diff --git a/.cargo/config.toml b/.cargo/config.toml index aad445697..ce959cbd4 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,4 +1,5 @@ [alias] docs = "doc --workspace --all-features --no-deps" -[build] -rustflags = ["--cfg", "tokio_unstable"] + +[net] +git-fetch-with-cli = true diff --git a/.github/assets/install_anvil.sh b/.github/assets/install_anvil.sh new file mode 100755 index 000000000..3bae1ba29 --- /dev/null +++ b/.github/assets/install_anvil.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash +# +# Install the exact `anvil` binary the L1 integration tests are pinned to. +# +# The rollup-node L1 sync/reorg fixtures launch an external `anvil` process and +# refuse to run against any other build (see `crates/node/src/test_utils/fixture.rs`). +# This script fetches the reviewed Foundry `v1.5.0` release, verifies its archive +# against a hard-coded SHA-256 before extracting, installs only the `anvil` +# executable, and confirms the installed version and commit. +# +# Usage: +# .github/assets/install_anvil.sh [DEST_DIR] +# +# DEST_DIR defaults to "$PWD/.anvil-bin". The resulting executable path is printed +# on the final line so callers can wire it into `ANVIL_BIN`, e.g.: +# ANVIL_BIN="$(.github/assets/install_anvil.sh /opt/anvil | tail -n1)" +# +# Deliberately does NOT use foundryup or a mutable release channel: the version and +# checksums are pinned so CI and local runs resolve the identical binary. +set -euo pipefail + +# --- Pinned release -------------------------------------------------------------- +# The commit is the definitive identity. The immutable `v1.5.0` archive reports +# version `1.5.0-v1.5.0`; a `foundryup stable` build reports `1.5.0-stable`; both +# share this commit, so the version string is matched by prefix only. +readonly FOUNDRY_VERSION="v1.5.0" +readonly REQUIRED_VERSION_PREFIX="1.5.0" +readonly REQUIRED_COMMIT="1c57854462289b2e71ee7654cd6666217ed86ffd" +readonly BASE_URL="https://github.com/foundry-rs/foundry/releases/download/${FOUNDRY_VERSION}" + +# Official Linux archive digests for ${FOUNDRY_VERSION}. +readonly SHA256_AMD64="5cd98f9092bcc28be087939491f786b2bf3ed55e492996a409e29519b8ab4dc8" +readonly SHA256_ARM64="8138e1615568bfcca5999773830892d93a569370eb0ae4b7dd97db46e2af47f9" + +readonly DEST_DIR="${1:-$PWD/.anvil-bin}" + +err() { printf 'install_anvil: %s\n' "$*" >&2; } + +# --- Platform selection ---------------------------------------------------------- +os="$(uname -s)" +if [ "${os}" != "Linux" ]; then + err "unsupported OS '${os}'; only Linux archives are pinned. Install Foundry ${FOUNDRY_VERSION} manually and set ANVIL_BIN." + exit 1 +fi + +arch="$(uname -m)" +case "${arch}" in + x86_64 | amd64) + archive="foundry_${FOUNDRY_VERSION}_linux_amd64.tar.gz" + expected_sha="${SHA256_AMD64}" + ;; + aarch64 | arm64) + archive="foundry_${FOUNDRY_VERSION}_linux_arm64.tar.gz" + expected_sha="${SHA256_ARM64}" + ;; + *) + err "unsupported architecture '${arch}'; only x86_64 and aarch64 are pinned." + exit 1 + ;; +esac + +# --- sha256 helper --------------------------------------------------------------- +if command -v sha256sum >/dev/null 2>&1; then + sha256_of() { sha256sum "$1" | awk '{print $1}'; } +elif command -v shasum >/dev/null 2>&1; then + sha256_of() { shasum -a 256 "$1" | awk '{print $1}'; } +else + err "neither sha256sum nor shasum is available; cannot verify the archive." + exit 1 +fi + +# --- Download -------------------------------------------------------------------- +tmp_dir="$(mktemp -d)" +trap 'rm -rf "${tmp_dir}"' EXIT + +archive_path="${tmp_dir}/${archive}" +url="${BASE_URL}/${archive}" +err "downloading ${url}" +curl --proto '=https' --tlsv1.2 -fsSL "${url}" -o "${archive_path}" + +# --- Verify checksum BEFORE extracting ------------------------------------------- +actual_sha="$(sha256_of "${archive_path}")" +if [ "${actual_sha}" != "${expected_sha}" ]; then + err "checksum mismatch for ${archive}" + err " expected: ${expected_sha}" + err " actual: ${actual_sha}" + exit 1 +fi +err "checksum verified: ${expected_sha}" + +# --- Extract only the anvil executable ------------------------------------------- +mkdir -p "${DEST_DIR}" +tar -xzf "${archive_path}" -C "${DEST_DIR}" anvil +anvil_bin="$(cd "${DEST_DIR}" && pwd -P)/anvil" +chmod +x "${anvil_bin}" + +# --- Verify the installed binary ------------------------------------------------- +version_output="$("${anvil_bin}" --version)" +installed_version="$(printf '%s\n' "${version_output}" | sed -n 's/^anvil Version:[[:space:]]*//p' | head -n1)" +installed_commit="$(printf '%s\n' "${version_output}" | sed -n 's/^Commit SHA:[[:space:]]*//p' | head -n1)" + +case "${installed_version}" in + "${REQUIRED_VERSION_PREFIX}"*) ;; + *) + err "installed anvil does not match the pinned release" + err " expected version ${REQUIRED_VERSION_PREFIX}* commit ${REQUIRED_COMMIT}" + err " found version ${installed_version:-} commit ${installed_commit:-}" + exit 1 + ;; +esac +if [ "${installed_commit}" != "${REQUIRED_COMMIT}" ]; then + err "installed anvil does not match the pinned release" + err " expected version ${REQUIRED_VERSION_PREFIX}* commit ${REQUIRED_COMMIT}" + err " found version ${installed_version:-} commit ${installed_commit:-}" + exit 1 +fi + +err "installed anvil ${installed_version} (${REQUIRED_COMMIT}) at ${anvil_bin}" +# Final stdout line: the executable path, for ANVIL_BIN wiring. +printf '%s\n' "${anvil_bin}" diff --git a/.github/assets/verify_reth_sources.jq b/.github/assets/verify_reth_sources.jq new file mode 100644 index 000000000..3f3230a42 --- /dev/null +++ b/.github/assets/verify_reth_sources.jq @@ -0,0 +1,77 @@ +# Validates a `cargo metadata` dependency graph against the canonical DogeOS +# component, clean DogeOS Reth, DogeOS REVM, and reviewed official Reth pins. +# +# Arguments (exact canonical source strings): +# $components DogeOS component packages (dogeos-reth repository) +# $reth clean DogeOS Reth packages (DogeOS69/reth repository) +# $revm DogeOS REVM packages (dogeos-revm repository) +# $official reviewed official Reth transitive source (paradigmxyz/reth) +# +# Emits one line per violation; empty output means the graph is verified. + +# Reduce a source URL to its repository identity so revision pinning cannot be +# bypassed through case, scheme, `.git`, or trailing-slash spelling variants. +def norm_repo: + ascii_downcase + | sub("^git\\+"; "") + | split("?")[0] + | split("#")[0] + | sub("^(https?|ssh|git)://"; "") + | sub("^git@"; "") + | sub("^github\\.com:"; "github.com/") + | sub("\\.git$"; "") + | sub("/+$"; ""); + +def retired_repos: + ["github.com/dogeos69/dogeos-reth2", + "github.com/dogeos69/scroll-reth", + "github.com/scroll-tech/reth"]; + +[ + # Anchor packages must each resolve exactly once from their canonical source. + (if [.packages[] | select(.name == "dogeos-reth-node") | .source] == [$components] then empty + else "anchor dogeos-reth-node must resolve exactly once from the canonical DogeOS component source" end), + (if [.packages[] | select(.name == "reth-node-builder") | .source] == [$reth] then empty + else "anchor reth-node-builder must resolve exactly once from the clean DogeOS Reth source" end), + (if [.packages[] | select(.name == "revm-scroll") | .source] == [$revm] then empty + else "revm-scroll must resolve exactly once from the canonical DogeOS REVM source" end), + + (.packages[] + | (if .source == null then null else (.source | norm_repo) end) as $repo + | ( + # Every DogeOS component package must use the canonical component + # source; null/path sources fail this comparison as well. + (if (.name | startswith("dogeos-")) and .source != $components then + "DogeOS component package \(.name) must use the canonical component source, found \(.source // "null/path source")" + else empty end), + + # Every reth-* package must be a registry compatibility crate, clean + # DogeOS Reth, or the exact reviewed official Reth source. + (if (.name | test("^reth(-|$)")) then + (if .source == null then + "Reth package \(.name) must not use a null/path source" + elif (.source | startswith("registry+")) or .source == $reth or .source == $official then + empty + else + "Reth package \(.name) has an unreviewed source \(.source)" + end) + else empty end), + + # Any package drawn from a guarded repository must use the exact + # canonical source; retired forks are rejected outright. + (if $repo == null then empty + elif retired_repos | index($repo) then + "package \(.name) uses the retired fork source \(.source)" + elif $repo == "github.com/dogeos69/dogeos-reth" and .source != $components then + "package \(.name) uses a noncanonical DogeOS component source \(.source)" + elif $repo == "github.com/dogeos69/reth" and .source != $reth then + "package \(.name) uses a noncanonical clean DogeOS Reth source \(.source)" + elif $repo == "github.com/dogeos69/dogeos-revm" and .source != $revm then + "package \(.name) uses a noncanonical DogeOS REVM source \(.source)" + elif $repo == "github.com/paradigmxyz/reth" and .source != $official then + "package \(.name) uses an unreviewed official Reth source \(.source)" + else empty end) + ) + ) +] +| .[] diff --git a/.github/assets/verify_reth_sources.sh b/.github/assets/verify_reth_sources.sh new file mode 100755 index 000000000..878fe2f88 --- /dev/null +++ b/.github/assets/verify_reth_sources.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env sh +set -eu + +script_dir=$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd) + +# Canonical reviewed sources; every guarded package family must resolve to +# these exact strings (see verify_reth_sources.jq for the enforced rules). +components_source="git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" +reth_source="git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" +revm_source="git+https://github.com/DogeOS69/dogeos-revm.git?rev=dcf087684f255131c96c0d20f3291eef9198e990#dcf087684f255131c96c0d20f3291eef9198e990" +official_reth_source="git+https://github.com/paradigmxyz/reth?rev=b25f32a977b489f9b84254c7811a2a5a25a81369#b25f32a977b489f9b84254c7811a2a5a25a81369" + +# The predicate runs against a metadata file when one is provided (used by the +# fixtures in verify_reth_sources_test.sh); CI and local runs generate the +# metadata from the locked workspace. +if [ "$#" -gt 0 ]; then + metadata_file="$1" +else + metadata_file=$(mktemp) + trap 'rm -f "$metadata_file"' EXIT + cargo metadata --locked --offline --format-version 1 > "$metadata_file" +fi + +violations=$(jq -r \ + --arg components "$components_source" \ + --arg reth "$reth_source" \ + --arg revm "$revm_source" \ + --arg official "$official_reth_source" \ + -f "$script_dir/verify_reth_sources.jq" \ + "$metadata_file") + +if [ -n "$violations" ]; then + printf '%s\n' "dependency source verification failed:" "$violations" >&2 + exit 1 +fi + +echo "dependency graph verified: qualified DogeOS component, Reth, and REVM revisions" diff --git a/.github/assets/verify_reth_sources_test.sh b/.github/assets/verify_reth_sources_test.sh new file mode 100755 index 000000000..3ffc97bfc --- /dev/null +++ b/.github/assets/verify_reth_sources_test.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env sh +# Fixtures for verify_reth_sources.sh: the unmodified dependency graph must +# pass, and every mutated copy of it must be rejected. Requires a fetched +# workspace (cargo metadata --locked --offline must succeed). +set -eu + +script_dir=$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd) +verify="$script_dir/verify_reth_sources.sh" + +workdir=$(mktemp -d) +trap 'rm -rf "$workdir"' EXIT + +metadata_file="$workdir/metadata.json" +cargo metadata --locked --offline --format-version 1 > "$metadata_file" + +# Positive control: the checked-in graph must pass through the file entry point. +"$verify" "$metadata_file" > /dev/null +echo "ok: guard accepts the checked-in dependency graph" + +fixture="$workdir/fixture.json" +canonical_metadata="$workdir/metadata.canonical.json" +jq -S . "$metadata_file" > "$canonical_metadata" + +expect_reject() { + description="$1" + mutation="$2" + jq "$mutation" "$metadata_file" > "$fixture" + # A fixture that does not change the metadata would trivially pass the + # guard; treat it as a broken fixture rather than a rejection. + if jq -S . "$fixture" | cmp -s - "$canonical_metadata"; then + echo "FAIL: fixture mutation for $description left the metadata unchanged" >&2 + exit 1 + fi + if "$verify" "$fixture" > /dev/null 2>&1; then + echo "FAIL: guard accepted $description" >&2 + exit 1 + fi + echo "ok: guard rejects $description" +} + +expect_reject "a null-source DogeOS component" \ + '.packages |= map(if .name == "dogeos-reth-evm" then .source = null else . end)' + +expect_reject "a path-source DogeOS component" \ + '.packages |= map(if .name == "dogeos-chainspec" then .source = "path+file:///tmp/dogeos-chainspec" else . end)' + +expect_reject "the obsolete c5198f7 DogeOS component source alongside the good anchors" \ + '.packages += [first(.packages[] | select(.name == "dogeos-chainspec")) | .source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=c5198f722a4fcbd47e8c0a10fe8f9835a801c2d2#c5198f722a4fcbd47e8c0a10fe8f9835a801c2d2"]' + +expect_reject "the immediately retired 18adb117 DogeOS component source alongside the good anchors" \ + '.packages += [first(.packages[] | select(.name == "dogeos-chainspec")) | .source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=18adb1176636b4f3bdc828a15c4622f60d2e5ec7#18adb1176636b4f3bdc828a15c4622f60d2e5ec7"]' + +expect_reject "the immediately retired 81c8b33e DogeOS component source alongside the good anchors" \ + '.packages += [first(.packages[] | select(.name == "dogeos-chainspec")) | .source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=81c8b33ea958fd03173bc37094b97ddebeed1441#81c8b33ea958fd03173bc37094b97ddebeed1441"]' + +expect_reject "the obsolete PR #3 ae160090 clean-Reth source alongside the good anchors" \ + '.packages += [first(.packages[] | select(.name == "reth-node-builder")) | .source = "git+https://github.com/DogeOS69/reth.git?rev=ae160090003d9b04be0521e9e4760558798cdf40#ae160090003d9b04be0521e9e4760558798cdf40"]' + +expect_reject "the immediately retired f851224e clean-Reth source alongside the good anchors" \ + '.packages += [first(.packages[] | select(.name == "reth-node-builder")) | .source = "git+https://github.com/DogeOS69/reth.git?rev=f851224ee9aaf21c76a14e844cbd12d9756f5f3b#f851224ee9aaf21c76a14e844cbd12d9756f5f3b"]' + +expect_reject "a retired dogeos-reth2 source without the .git suffix" \ + '.packages += [first(.packages[] | select(.name == "reth-node-builder")) | .source = "git+https://github.com/DogeOS69/dogeos-reth2?rev=0000000000000000000000000000000000000000#0000000000000000000000000000000000000000"]' + +expect_reject "a retired scroll-reth source with alternate casing" \ + '.packages += [first(.packages[] | select(.name == "reth-node-builder")) | .source = "git+https://github.com/DogeOS69/Scroll-Reth.git?branch=dev#0000000000000000000000000000000000000000"]' + +expect_reject "a retired scroll-tech/reth source without the .git suffix" \ + '.packages += [first(.packages[] | select(.name == "reth-node-builder")) | .source = "git+https://github.com/scroll-tech/reth?branch=scroll#0000000000000000000000000000000000000000"]' + +expect_reject "a duplicate lowercase-organization DogeOS REVM source" \ + '.packages += [first(.packages[] | select(.name == "revm-scroll")) | .source = "git+https://github.com/dogeos69/dogeos-revm?rev=dcf087684f255131c96c0d20f3291eef9198e990#dcf087684f255131c96c0d20f3291eef9198e990"]' + +expect_reject "the immediately retired branch-form DogeOS REVM source alongside the good anchors" \ + '.packages += [first(.packages[] | select(.name == "revm-scroll")) | .source = "git+https://github.com/DogeOS69/dogeos-revm.git?branch=dogeos#dcf087684f255131c96c0d20f3291eef9198e990"]' + +expect_reject "a wrong DogeOS REVM revision" \ + '.packages |= map(if .name == "revm-scroll" then .source = "git+https://github.com/DogeOS69/dogeos-revm.git?rev=1111111111111111111111111111111111111111#1111111111111111111111111111111111111111" else . end)' + +# The reviewed official Reth subtree only ever entered the graph through the +# removed Foundry/Tempo subtree, so the clean graph no longer contains a +# paradigmxyz/reth package to mutate. Inject a wrong official-Reth source onto a +# non-anchor, non-reth-* package so the rejection is attributed specifically to the +# repository-level official-Reth rule rather than the reth-* naming rule. +expect_reject "a wrong official Reth revision alongside the good anchors" \ + '.packages += [first(.packages[] | select(.name == "alloy-node-bindings")) | .source = "git+https://github.com/paradigmxyz/reth?rev=2222222222222222222222222222222222222222#2222222222222222222222222222222222222222"]' + +echo "source guard fixtures passed" diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 58fb345d5..aca97203d 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -13,6 +13,24 @@ env: CARGO_TERM_COLOR: always jobs: + dependency-sources: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v6 + - uses: dtolnay/rust-toolchain@stable + - uses: dcarbone/install-jq-action@v3 + - name: Configure dependency access + env: + GITHUB_TOKEN: ${{ secrets.DOGEOS_RETH_TOKEN || secrets.DOGEOS_RETH2_TOKEN || github.token }} + run: git config --global url."https://x-access-token:${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" + - name: Fetch locked dependencies + run: cargo fetch --locked + - name: Verify Reth dependency sources + run: .github/assets/verify_reth_sources.sh + - name: Check source guard rejects noncanonical fixtures + run: .github/assets/verify_reth_sources_test.sh + clippy: runs-on: ubuntu-latest timeout-minutes: 30 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 005c99fc0..fe80037fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -141,6 +141,8 @@ jobs: push: false platforms: ${{ env.PLATFORM }} tags: ${{ env.DOCKER_TAGS }} + secrets: | + github_token=${{ secrets.DOGEOS_RETH_TOKEN || secrets.DOGEOS_RETH2_TOKEN || github.token }} cache-from: type=registry,ref=${{ env.IMAGE_NAME }}:buildcache labels: | org.opencontainers.image.title=rollup-node @@ -165,6 +167,8 @@ jobs: push: true platforms: ${{ env.PLATFORM }} tags: ${{ env.DOCKER_TAGS }} + secrets: | + github_token=${{ secrets.DOGEOS_RETH_TOKEN || secrets.DOGEOS_RETH2_TOKEN || github.token }} cache-from: type=registry,ref=${{ env.IMAGE_NAME }}:buildcache cache-to: type=registry,ref=${{ env.IMAGE_NAME }}:buildcache,mode=max labels: | diff --git a/.github/workflows/sequencer-migration-docker.yml b/.github/workflows/sequencer-migration-docker.yml deleted file mode 100644 index a7ffc4b66..000000000 --- a/.github/workflows/sequencer-migration-docker.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Sequencer Migration Docker - -on: - push: - tags: - - '*' - release: - types: [published] - -jobs: - build-and-push: - runs-on: ubuntu-latest - permissions: {} - - steps: - - name: Checkout code - uses: actions/checkout@v6 - with: - persist-credentials: false - - - name: Extract docker metadata - id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 - with: - images: scrolltech/sequencer-migration - tags: | - type=ref,event=tag,enable=${{ github.event_name == 'push' }} - type=raw,value=latest,enable=${{ github.event_name == 'release' }} - flavor: | - latest=false - - - name: Login to Docker Hub - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 #v3.7.0 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push Docker image - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2 - with: - context: sequencer-migration - file: sequencer-migration/Dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 459608a22..38edac54e 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -46,6 +46,10 @@ jobs: with: cache-on-failure: true - uses: taiki-e/install-action@nextest + - name: Install pinned Anvil + run: | + ANVIL_BIN="$(.github/assets/install_anvil.sh "$RUNNER_TEMP/anvil" | tail -n1)" + echo "ANVIL_BIN=$ANVIL_BIN" >> "$GITHUB_ENV" - name: Run integration tests run: | cargo nextest run --all-features --workspace --locked \ diff --git a/Cargo.lock b/Cargo.lock index a333a2fda..55c12f1a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,7 +35,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -58,7 +58,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "version_check", ] @@ -108,9 +108,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", ] @@ -123,9 +123,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.18" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfaa9ea039a6f9304b4a593d780b1f23e1ae183acdee938b11b38795acacc9f1" +checksum = "84e0378e959aa6a885897522080a990e80eb317f1e9a222a604492ea50e13096" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -138,9 +138,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad704069c12f68d0c742d0cad7e0a03882b42767350584627fbf8a47b1bf1846" +checksum = "1e56cae3909bcb2347f77c0f318ef5eb7e131ea6d0a94d31f8bfb6e4c5e3c7c7" dependencies = [ "alloy-eips", "alloy-primitives", @@ -156,19 +156,19 @@ dependencies = [ "either", "k256", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "secp256k1 0.30.0", "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-consensus-any" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc374f640a5062224d7708402728e3d6879a514ba10f377da62e7dfb14c673e6" +checksum = "f4394690a8a64757316c57c57f2c663bf8395febb4c4baa049a058ebd122b668" dependencies = [ "alloy-consensus", "alloy-eips", @@ -179,46 +179,21 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-contract" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c493b2812943f7b58191063a8d13ea97c76099900869c08231e8eba3bf2f92" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "serde_json", - "thiserror 2.0.17", -] - [[package]] name = "alloy-dyn-abi" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdff496dd4e98a81f4861e66f7eaf5f2488971848bb42d9c892f871730245c8" +checksum = "cc2db5c583aaef0255aa63a4fe827f826090142528bba48d1bf4119b62780cad" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", "alloy-sol-types", - "arbitrary", "derive_more", "itoa", - "proptest", "serde", "serde_json", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -231,9 +206,9 @@ dependencies = [ "alloy-rlp", "arbitrary", "crc", - "rand 0.8.5", + "rand 0.8.6", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -246,48 +221,52 @@ dependencies = [ "alloy-rlp", "arbitrary", "borsh", - "rand 0.8.5", + "rand 0.8.6", "serde", ] [[package]] -name = "alloy-eip5792" -version = "1.1.1" +name = "alloy-eip7702" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37aa145e9d61cda33702d8fbe349f25ba89604c98c4e9c04a3f69a790d92c0fa" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" dependencies = [ "alloy-primitives", - "alloy-serde", + "alloy-rlp", + "arbitrary", + "borsh", + "k256", + "rand 0.8.6", "serde", - "serde_json", + "serde_with", + "thiserror 2.0.18", ] [[package]] -name = "alloy-eip7702" -version = "0.6.3" +name = "alloy-eip7928" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +checksum = "6b827a6d7784fe3eb3489d40699407a4cdcce74271421a01bdffe60cf573bb16" dependencies = [ "alloy-primitives", "alloy-rlp", "arbitrary", "borsh", - "k256", - "rand 0.8.5", + "once_cell", "serde", - "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-eips" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e867b5fd52ed0372a95016f3a37cbff95a9d5409230fbaef2d8ea00e8618098" +checksum = "e6ef28c9fdad22d4eec52d894f5f2673a0895f1e5ef196734568e68c0f6caca8" dependencies = [ "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", + "alloy-eip7928", "alloy-primitives", "alloy-rlp", "alloy-serde", @@ -297,78 +276,38 @@ dependencies = [ "c-kzg", "derive_more", "either", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.9.1", + "ethereum_ssz_derive 0.9.1", "serde", "serde_with", - "sha2 0.10.9", - "thiserror 2.0.17", -] - -[[package]] -name = "alloy-ens" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03947c30835388cd0e18d52e5bd1563ac3a2d784bf0801809bf693542ab68479" -dependencies = [ - "alloy-contract", - "alloy-primitives", - "alloy-provider", - "alloy-sol-types", - "async-trait", - "thiserror 2.0.17", -] - -[[package]] -name = "alloy-evm" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f1bfade4de9f464719b5aca30cf5bb02b9fda7036f0cf43addc3a0e66a0340c" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-hardforks 0.3.5", - "alloy-op-hardforks", - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-sol-types", - "auto_impl", - "derive_more", - "op-alloy-consensus", - "op-alloy-rpc-types-engine", - "op-revm 10.1.1", - "revm 29.0.1", - "thiserror 2.0.17", + "sha2", ] [[package]] name = "alloy-evm" -version = "0.22.2" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a48fa6a4a5a69ae8e46c0ae60851602c5016baa3379d076c76e4c2f3b889f7" +checksum = "e13146597a586a4166ac31b192883e08c044272d6b8c43de231ee1f43dd9a115" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-hardforks 0.4.4", + "alloy-hardforks 0.4.7", "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-eth", "alloy-sol-types", "auto_impl", "derive_more", - "op-alloy-consensus", - "op-alloy-rpc-types-engine", - "op-revm 11.1.1", - "revm 30.1.1", - "thiserror 2.0.17", + "revm", + "thiserror 2.0.18", + "tracing", ] [[package]] name = "alloy-genesis" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90be17e9760a6ba6d13cebdb049cea405ebc8bf57d90664ed708cc5bc348342" +checksum = "bbf9480307b09d22876efb67d30cadd9013134c21f3a17ec9f93fd7536d38024" dependencies = [ "alloy-eips", "alloy-primitives", @@ -394,22 +333,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "889eb3949b58368a09d4f16931c660275ef5fb08e5fbd4a96573b19c7085c41f" -dependencies = [ - "alloy-chains", - "alloy-eip2124", - "alloy-primitives", - "auto_impl", - "dyn-clone", -] - -[[package]] -name = "alloy-hardforks" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e29d7eacf42f89c21d7f089916d0bdb4f36139a31698790e8837d2dbbd4b2c3" +checksum = "83ba208044232d14d4adbfa77e57d6329f51bc1acc21f5667bb7db72d88a0831" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -421,9 +347,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5513d5e6bd1cba6bdcf5373470f559f320c05c8c59493b6e98912fbe6733943f" +checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -433,24 +359,24 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcab4c51fb1273e3b0f59078e0cdf8aa99f697925b09f0d2055c18be46b4d48c" +checksum = "422d110f1c40f1f8d0e5562b0b649c35f345fccb7093d9f02729943dcd1eef71" dependencies = [ "alloy-primitives", "alloy-sol-types", - "http 1.3.1", + "http 1.4.2", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] [[package]] name = "alloy-network" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196d7fd3f5d414f7bbd5886a628b7c42bd98d1b126f9a7cff69dbfd72007b39c" +checksum = "464d9c2c5bca3ff3f020f2ab502629043486a1b3645c5c11613c1dade4eb6f5e" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -469,14 +395,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-network-primitives" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3ae2777e900a7a47ad9e3b8ab58eff3d93628265e73bbdee09acf90bf68f75" +checksum = "2158d382ef9743ae7185c9fcd33cd9a99967419fdcd5eebc83ff7c0e79cad2bc" dependencies = [ "alloy-consensus", "alloy-eips", @@ -487,9 +413,9 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ead1731af4146c573e2ea0e83c6a0696814efb0c25feea2892bdd5e4ee1f479" +checksum = "665347f30d0dbb5e03f68cbd4f83390c3b3e4331e37fdb51b75d95acaa406a82" dependencies = [ "alloy-genesis", "alloy-hardforks 0.2.13", @@ -498,48 +424,20 @@ dependencies = [ "alloy-signer", "alloy-signer-local", "k256", - "rand 0.8.5", + "libc", + "rand 0.8.6", "serde_json", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", "url", ] -[[package]] -name = "alloy-op-evm" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b6679dc8854285d6c34ef6a9f9ade06dec1f5db8aab96e941d99b8abcefb72" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm 0.21.3", - "alloy-op-hardforks", - "alloy-primitives", - "auto_impl", - "op-alloy-consensus", - "op-revm 10.1.1", - "revm 29.0.1", -] - -[[package]] -name = "alloy-op-hardforks" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599c1d7dfbccb66603cb93fde00980d12848d32fe5e814f50562104a92df6487" -dependencies = [ - "alloy-chains", - "alloy-hardforks 0.3.5", - "alloy-primitives", - "auto_impl", -] - [[package]] name = "alloy-primitives" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355bf68a433e0fd7f7d33d5a9fc2583fde70bf5c530f63b80845f8da5505cf28" +checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" dependencies = [ "alloy-rlp", "arbitrary", @@ -548,28 +446,28 @@ dependencies = [ "const-hex", "derive_more", "foldhash 0.2.0", - "getrandom 0.3.4", - "hashbrown 0.16.0", - "indexmap 2.12.0", + "getrandom 0.4.3", + "hashbrown 0.16.1", + "indexmap 2.14.0", "itoa", "k256", "keccak-asm", "paste", "proptest", - "proptest-derive 0.6.0", - "rand 0.9.2", + "proptest-derive", + "rand 0.9.4", + "rapidhash", "ruint", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "sha3", - "tiny-keccak", ] [[package]] name = "alloy-provider" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9bf40c9b2a90c7677f9c39bccd9f06af457f35362439c0497a706f16557703" +checksum = "09b08405e82effb4985f7cbe83d5067730e79893c8699793c1e113043ffeac9d" dependencies = [ "alloy-chains", "alloy-consensus", @@ -577,12 +475,12 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", - "alloy-node-bindings", "alloy-primitives", "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types-anvil", "alloy-rpc-types-debug", + "alloy-rpc-types-engine", "alloy-rpc-types-eth", "alloy-rpc-types-trace", "alloy-signer", @@ -594,17 +492,17 @@ dependencies = [ "async-stream", "async-trait", "auto_impl", - "dashmap 6.1.0", + "dashmap", "either", "futures", "futures-utils-wasm", - "lru 0.13.0", + "lru 0.16.4", "parking_lot 0.12.5", "pin-project", - "reqwest", + "reqwest 0.13.4", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", "url", @@ -613,9 +511,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfdbe41e2ef1a7e79b5ea115baa750f9381ac9088fb600f4cedc731cf04a151" +checksum = "5ad54073131e7292d4e03e1aa2287730f737280eb160d8b579fb31939f558c11" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -635,9 +533,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +checksum = "dc90b1e703d3c03f4ff7f48e82dd0bc1c8211ab7d079cd836a06fcfeb06651cb" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -646,20 +544,20 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +checksum = "f36834a5c0a2fa56e171bf256c34d70fca07d0c0031583edea1c4946b7889c9e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "alloy-rpc-client" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c2630fde9ff6033a780635e1af6ef40e92d74a9cacb8af3defc1b15cfebca5" +checksum = "94fcc9604042ca80bd37aa5e232ea1cd851f337e31e2babbbb345bc0b1c30de3" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -670,7 +568,7 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest", + "reqwest 0.13.4", "serde", "serde_json", "tokio", @@ -683,25 +581,22 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad098153a12382c22a597e865530033f5e644473742d6c733562d448125e02a2" +checksum = "4f20059ff046049aae59f6e19d96462214ad3290cf9920394309dd7ffc284390" dependencies = [ "alloy-primitives", - "alloy-rpc-types-anvil", "alloy-rpc-types-engine", "alloy-rpc-types-eth", - "alloy-rpc-types-trace", - "alloy-rpc-types-txpool", "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-admin" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7604c415f725bd776d46dae44912c276cc3d8af37f37811e5675389791aa0c6" +checksum = "b38080c2b01ad1bacbd3583cf7f6f800e5e0ffc11eaddaad7321225733a2d818" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -711,9 +606,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214d9d1033c173ab8fa32edd8a4655cd784447c820b0b66cd0d5167e049567d6" +checksum = "e9aca954ee74bb38b24399da5bd861a2511fb76d40cca7ae700d2289ff96fb90" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -723,9 +618,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b8429b5b62d21bf3691eb1ae12aaae9bb496894d5a114e3cc73e27e6800ec8" +checksum = "89b71da7e5cdd0d5ffebc459f5987888fd3380969c2f94f8cb652ad91ae51bba" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -734,29 +629,29 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67f8269e8b5193a5328dd3ef4d60f93524071e53a993776e290581a59aa15fa" +checksum = "6a3569433bc2cddd4f00b1dd533a38a07512b55e62d11f662fde20930b613b57" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "derive_more", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.9.1", + "ethereum_ssz_derive 0.9.1", "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tree_hash", "tree_hash_derive", ] [[package]] name = "alloy-rpc-types-debug" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01731601ea631bd825c652a225701ab466c09457f446b8d8129368a095389c5d" +checksum = "2145138f3214928f08cd13da3cb51ef7482b5920d8ac5a02ecd4e38d1a8f6d1e" dependencies = [ "alloy-primitives", "derive_more", @@ -766,9 +661,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9981491bb98e76099983f516ec7de550db0597031f5828c994961eb4bb993cce" +checksum = "f083328dbf7aa5abfe5c0a7758ec9acc86a45bfbcfb45c54186c6caa78036f2a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -777,19 +672,19 @@ dependencies = [ "alloy-serde", "arbitrary", "derive_more", - "ethereum_ssz", - "ethereum_ssz_derive", + "ethereum_ssz 0.9.1", + "ethereum_ssz_derive 0.9.1", "jsonwebtoken", - "rand 0.8.5", + "rand 0.8.6", "serde", "strum 0.27.2", ] [[package]] name = "alloy-rpc-types-eth" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29031a6bf46177d65efce661f7ab37829ca09dd341bc40afb5194e97600655cc" +checksum = "1641df7ef4d15cd43843d399252c90a95abf465a67e2a2b2fd76f4e93cc60e15" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -804,14 +699,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-rpc-types-mev" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5c5c78bdd2c72c47e66ab977af420fb4a10279707d4edbd2575693c47aa54a2" +checksum = "23b6ca72affc6669e0a456af7d3c15d6b2edf75797d7906bc3900a8b1e094348" dependencies = [ "alloy-consensus", "alloy-eips", @@ -824,23 +719,23 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b842f5aac6676ff4b2e328262d03bdf49807eaec3fe3a4735c45c97388518b" +checksum = "b00e2d5ab1f7310c7ecd69962af8c99d2557335ff8cf1baf39c8ff6eec9c171d" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-rpc-types-txpool" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa12c608873beeb7afa392944dce8829fa8a50c487f266863bb2dd6b743c4a2" +checksum = "154695f4a24dd749368fd46a4bdac1ec806b4376abc40112e3028018fee5b593" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -850,9 +745,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01e856112bfa0d9adc85bd7c13db03fad0e71d1d6fb4c2010e475b6718108236" +checksum = "11ece63b89294b8614ab3f483560c08d016930f842bf36da56bf0b764a15c11e" dependencies = [ "alloy-primitives", "arbitrary", @@ -862,26 +757,24 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a4f629da632d5279bbc5731634f0f5c9484ad9c4cad0cd974d9669dc1f46d6" +checksum = "e0f59de30d9d3b13ce6a1b90e85270dc086e4e4733aaa12b250fb30e1eb35849" dependencies = [ - "alloy-dyn-abi", "alloy-primitives", - "alloy-sol-types", "async-trait", "auto_impl", "either", "elliptic-curve", "k256", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-signer-aws" -version = "1.1.1" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66be762e60db50f81be7744c3a5b3efd4c69203576340df0519dacea09f5f4dd" +checksum = "e38b411077d7b17e464de7dfa599f5b94161cdffc25c2f28a90a3a345b6d6490" dependencies = [ "alloy-consensus", "alloy-network", @@ -892,35 +785,15 @@ dependencies = [ "aws-sdk-kms", "k256", "spki", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "alloy-signer-ledger" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92490935797fe5625e123fc99ed67e8ba24f27c26d88e337e3fcabec0f350f7d" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "coins-ledger", - "futures-util", - "semver 1.0.27", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] [[package]] name = "alloy-signer-local" -version = "1.1.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76c8950810dc43660c0f22883659c4218e090a5c75dce33fa4ca787715997b7b" +checksum = "d3e64733ea58cfb393c901047638e9ff6890c0a45dc5855bfa077f8bace0f9f9" dependencies = [ "alloy-consensus", "alloy-network", @@ -929,96 +802,75 @@ dependencies = [ "async-trait", "coins-bip32", "coins-bip39", - "eth-keystore", "k256", - "rand 0.8.5", - "thiserror 2.0.17", + "rand 0.8.6", + "thiserror 2.0.18", "zeroize", ] -[[package]] -name = "alloy-signer-trezor" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eab6b865f665871ebb8e65f881d50d75d1a5c367d4e376578ff35ccd926b43e" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "semver 1.0.27", - "thiserror 2.0.17", - "tracing", - "trezor-client", -] - [[package]] name = "alloy-sol-macro" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" +checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" +checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" dependencies = [ - "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.12.0", + "indexmap 2.14.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.110", + "sha3", + "syn 2.0.118", "syn-solidity", - "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" +checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" dependencies = [ - "alloy-json-abi", "const-hex", "dunce", "heck 0.5.0", "macro-string", "proc-macro2", "quote", - "serde_json", - "syn 2.0.110", + "syn 2.0.118", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" +checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" dependencies = [ "serde", - "winnow", + "winnow 0.7.15", ] [[package]] name = "alloy-sol-types" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70319350969a3af119da6fb3e9bddb1bce66c9ea933600cb297c8b1850ad2a3c" +checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -1028,9 +880,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe215a2f9b51d5f1aa5c8cf22c8be8cdb354934de09c9a4e37aefb79b77552fd" +checksum = "8098f965442a9feb620965ba4b4be5e2b320f4ec5a3fff6bfa9e1ff7ef42bed1" dependencies = [ "alloy-json-rpc", "auto_impl", @@ -1041,7 +893,7 @@ dependencies = [ "parking_lot 0.12.5", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tower", "tracing", @@ -1051,19 +903,14 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b37b1a30d23deb3a8746e882c70b384c574d355bc2bbea9ea918b0c31366e" +checksum = "e8597d36d546e1dab822345ad563243ec3920e199322cb554ce56c8ef1a1e2e7" dependencies = [ "alloy-json-rpc", - "alloy-rpc-types-engine", "alloy-transport", - "http-body-util", - "hyper 1.8.1", - "hyper-tls", - "hyper-util", - "jsonwebtoken", - "reqwest", + "itertools 0.14.0", + "reqwest 0.13.4", "serde_json", "tower", "tracing", @@ -1072,9 +919,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c81a4deeaa0d4b022095db17b286188d731e29ea141d4ec765e166732972e4" +checksum = "a1bd98c3870b8a44b79091dde5216a81d58ffbc1fd8ed61b776f9fee0f3bdf20" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -1092,52 +939,53 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9d6f5f304e8943afede2680e5fc7008780d4fc49387eafd53192ad95e20091" +checksum = "ec3ab7a72b180992881acc112628b7668337a19ce15293ee974600ea7b693691" dependencies = [ "alloy-pubsub", "alloy-transport", "futures", - "http 1.3.1", - "rustls 0.23.31", + "http 1.4.2", + "rustls 0.23.41", "serde_json", "tokio", - "tokio-tungstenite 0.26.2", + "tokio-tungstenite", "tracing", + "url", "ws_stream_wasm", ] [[package]] name = "alloy-trie" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" +checksum = "3f14b5d9b2c2173980202c6ff470d96e7c5e202c65a9f67884ad565226df7fbb" dependencies = [ "alloy-primitives", "alloy-rlp", "arbitrary", - "arrayvec", "derive_arbitrary", "derive_more", "nybbles", "proptest", - "proptest-derive 0.5.1", + "proptest-derive", "serde", "smallvec", + "thiserror 2.0.18", "tracing", ] [[package]] name = "alloy-tx-macros" -version = "1.1.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccf423f6de62e8ce1d6c7a11fb7508ae3536d02e0d68aaeb05c8669337d0937" +checksum = "d69722eddcdf1ce096c3ab66cf8116999363f734eb36fe94a148f4f71c85da84" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -1155,22 +1003,11 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" -[[package]] -name = "annotate-snippets" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96401ca08501972288ecbcde33902fce858bf73fbcbdf91dab8c3a9544e106bb" -dependencies = [ - "anstyle", - "memchr", - "unicode-width 0.2.0", -] - [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -1183,15 +1020,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -1217,131 +1054,16 @@ dependencies = [ ] [[package]] -name = "anvil" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-contract", - "alloy-dyn-abi", - "alloy-eip5792", - "alloy-eips", - "alloy-evm 0.21.3", - "alloy-genesis", - "alloy-hardforks 0.3.5", - "alloy-network", - "alloy-op-evm", - "alloy-op-hardforks", - "alloy-primitives", - "alloy-provider", - "alloy-rlp", - "alloy-rpc-types", - "alloy-serde", - "alloy-signer", - "alloy-signer-local", - "alloy-sol-types", - "alloy-transport", - "alloy-trie", - "anvil-core", - "anvil-rpc", - "anvil-server", - "async-trait", - "axum", - "chrono", - "eyre", - "flate2", - "foundry-cli", - "foundry-common", - "foundry-config", - "foundry-evm", - "foundry-evm-networks", - "futures", - "hyper 1.8.1", - "itertools 0.14.0", - "op-alloy-consensus", - "op-revm 10.1.1", - "parking_lot 0.12.5", - "rand 0.8.5", - "revm 29.0.1", - "revm-inspectors 0.30.1", - "serde", - "serde_json", - "tempfile", - "thiserror 2.0.17", - "tokio", - "tracing", - "tracing-subscriber 0.3.20", - "yansi", -] - -[[package]] -name = "anvil-core" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-eip5792", - "alloy-eips", - "alloy-network", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types", - "alloy-serde", - "bytes", - "foundry-common", - "foundry-evm", - "op-alloy-consensus", - "op-revm 10.1.1", - "rand 0.9.2", - "revm 29.0.1", - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "anvil-rpc" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "anvil-server" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "anvil-rpc", - "async-trait", - "axum", - "bytes", - "futures", - "interprocess", - "parking_lot 0.12.5", - "pin-project", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio-util", - "tower-http", - "tracing", -] - -[[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +name = "anyhow" +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 = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" dependencies = [ "num-traits", ] @@ -1357,7 +1079,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -1472,6 +1194,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" @@ -1499,7 +1238,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.110", + "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]] @@ -1537,7 +1286,20 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.110", + "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]] @@ -1611,13 +1373,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" @@ -1626,7 +1401,18 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "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]] @@ -1636,7 +1422,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -1646,7 +1432,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -1656,7 +1442,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", +] + +[[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.6", ] [[package]] @@ -1667,37 +1463,36 @@ 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", ] [[package]] name = "asn1_der" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" +checksum = "4858a9d740c5007a9069007c3b4e91152d0506f13c1b31dd49051fd537656156" [[package]] name = "async-compression" -version = "0.4.33" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c1f86859c1af3d514fa19e8323147ff10ea98684e6c7b307912509f50e67b2" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" dependencies = [ "compression-codecs", "compression-core", - "futures-core", "pin-project-lite", "tokio", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener", "event-listener-strategy", @@ -1723,7 +1518,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -1734,7 +1529,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -1757,15 +1552,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "atomic" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" -dependencies = [ - "bytemuck", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -1790,20 +1576,20 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "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-config" -version = "1.8.10" +version = "1.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1856b1b48b65f71a4dd940b1c0931f9a7b646d4a924b9828ffefc1454714668a" +checksum = "8a8fc176d53d6fe85017f230405e3255cedb4a02221cb55ed6d76dccbbb099b2" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1820,7 +1606,7 @@ dependencies = [ "bytes", "fastrand", "hex", - "http 1.3.1", + "http 1.4.2", "ring", "time", "tokio", @@ -1831,9 +1617,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.9" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86590e57ea40121d47d3f2e131bfd873dea15d78dc2f4604f4734537ad9e56c4" +checksum = "6d203b0bf2626dcba8665f5cd0871d7c2c0930223d6b6be9097592fea21242d0" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1843,9 +1629,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.13.3" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" dependencies = [ "aws-lc-sys", "zeroize", @@ -1853,22 +1639,22 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.30.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" dependencies = [ - "bindgen 0.69.5", "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] name = "aws-runtime" -version = "1.5.14" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe0fd441565b0b318c76e7206c8d1d0b0166b3e986cf30e890b61feb6192045" +checksum = "ede2ddc593e6c8acc6ce3358c28d6677a6dc49b65ba4b37a2befe14a11297e75" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1879,26 +1665,28 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", + "bytes-utils", "fastrand", - "http 0.2.12", - "http-body 0.4.6", + "http 1.4.2", + "http-body 1.0.1", "percent-encoding", "pin-project-lite", "tracing", - "uuid 1.18.1", + "uuid", ] [[package]] name = "aws-sdk-kms" -version = "1.94.0" +version = "1.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95f85c05f9aecaf9a3ae222f2b11656abfea45a6a93835bfb98553e01819520e" +checksum = "22b682ef733ec24c300b11cec2df9bfea7ee4bf48ab2030c832e27db92b69c68" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1906,21 +1694,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" -version = "1.89.0" +version = "1.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c1b1af02288f729e95b72bd17988c009aa72e26dcb59b3200f86d7aea726c9" +checksum = "00c5ff27c6ba2cbd95e6e26e2e736676fdf6bcf96495b187733f521cfe4ce448" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1928,21 +1718,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.91.0" +version = "1.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e8122301558dc7c6c68e878af918880b82ff41897a60c8c4e18e4dc4d93e9f1" +checksum = "4d186f1e5a3694a188e5a0640b3115ccc6e084d104e16fd6ba968dca072ffef8" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1950,21 +1742,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.92.0" +version = "1.99.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c7808adcff8333eaa76a849e6de926c6ac1a1268b9fd6afe32de9c29ef29d2" +checksum = "9acba7c62f3d4e2408fa998a3a8caacd8b9a5b5549cf36e2372fbdae329d5449" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -1973,15 +1767,16 @@ dependencies = [ "aws-types", "fastrand", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.3.6" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" +checksum = "37411f8e0f4bea0c3ca0958ce7f18f6439db24d555dbd809787262cd00926aa9" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -1992,18 +1787,18 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "percent-encoding", - "sha2 0.10.9", + "sha2", "time", "tracing", ] [[package]] name = "aws-smithy-async" -version = "1.2.6" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" +checksum = "5cc50d0f63e714784b84223abd7abbc8577de8c35d699e0edd19f0a88a08ae13" dependencies = [ "futures-util", "pin-project-lite", @@ -2012,9 +1807,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.5" +version = "0.63.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" +checksum = "d619373d490ad70966994801bc126846afaa0d1ee920697a031f0cf63f2568e7" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", @@ -2022,9 +1817,9 @@ dependencies = [ "bytes-utils", "futures-core", "futures-util", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", "percent-encoding", "pin-project-lite", "pin-utils", @@ -2033,27 +1828,27 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.4" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +checksum = "00ccbb08c10f6bcf912f398188e42ee2eab5f1767ce215a02a73bc5df1bbdd95" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "h2 0.3.27", - "h2 0.4.12", + "h2 0.4.15", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.10.1", "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", + "hyper-rustls 0.27.9", "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls 0.23.41", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -2063,27 +1858,27 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.7" +version = "0.62.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" +checksum = "27b3a779093e18cad88bbae08dc4261e1d95018c4c5b9356a52bcae7c0b6e9bb" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +checksum = "4d3f39d5bb871aaf461d59144557f16d5927a5248a983a40654d9cf3b9ba183b" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.8" +version = "0.60.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" +checksum = "05f76a580e3d8f8961e5d48763214025a2af65c2fa4cd1fb7f270a0e107a71b0" dependencies = [ "aws-smithy-types", "urlencoding", @@ -2091,9 +1886,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.4" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" +checksum = "22ccf7f6eba8b2dcf8ce9b74806c6c185659c311665c4bf8d6e71ebd454db6bf" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -2104,9 +1899,10 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "http-body 0.4.6", "http-body 1.0.1", + "http-body-util", "pin-project-lite", "pin-utils", "tokio", @@ -2115,15 +1911,15 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.2" +version = "1.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" +checksum = "b4af6e5def28be846479bbeac55aa4603d6f7986fc5da4601ba324dd5d377516" dependencies = [ "aws-smithy-async", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "pin-project-lite", "tokio", "tracing", @@ -2132,16 +1928,16 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.4" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" +checksum = "8ca2734c16913a45343b37313605d84e7d8b34a4611598ce1d25b35860a2bed3" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", @@ -2158,18 +1954,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.12" +version = "0.60.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" +checksum = "b53543b4b86ed43f051644f704a98c7291b3618b67adf057ee77a366fa52fcaa" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.10" +version = "1.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" +checksum = "0470cc047657c6e286346bdf10a8719d26efd6a91626992e0e64481e44323e96" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -2179,67 +1975,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "axum" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" -dependencies = [ - "axum-core", - "base64 0.22.1", - "bytes", - "form_urlencoded", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.8.1", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sha1", - "sync_wrapper", - "tokio", - "tokio-tungstenite 0.28.0", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" -dependencies = [ - "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "az" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" - [[package]] name = "backon" version = "1.6.0" @@ -2287,6 +2022,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" @@ -2311,9 +2052,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.8.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bech32" @@ -2323,9 +2064,9 @@ checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bigdecimal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560f42649de9fa436b73517378a147ec21f6c997a546581df4b4b31677828934" +checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" dependencies = [ "autocfg", "libm", @@ -2350,63 +2091,22 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.10.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.110", - "which", -] - -[[package]] -name = "bindgen" -version = "0.71.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" -dependencies = [ - "bitflags 2.10.0", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.1", - "shlex", - "syn 2.0.110", -] - [[package]] name = "bindgen" version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "cexpr", "clang-sys", - "itertools 0.13.0", + "itertools 0.12.1", "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", - "shlex", - "syn 2.0.110", + "rustc-hash", + "shlex 1.3.0", + "syn 2.0.118", ] [[package]] @@ -2424,20 +2124,41 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-consensus-encoding" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2d6094e2a1ba3c93b5a596fe5a10d1a10c3c6e06785cde89f693a044c01aa40" +dependencies = [ + "bitcoin-internals", +] + +[[package]] +name = "bitcoin-internals" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a30a22d1f112dde8e16be7b45c63645dc165cef254f835b3e1e9553e485cfa64" +dependencies = [ + "hex-conservative 0.3.2", +] + [[package]] name = "bitcoin-io" -version = "0.1.3" +version = "0.1.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" +checksum = "bb5de036369d1ac59d3c1819ebc4d850f89466f5401c571a285b6ed564a4cb78" +dependencies = [ + "bitcoin-consensus-encoding", +] [[package]] name = "bitcoin_hashes" -version = "0.14.0" +version = "0.14.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +checksum = "bca4c7abb40c8817d77403c880988cfd484f23ab2365726afb2f798363e2c4a2" dependencies = [ "bitcoin-io", - "hex-conservative", + "hex-conservative 0.2.2", ] [[package]] @@ -2448,18 +2169,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" dependencies = [ "serde_core", ] [[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", @@ -2469,12 +2190,17 @@ dependencies = [ ] [[package]] -name = "block-buffer" -version = "0.9.0" +name = "blake3" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" dependencies = [ - "generic-array", + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", ] [[package]] @@ -2507,213 +2233,44 @@ dependencies = [ "zeroize", ] -[[package]] -name = "boa_ast" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" -dependencies = [ - "bitflags 2.10.0", - "boa_interner", - "boa_macros", - "boa_string", - "indexmap 2.12.0", - "num-bigint", - "rustc-hash 2.1.1", -] - -[[package]] -name = "boa_engine" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" -dependencies = [ - "arrayvec", - "bitflags 2.10.0", - "boa_ast", - "boa_gc", - "boa_interner", - "boa_macros", - "boa_parser", - "boa_profiler", - "boa_string", - "bytemuck", - "cfg-if", - "dashmap 6.1.0", - "fast-float2", - "hashbrown 0.15.5", - "icu_normalizer 1.5.0", - "indexmap 2.12.0", - "intrusive-collections", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "num_enum", - "once_cell", - "pollster", - "portable-atomic", - "rand 0.8.5", - "regress", - "rustc-hash 2.1.1", - "ryu-js", - "serde", - "serde_json", - "sptr", - "static_assertions", - "tap", - "thin-vec", - "thiserror 2.0.17", - "time", -] - -[[package]] -name = "boa_gc" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2425c0b7720d42d73eaa6a883fbb77a5c920da8694964a3d79a67597ac55cce2" -dependencies = [ - "boa_macros", - "boa_profiler", - "boa_string", - "hashbrown 0.15.5", - "thin-vec", -] - -[[package]] -name = "boa_interner" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42407a3b724cfaecde8f7d4af566df4b56af32a2f11f0956f5570bb974e7f749" -dependencies = [ - "boa_gc", - "boa_macros", - "hashbrown 0.15.5", - "indexmap 2.12.0", - "once_cell", - "phf 0.11.3", - "rustc-hash 2.1.1", - "static_assertions", -] - -[[package]] -name = "boa_macros" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", - "synstructure", -] - -[[package]] -name = "boa_parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" -dependencies = [ - "bitflags 2.10.0", - "boa_ast", - "boa_interner", - "boa_macros", - "boa_profiler", - "fast-float2", - "icu_properties 1.5.1", - "num-bigint", - "num-traits", - "regress", - "rustc-hash 2.1.1", -] - -[[package]] -name = "boa_profiler" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4064908e7cdf9b6317179e9b04dcb27f1510c1c144aeab4d0394014f37a0f922" - -[[package]] -name = "boa_string" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7debc13fbf7997bf38bf8e9b20f1ad5e2a7d27a900e1f6039fe244ce30f589b5" -dependencies = [ - "fast-float2", - "paste", - "rustc-hash 2.1.1", - "sptr", - "static_assertions", -] - -[[package]] -name = "bon" -version = "3.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234655ec178edd82b891e262ea7cf71f6584bcd09eff94db786be23f1821825c" -dependencies = [ - "bon-macros", - "rustversion", -] - -[[package]] -name = "bon-macros" -version = "3.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ec27229c38ed0eb3c0feee3d2c1d6a4379ae44f418a29a658890e062d8f365" -dependencies = [ - "darling 0.21.3", - "ident_case", - "prettyplease", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.110", -] - [[package]] name = "borsh" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" dependencies = [ "borsh-derive", + "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] -[[package]] -name = "boxcar" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" - [[package]] name = "boyer-moore-magiclen" -version = "0.2.20" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e6233f2d926b5b123caf9d58e3885885255567fbe7776a7fdcae2a4d7241c4" +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", @@ -2722,9 +2279,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", @@ -2736,25 +2293,21 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "sha2 0.10.9", + "sha2", "tinyvec", ] [[package]] -name = "bstr" -version = "1.12.1" +name = "bumpalo" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" -dependencies = [ - "memchr", - "serde", -] +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] -name = "bumpalo" -version = "3.19.0" +name = "by_address" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "byte-slice-cast" @@ -2784,31 +2337,11 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "bytecount" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" - [[package]] name = "bytemuck" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", -] +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" [[package]] name = "byteorder" @@ -2818,9 +2351,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" dependencies = [ "serde", ] @@ -2835,11 +2368,21 @@ dependencies = [ "either", ] +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "c-kzg" -version = "2.1.5" +version = "2.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +checksum = "6648ed1e4ea8e8a1a4a2c78e1cda29a3fd500bc622899c340d8525ea9a76b24a" dependencies = [ "arbitrary", "blst", @@ -2853,55 +2396,37 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.1" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" dependencies = [ "serde_core", ] [[package]] name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.14.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +checksum = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba" dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.27", "serde", - "serde_json", + "serde_core", ] [[package]] name = "cargo_metadata" -version = "0.19.2" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ "camino", "cargo-platform", - "semver 1.0.27", + "semver 1.0.28", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] -[[package]] -name = "cassowary" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" - [[package]] name = "cast" version = "0.3.0" @@ -2919,13 +2444,14 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.15" +version = "1.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" dependencies = [ + "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -2957,9 +2483,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -3019,9 +2545,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.51" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -3029,78 +2555,56 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", - "terminal_size", - "unicase", - "unicode-width 0.2.0", -] - -[[package]] -name = "clap_complete" -version = "4.5.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "430b4dc2b5e3861848de79627b2bedc9f3342c7da5173a14eaa5d0f8dc18ae5d" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_complete_nushell" -version = "4.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685bc86fd34b7467e0532a4f8435ab107960d69a243785ef0275e571b35b641a" -dependencies = [ - "clap", - "clap_complete", ] [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" -version = "0.1.54" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] [[package]] name = "codspeed" -version = "4.1.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b847e05a34be5c38f3f2a5052178a3bd32e6b5702f3ea775efde95c483a539" +checksum = "57af92d1db7f6871b7e82c79cd87f2501db66f36b0eab924be6ea83dd6b2f3f3" dependencies = [ "anyhow", "cc", "colored 2.2.0", - "getrandom 0.2.16", + "getrandom 0.2.17", "glob", "libc", - "nix 0.30.1", + "nix 0.31.3", "serde", "serde_json", "statrs", @@ -3108,9 +2612,9 @@ dependencies = [ [[package]] name = "codspeed-criterion-compat" -version = "4.1.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a0e2a53beb18dec493ec133f226e0d35e8bb2fdc638ccf7351696eabee416c" +checksum = "1d31ae2e9ab23c29fa13bdfa06d012524176f5c0f4e25ec262cd829d947ebc5e" dependencies = [ "clap", "codspeed", @@ -3123,9 +2627,9 @@ dependencies = [ [[package]] name = "codspeed-criterion-compat-walltime" -version = "4.1.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f652d6e6d40bba0f5c244744db94d92a26b7f083df18692df88fb0772f1c793" +checksum = "cc8605e40bab5114dcb0f76268e18880082b5798dec10757b5b58d2c3bbc7a1c" dependencies = [ "anes", "cast", @@ -3162,7 +2666,7 @@ dependencies = [ "hmac", "k256", "serde", - "sha2 0.10.9", + "sha2", "thiserror 1.0.69", ] @@ -3176,9 +2680,9 @@ dependencies = [ "coins-bip32", "hmac", "once_cell", - "pbkdf2 0.12.2", - "rand 0.8.5", - "sha2 0.10.9", + "pbkdf2", + "rand 0.8.6", + "sha2", "thiserror 1.0.69", ] @@ -3196,34 +2700,11 @@ dependencies = [ "generic-array", "ripemd", "serde", - "sha2 0.10.9", + "sha2", "sha3", "thiserror 1.0.69", ] -[[package]] -name = "coins-ledger" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9bc0994d0aa0f4ade5f3a9baf4a8d936f250278c85a1124b401860454246ab" -dependencies = [ - "async-trait", - "byteorder", - "cfg-if", - "const-hex", - "getrandom 0.2.16", - "hidapi-rusb", - "js-sys", - "log", - "nix 0.26.4", - "once_cell", - "thiserror 1.0.69", - "tokio", - "tracing", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "color-eyre" version = "0.6.5" @@ -3253,9 +2734,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "colored" @@ -3264,7 +2745,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -3273,7 +2754,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -3288,20 +2769,20 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" +checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" dependencies = [ "crossterm 0.29.0", "unicode-segmentation", - "unicode-width 0.2.0", + "unicode-width", ] [[package]] name = "compact_str" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" dependencies = [ "castaway", "cfg-if", @@ -3313,9 +2794,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.32" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680dc087785c5230f8e8843e2e57ac7c1c90488b6a91b88caa265410568f441b" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ "brotli", "compression-core", @@ -3327,9 +2808,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.30" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9b614a5787ef0c8802a55766480563cb3a93b435898c422ed2a359cf811582" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] name = "concat-kdf" @@ -3358,71 +2839,18 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.0", + "unicode-width", "windows-sys 0.59.0", ] -[[package]] -name = "console" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width 0.2.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "console-api" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8599749b6667e2f0c910c1d0dff6901163ff698a52d5a39720f61b5be4b20d3" -dependencies = [ - "futures-core", - "prost 0.14.1", - "prost-types 0.14.1", - "tonic", - "tonic-prost", - "tracing-core", -] - -[[package]] -name = "console-subscriber" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4915b7d8dd960457a1b6c380114c2944f728e7c65294ab247ae6b6f1f37592" -dependencies = [ - "console-api", - "crossbeam-channel", - "crossbeam-utils", - "futures-task", - "hdrhistogram", - "humantime", - "hyper-util", - "prost 0.14.1", - "prost-types 0.14.1", - "serde", - "serde_json", - "thread_local", - "tokio", - "tokio-stream", - "tonic", - "tracing", - "tracing-core", - "tracing-subscriber 0.3.20", -] - [[package]] name = "const-hex" -version = "1.17.0" +version = "1.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "proptest", "serde_core", ] @@ -3441,11 +2869,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]] @@ -3459,11 +2888,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + [[package]] name = "convert_case" -version = "0.7.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ "unicode-segmentation", ] @@ -3494,15 +2929,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 = "cpp_demangle" version = "0.4.5" @@ -3522,19 +2948,28 @@ dependencies = [ ] [[package]] -name = "crc" -version = "3.3.0" +name = "cpufeatures" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ - "crc-catalog", + "libc", ] [[package]] -name = "crc-catalog" -version = "2.4.0" +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" @@ -3610,7 +3045,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "crossterm_winapi", "mio", "parking_lot 0.12.5", @@ -3626,11 +3061,15 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "crossterm_winapi", + "derive_more", "document-features", + "mio", "parking_lot 0.12.5", - "rustix 1.1.2", + "rustix 1.1.4", + "signal-hook", + "signal-hook-mio", "winapi", ] @@ -3688,7 +3127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", @@ -3705,7 +3144,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -3720,12 +3159,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -3739,22 +3178,21 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", "serde", "strsim", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -3765,58 +3203,47 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.21.3", + "darling_core 0.23.0", "quote", - "syn 2.0.110", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.12", + "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", "crossbeam-utils", "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core 0.9.12", + "serde", ] [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] name = "data-encoding-macro" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" +checksum = "3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -3824,19 +3251,19 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" +checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" dependencies = [ "data-encoding", - "syn 2.0.110", + "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 = "debugid" @@ -3844,7 +3271,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ - "uuid 1.18.1", + "uuid", ] [[package]] @@ -3871,11 +3298,10 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -3892,13 +3318,13 @@ dependencies = [ [[package]] name = "derive-where" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" +checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -3909,7 +3335,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -3930,7 +3356,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -3940,42 +3366,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.110", + "rustc_version 0.4.1", + "syn 2.0.118", "unicode-xid", ] -[[package]] -name = "dialoguer" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" -dependencies = [ - "console 0.16.2", - "shell-words", - "zeroize", -] - [[package]] name = "diff" version = "0.1.13" @@ -3997,21 +3413,12 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "const-oid", "crypto-common", "subtle", ] -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - [[package]] name = "dirs-next" version = "2.0.0" @@ -4022,18 +3429,6 @@ dependencies = [ "dirs-sys-next", ] -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.2", - "windows-sys 0.61.2", -] - [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -4041,15 +3436,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users 0.4.6", + "redox_users", "winapi", ] [[package]] name = "discv5" -version = "0.9.1" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b4e7798d2ff74e29cee344dc490af947ae657d6ab5273dde35d58ce06a4d71" +checksum = "4c7999df38d0bd8f688212e1a4fae31fd2fea6d218649b9cd7c40bf3ec1318fc" dependencies = [ "aes", "aes-gcm", @@ -4060,18 +3455,17 @@ dependencies = [ "enr", "fnv", "futures", - "hashlink 0.9.1", + "hashlink 0.11.1", "hex", "hkdf", "lazy_static", "libp2p-identity", - "lru 0.12.5", "more-asserts", "multiaddr", "parking_lot 0.12.5", - "rand 0.8.5", + "rand 0.8.6", "smallvec", - "socket2 0.5.10", + "socket2 0.6.4", "tokio", "tracing", "uint 0.10.0", @@ -4080,20 +3474,20 @@ 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.110", + "syn 2.0.118", ] [[package]] name = "doctest-file" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" +checksum = "c2db04e74f0a9a93103b50e90b96024c9b2bdca8bce6a632ec71b88736d3d359" [[package]] name = "document-features" @@ -4105,142 +3499,458 @@ dependencies = [ ] [[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +name = "dogeos-chainspec" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "serdect", - "signature", - "spki", + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-serde", + "derive_more", + "dogeos-hardforks", + "once_cell", + "reth-chainspec", + "reth-ethereum-forks", + "reth-network-peers", + "reth-primitives-traits", + "reth-trie-common", + "serde", + "serde_json", ] [[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +name = "dogeos-hardforks" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ - "pkcs8", - "signature", + "alloy-hardforks 0.4.7", + "auto_impl", + "serde", ] [[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +name = "dogeos-protocol-types" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "arbitrary", + "bytes", + "derive_more", + "modular-bitfield", + "reth-codecs", + "reth-codecs-derive", + "reth-primitives-traits", "serde", - "sha2 0.10.9", - "subtle", - "zeroize", + "serde_with", ] [[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +name = "dogeos-reth-consensus" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.110", + "alloy-consensus", + "alloy-primitives", + "dogeos-protocol-types", + "dogeos-reth-primitives", + "reth-consensus", + "reth-consensus-common", + "reth-execution-types", + "reth-primitives-traits", + "thiserror 2.0.18", ] [[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +name = "dogeos-reth-engine" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "dogeos-reth-primitives", + "reth-engine-primitives", + "reth-payload-primitives", + "reth-primitives-traits", "serde", + "sha2", ] [[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pem-rfc7468", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoder-standard" +name = "dogeos-reth-evm" version = "0.1.0" -source = "git+https://github.com/scroll-tech/da-codec#54929786434f00efd00431517a332f1ec8ca58d4" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ - "zstd", + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "derive_more", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-primitives", + "encoder-standard", + "reth-chainspec", + "reth-evm", + "reth-execution-types", + "reth-primitives-traits", + "reth-storage-errors", + "revm", + "revm-scroll", + "serde", ] [[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +name = "dogeos-reth-node" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ - "cfg-if", + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "clap", + "dogeos-chainspec", + "dogeos-reth-consensus", + "dogeos-reth-engine", + "dogeos-reth-evm", + "dogeos-reth-payload", + "dogeos-reth-primitives", + "dogeos-reth-rpc", + "dogeos-reth-txpool", + "dogeos-rpc-types", + "dogeos-scroll-wire", + "eyre", + "reqwest 0.13.4", + "reth-chainspec", + "reth-db-api", + "reth-engine-local", + "reth-engine-primitives", + "reth-evm", + "reth-network", + "reth-network-api", + "reth-node-builder", + "reth-node-types", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-rpc", + "reth-rpc-builder", + "reth-rpc-convert", + "reth-rpc-eth-api", + "reth-rpc-eth-types", + "reth-storage-api", + "reth-transaction-pool", + "thiserror 2.0.18", + "tokio", + "tracing", ] [[package]] -name = "enr" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851bd664a3d3a3c175cff92b2f0df02df3c541b4895d0ae307611827aae46152" +name = "dogeos-reth-payload" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" dependencies = [ - "alloy-rlp", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-reth-engine", + "dogeos-reth-evm", + "dogeos-reth-primitives", + "either", + "reth-basic-payload-builder", + "reth-chainspec", + "reth-errors", + "reth-evm", + "reth-execution-cache", + "reth-execution-types", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-revm", + "reth-storage-api", + "reth-transaction-pool", + "revm", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "dogeos-reth-primitives" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "arbitrary", + "bytes", + "dogeos-protocol-types", + "modular-bitfield", + "once_cell", + "reth-codecs", + "reth-primitives-traits", + "reth-zstd-compressors", + "serde", +] + +[[package]] +name = "dogeos-reth-rpc" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-client", + "alloy-rpc-types-debug", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-evm", + "dogeos-reth-primitives", + "dogeos-rpc-types", + "jsonrpsee", + "reqwest 0.13.4", + "reth-chainspec", + "reth-errors", + "reth-evm", + "reth-primitives-traits", + "reth-revm", + "reth-rpc", + "reth-rpc-convert", + "reth-rpc-eth-api", + "reth-rpc-eth-types", + "reth-storage-api", + "reth-tasks", + "revm", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "dogeos-reth-txpool" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "derive_more", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-evm", + "dogeos-reth-primitives", + "parking_lot 0.12.5", + "reth-chainspec", + "reth-evm", + "reth-primitives-traits", + "reth-revm", + "reth-storage-api", + "reth-storage-errors", + "reth-transaction-pool", + "revm-scroll", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "dogeos-rpc-types" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "derive_more", + "dogeos-protocol-types", + "reth-rpc-traits", + "serde", + "serde_json", +] + +[[package]] +name = "dogeos-scroll-wire" +version = "0.1.0" +source = "git+https://github.com/DogeOS69/dogeos-reth.git?rev=8f0b98b056111e8f497a4c6dd78ef1f776b626a5#8f0b98b056111e8f497a4c6dd78ef1f776b626a5" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "dogeos-reth-primitives", + "futures", + "reth-eth-wire", + "reth-network", + "reth-network-api", + "reth-primitives-traits", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +dependencies = [ + "serde", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoder-standard" +version = "0.1.0" +source = "git+https://github.com/scroll-tech/da-codec?rev=54929786434f00efd00431517a332f1ec8ca58d4#54929786434f00efd00431517a332f1ec8ca58d4" +dependencies = [ + "zstd", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "851bd664a3d3a3c175cff92b2f0df02df3c541b4895d0ae307611827aae46152" +dependencies = [ + "alloy-rlp", "base64 0.22.1", "bytes", "ed25519-dalek", "hex", "k256", "log", - "rand 0.8.5", + "rand 0.8.6", "secp256k1 0.30.0", "serde", "sha3", @@ -4256,27 +3966,27 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[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.110", + "syn 2.0.118", ] [[package]] @@ -4287,7 +3997,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -4307,7 +4017,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -4316,17 +4026,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - [[package]] name = "errno" version = "0.3.14" @@ -4337,15 +4036,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "version_check", -] - [[package]] name = "etcetera" version = "0.8.0" @@ -4358,43 +4048,21 @@ dependencies = [ ] [[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand 0.8.5", - "scrypt", - "serde", - "serde_json", - "sha2 0.10.9", - "sha3", - "thiserror 1.0.69", - "uuid 0.8.2", -] - -[[package]] -name = "ethereum_hashing" -version = "0.7.0" +name = "ethereum_hashing" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c853bd72c9e5787f8aafc3df2907c2ed03cff3150c3acd94e2e53a98ab70a8ab" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "ring", - "sha2 0.10.9", + "sha2", ] [[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", @@ -4418,6 +4086,21 @@ dependencies = [ "typenum", ] +[[package]] +name = "ethereum_ssz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e462875ad8693755ea8913d6e905715c76ea4836e2254e18c9cf0f7a8f8c2a13" +dependencies = [ + "alloy-primitives", + "ethereum_serde_utils", + "itertools 0.14.0", + "serde", + "serde_derive", + "smallvec", + "typenum", +] + [[package]] name = "ethereum_ssz_derive" version = "0.9.1" @@ -4427,7 +4110,19 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", +] + +[[package]] +name = "ethereum_ssz_derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf022360bdbe9456eda5f35718a50476d5b2a0d51a97ed4eae27420737a6fba" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] @@ -4451,6 +4146,17 @@ dependencies = [ "pin-project-lite", ] +[[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]] name = "eyre" version = "0.6.12" @@ -4462,16 +4168,16 @@ dependencies = [ ] [[package]] -name = "fast-float2" -version = "0.2.3" +name = "fast-srgb8" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" +checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "fastrlp" @@ -4516,728 +4222,150 @@ dependencies = [ ] [[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "figment" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" -dependencies = [ - "atomic", - "pear", - "serde", - "toml 0.8.23", - "uncased", - "version_check", -] - -[[package]] -name = "filetime" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.60.2", -] - -[[package]] -name = "findshlibs" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" -dependencies = [ - "cc", - "lazy_static", - "libc", - "winapi", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" -dependencies = [ - "crc32fast", - "libz-rs-sys", - "miniz_oxide", -] - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "forge-script-sequence" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-network", - "alloy-primitives", - "eyre", - "foundry-common", - "foundry-compilers", - "foundry-config", - "revm-inspectors 0.30.1", - "serde", - "serde_json", - "walkdir", -] - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "foundry-block-explorers" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff814624bb21bfe43b70fb736ab39527b405d04cdc94d90b7e182fba28b25ec7" -dependencies = [ - "alloy-chains", - "alloy-json-abi", - "alloy-primitives", - "foundry-compilers", - "reqwest", - "semver 1.0.27", - "serde", - "serde_json", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "foundry-cheatcodes" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-dyn-abi", - "alloy-ens", - "alloy-evm 0.21.3", - "alloy-genesis", - "alloy-json-abi", - "alloy-network", - "alloy-primitives", - "alloy-provider", - "alloy-rlp", - "alloy-rpc-types", - "alloy-signer", - "alloy-signer-local", - "alloy-sol-types", - "base64 0.22.1", - "dialoguer", - "ecdsa", - "eyre", - "forge-script-sequence", - "foundry-cheatcodes-spec", - "foundry-common", - "foundry-compilers", - "foundry-config", - "foundry-evm-core", - "foundry-evm-fuzz", - "foundry-evm-traces", - "foundry-wallets", - "itertools 0.14.0", - "jsonpath_lib", - "k256", - "memchr", - "p256", - "parking_lot 0.12.5", - "proptest", - "rand 0.9.2", - "revm 29.0.1", - "revm-inspectors 0.30.1", - "semver 1.0.27", - "serde", - "serde_json", - "solar-compiler", - "thiserror 2.0.17", - "toml 0.9.8", - "tracing", - "walkdir", -] - -[[package]] -name = "foundry-cheatcodes-spec" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-sol-types", - "foundry-macros", - "serde", -] - -[[package]] -name = "foundry-cli" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-chains", - "alloy-dyn-abi", - "alloy-eips", - "alloy-ens", - "alloy-json-abi", - "alloy-primitives", - "alloy-provider", - "alloy-rlp", - "cfg-if", - "clap", - "clap_complete", - "clap_complete_nushell", - "color-eyre", - "dotenvy", - "dunce", - "eyre", - "foundry-block-explorers", - "foundry-common", - "foundry-compilers", - "foundry-config", - "foundry-evm", - "foundry-wallets", - "futures", - "indicatif 0.18.3", - "itertools 0.14.0", - "path-slash", - "rayon", - "regex", - "rustls 0.23.31", - "serde", - "serde_json", - "solar-compiler", - "strsim", - "strum 0.27.2", - "tokio", - "tracing", - "tracing-subscriber 0.3.20", - "yansi", -] - -[[package]] -name = "foundry-common" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-dyn-abi", - "alloy-eips", - "alloy-json-abi", - "alloy-json-rpc", - "alloy-network", - "alloy-primitives", - "alloy-provider", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-serde", - "alloy-sol-types", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "anstream", - "anstyle", - "chrono", - "ciborium", - "clap", - "comfy-table", - "dunce", - "eyre", - "flate2", - "foundry-block-explorers", - "foundry-common-fmt", - "foundry-compilers", - "itertools 0.14.0", - "jiff", - "num-format", - "path-slash", - "regex", - "reqwest", - "revm 29.0.1", - "semver 1.0.27", - "serde", - "serde_json", - "solar-compiler", - "thiserror 2.0.17", - "tokio", - "tower", - "tracing", - "url", - "vergen 8.3.2", - "walkdir", - "yansi", -] - -[[package]] -name = "foundry-common-fmt" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-network", - "alloy-primitives", - "alloy-rpc-types", - "alloy-serde", - "chrono", - "eyre", - "revm 29.0.1", - "serde", - "serde_json", - "yansi", -] - -[[package]] -name = "foundry-compilers" -version = "0.19.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e639f98fe54d1cc0011a4bdb2eb1d838b379c9f004991ae7555a4cc09e8da32a" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "auto_impl", - "derive_more", - "dyn-clone", - "foundry-compilers-artifacts", - "foundry-compilers-core", - "itertools 0.14.0", - "path-slash", - "rayon", - "semver 1.0.27", - "serde", - "serde_json", - "sha2 0.10.9", - "solar-compiler", - "svm-rs", - "svm-rs-builds", - "thiserror 2.0.17", - "tracing", - "winnow", - "yansi", -] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] -name = "foundry-compilers-artifacts" -version = "0.19.14" +name = "filetime" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ec96df20055211f4e46b5a61fa479b2ea7d1ce0659818e0359afadfcded8d2" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" dependencies = [ - "foundry-compilers-artifacts-solc", - "foundry-compilers-artifacts-vyper", + "cfg-if", + "libc", ] [[package]] -name = "foundry-compilers-artifacts-solc" -version = "0.19.14" +name = "find-msvc-tools" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a206e475b5dd1a77dc33cd917cde4846148f5136729a24edb3a16ab431b90a" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "foundry-compilers-core", - "memchr", - "path-slash", - "rayon", - "regex", - "semver 1.0.27", - "serde", - "serde_json", - "thiserror 2.0.17", - "tracing", - "yansi", -] +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] -name = "foundry-compilers-artifacts-vyper" -version = "0.19.14" +name = "findshlibs" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f74883db8036522fa21d0853c21ac318e165ec88e141f1ef1d6f7b4dfa841ff7" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "foundry-compilers-artifacts-solc", - "foundry-compilers-core", - "path-slash", - "semver 1.0.27", - "serde", + "cc", + "lazy_static", + "libc", + "winapi", ] [[package]] -name = "foundry-compilers-core" -version = "0.19.14" +name = "fixed-cache" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab384daeaea5c33cad8c3c094a1eb6f98e70922e18380c660980c74c19e362b" +checksum = "2fe63500644ef0269fe6b744e7e5dc5c20b5eebf3d881bc2be53f194636f6583" dependencies = [ - "alloy-primitives", - "cfg-if", - "dunce", - "path-slash", - "regex", - "semver 1.0.27", - "serde", - "serde_json", - "svm-rs", - "thiserror 2.0.17", - "tokio", - "walkdir", - "xxhash-rust", + "equivalent", + "rapidhash", + "typeid", ] [[package]] -name = "foundry-config" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ - "alloy-chains", - "alloy-primitives", - "clap", - "dirs", - "dunce", - "eyre", - "figment", - "foundry-block-explorers", - "foundry-compilers", - "foundry-evm-networks", - "glob", - "globset", - "heck 0.5.0", - "itertools 0.14.0", - "mesc", - "number_prefix", - "path-slash", - "rayon", - "regex", - "reqwest", - "revm 29.0.1", - "semver 1.0.27", - "serde", - "serde_json", - "solar-compiler", - "soldeer-core", - "thiserror 2.0.17", - "toml 0.9.8", - "toml_edit 0.23.7", - "tracing", - "walkdir", - "yansi", + "byteorder", + "rand 0.8.6", + "rustc-hex", + "static_assertions", ] [[package]] -name = "foundry-evm" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" +name = "fixed-map" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ed19add84e8cb9e8cc5f7074de0324247149ffef0b851e215fb0edc50c229b" dependencies = [ - "alloy-dyn-abi", - "alloy-evm 0.21.3", - "alloy-json-abi", - "alloy-primitives", - "alloy-rpc-types", - "alloy-sol-types", - "eyre", - "foundry-cheatcodes", - "foundry-common", - "foundry-compilers", - "foundry-config", - "foundry-evm-core", - "foundry-evm-coverage", - "foundry-evm-fuzz", - "foundry-evm-networks", - "foundry-evm-traces", - "indicatif 0.18.3", - "parking_lot 0.12.5", - "proptest", - "revm 29.0.1", - "revm-inspectors 0.30.1", + "fixed-map-derive", "serde", - "serde_json", - "solar-compiler", - "thiserror 2.0.17", - "tracing", - "uuid 1.18.1", ] [[package]] -name = "foundry-evm-abi" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" +name = "fixed-map-derive" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dc7a9cb3326bafb80642c5ce99b39a2c0702d4bfa8ee8a3e773791a6cbe2407" dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "derive_more", - "foundry-common-fmt", - "foundry-macros", - "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "foundry-evm-core" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-dyn-abi", - "alloy-evm 0.21.3", - "alloy-genesis", - "alloy-hardforks 0.3.5", - "alloy-json-abi", - "alloy-network", - "alloy-op-evm", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types", - "alloy-sol-types", - "auto_impl", - "eyre", - "foundry-cheatcodes-spec", - "foundry-common", - "foundry-config", - "foundry-evm-abi", - "foundry-evm-networks", - "foundry-fork-db", - "futures", - "itertools 0.14.0", - "op-revm 10.1.1", - "parking_lot 0.12.5", - "revm 29.0.1", - "revm-inspectors 0.30.1", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tracing", - "url", -] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] -name = "foundry-evm-coverage" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ - "alloy-primitives", - "eyre", - "foundry-common", - "foundry-compilers", - "foundry-evm-core", - "rayon", - "revm 29.0.1", - "semver 1.0.27", - "solar-compiler", - "tracing", + "crc32fast", + "miniz_oxide", ] [[package]] -name = "foundry-evm-fuzz" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "eyre", - "foundry-common", - "foundry-compilers", - "foundry-config", - "foundry-evm-core", - "foundry-evm-coverage", - "foundry-evm-traces", - "itertools 0.14.0", - "parking_lot 0.12.5", - "proptest", - "rand 0.9.2", - "revm 29.0.1", - "serde", - "thiserror 2.0.17", - "tracing", + "futures-core", + "futures-sink", + "spin 0.9.8", ] [[package]] -name = "foundry-evm-networks" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-chains", - "alloy-evm 0.21.3", - "alloy-primitives", - "clap", - "revm 29.0.1", - "serde", -] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "foundry-evm-traces" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-types", - "eyre", - "foundry-block-explorers", - "foundry-common", - "foundry-compilers", - "foundry-config", - "foundry-evm-core", - "foundry-linking", - "futures", - "itertools 0.14.0", - "memchr", - "rayon", - "revm 29.0.1", - "revm-inspectors 0.30.1", - "serde", - "serde_json", - "solar-compiler", - "tempfile", - "tokio", - "tracing", - "yansi", -] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "foundry-fork-db" -version = "0.18.1" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5c6930a2357571fef2ca1e71bbb27be83e86bc78d9ead064c9889bdb268501e" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-hardforks 0.3.5", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types", - "eyre", - "futures", - "parking_lot 0.12.5", - "revm 29.0.1", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tracing", - "url", -] +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] -name = "foundry-linking" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "alloy-primitives", - "foundry-compilers", - "rayon", - "semver 1.0.27", - "thiserror 2.0.17", + "foreign-types-shared", ] [[package]] -name = "foundry-macros" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.110", -] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] -name = "foundry-wallets" -version = "1.4.2" -source = "git+https://github.com/foundry-rs/foundry.git?rev=2c84e1c970d11ef5023a77d8002a1cb70b143888#2c84e1c970d11ef5023a77d8002a1cb70b143888" +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "alloy-signer-ledger", - "alloy-signer-local", - "alloy-signer-trezor", - "alloy-sol-types", - "async-trait", - "clap", - "derive_builder", - "eth-keystore", - "eyre", - "foundry-config", - "rpassword", - "serde", - "thiserror 2.0.17", - "tracing", + "percent-encoding", ] [[package]] @@ -5263,9 +4391,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -5278,9 +4406,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -5288,15 +4416,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -5316,48 +4444,48 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +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]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -5367,23 +4495,36 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - +[[package]] +name = "futures-utils-wasm" +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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "serde", "typenum", "version_check", "zeroize", @@ -5391,9 +4532,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -5411,11 +4552,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + [[package]] name = "ghash" version = "0.5.1" @@ -5434,11 +4586,11 @@ checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git2" -version = "0.20.2" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "libc", "libgit2-sys", "log", @@ -5451,19 +4603,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" -[[package]] -name = "globset" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", -] - [[package]] name = "gloo-net" version = "0.6.0" @@ -5474,7 +4613,7 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http 1.3.1", + "http 1.4.2", "js-sys", "pin-project", "serde", @@ -5487,9 +4626,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", @@ -5510,16 +4649,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "gmp-mpfr-sys" -version = "1.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60f8970a75c006bb2f8ae79c6768a116dd215fa8346a87aed99bf9d82ca43394" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - [[package]] name = "group" version = "0.13.0" @@ -5543,7 +4672,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.12.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -5552,17 +4681,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.12.0", + "http 1.4.2", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -5586,6 +4715,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" @@ -5606,9 +4741,6 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.12", -] [[package]] name = "hashbrown" @@ -5623,23 +4755,26 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", "foldhash 0.2.0", "serde", + "serde_core", ] [[package]] -name = "hashlink" -version = "0.9.1" +name = "hashbrown" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ - "hashbrown 0.14.5", + "allocator-api2", + "equivalent", + "foldhash 0.2.0", ] [[package]] @@ -5651,16 +4786,22 @@ dependencies = [ "hashbrown 0.15.5", ] +[[package]] +name = "hashlink" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" +dependencies = [ + "hashbrown 0.16.1", +] + [[package]] name = "hdrhistogram" version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.21.7", "byteorder", - "flate2", - "nom", "num-traits", ] @@ -5690,9 +4831,18 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hex-conservative" -version = "0.2.1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex-conservative" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +checksum = "830e599c2904b08f0834ee6337d8fe8f0ed4a63b5d9e7a7f49c0ffa06d08d360" dependencies = [ "arrayvec", ] @@ -5713,10 +4863,10 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "ring", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tokio", "tracing", @@ -5736,27 +4886,15 @@ dependencies = [ "moka", "once_cell", "parking_lot 0.12.5", - "rand 0.9.2", + "rand 0.9.4", "resolv-conf", "serde", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] -[[package]] -name = "hidapi-rusb" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efdc2ec354929a6e8f3c6b6923a4d97427ec2f764cfee8cd4bfe890946cdf08b" -dependencies = [ - "cc", - "libc", - "pkg-config", - "rusb", -] - [[package]] name = "hkdf" version = "0.12.4" @@ -5797,12 +4935,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -5824,7 +4961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http 1.4.2", ] [[package]] @@ -5835,7 +4972,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "pin-project-lite", ] @@ -5866,9 +5003,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" @@ -5906,22 +5043,21 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.12", - "http 1.3.1", + "h2 0.4.15", + "http 1.4.2", "http-body 1.0.1", "httparse", "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -5938,28 +5074,25 @@ dependencies = [ "hyper 0.14.32", "log", "rustls 0.21.12", - "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] [[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 1.3.1", - "hyper 1.8.1", + "http 1.4.2", + "hyper 1.10.1", "hyper-util", "log", - "rustls 0.23.31", - "rustls-native-certs 0.8.2", - "rustls-pki-types", + "rustls 0.23.41", + "rustls-native-certs", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.4", ] [[package]] @@ -5968,7 +5101,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.8.1", + "hyper 1.10.1", "hyper-util", "pin-project-lite", "tokio", @@ -5983,7 +5116,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.8.1", + "hyper 1.10.1", "hyper-util", "native-tls", "tokio", @@ -5993,23 +5126,22 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", - "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", - "hyper 1.8.1", + "hyper 1.10.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.5.10", "system-configuration", "tokio", "tower-service", @@ -6019,9 +5151,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -6029,7 +5161,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core", ] [[package]] @@ -6043,201 +5175,89 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", "potential_utf", - "yoke 0.8.1", + "yoke", "zerofrom", - "zerovec 0.11.5", + "zerovec", ] [[package]] name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap 0.8.1", - "tinystr 0.8.2", - "writeable 0.6.2", - "zerovec 0.11.5", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap 0.7.5", - "tinystr 0.7.6", - "writeable 0.5.5", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", ] -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "8b24a59706036ba941c9476a55cd57b82b77f38a3c667d637ee7cabbc85eaedc" dependencies = [ "displaydoc", - "icu_collections 1.5.0", - "icu_normalizer_data 1.5.1", - "icu_properties 1.5.1", - "icu_provider 1.5.0", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections 2.1.1", - "icu_normalizer_data 2.1.1", - "icu_properties 2.1.1", - "icu_provider 2.1.1", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", "smallvec", - "zerovec 0.11.5", + "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "f5a97b8ac6235e69506e8dacfb2adf38461d2ce6d3e9bd9c94c4cbc3cd4400a4" dependencies = [ "displaydoc", - "icu_collections 1.5.0", - "icu_locid_transform", - "icu_properties_data 1.5.1", - "icu_provider 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_properties" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" -dependencies = [ - "icu_collections 2.1.1", + "icu_collections", "icu_locale_core", - "icu_properties_data 2.1.1", - "icu_provider 2.1.1", + "icu_properties_data", + "icu_provider", + "potential_utf", "zerotrie", - "zerovec 0.11.5", + "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" - -[[package]] -name = "icu_properties_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" - -[[package]] -name = "icu_provider" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr 0.7.6", - "writeable 0.5.5", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", - "writeable 0.6.2", - "yoke 0.8.1", + "serde", + "stable_deref_trait", + "writeable", + "yoke", "zerofrom", "zerotrie", - "zerovec 0.11.5", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", + "zerovec", ] [[package]] @@ -6263,36 +5283,20 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "icu_normalizer 2.1.1", - "icu_properties 2.1.1", + "icu_normalizer", + "icu_properties", ] [[package]] name = "if-addrs" -version = "0.13.4" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b2eeee38fef3aa9b4cc5f1beea8a2444fc00e7377cafae396de3f5c2065e24" +checksum = "bf39cc0423ee66021dc5eccface85580e4a001e0c5288bae8bea7ecb69225e90" dependencies = [ "libc", "windows-sys 0.59.0", ] -[[package]] -name = "ignore" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata", - "same-file", - "walkdir", - "winapi-util", -] - [[package]] name = "impl-codec" version = "0.6.0" @@ -6310,7 +5314,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -6338,12 +5342,6 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" -[[package]] -name = "index_vec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44faf5bb8861a9c72e20d3fb0fdbd59233e43056e2b80475ab0aacdc2e781355" - [[package]] name = "indexmap" version = "1.9.3" @@ -6357,13 +5355,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.17.1", "serde", "serde_core", ] @@ -6374,23 +5372,10 @@ version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ - "console 0.15.11", + "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", - "web-time", -] - -[[package]] -name = "indicatif" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" -dependencies = [ - "console 0.16.2", - "portable-atomic", - "unicode-width 0.2.0", - "unit-prefix", + "unicode-width", "web-time", ] @@ -6410,7 +5395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash 0.8.12", - "indexmap 2.12.0", + "indexmap 2.14.0", "is-terminal", "itoa", "log", @@ -6429,31 +5414,25 @@ checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] -[[package]] -name = "inlinable_string" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" - [[package]] name = "inotify" -version = "0.11.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +checksum = "533e68a5842e734946fe159fb03fc9bbbb254f590dd0d8ad321ae5ff7beca2c1" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "inotify-sys", "libc", ] [[package]] name = "inotify-sys" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "9ea94e891b3606826e9c998be69ddca42247dad8ad50b1649a5cb7e1c9ae06fd" dependencies = [ "libc", ] @@ -6470,15 +5449,15 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.9" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" +checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" dependencies = [ - "darling 0.20.11", + "darling 0.23.0", "indoc", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -6495,9 +5474,9 @@ dependencies = [ [[package]] name = "interprocess" -version = "2.2.3" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +checksum = "069323743400cb7ab06a8fe5c1ed911d36b6919ec531661d034c89083629595b" dependencies = [ "doctest-file", "futures-core", @@ -6505,58 +5484,27 @@ dependencies = [ "recvmsg", "tokio", "widestring", - "windows-sys 0.52.0", -] - -[[package]] -name = "intrusive-collections" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" -dependencies = [ - "memoffset 0.9.1", -] - -[[package]] -name = "inturn" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2efbe120e37f17bb33fcdc82bc1c65087242608be37ace3cf7ebf49f3164e37" -dependencies = [ - "boxcar", - "bumpalo", - "dashmap 6.1.0", - "hashbrown 0.14.5", - "thread_local", + "windows-sys 0.61.2", ] [[package]] name = "ipconfig" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" dependencies = [ - "socket2 0.5.10", + "socket2 0.6.4", "widestring", - "windows-sys 0.48.0", - "winreg", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", ] [[package]] name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" -dependencies = [ - "memchr", - "serde", -] +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "is-terminal" @@ -6613,55 +5561,83 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "jiff" -version = "0.2.18" +name = "jni" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ - "jiff-static", + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", "log", - "portable-atomic", - "portable-atomic-util", - "serde_core", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "jiff-static" -version = "0.2.18" +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 = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "rustc_version 0.4.1", + "simd_cesu8", + "syn 2.0.118", ] [[package]] -name = "jni" -version = "0.21.1" +name = "jni-sys" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", + "jni-sys 0.4.1", ] [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.118", +] [[package]] name = "jobserver" @@ -6675,25 +5651,15 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] -[[package]] -name = "jsonpath_lib" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" -dependencies = [ - "log", - "serde", - "serde_json", -] - [[package]] name = "jsonrpsee" version = "0.26.0" @@ -6722,14 +5688,14 @@ dependencies = [ "futures-channel", "futures-util", "gloo-net", - "http 1.3.1", + "http 1.4.2", "jsonrpsee-core", "pin-project", - "rustls 0.23.31", + "rustls 0.23.41", "rustls-pki-types", - "rustls-platform-verifier", + "rustls-platform-verifier 0.5.3", "soketto", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-rustls 0.26.4", "tokio-util", @@ -6747,17 +5713,17 @@ dependencies = [ "bytes", "futures-timer", "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "http-body-util", "jsonrpsee-types", "parking_lot 0.12.5", "pin-project", - "rand 0.9.2", - "rustc-hash 2.1.1", + "rand 0.9.4", + "rustc-hash", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tower", @@ -6773,16 +5739,16 @@ checksum = "790bedefcec85321e007ff3af84b4e417540d5c87b3c9779b9e247d1bcc3dab8" dependencies = [ "base64 0.22.1", "http-body 1.0.1", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.10.1", + "hyper-rustls 0.27.9", "hyper-util", "jsonrpsee-core", "jsonrpsee-types", - "rustls 0.23.31", - "rustls-platform-verifier", + "rustls 0.23.41", + "rustls-platform-verifier 0.5.3", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tower", "url", @@ -6798,7 +5764,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -6808,10 +5774,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c51b7c290bb68ce3af2d029648148403863b982f138484a73f02a9dd52dbd7f" dependencies = [ "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.10.1", "hyper-util", "jsonrpsee-core", "jsonrpsee-types", @@ -6820,7 +5786,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -6834,10 +5800,10 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" dependencies = [ - "http 1.3.1", + "http 1.4.2", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -6858,7 +5824,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6fceceeb05301cc4c065ab3bd2fa990d41ff4eb44e4ca1b30fa99c057c3e79" dependencies = [ - "http 1.3.1", + "http 1.4.2", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", @@ -6892,34 +5858,60 @@ dependencies = [ "elliptic-curve", "once_cell", "serdect", - "sha2 0.10.9", + "sha2", "signature", ] +[[package]] +name = "kasuari" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" +dependencies = [ + "hashbrown 0.16.1", + "portable-atomic", + "thiserror 2.0.18", +] + [[package]] name = "keccak" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] name = "keccak-asm" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +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", @@ -6927,11 +5919,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 2.13.0", "libc", ] @@ -6945,22 +5937,27 @@ dependencies = [ ] [[package]] -name = "lazycell" -version = "1.3.0" +name = "left-right" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "0f0c21e4c8ff95f487fb34e6f9182875f42c84cef966d29216bf115d9bba835a" +dependencies = [ + "crossbeam-utils", + "loom", + "slab", +] [[package]] name = "libc" -version = "0.2.177" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libgit2-sys" -version = "0.18.2+1.9.1" +version = "0.18.5+1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +checksum = "005d6ae6eac1912906073e069f7db60b1fa98e052a68227824afe3e3a1c59ca2" dependencies = [ "cc", "libc", @@ -6980,15 +5977,15 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libp2p-identity" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" +checksum = "9525f3831544f7ae497bde79adf114ef127b0fbbb97edbbf692a80408636421c" dependencies = [ "asn1_der", "bs58", @@ -6996,9 +5993,9 @@ dependencies = [ "hkdf", "k256", "multihash", - "quick-protobuf", - "sha2 0.10.9", - "thiserror 2.0.17", + "prost 0.14.4", + "sha2", + "thiserror 2.0.18", "tracing", "zeroize", ] @@ -7009,66 +6006,36 @@ version = "0.14.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a54ad7278b8bc5301d5ffd2a94251c004feb971feba96c971ea4063645990757" dependencies = [ - "bindgen 0.72.1", + "bindgen", "errno", "libc", ] [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "libc", - "redox_syscall 0.5.18", -] - -[[package]] -name = "libsecp256k1" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" -dependencies = [ - "arrayref", - "base64 0.22.1", - "digest 0.9.0", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.8.5", - "serde", - "sha2 0.9.9", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", + "plain", + "redox_syscall 0.9.0", ] [[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" +name = "librocksdb-sys" +version = "0.17.3+10.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +checksum = "cef2a00ee60fe526157c9023edab23943fae1ce2ab6f4abb2a807c1746835de9" dependencies = [ - "libsecp256k1-core", + "bindgen", + "bzip2-sys", + "cc", + "libc", + "libz-sys", + "lz4-sys", + "zstd-sys", ] [[package]] @@ -7083,10 +6050,10 @@ dependencies = [ ] [[package]] -name = "libusb1-sys" -version = "0.7.0" +name = "libz-sys" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da050ade7ac4ff1ba5379af847a10a10a8e284181e060105bf8d86960ce9ce0f" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -7095,24 +6062,12 @@ dependencies = [ ] [[package]] -name = "libz-rs-sys" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10501e7805cee23da17c7790e59df2870c0d4043ec6d03f67d31e2b53e77415" -dependencies = [ - "zlib-rs", -] - -[[package]] -name = "libz-sys" -version = "1.1.23" +name = "line-clipping" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "bitflags 2.13.0", ] [[package]] @@ -7139,21 +6094,15 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.7.5" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" @@ -7173,29 +6122,48 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "loom" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" dependencies = [ - "value-bag", + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber 0.3.23", ] [[package]] name = "lru" -version = "0.12.5" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ "hashbrown 0.15.5", ] [[package]] name = "lru" -version = "0.13.0" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", +] + +[[package]] +name = "lru" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +dependencies = [ + "hashbrown 0.17.1", ] [[package]] @@ -7225,9 +6193,20 @@ dependencies = [ [[package]] name = "lz4_flex" -version = "0.11.5" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90071f8077f8e40adfc4b7fe9cd495ce316263f19e75c2211eeff3fdf475a3d9" + +[[package]] +name = "mac_address" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" +checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" +dependencies = [ + "nix 0.29.0", + "serde", + "winapi", +] [[package]] name = "mach2" @@ -7238,6 +6217,12 @@ dependencies = [ "libc", ] +[[package]] +name = "mach2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" + [[package]] name = "macro-string" version = "0.1.4" @@ -7246,18 +6231,18 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "match-lookup" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" +checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.118", ] [[package]] @@ -7269,12 +6254,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - [[package]] name = "md-5" version = "0.10.6" @@ -7287,28 +6266,19 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "memmap2" -version = "0.9.9" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -7318,82 +6288,72 @@ dependencies = [ "autocfg", ] -[[package]] -name = "mesc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04b0347d2799ef17df4623dbcb03531031142105168e0c549e0bf1f980e9e7e" -dependencies = [ - "serde", - "serde_json", - "thiserror 1.0.69", -] - [[package]] name = "metrics" -version = "0.24.2" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dea7ac8057892855ec285c440160265225438c3c45072613c25a4b26e98ef5" +checksum = "89550ee9f79e88fef3119de263694973a8adb26c21d75322164fb8c493039fe2" dependencies = [ - "ahash 0.8.12", "portable-atomic", + "rapidhash", ] [[package]] name = "metrics-derive" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3dbdd96ed57d565ec744cba02862d707acf373c5772d152abae6ec5c4e24f6c" +checksum = "161ab904c2c62e7bda0f7562bf22f96440ca35ff79e66c800cbac298f2f4f5ec" dependencies = [ "proc-macro2", "quote", - "regex", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.16.2" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7399781913e5393588a8d8c6a2867bf85fb38eaf2502fdce465aad2dc6f034" +checksum = "1db0d8f1fc9e62caebd0319e11eaec5822b0186c171568f0480b46a0137f9108" dependencies = [ "base64 0.22.1", - "indexmap 2.12.0", + "evmap", + "indexmap 2.14.0", "metrics", "metrics-util", "quanta", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "metrics-process" -version = "2.4.2" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f615e08e049bd14a44c4425415782efb9bcd479fc1e19ddeb971509074c060d0" +checksum = "4268d87f64a752f5a651314fc683f04da10be65701ea3e721ba4d74f79163cac" dependencies = [ "libc", "libproc", - "mach2", + "mach2 0.6.0", "metrics", "once_cell", - "procfs 0.18.0", + "procfs", "rlimit", - "windows 0.62.2", + "windows", ] [[package]] name = "metrics-util" -version = "0.19.1" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8496cc523d1f94c1385dd8f0f0c2c480b2b8aeccb5b7e4485ad6365523ae376" +checksum = "96f8722f8562635f92f8ed992f26df0532266eb03d5202607c20c0d7e9745e13" dependencies = [ "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "metrics", "quanta", - "rand 0.9.2", + "rand 0.9.4", "rand_xoshiro", + "rapidhash", "sketches-ddsketch", ] @@ -7413,21 +6373,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "mini-moka" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" -dependencies = [ - "crossbeam-channel", - "crossbeam-utils", - "dashmap 5.5.3", - "skeptic", - "smallvec", - "tagptr", - "triomphe", -] - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -7446,9 +6391,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "log", @@ -7458,9 +6403,9 @@ dependencies = [ [[package]] name = "modular-bitfield" -version = "0.11.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +checksum = "2956e537fc68236d2aa048f55704f231cc93f1c4de42fe1ecb5bd7938061fc4a" dependencies = [ "modular-bitfield-impl", "static_assertions", @@ -7468,20 +6413,20 @@ dependencies = [ [[package]] name = "modular-bitfield-impl" -version = "0.11.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +checksum = "59b43b4fd69e3437618106f7754f34021b831a514f9e1a98ae863cabcd8d8dad" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.118", ] [[package]] name = "moka" -version = "0.12.11" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ "async-lock", "crossbeam-channel", @@ -7492,10 +6437,9 @@ dependencies = [ "futures-util", "parking_lot 0.12.5", "portable-atomic", - "rustc_version 0.4.1", "smallvec", "tagptr", - "uuid 1.18.1", + "uuid", ] [[package]] @@ -7525,23 +6469,23 @@ 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", ] @@ -7553,9 +6497,9 @@ checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", @@ -7563,7 +6507,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework 2.11.1", + "security-framework", "security-framework-sys", "tempfile", ] @@ -7572,22 +6516,33 @@ dependencies = [ name = "nix" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.13.0", "cfg-if", + "cfg_aliases", "libc", - "memoffset 0.7.1", - "pin-utils", + "memoffset", ] [[package]] name = "nix" -version = "0.30.1" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "cfg-if", "cfg_aliases", "libc", @@ -7603,19 +6558,13 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "normalize-path" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5438dd2b2ff4c6df6e1ce22d825ed2fa93ee2922235cc45186991717f0a892d" - [[package]] name = "notify" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "fsevent-sys", "inotify", "kqueue", @@ -7629,15 +6578,18 @@ dependencies = [ [[package]] name = "notify-types" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" +dependencies = [ + "bitflags 2.13.0", +] [[package]] name = "ntapi" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" dependencies = [ "winapi", ] @@ -7667,13 +6619,12 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c863e9ab5e7bf9c99ba75e1050f1e4d624ae87ed3532d6238ffbdc7b585dbbe6" dependencies = [ "num-integer", "num-traits", - "serde", ] [[package]] @@ -7687,7 +6638,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] @@ -7703,9 +6654,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-format" @@ -7770,9 +6721,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -7780,14 +6731,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -7807,9 +6758,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "nybbles" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4b5ecbd0beec843101bffe848217f770e8b8da81d8355b7d6e226f2199b3dc" +checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" dependencies = [ "alloy-rlp", "arbitrary", @@ -7820,6 +6771,25 @@ dependencies = [ "smallvec", ] +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", +] + [[package]] name = "object" version = "0.37.3" @@ -7831,9 +6801,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" dependencies = [ "critical-section", "portable-atomic", @@ -7845,84 +6815,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" -[[package]] -name = "once_map" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29eefd5038c9eee9e788d90966d6b5578dd3f88363a91edaec117a7ae0adc2d5" -dependencies = [ - "ahash 0.8.12", - "hashbrown 0.16.0", - "parking_lot 0.12.5", - "stable_deref_trait", -] - [[package]] name = "oorandom" version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" -[[package]] -name = "op-alloy-consensus" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a501241474c3118833d6195312ae7eb7cc90bbb0d5f524cbb0b06619e49ff67" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "arbitrary", - "derive_more", - "serde", - "serde_with", - "thiserror 2.0.17", -] - -[[package]] -name = "op-alloy-rpc-types-engine" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e50c94013a1d036a529df259151991dbbd6cf8dc215e3b68b784f95eec60e6" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-engine", - "alloy-serde", - "derive_more", - "ethereum_ssz", - "ethereum_ssz_derive", - "op-alloy-consensus", - "serde", - "snap", - "thiserror 2.0.17", -] - -[[package]] -name = "op-revm" -version = "10.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826f43a5b1613c224f561847c152bfbaefcb593a9ae2c612ff4dc4661c6e625f" -dependencies = [ - "auto_impl", - "revm 29.0.1", - "serde", -] - -[[package]] -name = "op-revm" -version = "11.1.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" -dependencies = [ - "auto_impl", - "revm 30.1.1", - "serde", -] - [[package]] name = "opaque-debug" version = "0.3.1" @@ -7931,15 +6829,14 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "cfg-if", "foreign-types", "libc", - "once_cell", "openssl-macros", "openssl-sys", ] @@ -7952,20 +6849,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -7974,10 +6871,84 @@ dependencies = [ ] [[package]] -name = "option-ext" -version = "0.2.0" +name = "opentelemetry" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "opentelemetry-http" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +dependencies = [ + "async-trait", + "bytes", + "http 1.4.2", + "opentelemetry", + "reqwest 0.12.28", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" +dependencies = [ + "http 1.4.2", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-proto", + "opentelemetry_sdk", + "prost 0.14.4", + "reqwest 0.12.28", + "thiserror 2.0.18", + "tokio", + "tonic", + "tracing", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost 0.14.4", + "tonic", + "tonic-prost", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e62e29dfe041afb8ed2a6c9737ab57db4907285d999ef8ad3a59092a36bdc846" + +[[package]] +name = "opentelemetry_sdk" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "opentelemetry", + "percent-encoding", + "rand 0.9.4", + "thiserror 2.0.18", +] [[package]] name = "ordered-float" @@ -8009,7 +6980,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -8020,9 +6991,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "owo-colors" -version = "4.2.3" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" [[package]] name = "p256" @@ -8033,7 +7004,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -8046,13 +7017,36 @@ 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ - "arbitrary", "arrayvec", "bitvec", "byte-slice-cast", @@ -8073,7 +7067,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -8136,21 +7130,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - [[package]] name = "pbkdf2" version = "0.12.2" @@ -8161,29 +7140,6 @@ dependencies = [ "hmac", ] -[[package]] -name = "pear" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" -dependencies = [ - "inlinable_string", - "pear_codegen", - "yansi", -] - -[[package]] -name = "pear_codegen" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.110", -] - [[package]] name = "pem" version = "3.0.6" @@ -8211,9 +7167,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", "ucd-trie", @@ -8226,14 +7182,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.12.0", + "indexmap 2.14.0", ] [[package]] name = "pgvector" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" +checksum = "3673cba5b9a124916096a423b806a9f29620972c6c97b08db5f2053e9428b481" dependencies = [ "serde", ] @@ -8248,38 +7204,17 @@ dependencies = [ "rustc_version 0.4.1", ] -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros 0.11.3", - "phf_shared 0.11.3", - "serde", -] - [[package]] name = "phf" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_macros 0.13.1", - "phf_shared 0.13.1", + "phf_macros", + "phf_shared", "serde", ] -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.5", -] - [[package]] name = "phf_generator" version = "0.13.1" @@ -8287,20 +7222,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ "fastrand", - "phf_shared 0.13.1", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.110", + "phf_shared", ] [[package]] @@ -8309,20 +7231,11 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", + "phf_generator", + "phf_shared", "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", + "syn 2.0.118", ] [[package]] @@ -8336,29 +7249,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -8389,9 +7302,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plain_hasher" @@ -8430,12 +7349,6 @@ dependencies = [ "plotters-backend", ] -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - [[package]] name = "polyval" version = "0.6.2" @@ -8443,33 +7356,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] [[package]] name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "portable-atomic-util" -version = "0.2.5" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" -dependencies = [ - "portable-atomic", -] +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ - "zerovec 0.11.5", + "zerovec", ] [[package]] @@ -8496,12 +7400,12 @@ dependencies = [ "prost 0.12.6", "prost-build", "prost-derive 0.12.6", - "sha2 0.10.9", + "sha2", "smallvec", "spin 0.10.0", "symbolic-demangle", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -8530,7 +7434,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -8555,11 +7459,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.7", + "toml_edit", ] [[package]] @@ -8581,65 +7485,42 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "proc-macro2" -version = "1.0.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", - "version_check", - "yansi", -] - -[[package]] -name = "procfs" -version = "0.17.0" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ - "bitflags 2.10.0", - "chrono", - "flate2", - "hex", - "procfs-core 0.17.0", - "rustix 0.38.44", + "unicode-ident", ] [[package]] -name = "procfs" -version = "0.18.0" +name = "proc-macro2-diagnostics" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ - "bitflags 2.10.0", - "procfs-core 0.18.0", - "rustix 1.1.2", + "proc-macro2", + "quote", + "syn 2.0.118", + "version_check", + "yansi", ] [[package]] -name = "procfs-core" -version = "0.17.0" +name = "procfs" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" +checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "chrono", - "hex", + "flate2", + "procfs-core", + "rustix 1.1.4", ] [[package]] @@ -8648,21 +7529,22 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", + "chrono", "hex", ] [[package]] name = "proptest" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.13.0", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -8683,24 +7565,13 @@ dependencies = [ [[package]] name = "proptest-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", -] - -[[package]] -name = "proptest-derive" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "095a99f75c69734802359b682be8daaf8980296731f6470434ea2c652af1dd30" +checksum = "fb6dc647500e84a25a85b100e76c85b8ace114c209432dc174f20aac11d4ed6c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -8715,12 +7586,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.1" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", - "prost-derive 0.14.1", + "prost-derive 0.14.4", ] [[package]] @@ -8730,7 +7601,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", - "heck 0.5.0", + "heck 0.4.1", "itertools 0.12.1", "log", "multimap", @@ -8738,9 +7609,9 @@ dependencies = [ "petgraph", "prettyplease", "prost 0.12.6", - "prost-types 0.12.6", + "prost-types", "regex", - "syn 2.0.110", + "syn 2.0.118", "tempfile", ] @@ -8754,20 +7625,20 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "prost-derive" -version = "0.14.1" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -8779,35 +7650,6 @@ dependencies = [ "prost 0.12.6", ] -[[package]] -name = "prost-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" -dependencies = [ - "prost 0.14.1", -] - -[[package]] -name = "protobuf" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65f4a8ec18723a734e5dc09c173e0abf9690432da5340285d536edcb4dac190" -dependencies = [ - "once_cell", - "protobuf-support", - "thiserror 1.0.69", -] - -[[package]] -name = "protobuf-support" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6872f4d4f4b98303239a2b5838f5bbbb77b01ffc892d627957f37a22d7cfe69c" -dependencies = [ - "thiserror 1.0.69", -] - [[package]] name = "ptr_meta" version = "0.1.4" @@ -8828,17 +7670,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.10.0", - "memchr", - "unicase", -] - [[package]] name = "quanta" version = "0.12.6" @@ -8860,15 +7691,6 @@ 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 = "quick-xml" version = "0.26.0" @@ -8880,19 +7702,19 @@ dependencies = [ [[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", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", - "rustls 0.23.31", - "socket2 0.6.1", - "thiserror 2.0.17", + "rustc-hash", + "rustls 0.23.41", + "socket2 0.5.10", + "thiserror 2.0.18", "tokio", "tracing", "web-time", @@ -8900,20 +7722,21 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" dependencies = [ + "aws-lc-rs", "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", - "rustc-hash 2.1.1", - "rustls 0.23.31", + "rustc-hash", + "rustls 0.23.41", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -8928,16 +7751,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.5.10", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -8948,6 +7771,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.7.0" @@ -8956,9 +7785,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -8968,12 +7797,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", "serde", ] @@ -8994,7 +7823,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -9003,14 +7832,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", "serde", @@ -9022,7 +7851,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -9031,28 +7860,83 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", +] + +[[package]] +name = "rapidhash" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a224897b65b7ce38bf7b0adb569e7d77e11460d0cc3577908b263d8b5a89aa" +dependencies = [ + "getrandom 0.3.4", + "rustversion", ] [[package]] name = "ratatui" -version = "0.29.0" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" +dependencies = [ + "instability", + "ratatui-core", + "ratatui-crossterm", + "ratatui-widgets", + "serde", +] + +[[package]] +name = "ratatui-core" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" +checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" dependencies = [ - "bitflags 2.10.0", - "cassowary", + "bitflags 2.13.0", "compact_str", - "crossterm 0.28.1", + "hashbrown 0.17.1", + "itertools 0.14.0", + "kasuari", + "lru 0.18.0", + "palette", + "serde", + "strum 0.28.0", + "thiserror 2.0.18", + "unicode-segmentation", + "unicode-truncate", + "unicode-width", +] + +[[package]] +name = "ratatui-crossterm" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" +dependencies = [ + "cfg-if", + "crossterm 0.29.0", + "instability", + "ratatui-core", +] + +[[package]] +name = "ratatui-widgets" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" +dependencies = [ + "bitflags 2.13.0", + "hashbrown 0.17.1", "indoc", "instability", - "itertools 0.13.0", - "lru 0.12.5", - "paste", - "strum 0.26.3", + "itertools 0.14.0", + "line-clipping", + "ratatui-core", + "serde", + "strum 0.28.0", + "time", "unicode-segmentation", - "unicode-truncate", - "unicode-width 0.2.0", + "unicode-width", ] [[package]] @@ -9061,14 +7945,14 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", ] [[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", @@ -9105,29 +7989,27 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", ] [[package]] -name = "redox_users" -version = "0.4.6" +name = "redox_syscall" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", + "bitflags 2.13.0", ] [[package]] name = "redox_users" -version = "0.5.2" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", - "thiserror 2.0.17", + "thiserror 1.0.69", ] [[package]] @@ -9147,14 +8029,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", @@ -9164,9 +8046,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -9175,25 +8057,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "regress" -version = "0.10.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2057b2325e68a893284d1538021ab90279adac1139957ca2a74426c6f118fb48" -dependencies = [ - "hashbrown 0.16.0", - "memchr", -] +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rend" @@ -9206,9 +8078,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", @@ -9216,24 +8088,20 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.12", - "http 1.3.1", + "h2 0.4.15", + "http 1.4.2", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.10.1", + "hyper-rustls 0.27.9", "hyper-tls", "hyper-util", "js-sys", "log", "mime", - "mime_guess", "native-tls", "percent-encoding", "pin-project-lite", - "quinn", - "rustls 0.23.31", - "rustls-native-certs 0.8.2", "rustls-pki-types", "serde", "serde_json", @@ -9241,6 +8109,45 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "hyper 1.10.1", + "hyper-rustls 0.27.9", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.41", + "rustls-pki-types", + "rustls-platform-verifier 0.7.0", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", "tokio-rustls 0.26.4", "tokio-util", "tower", @@ -9251,7 +8158,6 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.4", ] [[package]] @@ -9262,8 +8168,8 @@ checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" dependencies = [ "anyhow", "async-trait", - "http 1.3.1", - "reqwest", + "http 1.4.2", + "reqwest 0.12.28", "serde", "thiserror 1.0.69", "tower-service", @@ -9278,11 +8184,11 @@ dependencies = [ "anyhow", "async-trait", "futures", - "getrandom 0.2.16", - "http 1.3.1", - "hyper 1.8.1", + "getrandom 0.2.17", + "http 1.4.2", + "hyper 1.10.1", "parking_lot 0.11.2", - "reqwest", + "reqwest 0.12.28", "reqwest-middleware", "retry-policies", "thiserror 1.0.69", @@ -9293,14 +8199,14 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "reth-basic-payload-builder" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9309,6 +8215,7 @@ dependencies = [ "futures-util", "metrics", "reth-chain-state", + "reth-execution-cache", "reth-metrics", "reth-payload-builder", "reth-payload-builder-primitives", @@ -9317,14 +8224,16 @@ dependencies = [ "reth-revm", "reth-storage-api", "reth-tasks", + "reth-trie-parallel", + "serde", "tokio", "tracing", ] [[package]] name = "reth-chain-state" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9335,7 +8244,8 @@ dependencies = [ "metrics", "parking_lot 0.12.5", "pin-project", - "rand 0.9.2", + "rand 0.9.4", + "rayon", "reth-chainspec", "reth-errors", "reth-ethereum-primitives", @@ -9344,8 +8254,8 @@ dependencies = [ "reth-primitives-traits", "reth-storage-api", "reth-trie", - "revm-database 9.0.1", - "revm-state 8.0.1", + "revm-database", + "revm-state", "serde", "tokio", "tokio-stream", @@ -9354,13 +8264,13 @@ dependencies = [ [[package]] name = "reth-chainspec" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-chains", "alloy-consensus", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-genesis", "alloy-primitives", "alloy-trie", @@ -9374,8 +8284,8 @@ dependencies = [ [[package]] name = "reth-cli" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-genesis", "clap", @@ -9383,13 +8293,12 @@ dependencies = [ "reth-cli-runner", "reth-db", "serde_json", - "shellexpand", ] [[package]] name = "reth-cli-commands" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-chains", "alloy-consensus", @@ -9397,9 +8306,10 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "backon", + "blake3", "clap", "comfy-table", - "crossterm 0.28.1", + "crossterm 0.29.0", "eyre", "fdlimit", "futures", @@ -9407,8 +8317,11 @@ dependencies = [ "humantime", "itertools 0.14.0", "lz4", + "metrics", + "parking_lot 0.12.5", "ratatui", - "reqwest", + "rayon", + "reqwest 0.13.4", "reth-chainspec", "reth-cli", "reth-cli-runner", @@ -9443,12 +8356,15 @@ dependencies = [ "reth-primitives-traits", "reth-provider", "reth-prune", + "reth-prune-types", "reth-revm", "reth-stages", + "reth-stages-types", "reth-static-file", "reth-static-file-types", + "reth-storage-api", + "reth-tasks", "reth-trie", - "reth-trie-common", "reth-trie-db", "secp256k1 0.30.0", "serde", @@ -9456,15 +8372,16 @@ dependencies = [ "tar", "tokio", "tokio-stream", - "toml 0.8.23", + "toml", "tracing", + "url", "zstd", ] [[package]] name = "reth-cli-runner" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "reth-tasks", "tokio", @@ -9473,25 +8390,26 @@ dependencies = [ [[package]] name = "reth-cli-util" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-primitives", "cfg-if", "eyre", "libc", - "rand 0.8.5", + "rand 0.8.6", "reth-fs-util", "secp256k1 0.30.0", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-codecs" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96e584e01478c951911946a7864f18e967c1cd90965e136e2d1b51aa3da9126" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9501,7 +8419,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus", + "parity-scale-codec", "reth-codecs-derive", "reth-zstd-compressors", "serde", @@ -9510,49 +8428,52 @@ dependencies = [ [[package]] name = "reth-codecs-derive" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c342ae46f5a886b8bf506205b9501b1032b896defd0f4f156edb423007fef880" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "reth-config" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "eyre", "humantime-serde", "reth-network-types", "reth-prune-types", "reth-stages-types", + "reth-static-file-types", "serde", - "toml 0.8.23", + "toml", "url", ] [[package]] name = "reth-consensus" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", "reth-execution-types", "reth-primitives-traits", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-consensus-common" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", + "alloy-primitives", "reth-chainspec", "reth-consensus", "reth-primitives-traits", @@ -9560,8 +8481,8 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9574,7 +8495,7 @@ dependencies = [ "derive_more", "eyre", "futures", - "reqwest", + "reqwest 0.13.4", "reth-node-api", "reth-primitives-traits", "reth-tracing", @@ -9586,8 +8507,8 @@ dependencies = [ [[package]] name = "reth-db" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "derive_more", @@ -9595,6 +8516,7 @@ dependencies = [ "metrics", "page_size", "parking_lot 0.12.5", + "quanta", "reth-db-api", "reth-fs-util", "reth-libmdbx", @@ -9603,35 +8525,33 @@ dependencies = [ "reth-static-file-types", "reth-storage-errors", "reth-tracing", - "rustc-hash 2.1.1", + "rustc-hash", "strum 0.27.2", "sysinfo", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", + "tracing", ] [[package]] name = "reth-db-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", - "alloy-genesis", "alloy-primitives", "arbitrary", + "arrayvec", "bytes", "derive_more", "metrics", "modular-bitfield", - "parity-scale-codec", "proptest", "reth-codecs", "reth-db-models", "reth-ethereum-primitives", - "reth-optimism-primitives", "reth-primitives-traits", "reth-prune-types", - "reth-scroll-primitives", "reth-stages-types", "reth-storage-errors", "reth-trie-common", @@ -9641,8 +8561,8 @@ dependencies = [ [[package]] name = "reth-db-common" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -9665,14 +8585,14 @@ dependencies = [ "reth-trie-db", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] [[package]] name = "reth-db-models" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9686,17 +8606,16 @@ dependencies = [ [[package]] name = "reth-discv4" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "alloy-rlp", "discv5", "enr", - "generic-array", "itertools 0.14.0", "parking_lot 0.12.5", - "rand 0.8.5", + "rand 0.8.6", "reth-ethereum-forks", "reth-net-banlist", "reth-net-nat", @@ -9704,7 +8623,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -9712,8 +8631,8 @@ dependencies = [ [[package]] name = "reth-discv5" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9723,28 +8642,28 @@ dependencies = [ "futures", "itertools 0.14.0", "metrics", - "rand 0.9.2", + "rand 0.9.4", "reth-chainspec", "reth-ethereum-forks", "reth-metrics", "reth-network-peers", "secp256k1 0.30.0", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "reth-dns-discovery" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", + "dashmap", "data-encoding", "enr", "hickory-resolver", "linked_hash_set", - "parking_lot 0.12.5", "reth-ethereum-forks", "reth-network-peers", "reth-tokio-util", @@ -9752,7 +8671,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -9760,8 +8679,8 @@ dependencies = [ [[package]] name = "reth-downloaders" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9786,7 +8705,7 @@ dependencies = [ "reth-tasks", "reth-testing-utils", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -9795,8 +8714,8 @@ dependencies = [ [[package]] name = "reth-e2e-test-utils" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9831,7 +8750,6 @@ dependencies = [ "reth-payload-builder", "reth-payload-builder-primitives", "reth-payload-primitives", - "reth-primitives", "reth-primitives-traits", "reth-provider", "reth-rpc-api", @@ -9842,7 +8760,7 @@ dependencies = [ "reth-tasks", "reth-tokio-util", "reth-tracing", - "revm 30.1.1", + "revm", "serde_json", "tempfile", "tokio", @@ -9853,8 +8771,8 @@ dependencies = [ [[package]] name = "reth-ecies" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "aes", "alloy-primitives", @@ -9866,26 +8784,23 @@ dependencies = [ "ctr", "digest 0.10.7", "futures", - "generic-array", "hmac", "pin-project", - "rand 0.8.5", + "rand 0.8.6", "reth-network-peers", "secp256k1 0.30.0", - "sha2 0.10.9", - "sha3", - "thiserror 2.0.17", + "sha2", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", "tracing", - "typenum", ] [[package]] name = "reth-engine-local" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9897,9 +8812,9 @@ dependencies = [ "reth-ethereum-engine-primitives", "reth-payload-builder", "reth-payload-primitives", - "reth-provider", + "reth-primitives-traits", + "reth-storage-api", "reth-transaction-pool", - "scroll-alloy-rpc-types-engine", "tokio", "tokio-stream", "tracing", @@ -9907,8 +8822,8 @@ dependencies = [ [[package]] name = "reth-engine-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9926,48 +8841,27 @@ dependencies = [ "reth-primitives-traits", "reth-trie-common", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", ] -[[package]] -name = "reth-engine-service" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "futures", - "pin-project", - "reth-chainspec", - "reth-consensus", - "reth-engine-primitives", - "reth-engine-tree", - "reth-ethereum-primitives", - "reth-evm", - "reth-network-p2p", - "reth-node-types", - "reth-payload-builder", - "reth-provider", - "reth-prune", - "reth-stages-api", - "reth-tasks", -] - [[package]] name = "reth-engine-tree" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", + "alloy-eip7928", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", - "dashmap 6.1.0", + "crossbeam-channel", "derive_more", "futures", "metrics", - "mini-moka", + "moka", "parking_lot 0.12.5", "rayon", "reth-chain-state", @@ -9978,6 +8872,7 @@ dependencies = [ "reth-errors", "reth-ethereum-primitives", "reth-evm", + "reth-execution-cache", "reth-execution-types", "reth-metrics", "reth-network-p2p", @@ -9994,23 +8889,22 @@ dependencies = [ "reth-tasks", "reth-tracing", "reth-trie", + "reth-trie-common", "reth-trie-db", "reth-trie-parallel", "reth-trie-sparse", - "reth-trie-sparse-parallel", - "revm 30.1.1", - "revm-primitives 21.0.1", + "revm", + "revm-primitives", "schnellru", - "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "reth-engine-util" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -10037,39 +8931,39 @@ dependencies = [ [[package]] name = "reth-era" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rlp", - "ethereum_ssz", - "ethereum_ssz_derive", - "reth-ethereum-primitives", + "ethereum_ssz 0.10.4", + "ethereum_ssz_derive 0.10.4", "snap", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-era-downloader" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "bytes", "eyre", "futures-util", - "reqwest", + "reqwest 0.13.4", + "reth-era", "reth-fs-util", - "sha2 0.10.9", + "sha2", "tokio", ] [[package]] name = "reth-era-utils" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10090,19 +8984,19 @@ dependencies = [ [[package]] name = "reth-errors" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "reth-consensus", "reth-execution-errors", "reth-storage-errors", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-eth-wire" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-chains", "alloy-primitives", @@ -10120,7 +9014,7 @@ dependencies = [ "reth-primitives-traits", "serde", "snap", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -10129,13 +9023,13 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-chains", "alloy-consensus", "alloy-eips", - "alloy-hardforks 0.4.4", + "alloy-hardforks 0.4.7", "alloy-primitives", "alloy-rlp", "bytes", @@ -10145,13 +9039,36 @@ dependencies = [ "reth-ethereum-primitives", "reth-primitives-traits", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", +] + +[[package]] +name = "reth-ethereum-cli" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" +dependencies = [ + "clap", + "eyre", + "reth-chainspec", + "reth-cli", + "reth-cli-commands", + "reth-cli-runner", + "reth-db", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-node-ethereum", + "reth-node-metrics", + "reth-rpc-server-types", + "reth-tasks", + "reth-tracing", + "tracing", ] [[package]] name = "reth-ethereum-consensus" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10166,40 +9083,38 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-primitives", - "alloy-rlp", "alloy-rpc-types-engine", "reth-engine-primitives", "reth-ethereum-primitives", "reth-payload-primitives", "reth-primitives-traits", "serde", - "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-ethereum-forks" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eip2124", - "alloy-hardforks 0.4.4", + "alloy-hardforks 0.4.7", "alloy-primitives", "arbitrary", "auto_impl", "once_cell", - "rustc-hash 2.1.1", + "rustc-hash", ] [[package]] name = "reth-ethereum-payload-builder" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10213,6 +9128,7 @@ dependencies = [ "reth-ethereum-primitives", "reth-evm", "reth-evm-ethereum", + "reth-execution-cache", "reth-payload-builder", "reth-payload-builder-primitives", "reth-payload-primitives", @@ -10221,34 +9137,28 @@ dependencies = [ "reth-revm", "reth-storage-api", "reth-transaction-pool", - "revm 30.1.1", + "revm", "tracing", ] [[package]] name = "reth-ethereum-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", - "alloy-rlp", "alloy-rpc-types-eth", - "alloy-serde", - "arbitrary", - "modular-bitfield", "reth-codecs", "reth-primitives-traits", - "reth-zstd-compressors", "serde", - "serde_with", ] [[package]] name = "reth-etl" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "rayon", "reth-db-api", @@ -10257,17 +9167,18 @@ dependencies = [ [[package]] name = "reth-evm" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-primitives", "auto_impl", "derive_more", "futures-util", "metrics", + "rayon", "reth-execution-errors", "reth-execution-types", "reth-metrics", @@ -10275,18 +9186,17 @@ dependencies = [ "reth-storage-api", "reth-storage-errors", "reth-trie-common", - "revm 30.1.1", - "scroll-alloy-evm", + "revm", ] [[package]] name = "reth-evm-ethereum" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-primitives", "alloy-rpc-types-engine", "reth-chainspec", @@ -10296,44 +9206,63 @@ dependencies = [ "reth-execution-types", "reth-primitives-traits", "reth-storage-errors", - "revm 30.1.1", + "revm", +] + +[[package]] +name = "reth-execution-cache" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" +dependencies = [ + "alloy-primitives", + "fixed-cache", + "metrics", + "parking_lot 0.12.5", + "reth-errors", + "reth-metrics", + "reth-primitives-traits", + "reth-provider", + "reth-revm", + "reth-trie", + "tracing", ] [[package]] name = "reth-execution-errors" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ - "alloy-evm 0.22.2", + "alloy-evm", "alloy-primitives", "alloy-rlp", "nybbles", "reth-storage-errors", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-execution-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-primitives", + "alloy-rlp", "derive_more", "reth-ethereum-primitives", "reth-primitives-traits", "reth-trie-common", - "revm 30.1.1", + "revm", "serde", "serde_with", ] [[package]] name = "reth-exex" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10362,7 +9291,7 @@ dependencies = [ "reth-tasks", "reth-tracing", "rmp-serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-util", "tracing", @@ -10370,8 +9299,8 @@ dependencies = [ [[package]] name = "reth-exex-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-primitives", @@ -10384,18 +9313,18 @@ dependencies = [ [[package]] name = "reth-fs-util" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-invalid-block-hooks" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10413,17 +9342,17 @@ dependencies = [ "reth-rpc-api", "reth-tracing", "reth-trie", - "revm 30.1.1", - "revm-bytecode 7.0.1", - "revm-database 9.0.1", + "revm", + "revm-bytecode", + "revm-database", "serde", "serde_json", ] [[package]] name = "reth-ipc" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "bytes", "futures", @@ -10432,7 +9361,7 @@ dependencies = [ "jsonrpsee", "pin-project", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -10442,33 +9371,34 @@ dependencies = [ [[package]] name = "reth-libmdbx" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "byteorder", - "dashmap 6.1.0", + "crossbeam-queue", + "dashmap", "derive_more", "parking_lot 0.12.5", "reth-mdbx-sys", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] [[package]] name = "reth-mdbx-sys" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ - "bindgen 0.71.1", + "bindgen", "cc", ] [[package]] name = "reth-metrics" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "futures", "metrics", @@ -10479,30 +9409,31 @@ dependencies = [ [[package]] name = "reth-net-banlist" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", + "ipnet", ] [[package]] name = "reth-net-nat" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "futures-util", "if-addrs", - "reqwest", + "reqwest 0.13.4", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "reth-network" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10519,7 +9450,9 @@ dependencies = [ "metrics", "parking_lot 0.12.5", "pin-project", - "rand 0.8.5", + "rand 0.8.6", + "rand 0.9.4", + "rayon", "reth-chainspec", "reth-consensus", "reth-discv4", @@ -10530,6 +9463,7 @@ dependencies = [ "reth-eth-wire-types", "reth-ethereum-forks", "reth-ethereum-primitives", + "reth-evm-ethereum", "reth-fs-util", "reth-metrics", "reth-net-banlist", @@ -10542,12 +9476,12 @@ dependencies = [ "reth-tasks", "reth-tokio-util", "reth-transaction-pool", - "rustc-hash 2.1.1", + "rustc-hash", "schnellru", "secp256k1 0.30.0", "serde", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -10556,8 +9490,8 @@ dependencies = [ [[package]] name = "reth-network-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10572,18 +9506,17 @@ dependencies = [ "reth-network-p2p", "reth-network-peers", "reth-network-types", - "reth-primitives-traits", "reth-tokio-util", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", ] [[package]] name = "reth-network-p2p" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10605,23 +9538,23 @@ dependencies = [ [[package]] name = "reth-network-peers" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "alloy-rlp", "enr", "secp256k1 0.30.0", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "url", ] [[package]] name = "reth-network-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -10634,8 +9567,8 @@ dependencies = [ [[package]] name = "reth-nippy-jar" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "anyhow", "bincode", @@ -10644,15 +9577,15 @@ dependencies = [ "memmap2", "reth-fs-util", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", "zstd", ] [[package]] name = "reth-node-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -10675,8 +9608,8 @@ dependencies = [ [[package]] name = "reth-node-builder" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10689,11 +9622,11 @@ dependencies = [ "fdlimit", "futures", "jsonrpsee", + "parking_lot 0.12.5", "rayon", "reth-basic-payload-builder", "reth-chain-state", "reth-chainspec", - "reth-cli-util", "reth-config", "reth-consensus", "reth-consensus-debug-client", @@ -10703,7 +9636,6 @@ dependencies = [ "reth-downloaders", "reth-engine-local", "reth-engine-primitives", - "reth-engine-service", "reth-engine-tree", "reth-engine-util", "reth-evm", @@ -10734,6 +9666,7 @@ dependencies = [ "reth-tokio-util", "reth-tracing", "reth-transaction-pool", + "reth-trie-db", "secp256k1 0.30.0", "serde_json", "tokio", @@ -10743,8 +9676,8 @@ dependencies = [ [[package]] name = "reth-node-core" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10756,7 +9689,8 @@ dependencies = [ "eyre", "futures", "humantime", - "rand 0.9.2", + "ipnet", + "rand 0.9.4", "reth-chainspec", "reth-cli-util", "reth-config", @@ -10767,6 +9701,7 @@ dependencies = [ "reth-engine-local", "reth-engine-primitives", "reth-ethereum-forks", + "reth-net-banlist", "reth-net-nat", "reth-network", "reth-network-p2p", @@ -10779,24 +9714,25 @@ dependencies = [ "reth-stages-types", "reth-storage-api", "reth-storage-errors", + "reth-tasks", "reth-tracing", + "reth-tracing-otlp", "reth-transaction-pool", "secp256k1 0.30.0", "serde", - "shellexpand", "strum 0.27.2", - "thiserror 2.0.17", - "toml 0.8.23", + "thiserror 2.0.18", + "toml", "tracing", "url", - "vergen 9.0.6", + "vergen", "vergen-git2", ] [[package]] name = "reth-node-ethereum" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-network", @@ -10827,14 +9763,14 @@ dependencies = [ "reth-rpc-server-types", "reth-tracing", "reth-transaction-pool", - "revm 30.1.1", + "revm", "tokio", ] [[package]] name = "reth-node-ethstats" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10847,18 +9783,18 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", - "tokio-tungstenite 0.26.2", + "tokio-tungstenite", "tracing", "url", ] [[package]] name = "reth-node-events" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10881,17 +9817,20 @@ dependencies = [ [[package]] name = "reth-node-metrics" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ + "bytes", "eyre", - "http 1.3.1", + "http 1.4.2", + "http-body-util", "jsonrpsee-server", "metrics", "metrics-exporter-prometheus", "metrics-process", "metrics-util", - "procfs 0.17.0", + "procfs", + "reqwest 0.13.4", "reth-metrics", "reth-tasks", "tokio", @@ -10901,8 +9840,8 @@ dependencies = [ [[package]] name = "reth-node-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "reth-chainspec", "reth-db-api", @@ -10911,42 +9850,25 @@ dependencies = [ "reth-primitives-traits", ] -[[package]] -name = "reth-optimism-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "bytes", - "modular-bitfield", - "op-alloy-consensus", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", - "serde", - "serde_with", -] - [[package]] name = "reth-payload-builder" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", "alloy-rpc-types", + "derive_more", "futures-util", "metrics", "reth-chain-state", "reth-ethereum-engine-primitives", + "reth-execution-cache", "reth-metrics", "reth-payload-builder-primitives", "reth-payload-primitives", "reth-primitives-traits", + "reth-trie-parallel", "tokio", "tokio-stream", "tracing", @@ -10954,8 +9876,8 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "pin-project", "reth-payload-primitives", @@ -10966,63 +9888,43 @@ dependencies = [ [[package]] name = "reth-payload-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ + "alloy-consensus", "alloy-eips", "alloy-primitives", + "alloy-rlp", "alloy-rpc-types-engine", "auto_impl", "either", - "op-alloy-rpc-types-engine", "reth-chain-state", "reth-chainspec", "reth-errors", + "reth-execution-types", "reth-primitives-traits", - "scroll-alloy-rpc-types-engine", + "reth-trie-common", "serde", - "thiserror 2.0.17", + "sha2", + "thiserror 2.0.18", "tokio", ] -[[package]] -name = "reth-payload-util" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "reth-transaction-pool", -] - [[package]] name = "reth-payload-validator" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", "reth-primitives-traits", ] -[[package]] -name = "reth-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "c-kzg", - "once_cell", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-static-file-types", -] - [[package]] name = "reth-primitives-traits" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca36e245593498020c31e707154fc13391164eb90444da76d67361f646e7669" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11032,37 +9934,35 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-trie", "arbitrary", - "auto_impl", "byteorder", "bytes", + "dashmap", "derive_more", "modular-bitfield", "once_cell", - "op-alloy-consensus", "proptest", "proptest-arbitrary-interop", + "quanta", "rayon", "reth-codecs", - "revm-bytecode 7.0.1", - "revm-primitives 21.0.1", - "revm-state 8.0.1", - "scroll-alloy-consensus", + "revm-bytecode", + "revm-primitives", + "revm-state", "secp256k1 0.30.0", "serde", - "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-provider" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", + "alloy-genesis", "alloy-primitives", "alloy-rpc-types-engine", - "dashmap 6.1.0", "eyre", "itertools 0.14.0", "metrics", @@ -11088,10 +9988,12 @@ dependencies = [ "reth-static-file-types", "reth-storage-api", "reth-storage-errors", + "reth-tasks", "reth-trie", "reth-trie-db", - "revm-database 9.0.1", - "revm-state 8.0.1", + "revm-database", + "revm-state", + "rocksdb", "strum 0.27.2", "tokio", "tracing", @@ -11099,8 +10001,8 @@ dependencies = [ [[package]] name = "reth-prune" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11108,7 +10010,6 @@ dependencies = [ "itertools 0.14.0", "metrics", "rayon", - "reth-chainspec", "reth-config", "reth-db-api", "reth-errors", @@ -11117,18 +10018,20 @@ dependencies = [ "reth-primitives-traits", "reth-provider", "reth-prune-types", + "reth-stages-types", "reth-static-file-types", + "reth-storage-api", "reth-tokio-util", - "rustc-hash 2.1.1", - "thiserror 2.0.17", + "rustc-hash", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "reth-prune-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "arbitrary", @@ -11136,31 +10039,36 @@ dependencies = [ "modular-bitfield", "reth-codecs", "serde", - "thiserror 2.0.17", + "strum 0.27.2", + "thiserror 2.0.18", + "tracing", ] [[package]] name = "reth-revm" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-debug", "reth-primitives-traits", "reth-storage-api", "reth-storage-errors", "reth-trie", - "revm 30.1.1", + "revm", ] [[package]] name = "reth-rpc" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-dyn-abi", + "alloy-eip7928", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-genesis", "alloy-network", "alloy-primitives", @@ -11182,13 +10090,9 @@ dependencies = [ "derive_more", "dyn-clone", "futures", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.8.1", "itertools 0.14.0", "jsonrpsee", "jsonrpsee-types", - "jsonwebtoken", "parking_lot 0.12.5", "pin-project", "reth-chain-state", @@ -11197,6 +10101,8 @@ dependencies = [ "reth-consensus-common", "reth-engine-primitives", "reth-errors", + "reth-ethereum-engine-primitives", + "reth-ethereum-primitives", "reth-evm", "reth-evm-ethereum", "reth-execution-types", @@ -11213,30 +10119,30 @@ dependencies = [ "reth-rpc-eth-api", "reth-rpc-eth-types", "reth-rpc-server-types", - "reth-scroll-evm", "reth-storage-api", "reth-tasks", + "reth-tracing", "reth-transaction-pool", "reth-trie-common", - "revm 30.1.1", - "revm-inspectors 0.31.2", - "revm-primitives 21.0.1", + "revm", + "revm-inspectors", + "revm-primitives", "serde", "serde_json", - "sha2 0.10.9", - "thiserror 2.0.17", + "sha2", + "thiserror 2.0.18", "tokio", "tokio-stream", - "tower", "tracing", "tracing-futures", ] [[package]] name = "reth-rpc-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ + "alloy-eip7928", "alloy-eips", "alloy-genesis", "alloy-json-rpc", @@ -11258,40 +10164,46 @@ dependencies = [ "reth-network-peers", "reth-rpc-eth-api", "reth-trie-common", + "serde", + "serde_json", ] [[package]] name = "reth-rpc-builder" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-network", "alloy-provider", "dyn-clone", - "http 1.3.1", + "http 1.4.2", "jsonrpsee", "metrics", "pin-project", "reth-chain-state", "reth-chainspec", "reth-consensus", + "reth-engine-primitives", "reth-evm", "reth-ipc", "reth-metrics", "reth-network-api", "reth-node-core", + "reth-payload-primitives", "reth-primitives-traits", "reth-rpc", "reth-rpc-api", + "reth-rpc-engine-api", "reth-rpc-eth-api", "reth-rpc-eth-types", "reth-rpc-layer", "reth-rpc-server-types", "reth-storage-api", "reth-tasks", + "reth-tokio-util", "reth-transaction-pool", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-util", "tower", @@ -11301,47 +10213,41 @@ dependencies = [ [[package]] name = "reth-rpc-convert" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", + "alloy-evm", "alloy-json-rpc", "alloy-network", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-signer", "auto_impl", "dyn-clone", "jsonrpsee-types", - "reth-ethereum-primitives", "reth-evm", "reth-primitives-traits", - "reth-scroll-primitives", - "reth-storage-api", - "revm-context 10.1.1", - "revm-scroll", - "scroll-alloy-consensus", - "scroll-alloy-evm", - "scroll-alloy-rpc-types", - "thiserror 2.0.17", + "reth-rpc-traits", + "thiserror 2.0.18", ] [[package]] name = "reth-rpc-engine-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-primitives", + "alloy-rlp", "alloy-rpc-types-engine", "async-trait", "jsonrpsee-core", "jsonrpsee-types", "metrics", - "parking_lot 0.12.5", "reth-chainspec", "reth-engine-primitives", "reth-metrics", + "reth-network-api", "reth-payload-builder", "reth-payload-builder-primitives", "reth-payload-primitives", @@ -11351,20 +10257,21 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "reth-rpc-eth-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-dyn-abi", + "alloy-eip7928", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-json-rpc", "alloy-network", "alloy-primitives", @@ -11390,25 +10297,25 @@ dependencies = [ "reth-rpc-convert", "reth-rpc-eth-types", "reth-rpc-server-types", - "reth-scroll-evm", "reth-storage-api", "reth-tasks", "reth-transaction-pool", "reth-trie-common", - "revm 30.1.1", - "revm-inspectors 0.31.2", + "revm", + "revm-inspectors", + "serde_json", "tokio", "tracing", ] [[package]] name = "reth-rpc-eth-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-evm 0.22.2", + "alloy-evm", "alloy-network", "alloy-primitives", "alloy-rpc-client", @@ -11421,8 +10328,8 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "metrics", - "rand 0.9.2", - "reqwest", + "rand 0.9.4", + "reqwest 0.13.4", "reth-chain-state", "reth-chainspec", "reth-errors", @@ -11438,370 +10345,78 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "reth-trie", - "revm 30.1.1", - "revm-inspectors 0.31.2", + "revm", + "revm-inspectors", "schnellru", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", + "url", ] -[[package]] -name = "reth-rpc-layer" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-rpc-types-engine", - "http 1.3.1", - "jsonrpsee-http-client", - "pin-project", - "tower", - "tower-http", - "tracing", -] - -[[package]] -name = "reth-rpc-server-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "jsonrpsee-core", - "jsonrpsee-types", - "reth-errors", - "reth-network-api", - "serde", - "strum 0.27.2", -] - -[[package]] -name = "reth-scroll-chainspec" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-primitives", - "alloy-serde", - "auto_impl", - "derive_more", - "once_cell", - "reth-chainspec", - "reth-ethereum-forks", - "reth-network-peers", - "reth-primitives-traits", - "reth-scroll-forks", - "reth-trie-common", - "scroll-alloy-hardforks", - "serde", - "serde_json", -] - -[[package]] -name = "reth-scroll-cli" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "clap", - "eyre", - "reth-cli", - "reth-cli-commands", - "reth-cli-runner", - "reth-consensus", - "reth-db", - "reth-node-builder", - "reth-node-core", - "reth-node-metrics", - "reth-scroll-chainspec", - "reth-scroll-consensus", - "reth-scroll-evm", - "reth-scroll-node", - "reth-scroll-primitives", - "reth-tracing", - "tracing", -] - -[[package]] -name = "reth-scroll-consensus" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-ethereum-consensus", - "reth-execution-types", - "reth-primitives-traits", - "reth-scroll-primitives", - "scroll-alloy-consensus", - "scroll-alloy-hardforks", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "reth-scroll-engine-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-engine", - "reth-chain-state", - "reth-chainspec", - "reth-engine-primitives", - "reth-payload-builder", - "reth-payload-primitives", - "reth-primitives", - "reth-primitives-traits", - "reth-scroll-chainspec", - "reth-scroll-primitives", - "scroll-alloy-hardforks", - "scroll-alloy-rpc-types-engine", - "serde", - "sha2 0.10.9", -] - -[[package]] -name = "reth-scroll-evm" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm 0.22.2", - "alloy-primitives", - "alloy-rpc-types-engine", - "derive_more", - "reth-chainspec", - "reth-evm", - "reth-execution-types", - "reth-primitives", - "reth-primitives-traits", - "reth-scroll-chainspec", - "reth-scroll-forks", - "reth-scroll-primitives", - "reth-storage-api", - "revm 30.1.1", - "revm-primitives 21.0.1", - "revm-scroll", - "scroll-alloy-consensus", - "scroll-alloy-evm", - "scroll-alloy-hardforks", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "reth-scroll-forks" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-chains", - "alloy-primitives", - "auto_impl", - "once_cell", - "reth-ethereum-forks", - "scroll-alloy-hardforks", - "serde", -] - -[[package]] -name = "reth-scroll-node" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-genesis", - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "clap", - "eyre", - "reth-chainspec", - "reth-db", - "reth-e2e-test-utils", - "reth-engine-local", - "reth-eth-wire-types", - "reth-evm", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-types", - "reth-payload-builder", - "reth-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-revm", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-scroll-chainspec", - "reth-scroll-consensus", - "reth-scroll-engine-primitives", - "reth-scroll-evm", - "reth-scroll-payload", - "reth-scroll-primitives", - "reth-scroll-rpc", - "reth-scroll-txpool", - "reth-tasks", - "reth-tracing", - "reth-transaction-pool", - "reth-trie-db", - "revm 30.1.1", - "scroll-alloy-consensus", - "scroll-alloy-evm", - "scroll-alloy-hardforks", - "scroll-alloy-network", - "scroll-alloy-rpc-types", - "scroll-alloy-rpc-types-engine", - "serde_json", - "tokio", - "tracing", -] - -[[package]] -name = "reth-scroll-payload" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rlp", - "futures-util", - "reth-basic-payload-builder", - "reth-chain-state", - "reth-chainspec", - "reth-evm", - "reth-execution-types", - "reth-payload-builder", - "reth-payload-primitives", - "reth-payload-util", - "reth-primitives-traits", - "reth-revm", - "reth-scroll-chainspec", - "reth-scroll-engine-primitives", - "reth-scroll-evm", - "reth-scroll-primitives", - "reth-storage-api", - "reth-transaction-pool", - "revm 30.1.1", - "scroll-alloy-hardforks", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "reth-scroll-primitives" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "bytes", - "modular-bitfield", - "once_cell", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", - "scroll-alloy-consensus", - "serde", -] - -[[package]] -name = "reth-scroll-rpc" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "eyre", - "jsonrpsee-types", - "reqwest", - "reth-chainspec", - "reth-evm", - "reth-node-api", - "reth-node-builder", - "reth-primitives-traits", - "reth-provider", - "reth-rpc", - "reth-rpc-convert", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-scroll-chainspec", - "reth-scroll-evm", - "reth-scroll-primitives", - "reth-tasks", - "reth-transaction-pool", - "revm 30.1.1", - "scroll-alloy-consensus", - "scroll-alloy-hardforks", - "scroll-alloy-network", - "scroll-alloy-rpc-types", - "thiserror 2.0.17", - "tokio", +[[package]] +name = "reth-rpc-layer" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" +dependencies = [ + "alloy-rpc-types-engine", + "http 1.4.2", + "jsonrpsee-http-client", + "pin-project", + "tower", + "tower-http", "tracing", ] [[package]] -name = "reth-scroll-txpool" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +name = "reth-rpc-server-types" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ - "alloy-consensus", "alloy-eips", "alloy-primitives", - "c-kzg", - "derive_more", - "parking_lot 0.12.5", - "reth-chainspec", + "alloy-rpc-types-engine", + "jsonrpsee-core", + "jsonrpsee-types", + "reth-errors", + "reth-network-api", + "serde", + "strum 0.27.2", +] + +[[package]] +name = "reth-rpc-traits" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66ebbc3cc6f1808c2838bf8da9928f3ef9b8a6f969c6522174c1598ddb34bc0f" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-signer", "reth-primitives-traits", - "reth-revm", - "reth-scroll-consensus", - "reth-scroll-evm", - "reth-scroll-forks", - "reth-scroll-primitives", - "reth-storage-api", - "reth-transaction-pool", - "revm-scroll", - "scroll-alloy-consensus", - "tracing", + "thiserror 2.0.18", ] [[package]] name = "reth-stages" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", - "bincode", + "alloy-rlp", "eyre", "futures-util", "itertools 0.14.0", "num-traits", + "page_size", "rayon", - "reqwest", + "reqwest 0.13.4", "reth-chainspec", "reth-codecs", "reth-config", @@ -11817,6 +10432,7 @@ dependencies = [ "reth-execution-types", "reth-exex", "reth-fs-util", + "reth-libmdbx", "reth-network-p2p", "reth-primitives-traits", "reth-provider", @@ -11825,20 +10441,22 @@ dependencies = [ "reth-revm", "reth-stages-api", "reth-static-file-types", + "reth-storage-api", "reth-storage-errors", + "reth-tasks", "reth-testing-utils", "reth-trie", "reth-trie-db", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "reth-stages-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-primitives", @@ -11846,6 +10464,7 @@ dependencies = [ "auto_impl", "futures-util", "metrics", + "reth-codecs", "reth-consensus", "reth-errors", "reth-metrics", @@ -11857,15 +10476,15 @@ dependencies = [ "reth-static-file", "reth-static-file-types", "reth-tokio-util", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "reth-stages-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "arbitrary", @@ -11878,8 +10497,8 @@ dependencies = [ [[package]] name = "reth-static-file" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "parking_lot 0.12.5", @@ -11898,20 +10517,23 @@ dependencies = [ [[package]] name = "reth-static-file-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "clap", "derive_more", + "fixed-map", + "reth-stages-types", "serde", "strum 0.27.2", + "tracing", ] [[package]] name = "reth-storage-api" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11928,38 +10550,44 @@ dependencies = [ "reth-stages-types", "reth-storage-errors", "reth-trie-common", - "revm-database 9.0.1", + "revm-database", + "serde_json", ] [[package]] name = "reth-storage-errors" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "derive_more", + "reth-codecs", "reth-primitives-traits", "reth-prune-types", "reth-static-file-types", - "revm-database-interface 8.0.2", - "thiserror 2.0.17", + "revm-database-interface", + "revm-state", + "thiserror 2.0.18", ] [[package]] name = "reth-tasks" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ - "auto_impl", - "dyn-clone", + "crossbeam-utils", + "dashmap", "futures-util", + "libc", "metrics", + "parking_lot 0.12.5", "pin-project", "rayon", "reth-metrics", - "thiserror 2.0.17", + "thiserror 2.0.18", + "thread-priority", "tokio", "tracing", "tracing-futures", @@ -11967,15 +10595,15 @@ dependencies = [ [[package]] name = "reth-testing-utils" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-genesis", "alloy-primitives", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.8.6", + "rand 0.9.4", "reth-ethereum-primitives", "reth-primitives-traits", "secp256k1 0.30.0", @@ -11983,8 +10611,8 @@ dependencies = [ [[package]] name = "reth-tokio-util" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "tokio", "tokio-stream", @@ -11993,8 +10621,8 @@ dependencies = [ [[package]] name = "reth-tracing" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "clap", "eyre", @@ -12003,13 +10631,31 @@ dependencies = [ "tracing-appender", "tracing-journald", "tracing-logfmt", - "tracing-subscriber 0.3.20", + "tracing-samply", + "tracing-subscriber 0.3.23", +] + +[[package]] +name = "reth-tracing-otlp" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" +dependencies = [ + "clap", + "eyre", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber 0.3.23", + "url", ] [[package]] name = "reth-transaction-pool" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12017,31 +10663,34 @@ dependencies = [ "alloy-rlp", "aquamarine", "auto_impl", - "bitflags 2.10.0", + "bitflags 2.13.0", "futures-util", "metrics", "parking_lot 0.12.5", "paste", "pin-project", - "rand 0.9.2", + "rand 0.9.4", "reth-chain-state", "reth-chainspec", "reth-eth-wire-types", "reth-ethereum-primitives", + "reth-evm", + "reth-evm-ethereum", "reth-execution-types", "reth-fs-util", "reth-metrics", "reth-primitives-traits", "reth-storage-api", "reth-tasks", - "revm-interpreter 27.0.1", - "revm-primitives 21.0.1", - "rustc-hash 2.1.1", + "revm", + "revm-interpreter", + "revm-primitives", + "rustc-hash", "schnellru", "serde", "serde_json", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -12049,8 +10698,8 @@ dependencies = [ [[package]] name = "reth-trie" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12060,6 +10709,7 @@ dependencies = [ "auto_impl", "itertools 0.14.0", "metrics", + "parking_lot 0.12.5", "reth-execution-errors", "reth-metrics", "reth-primitives-traits", @@ -12067,15 +10717,15 @@ dependencies = [ "reth-storage-errors", "reth-trie-common", "reth-trie-sparse", - "revm-database 9.0.1", + "revm-database", "tracing", "triehash", ] [[package]] name = "reth-trie-common" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -12084,63 +10734,73 @@ dependencies = [ "alloy-serde", "alloy-trie", "arbitrary", + "arrayvec", "bytes", "derive_more", "hash-db", "itertools 0.14.0", "nybbles", "plain_hasher", + "rayon", "reth-codecs", "reth-primitives-traits", - "revm-database 9.0.1", + "revm-database", "serde", "serde_with", ] [[package]] name = "reth-trie-db" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", + "metrics", + "parking_lot 0.12.5", "reth-db-api", "reth-execution-errors", + "reth-metrics", "reth-primitives-traits", + "reth-stages-types", + "reth-storage-api", + "reth-storage-errors", "reth-trie", + "reth-trie-common", "tracing", ] [[package]] name = "reth-trie-parallel" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ + "alloy-eip7928", + "alloy-evm", "alloy-primitives", "alloy-rlp", "crossbeam-channel", - "dashmap 6.1.0", + "crossbeam-utils", "derive_more", "itertools 0.14.0", "metrics", "rayon", - "reth-db-api", "reth-execution-errors", "reth-metrics", + "reth-primitives-traits", "reth-provider", "reth-storage-errors", + "reth-tasks", "reth-trie", - "reth-trie-common", - "reth-trie-db", "reth-trie-sparse", - "thiserror 2.0.17", - "tokio", + "revm-state", + "thiserror 2.0.18", "tracing", ] [[package]] name = "reth-trie-sparse" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "2.0.0" +source = "git+https://github.com/DogeOS69/reth.git?rev=972366a0bfc11cf6a0d5dc79d5e779cd81e32232#972366a0bfc11cf6a0d5dc79d5e779cd81e32232" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -12152,32 +10812,18 @@ dependencies = [ "reth-metrics", "reth-primitives-traits", "reth-trie-common", - "smallvec", - "tracing", -] - -[[package]] -name = "reth-trie-sparse-parallel" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-trie", - "metrics", - "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-trie-common", - "reth-trie-sparse", + "serde", + "serde_json", + "slotmap", "smallvec", "tracing", ] [[package]] name = "reth-zstd-compressors" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a621aef55fe4da8935abede9d1d105f227bcb673f212b3575a748a6a2f8f688e" dependencies = [ "zstd", ] @@ -12188,349 +10834,174 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5875471e6cab2871bc150ecb8c727db5113c9338cc3354dc5ee3425b6aa40a1c" dependencies = [ - "rand 0.8.5", + "rand 0.8.6", ] [[package]] name = "revm" -version = "29.0.1" +version = "36.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718d90dce5f07e115d0e66450b1b8aa29694c1cf3f89ebddaddccc2ccbd2f13e" -dependencies = [ - "revm-bytecode 6.2.2", - "revm-context 9.1.0", - "revm-context-interface 10.2.0", - "revm-database 7.0.5", - "revm-database-interface 7.0.5", - "revm-handler 10.0.1", - "revm-inspector 10.0.1", - "revm-interpreter 25.0.3", - "revm-precompile 27.0.0", - "revm-primitives 20.2.1", - "revm-state 7.0.5", -] - -[[package]] -name = "revm" -version = "30.1.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "b0abc15d09cd211e9e73410ada10134069c794d4bcdb787dfc16a1bf0939849c" dependencies = [ - "revm-bytecode 7.0.1", - "revm-context 10.1.1", - "revm-context-interface 11.1.1", - "revm-database 9.0.1", - "revm-database-interface 8.0.2", - "revm-handler 11.1.1", - "revm-inspector 11.1.1", - "revm-interpreter 27.0.1", - "revm-precompile 28.1.1", - "revm-primitives 21.0.1", - "revm-state 8.0.1", + "revm-bytecode", + "revm-context", + "revm-context-interface", + "revm-database", + "revm-database-interface", + "revm-handler", + "revm-inspector", + "revm-interpreter", + "revm-precompile", + "revm-primitives", + "revm-state", ] [[package]] name = "revm-bytecode" -version = "6.2.2" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c52031b73cae95d84cd1b07725808b5fd1500da3e5e24574a3b2dc13d9f16d" +checksum = "e86e468df3cf5cf59fa7ef71a3e9ccabb76bb336401ea2c0674f563104cf3c5e" dependencies = [ "bitvec", - "phf 0.11.3", - "revm-primitives 20.2.1", - "serde", -] - -[[package]] -name = "revm-bytecode" -version = "7.0.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" -dependencies = [ - "bitvec", - "phf 0.13.1", - "revm-primitives 21.0.1", + "phf", + "revm-primitives", "serde", ] [[package]] name = "revm-context" -version = "9.1.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a20c98e7008591a6f012550c2a00aa36cba8c14cc88eb88dec32eb9102554b4" -dependencies = [ - "bitvec", - "cfg-if", - "derive-where", - "revm-bytecode 6.2.2", - "revm-context-interface 10.2.0", - "revm-database-interface 7.0.5", - "revm-primitives 20.2.1", - "revm-state 7.0.5", - "serde", -] - -[[package]] -name = "revm-context" -version = "10.1.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "9eb1f0a76b14d684a444fc52f7bf6b7564bf882599d91ee62e76d602e7a187c7" dependencies = [ "bitvec", "cfg-if", "derive-where", - "revm-bytecode 7.0.1", - "revm-context-interface 11.1.1", - "revm-database-interface 8.0.2", - "revm-primitives 21.0.1", - "revm-state 8.0.1", + "revm-bytecode", + "revm-context-interface", + "revm-database-interface", + "revm-primitives", + "revm-state", "serde", ] [[package]] name = "revm-context-interface" -version = "10.2.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50d241ed1ce647b94caf174fcd0239b7651318b2c4c06b825b59b973dfb8495" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "auto_impl", - "either", - "revm-database-interface 7.0.5", - "revm-primitives 20.2.1", - "revm-state 7.0.5", - "serde", -] - -[[package]] -name = "revm-context-interface" -version = "11.1.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "fc256b27743e2912ca16899568e6652a372eb5d1d573e6edb16c7836b16cf487" dependencies = [ "alloy-eip2930", "alloy-eip7702", "auto_impl", "either", - "revm-database-interface 8.0.2", - "revm-primitives 21.0.1", - "revm-state 8.0.1", + "revm-database-interface", + "revm-primitives", + "revm-state", "serde", ] [[package]] name = "revm-database" -version = "7.0.5" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a276ed142b4718dcf64bc9624f474373ed82ef20611025045c3fb23edbef9c" -dependencies = [ - "alloy-eips", - "revm-bytecode 6.2.2", - "revm-database-interface 7.0.5", - "revm-primitives 20.2.1", - "revm-state 7.0.5", - "serde", -] - -[[package]] -name = "revm-database" -version = "9.0.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "2c0a7d6da41061f2c50f99a2632571026b23684b5449ff319914151f4449b6c8" dependencies = [ "alloy-eips", - "revm-bytecode 7.0.1", - "revm-database-interface 8.0.2", - "revm-primitives 21.0.1", - "revm-state 8.0.1", + "revm-bytecode", + "revm-database-interface", + "revm-primitives", + "revm-state", "serde", ] [[package]] name = "revm-database-interface" -version = "7.0.5" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c523c77e74eeedbac5d6f7c092e3851dbe9c7fec6f418b85992bd79229db361" -dependencies = [ - "auto_impl", - "either", - "revm-primitives 20.2.1", - "revm-state 7.0.5", - "serde", -] - -[[package]] -name = "revm-database-interface" -version = "8.0.2" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "bd497a38a79057b94a049552cb1f925ad15078bc1a479c132aeeebd1d2ccc768" dependencies = [ "auto_impl", "either", - "revm-primitives 21.0.1", - "revm-state 8.0.1", + "revm-primitives", + "revm-state", "serde", + "thiserror 2.0.18", ] [[package]] name = "revm-handler" -version = "10.0.1" +version = "17.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550331ea85c1d257686e672081576172fe3d5a10526248b663bbf54f1bef226a" -dependencies = [ - "auto_impl", - "derive-where", - "revm-bytecode 6.2.2", - "revm-context 9.1.0", - "revm-context-interface 10.2.0", - "revm-database-interface 7.0.5", - "revm-interpreter 25.0.3", - "revm-precompile 27.0.0", - "revm-primitives 20.2.1", - "revm-state 7.0.5", - "serde", -] - -[[package]] -name = "revm-handler" -version = "11.1.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "9f1eed729ca9b228ae98688f352235871e9b8be3d568d488e4070f64c56e9d3d" dependencies = [ "auto_impl", "derive-where", - "revm-bytecode 7.0.1", - "revm-context 10.1.1", - "revm-context-interface 11.1.1", - "revm-database-interface 8.0.2", - "revm-interpreter 27.0.1", - "revm-precompile 28.1.1", - "revm-primitives 21.0.1", - "revm-state 8.0.1", + "revm-bytecode", + "revm-context", + "revm-context-interface", + "revm-database-interface", + "revm-interpreter", + "revm-precompile", + "revm-primitives", + "revm-state", "serde", ] [[package]] name = "revm-inspector" -version = "10.0.1" +version = "17.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0a6e9ccc2ae006f5bed8bd80cd6f8d3832cd55c5e861b9402fdd556098512f" -dependencies = [ - "auto_impl", - "either", - "revm-context 9.1.0", - "revm-database-interface 7.0.5", - "revm-handler 10.0.1", - "revm-interpreter 25.0.3", - "revm-primitives 20.2.1", - "revm-state 7.0.5", - "serde", - "serde_json", -] - -[[package]] -name = "revm-inspector" -version = "11.1.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "cbf5102391706513689f91cb3cb3d97b5f13a02e8647e6e9cb7620877ef84847" dependencies = [ "auto_impl", "either", - "revm-context 10.1.1", - "revm-database-interface 8.0.2", - "revm-handler 11.1.1", - "revm-interpreter 27.0.1", - "revm-primitives 21.0.1", - "revm-state 8.0.1", - "serde", - "serde_json", -] - -[[package]] -name = "revm-inspectors" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de23199c4b6181a6539e4131cf7e31cde4df05e1192bcdce491c34a511241588" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-rpc-types-trace", - "alloy-sol-types", - "anstyle", - "colorchoice", - "revm 29.0.1", + "revm-context", + "revm-database-interface", + "revm-handler", + "revm-interpreter", + "revm-primitives", + "revm-state", "serde", "serde_json", - "thiserror 2.0.17", ] [[package]] name = "revm-inspectors" -version = "0.31.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782c38fa94f99b4b15f1690bffc2c3cbf06a0f460cf163b470d126914b47d343" +checksum = "9487362b728f80dd2033ef5f4d0688453435bbe7caa721fa7e3b8fa25d89242b" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-rpc-types-trace", - "alloy-sol-types", - "anstyle", - "boa_engine", - "boa_gc", - "colorchoice", - "revm 30.1.1", - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "revm-interpreter" -version = "25.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06575dc51b1d8f5091daa12a435733a90b4a132dca7ccee0666c7db3851bc30c" -dependencies = [ - "revm-bytecode 6.2.2", - "revm-context-interface 10.2.0", - "revm-primitives 20.2.1", - "serde", -] - -[[package]] -name = "revm-interpreter" -version = "27.0.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" -dependencies = [ - "revm-bytecode 7.0.1", - "revm-context-interface 11.1.1", - "revm-primitives 21.0.1", - "revm-state 8.0.1", - "serde", -] - -[[package]] -name = "revm-precompile" -version = "27.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b57d4bd9e6b5fe469da5452a8a137bc2d030a3cd47c46908efc615bbc699da" -dependencies = [ - "ark-bls12-381", - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "arrayref", - "aurora-engine-modexp", - "blst", - "c-kzg", - "cfg-if", - "k256", - "libsecp256k1", - "p256", - "revm-primitives 20.2.1", - "ripemd", - "rug", - "secp256k1 0.31.1", - "sha2 0.10.9", + "alloy-sol-types", + "anstyle", + "colorchoice", + "revm", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "revm-interpreter" +version = "34.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf22f80612bb8f58fd1f578750281f2afadb6c93835b14ae6a4d6b75ca26f445" +dependencies = [ + "revm-bytecode", + "revm-context-interface", + "revm-primitives", + "revm-state", + "serde", ] [[package]] name = "revm-precompile" -version = "28.1.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +version = "32.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ec11f45deec71e4945e1809736bb20d454285f9167ab53c5159dae1deb603f" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -12544,29 +11015,17 @@ dependencies = [ "cfg-if", "k256", "p256", - "revm-primitives 21.0.1", + "revm-primitives", "ripemd", - "rug", "secp256k1 0.31.1", - "sha2 0.10.9", + "sha2", ] [[package]] name = "revm-primitives" -version = "20.2.1" +version = "22.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa29d9da06fe03b249b6419b33968ecdf92ad6428e2f012dc57bcd619b5d94e" -dependencies = [ - "alloy-primitives", - "num_enum", - "once_cell", - "serde", -] - -[[package]] -name = "revm-primitives" -version = "21.0.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "4bcfb5ce6cf18b118932bcdb7da05cd9c250f2cb9f64131396b55f3fe3537c35" dependencies = [ "alloy-primitives", "num_enum", @@ -12577,37 +11036,28 @@ dependencies = [ [[package]] name = "revm-scroll" version = "0.1.0" -source = "git+https://github.com/scroll-tech/scroll-revm?tag=scroll-v91.1#9c2a41996a216e3b69951db987d39e2f3fcfa148" +source = "git+https://github.com/DogeOS69/dogeos-revm.git?rev=dcf087684f255131c96c0d20f3291eef9198e990#dcf087684f255131c96c0d20f3291eef9198e990" dependencies = [ + "alloy-evm", "auto_impl", "enumn", "once_cell", - "revm 30.1.1", - "revm-inspector 11.1.1", - "revm-primitives 21.0.1", + "revm", + "revm-inspector", + "revm-primitives", "serde", ] [[package]] name = "revm-state" -version = "7.0.5" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f64fbacb86008394aaebd3454f9643b7d5a782bd251135e17c5b33da592d84d" -dependencies = [ - "bitflags 2.10.0", - "revm-bytecode 6.2.2", - "revm-primitives 20.2.1", - "serde", -] - -[[package]] -name = "revm-state" -version = "8.0.1" -source = "git+https://github.com/scroll-tech/revm?tag=scroll-v91.1#3992cf8991a8738c565d45960efb60a2cabd4c02" +checksum = "d29404707763da607e5d6e4771cb203998c28159279c2f64cc32de08d2814651" dependencies = [ - "bitflags 2.10.0", - "revm-bytecode 7.0.1", - "revm-primitives 21.0.1", + "alloy-eip7928", + "bitflags 2.13.0", + "revm-bytecode", + "revm-primitives", "serde", ] @@ -12623,9 +11073,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" dependencies = [ "bytemuck", ] @@ -12638,7 +11088,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -12646,9 +11096,9 @@ dependencies = [ [[package]] name = "ringbuffer" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6368f71f205ff9c33c076d170dd56ebf68e8161c733c0caa07a7a5509ed53" +checksum = "57b0b88a509053cbfd535726dcaaceee631313cef981266119527a1d110f6d2b" [[package]] name = "ripemd" @@ -12661,9 +11111,9 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.45" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" dependencies = [ "bitvec", "bytecheck", @@ -12674,14 +11124,14 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.18.1", + "uuid", ] [[package]] name = "rkyv_derive" -version = "0.7.45" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" dependencies = [ "proc-macro2", "quote", @@ -12690,9 +11140,9 @@ dependencies = [ [[package]] name = "rlimit" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" +checksum = "f35ee2729c56bb610f6dba436bf78135f728b7373bdffae2ec815b2d3eb98cc3" dependencies = [ "libc", ] @@ -12709,36 +11159,43 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "byteorder", "rmp", "serde", ] [[package]] name = "roaring" -version = "0.10.12" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e8d2cfa184d94d0726d650a9f4a1be7f9b76ac9fdb954219878dc00c1c1e7b" +checksum = "1dedc5658c6ecb3bdb5ef5f3295bb9253f42dcf3fd1402c03f6b1f7659c3c4a9" dependencies = [ "bytemuck", "byteorder", ] +[[package]] +name = "rocksdb" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddb7af00d2b17dbd07d82c0063e25411959748ff03e8d4f96134c2ff41fce34f" +dependencies = [ + "libc", + "librocksdb-sys", +] + [[package]] name = "rolling-file" version = "0.2.0" @@ -12750,13 +11207,14 @@ dependencies = [ [[package]] name = "rollup-node" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-chains", "alloy-consensus", "alloy-eips", "alloy-genesis", "alloy-network", + "alloy-node-bindings", "alloy-primitives", "alloy-provider", "alloy-rpc-client", @@ -12768,7 +11226,6 @@ dependencies = [ "alloy-signer-local", "alloy-sol-types", "alloy-transport", - "anvil", "async-trait", "auto_impl", "aws-config", @@ -12776,19 +11233,29 @@ dependencies = [ "clap", "color-eyre", "colored 3.1.1", - "console-subscriber", "crossterm 0.28.1", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-consensus", + "dogeos-reth-engine", + "dogeos-reth-evm", + "dogeos-reth-node", + "dogeos-reth-primitives", + "dogeos-reth-rpc", + "dogeos-rpc-types", "eyre", "futures", "glob", "http-body-util", - "hyper 1.8.1", + "hyper 1.10.1", "hyper-util", "jsonrpsee", "pprof", "rayon", "regex-lite", - "reqwest", + "reqwest 0.12.28", + "reqwest 0.13.4", "reth-chainspec", "reth-cli", "reth-cli-util", @@ -12796,6 +11263,7 @@ dependencies = [ "reth-e2e-test-utils", "reth-engine-local", "reth-eth-wire-types", + "reth-ethereum-cli", "reth-evm", "reth-fs-util", "reth-network", @@ -12810,18 +11278,11 @@ dependencies = [ "reth-provider", "reth-revm", "reth-rpc-api", + "reth-rpc-builder", "reth-rpc-eth-api", "reth-rpc-eth-types", "reth-rpc-layer", "reth-rpc-server-types", - "reth-scroll-chainspec", - "reth-scroll-cli", - "reth-scroll-consensus", - "reth-scroll-engine-primitives", - "reth-scroll-evm", - "reth-scroll-node", - "reth-scroll-primitives", - "reth-scroll-rpc", "reth-storage-api", "reth-tasks", "reth-tokio-util", @@ -12835,16 +11296,10 @@ dependencies = [ "rollup-node-sequencer", "rollup-node-signer", "rollup-node-watcher", - "scroll-alloy-consensus", - "scroll-alloy-evm", - "scroll-alloy-hardforks", - "scroll-alloy-network", - "scroll-alloy-provider", - "scroll-alloy-rpc-types", - "scroll-alloy-rpc-types-engine", "scroll-db", "scroll-derivation-pipeline", "scroll-engine", + "scroll-l1", "scroll-migration", "scroll-network", "scroll-wire", @@ -12852,12 +11307,12 @@ dependencies = [ "serde_json", "tokio", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.23", ] [[package]] name = "rollup-node-chain-orchestrator" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12866,26 +11321,28 @@ dependencies = [ "alloy-provider", "alloy-rpc-client", "alloy-rpc-types-engine", + "alloy-rpc-types-eth", "alloy-transport", "arbitrary", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-consensus", + "dogeos-reth-engine", + "dogeos-reth-primitives", + "dogeos-rpc-types", "futures", "metrics", "metrics-derive", "parking_lot 0.12.5", - "rand 0.9.2", - "reqwest", + "rand 0.9.4", + "reqwest 0.12.28", "reth-chainspec", "reth-eth-wire-types", "reth-network-api", "reth-network-p2p", "reth-network-peers", "reth-primitives-traits", - "reth-scroll-chainspec", - "reth-scroll-consensus", - "reth-scroll-engine-primitives", - "reth-scroll-forks", - "reth-scroll-node", - "reth-scroll-primitives", "reth-tasks", "reth-tokio-util", "reth-tracing", @@ -12894,10 +11351,6 @@ dependencies = [ "rollup-node-sequencer", "rollup-node-signer", "rollup-node-watcher", - "scroll-alloy-consensus", - "scroll-alloy-hardforks", - "scroll-alloy-network", - "scroll-alloy-provider", "scroll-db", "scroll-derivation-pipeline", "scroll-engine", @@ -12905,7 +11358,7 @@ dependencies = [ "serde", "serde_json", "strum 0.27.2", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -12913,7 +11366,7 @@ dependencies = [ [[package]] name = "rollup-node-primitives" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-chains", "alloy-consensus", @@ -12923,21 +11376,21 @@ dependencies = [ "alloy-rpc-types-eth", "arbitrary", "derive_more", + "dogeos-chainspec", + "dogeos-protocol-types", + "dogeos-reth-engine", + "dogeos-reth-primitives", "eyre", "reth-chainspec", "reth-network-peers", "reth-node-core", "reth-primitives-traits", - "reth-scroll-chainspec", - "reth-scroll-primitives", - "scroll-alloy-consensus", - "scroll-alloy-rpc-types-engine", "serde", ] [[package]] name = "rollup-node-providers" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-eips", "alloy-primitives", @@ -12948,39 +11401,43 @@ dependencies = [ "alloy-transport", "async-trait", "auto_impl", + "dogeos-reth-engine", + "dogeos-rpc-types", "eyre", "futures", "lru 0.13.0", - "reqwest", + "reqwest 0.12.28", "rollup-node-primitives", - "scroll-alloy-network", - "scroll-alloy-rpc-types-engine", "scroll-db", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "rollup-node-sequencer" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", + "alloy-provider", "alloy-rpc-types-engine", "alloy-signer-local", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-engine", + "dogeos-reth-evm", + "dogeos-reth-primitives", + "dogeos-rpc-types", "eyre", "futures", "metrics", "metrics-derive", "reth-e2e-test-utils", "reth-node-core", - "reth-scroll-chainspec", - "reth-scroll-engine-primitives", - "reth-scroll-node", - "reth-scroll-primitives", "reth-tasks", "reth-tracing", "rollup-node", @@ -12990,32 +11447,28 @@ dependencies = [ "rollup-node-sequencer", "rollup-node-signer", "rollup-node-watcher", - "scroll-alloy-consensus", - "scroll-alloy-hardforks", - "scroll-alloy-provider", - "scroll-alloy-rpc-types-engine", "scroll-db", "scroll-engine", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "rollup-node-signer" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-primitives", "alloy-signer", "alloy-signer-local", + "dogeos-reth-primitives", "futures", "metrics", "metrics-derive", - "reth-scroll-primitives", "reth-tracing", "rollup-node-primitives", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -13023,7 +11476,7 @@ dependencies = [ [[package]] name = "rollup-node-watcher" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-consensus", "alloy-eips", @@ -13037,19 +11490,19 @@ dependencies = [ "alloy-transport", "arbitrary", "async-trait", + "dogeos-protocol-types", "eyre", "itertools 0.14.0", "lru 0.13.0", "metrics", "metrics-derive", - "rand 0.9.2", + "rand 0.9.4", "reth-tasks", "reth-tracing", "rollup-node-primitives", "rollup-node-providers", - "scroll-alloy-consensus", "scroll-l1", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -13060,22 +11513,11 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" -[[package]] -name = "rpassword" -version = "7.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" -dependencies = [ - "libc", - "rtoolbox", - "windows-sys 0.59.0", -] - [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ "const-oid", "digest 0.10.7", @@ -13091,39 +11533,18 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rtoolbox" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "rug" -version = "1.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad2e973fe3c3214251a840a621812a4f40468da814b1a3d6947d433c2af11f" -dependencies = [ - "az", - "gmp-mpfr-sys", - "libc", - "libm", -] - [[package]] name = "ruint" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" +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", @@ -13133,8 +11554,8 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.8.6", + "rand 0.9.4", "rlp", "ruint-macro", "serde_core", @@ -13148,51 +11569,36 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" -[[package]] -name = "rusb" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9f9ff05b63a786553a4c02943b74b34a988448671001e9a27e2f0565cc05a4" -dependencies = [ - "libc", - "libusb1-sys", -] - [[package]] name = "rust_decimal" -version = "1.39.0" +version = "1.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" +checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" dependencies = [ "arrayvec", "borsh", "bytes", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "rkyv", "serde", "serde_json", + "wasm-bindgen", ] [[package]] name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - -[[package]] -name = "rustc-hash" -version = "1.1.0" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" dependencies = [ - "rand 0.8.5", + "rand 0.9.4", ] [[package]] @@ -13216,7 +11622,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.27", + "semver 1.0.28", ] [[package]] @@ -13225,7 +11631,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -13234,14 +11640,14 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "errno", "libc", - "linux-raw-sys 0.11.0", + "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] @@ -13259,58 +11665,37 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.4", + "rustls-webpki 0.103.13", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework 2.11.1", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.1", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", + "security-framework", ] [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", @@ -13324,19 +11709,40 @@ checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", - "jni", + "jni 0.21.1", "log", "once_cell", - "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls 0.23.41", + "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.103.4", - "security-framework 3.5.1", + "rustls-webpki 0.103.13", + "security-framework", "security-framework-sys", "webpki-root-certs 0.26.11", "windows-sys 0.59.0", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni 0.22.4", + "log", + "once_cell", + "rustls 0.23.41", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.13", + "security-framework", + "security-framework-sys", + "webpki-root-certs 1.0.8", + "windows-sys 0.61.2", +] + [[package]] name = "rustls-platform-verifier-android" version = "0.1.1" @@ -13355,9 +11761,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -13385,24 +11791,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "ryu-js" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" - -[[package]] -name = "salsa20" -version = "0.10.2" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -13413,20 +11804,11 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "sanitize-filename" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc984f4f9ceb736a7bb755c3e3bd17dc56370af2600c9780dcc48c66453da34d" -dependencies = [ - "regex", -] - [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -13445,9 +11827,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -13456,145 +11838,28 @@ dependencies = [ ] [[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash 0.8.12", - "cfg-if", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scroll-alloy-consensus" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "arbitrary", - "derive_more", - "modular-bitfield", - "reth-codecs", - "reth-codecs-derive", - "serde", - "serde_with", -] - -[[package]] -name = "scroll-alloy-evm" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm 0.22.2", - "alloy-primitives", - "auto_impl", - "encoder-standard", - "reth-scroll-chainspec", - "revm 30.1.1", - "revm-scroll", - "scroll-alloy-consensus", - "scroll-alloy-hardforks", - "serde", -] - -[[package]] -name = "scroll-alloy-hardforks" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-hardforks 0.4.4", - "auto_impl", - "serde", -] - -[[package]] -name = "scroll-alloy-network" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types-eth", - "alloy-signer", - "scroll-alloy-consensus", - "scroll-alloy-rpc-types", -] - -[[package]] -name = "scroll-alloy-provider" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-primitives", - "alloy-provider", - "alloy-rpc-client", - "alloy-rpc-types-engine", - "alloy-transport", - "alloy-transport-http", - "async-trait", - "auto_impl", - "derive_more", - "eyre", - "http-body-util", - "jsonrpsee", - "reqwest", - "reth-rpc-api", - "reth-scroll-engine-primitives", - "scroll-alloy-network", - "scroll-alloy-rpc-types-engine", - "thiserror 2.0.17", - "tower", -] - -[[package]] -name = "scroll-alloy-rpc-types" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "derive_more", - "scroll-alloy-consensus", - "serde", - "serde_json", -] - -[[package]] -name = "scroll-alloy-rpc-types-engine" -version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git?tag=scroll-v91.7#a4de13d3b2af3bb17b352a217af85c85cfc8cd74" +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" dependencies = [ - "alloy-primitives", - "alloy-rpc-types-engine", - "arbitrary", - "serde", + "ahash 0.8.12", + "cfg-if", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "scroll-codec" version = "0.1.0" @@ -13605,71 +11870,71 @@ dependencies = [ "alloy-sol-types", "bitvec", "derive_more", + "dogeos-protocol-types", "eyre", - "scroll-alloy-consensus", "scroll-l1", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "zstd", ] [[package]] name = "scroll-db" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-primitives", "arbitrary", "async-trait", "auto_impl", + "dogeos-protocol-types", + "dogeos-reth-engine", "futures", "metrics", "metrics-derive", - "rand 0.9.2", + "rand 0.9.4", "reth-tracing", "rollup-node-primitives", - "scroll-alloy-consensus", - "scroll-alloy-rpc-types-engine", "scroll-migration", "sea-orm", "serde", "serde_json", "strum 0.27.2", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "scroll-derivation-pipeline" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "codspeed-criterion-compat", + "dogeos-protocol-types", + "dogeos-reth-engine", "eyre", "futures", "metrics", "metrics-derive", "moka", - "reqwest", + "reqwest 0.12.28", "reth-tracing", "rollup-node-primitives", "rollup-node-providers", - "scroll-alloy-consensus", - "scroll-alloy-rpc-types-engine", "scroll-codec", "scroll-db", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "scroll-engine" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-chains", "alloy-consensus", @@ -13677,43 +11942,43 @@ dependencies = [ "alloy-primitives", "alloy-provider", "alloy-rpc-types-engine", + "alloy-transport", "arbitrary", "async-trait", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-engine", + "dogeos-reth-primitives", + "dogeos-rpc-types", "eyre", "futures", + "jsonrpsee", "metrics", "metrics-derive", "reth-chainspec", "reth-network-api", "reth-payload-primitives", "reth-primitives-traits", - "reth-scroll-chainspec", - "reth-scroll-engine-primitives", - "reth-scroll-primitives", "reth-testing-utils", "rollup-node-primitives", - "scroll-alloy-consensus", - "scroll-alloy-hardforks", - "scroll-alloy-network", - "scroll-alloy-provider", - "scroll-alloy-rpc-types-engine", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] [[package]] name = "scroll-l1" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-primitives", "alloy-sol-types", "arbitrary", "bitvec", "derive_more", - "scroll-alloy-consensus", - "thiserror 2.0.17", + "dogeos-protocol-types", + "thiserror 2.0.18", ] [[package]] @@ -13721,25 +11986,29 @@ name = "scroll-migration" version = "0.1.0" dependencies = [ "alloy-primitives", + "dogeos-chainspec", "eyre", "futures", - "indicatif 0.17.11", - "reqwest", + "indicatif", + "reqwest 0.12.28", "reqwest-middleware", "reqwest-retry", "reth-chainspec", - "reth-scroll-chainspec", "sea-orm", "sea-orm-migration", - "sha2 0.10.9", + "sha2", "tracing", ] [[package]] name = "scroll-network" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-primitives", + "dogeos-chainspec", + "dogeos-hardforks", + "dogeos-protocol-types", + "dogeos-reth-primitives", "futures", "parking_lot 0.12.5", "reth-chainspec", @@ -13749,15 +12018,11 @@ dependencies = [ "reth-network-peers", "reth-network-types", "reth-primitives-traits", - "reth-scroll-chainspec", - "reth-scroll-node", - "reth-scroll-primitives", "reth-storage-api", "reth-tokio-util", "rollup-node-primitives", - "scroll-alloy-hardforks", "scroll-wire", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -13765,34 +12030,22 @@ dependencies = [ [[package]] name = "scroll-wire" -version = "1.0.6" +version = "0.3.0-beta.0" dependencies = [ "alloy-primitives", "alloy-rlp", + "dogeos-reth-primitives", "futures", "reth-eth-wire", "reth-network", "reth-network-api", - "reth-scroll-primitives", "rollup-node-signer", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", ] -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2 0.10.9", -] - [[package]] name = "sct" version = "0.7.1" @@ -13813,14 +12066,14 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "sea-orm" -version = "1.1.19" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d945f62558fac19e5988680d2fdf747b734c2dbc6ce2cb81ba33ed8dde5b103" +checksum = "2dc312fedd460a47ea563911761d254a84e7b51d8cc73ec92c929e78f33fa957" dependencies = [ "async-stream", "async-trait", @@ -13829,6 +12082,7 @@ dependencies = [ "derive_more", "futures-util", "log", + "mac_address", "ouroboros", "pgvector", "rust_decimal", @@ -13839,18 +12093,18 @@ dependencies = [ "serde_json", "sqlx", "strum 0.26.3", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tracing", "url", - "uuid 1.18.1", + "uuid", ] [[package]] name = "sea-orm-cli" -version = "1.1.19" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94492e2ab6c045b4cc38013809ce255d14c3d352c9f0d11e6b920e2adc948ad" +checksum = "da80ebcdb44571e86f03a2bdcb5532136a87397f366f38bbce64673fc5e6a450" dependencies = [ "chrono", "clap", @@ -13861,29 +12115,29 @@ dependencies = [ "sqlx", "tokio", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.23", "url", ] [[package]] name = "sea-orm-macros" -version = "1.1.19" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c2e64a50a9cc8339f10a27577e10062c7f995488e469f2c95762c5ee847832" +checksum = "9b9a3f90e336ec74803e8eb98c61bc98754c1adfba3b4f84d946237b752b1c88" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", "sea-bae", - "syn 2.0.110", + "syn 2.0.118", "unicode-ident", ] [[package]] name = "sea-orm-migration" -version = "1.1.19" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7315c0cadb7e60fb17ee2bb282aa27d01911fc2a7e5836ec1d4ac37d19250bb4" +checksum = "07c577f2959277e936c1d08109acd1e08fc36a95ef29ec028190ba82cad8f96e" dependencies = [ "async-trait", "clap", @@ -13892,7 +12146,7 @@ dependencies = [ "sea-orm-cli", "sea-schema", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.23", ] [[package]] @@ -13909,7 +12163,7 @@ dependencies = [ "sea-query-derive", "serde_json", "time", - "uuid 1.18.1", + "uuid", ] [[package]] @@ -13925,7 +12179,7 @@ dependencies = [ "serde_json", "sqlx", "time", - "uuid 1.18.1", + "uuid", ] [[package]] @@ -13938,8 +12192,8 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.110", - "thiserror 2.0.17", + "syn 2.0.118", + "thiserror 2.0.18", ] [[package]] @@ -13964,7 +12218,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -13995,7 +12249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.6", "secp256k1-sys 0.10.1", "serde", ] @@ -14007,7 +12261,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes", - "rand 0.9.2", + "rand 0.9.4", "secp256k1-sys 0.11.0", ] @@ -14031,24 +12285,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.5.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -14057,9 +12298,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -14076,9 +12317,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -14093,12 +12334,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" @@ -14132,57 +12367,28 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "serde_fmt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed" -dependencies = [ - "serde_core", + "syn 2.0.118", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.14.0", "itoa", "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", "serde", "serde_core", + "zmij", ] [[package]] name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -14201,17 +12407,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10574371d41b0d9b2cff89418eda27da52bcaff2cc8741db26382a77c29131f1" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ "base64 0.22.1", + "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.0", + "indexmap 2.14.0", "schemars 0.9.0", - "schemars 1.1.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -14220,14 +12427,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a72d8216842fdd57820dc78d840bef99248e35fb2554ff923319e60f2d686b" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -14247,23 +12454,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.9" @@ -14271,15 +12465,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] [[package]] name = "sha3" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" dependencies = [ "digest 0.10.7", "keccak", @@ -14287,9 +12481,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" dependencies = [ "cc", "cfg-if", @@ -14305,25 +12499,16 @@ dependencies = [ ] [[package]] -name = "shell-words" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" - -[[package]] -name = "shellexpand" -version = "3.1.1" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" -dependencies = [ - "dirs", -] +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook" @@ -14348,10 +12533,11 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -14367,9 +12553,19 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version 0.4.1", + "simdutf8", +] [[package]] name = "simdutf8" @@ -14379,54 +12575,48 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple_asn1" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", ] [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] -name = "skeptic" -version = "0.13.7" +name = "sketches-ddsketch" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" -dependencies = [ - "bytecount", - "cargo_metadata 0.14.2", - "error-chain", - "glob", - "pulldown-cmark", - "tempfile", - "walkdir", -] +checksum = "0c6f73aeb92d671e0cc4dca167e59b2deb6387c375391bc99ee743f326994a2b" [[package]] -name = "sketches-ddsketch" -version = "0.3.0" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] -name = "slab" -version = "0.4.11" +name = "slotmap" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] [[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", @@ -14445,210 +12635,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "soketto" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures", - "http 1.3.1", - "httparse", - "log", - "rand 0.8.5", - "sha1", -] - -[[package]] -name = "solar-ast" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6aaf98d032ba3be85dca5f969895ade113a9137bb5956f80c5faf14689de59" -dependencies = [ - "alloy-primitives", - "bumpalo", - "either", - "num-rational", - "semver 1.0.27", - "solar-data-structures", - "solar-interface", - "solar-macros", - "strum 0.27.2", -] - -[[package]] -name = "solar-compiler" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e792060bcbb007a6b9b060292945fb34ff854c7d93a9628f81b6c809eb4360" -dependencies = [ - "alloy-primitives", - "solar-ast", - "solar-config", - "solar-data-structures", - "solar-interface", - "solar-macros", - "solar-parse", - "solar-sema", -] - -[[package]] -name = "solar-config" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff16d692734c757edd339f5db142ba91b42772f8cbe1db1ce3c747f1e777185f" -dependencies = [ - "colorchoice", - "strum 0.27.2", -] - -[[package]] -name = "solar-data-structures" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dea34e58332c7d6a8cde1f1740186d31682b7be46e098b8cc16fcb7ffd98bf5" -dependencies = [ - "bumpalo", - "index_vec", - "indexmap 2.12.0", - "parking_lot 0.12.5", - "rayon", - "rustc-hash 2.1.1", - "smallvec", -] - -[[package]] -name = "solar-interface" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6163af2e773f4d455212fa9ba2c0664506029dd26232eb406f5046092ac311" -dependencies = [ - "annotate-snippets", - "anstream", - "anstyle", - "derive_more", - "dunce", - "inturn", - "itertools 0.14.0", - "itoa", - "normalize-path", - "once_map", - "rayon", - "scoped-tls", - "serde", - "serde_json", - "solar-config", - "solar-data-structures", - "solar-macros", - "thiserror 2.0.17", - "tracing", - "unicode-width 0.2.0", -] - -[[package]] -name = "solar-macros" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44a98045888d75d17f52e7b76f6098844b76078b5742a450c3ebcdbdb02da124" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", -] - -[[package]] -name = "solar-parse" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b77a9cbb07948e4586cdcf64f0a483424197308816ebd57a4cf06130b68562" -dependencies = [ - "alloy-primitives", - "bitflags 2.10.0", - "bumpalo", - "itertools 0.14.0", - "memchr", - "num-bigint", - "num-rational", - "num-traits", - "ruint", - "smallvec", - "solar-ast", - "solar-data-structures", - "solar-interface", - "tracing", -] - -[[package]] -name = "solar-sema" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd033af43a38da316a04b25bbd20b121ce5d728b61e6988fd8fd6e2f1e68d0a1" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "bitflags 2.10.0", - "bumpalo", - "derive_more", - "either", - "once_map", - "paste", - "rayon", - "serde", - "serde_json", - "solar-ast", - "solar-data-structures", - "solar-interface", - "solar-macros", - "solar-parse", - "strum 0.27.2", - "thread_local", - "tracing", + "windows-sys 0.52.0", ] [[package]] -name = "soldeer-core" -version = "0.8.0" +name = "socket2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6956940ce1436c00d50847e78c703375922d25130041a97f57508dee5f3952" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ - "bon", - "chrono", - "const-hex", - "derive_more", - "dunce", - "home", - "ignore", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "soketto" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "http 1.4.2", + "httparse", "log", - "path-slash", - "rayon", - "regex", - "reqwest", - "sanitize-filename", - "semver 1.0.27", - "serde", - "serde_json", - "sha2 0.10.9", - "thiserror 2.0.17", - "tokio", - "toml_edit 0.23.7", - "uuid 1.18.1", - "zip", - "zip-extract", + "rand 0.8.6", + "sha1", ] [[package]] @@ -14679,12 +12692,6 @@ dependencies = [ "der", ] -[[package]] -name = "sptr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" - [[package]] name = "sqlx" version = "0.8.6" @@ -14718,7 +12725,7 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink 0.10.0", - "indexmap 2.12.0", + "indexmap 2.14.0", "log", "memchr", "native-tls", @@ -14727,15 +12734,15 @@ dependencies = [ "rust_decimal", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tokio", "tokio-stream", "tracing", "url", - "uuid 1.18.1", + "uuid", ] [[package]] @@ -14748,7 +12755,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -14766,12 +12773,12 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "sqlx-core", "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.110", + "syn 2.0.118", "tokio", "url", ] @@ -14785,7 +12792,7 @@ dependencies = [ "atoi", "base64 0.22.1", "bigdecimal", - "bitflags 2.10.0", + "bitflags 2.13.0", "byteorder", "bytes", "chrono", @@ -14807,19 +12814,19 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand 0.8.5", + "rand 0.8.6", "rsa", "rust_decimal", "serde", "sha1", - "sha2 0.10.9", + "sha2", "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tracing", - "uuid 1.18.1", + "uuid", "whoami", ] @@ -14832,7 +12839,7 @@ dependencies = [ "atoi", "base64 0.22.1", "bigdecimal", - "bitflags 2.10.0", + "bitflags 2.13.0", "byteorder", "chrono", "crc", @@ -14851,18 +12858,18 @@ dependencies = [ "memchr", "num-bigint", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "rust_decimal", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tracing", - "uuid 1.18.1", + "uuid", "whoami", ] @@ -14886,11 +12893,11 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tracing", "url", - "uuid 1.18.1", + "uuid", ] [[package]] @@ -14917,9 +12924,9 @@ dependencies = [ [[package]] name = "str_stack" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" +checksum = "7f446288b699d66d0fd2e30d1cfe7869194312524b3b9252594868ed26ef056a" [[package]] name = "stringprep" @@ -14943,9 +12950,6 @@ name = "strum" version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] [[package]] name = "strum" @@ -14957,16 +12961,12 @@ dependencies = [ ] [[package]] -name = "strum_macros" -version = "0.26.4" +name = "strum" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.110", + "strum_macros 0.28.0", ] [[package]] @@ -14978,147 +12978,56 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "sval" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502b8906c4736190684646827fbab1e954357dfe541013bbd7994d033d53a1ca" - -[[package]] -name = "sval_buffer" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b854348b15b6c441bdd27ce9053569b016a0723eab2d015b1fd8e6abe4f708" -dependencies = [ - "sval", - "sval_ref", -] - -[[package]] -name = "sval_dynamic" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bd9e8b74410ddad37c6962587c5f9801a2caadba9e11f3f916ee3f31ae4a1f" -dependencies = [ - "sval", + "syn 2.0.118", ] [[package]] -name = "sval_fmt" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe17b8deb33a9441280b4266c2d257e166bafbaea6e66b4b34ca139c91766d9" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_json" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854addb048a5bafb1f496c98e0ab5b9b581c3843f03ca07c034ae110d3b7c623" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_nested" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cf068f482108ff44ae8013477cb047a1665d5f1a635ad7cf79582c1845dce9" -dependencies = [ - "sval", - "sval_buffer", - "sval_ref", -] - -[[package]] -name = "sval_ref" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed02126365ffe5ab8faa0abd9be54fbe68d03d607cd623725b0a71541f8aaa6f" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_serde" -version = "2.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a263383c6aa2076c4ef6011d3bae1b356edf6ea2613e3d8e8ebaa7b57dd707d5" -dependencies = [ - "serde_core", - "sval", - "sval_nested", -] - -[[package]] -name = "svm-rs" -version = "0.5.23" +name = "strum_macros" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415b159b54c22d9810087f0991371fd6242a912673e982a7c4ca8ea122f7e00a" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ - "const-hex", - "dirs", - "reqwest", - "semver 1.0.27", - "serde", - "serde_json", - "sha2 0.10.9", - "tempfile", - "thiserror 2.0.17", - "url", - "zip", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "svm-rs-builds" -version = "0.5.23" +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab96ac3275ad299c6e5455b69a2f72443c4d3afb4933d92a0f859d48432dea49" -dependencies = [ - "const-hex", - "semver 1.0.27", - "serde_json", - "svm-rs", -] +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symbolic-common" -version = "12.17.0" +version = "12.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d8046c5674ab857104bc4559d505f4809b8060d57806e45d49737c97afeb60" +checksum = "332615d90111d8eeaf86a84dc9bbe9f65d0d8c5cf11b4caccedc37754eb0dcfd" dependencies = [ "debugid", "memmap2", "stable_deref_trait", - "uuid 1.18.1", + "uuid", ] [[package]] name = "symbolic-demangle" -version = "12.17.0" +version = "12.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1accb6e5c4b0f682de907623912e616b44be1c9e725775155546669dbff720ec" +checksum = "912017718eb4d21930546245af9a3475c9dccf15675a5c215664e76621afc471" dependencies = [ "cpp_demangle", "rustc-demangle", "symbolic-common", ] +[[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" @@ -15132,9 +13041,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.110" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", @@ -15143,14 +13052,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.4.1" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" +checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -15170,29 +13079,30 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "sysinfo" -version = "0.33.1" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +checksum = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f" dependencies = [ - "core-foundation-sys", "libc", "memchr", "ntapi", - "windows 0.57.0", + "objc2-core-foundation", + "objc2-io-kit", + "windows", ] [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -15221,9 +13131,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.44" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" dependencies = [ "filetime", "libc", @@ -15232,27 +13142,17 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", - "rustix 1.1.2", + "rustix 1.1.4", "windows-sys 0.61.2", ] -[[package]] -name = "terminal_size" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" -dependencies = [ - "rustix 1.1.2", - "windows-sys 0.60.2", -] - [[package]] name = "tests" version = "0.0.1" @@ -15263,24 +13163,18 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-signer-local", "alloy-sol-types", + "dogeos-rpc-types", "eyre", - "getrandom 0.2.16", + "getrandom 0.2.17", "reth-e2e-test-utils", "reth-tracing", "rollup-node-chain-orchestrator", - "scroll-alloy-network", "serde", "serde_json", "tokio", "tracing", ] -[[package]] -name = "thin-vec" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" - [[package]] name = "thiserror" version = "1.0.69" @@ -15292,11 +13186,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -15307,18 +13201,32 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", +] + +[[package]] +name = "thread-priority" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d2e834949be5111506bb252643498af1514f600d9e1dceedaa42afae155b67f" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "libc", + "log", + "rustversion", + "windows", ] [[package]] @@ -15341,65 +13249,45 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", - "itoa", - "js-sys", "libc", "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec 0.10.4", -] - [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", - "zerovec 0.11.5", + "serde_core", + "zerovec", ] [[package]] @@ -15414,9 +13302,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -15429,9 +13317,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -15439,7 +13327,7 @@ dependencies = [ "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.4", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -15447,13 +13335,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -15482,15 +13370,15 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.31", + "rustls 0.23.41", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -15500,38 +13388,26 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", - "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls 0.23.41", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", - "tungstenite 0.26.2", + "tungstenite", "webpki-roots 0.26.11", ] -[[package]] -name = "tokio-tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.28.0", -] - [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -15544,119 +13420,81 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "0.9.8" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.14.0", "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.3", + "serde_spanned", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_datetime" -version = "0.7.3" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.12.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.23.7" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ - "indexmap 2.12.0", - "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.3", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "toml_writer", - "winnow", + "winnow 1.0.3", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.3", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tonic" -version = "0.14.2" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", - "axum", "base64 0.22.1", "bytes", - "h2 0.4.12", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.10.1", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "socket2 0.6.1", "sync_wrapper", "tokio", "tokio-stream", @@ -15668,25 +13506,25 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.2" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" dependencies = [ "bytes", - "prost 0.14.1", + "prost 0.14.4", "tonic", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", "hdrhistogram", - "indexmap 2.12.0", + "indexmap 2.14.0", "pin-project-lite", "slab", "sync_wrapper", @@ -15699,22 +13537,21 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "async-compression", "base64 0.22.1", - "bitflags 2.10.0", + "bitflags 2.13.0", "bytes", "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "http-body-util", "http-range-header", "httpdate", - "iri-string", "mime", "mime_guess", "percent-encoding", @@ -15725,7 +13562,8 @@ dependencies = [ "tower-layer", "tower-service", "tracing", - "uuid 1.18.1", + "url", + "uuid", ] [[package]] @@ -15742,9 +13580,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -15754,32 +13592,33 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", - "thiserror 1.0.69", + "symlink", + "thiserror 2.0.18", "time", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.23", ] [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -15792,7 +13631,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.23", ] [[package]] @@ -15807,13 +13646,13 @@ dependencies = [ [[package]] name = "tracing-journald" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0b4143302cf1022dac868d521e36e8b27691f72c84b3311750d5188ebba657" +checksum = "2d3a81ed245bfb62592b1e2bc153e77656d94ee6a0497683a65a12ccaf2438d0" dependencies = [ "libc", "tracing-core", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.23", ] [[package]] @@ -15829,14 +13668,46 @@ dependencies = [ [[package]] name = "tracing-logfmt" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" +checksum = "a250055a3518b5efba928a18ffac8d32d42ea607a9affff4532144cd5b2e378e" dependencies = [ "time", "tracing", "tracing-core", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.23", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac28f2d093c6c477eaa76b23525478f38de514fa9aeb1285738d4b97a9552fc" +dependencies = [ + "js-sys", + "opentelemetry", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber 0.3.23", + "web-time", +] + +[[package]] +name = "tracing-samply" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c175f7ecc002b6ef04776a39f440503e4e788790ddbdbfac8259b7a069526334" +dependencies = [ + "cfg-if", + "itoa", + "libc", + "mach2 0.5.0", + "memmap2", + "smallvec", + "tracing-core", + "tracing-subscriber 0.3.23", ] [[package]] @@ -15860,9 +13731,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -15887,7 +13758,7 @@ checksum = "ee44f4cef85f88b4dea21c0b1f58320bdf35715cf56d840969487cff00613321" dependencies = [ "alloy-primitives", "ethereum_hashing", - "ethereum_ssz", + "ethereum_ssz 0.9.1", "smallvec", "typenum", ] @@ -15901,21 +13772,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "trezor-client" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10636211ab89c96ed2824adc5ec0d081e1080aeacc24c37abb318dcb31dcc779" -dependencies = [ - "byteorder", - "hex", - "protobuf", - "rusb", - "thiserror 1.0.69", - "tracing", + "syn 2.0.118", ] [[package]] @@ -15926,13 +13783,7 @@ checksum = "a1631b201eb031b563d2e85ca18ec8092508e262a3196ce9bd10a67ec87b9f5c" dependencies = [ "hash-db", "rlp", -] - -[[package]] -name = "triomphe" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +] [[package]] name = "try-lock" @@ -15940,25 +13791,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tungstenite" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" -dependencies = [ - "bytes", - "data-encoding", - "http 1.3.1", - "httparse", - "log", - "rand 0.9.2", - "rustls 0.23.31", - "rustls-pki-types", - "sha1", - "thiserror 2.0.17", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.28.0" @@ -15967,12 +13799,14 @@ checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", - "http 1.3.1", + "http 1.4.2", "httparse", "log", - "rand 0.9.2", + "rand 0.9.4", + "rustls 0.23.41", + "rustls-pki-types", "sha1", - "thiserror 2.0.17", + "thiserror 2.0.18", "utf-8", ] @@ -15984,9 +13818,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" @@ -16024,20 +13858,11 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "uncased" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" -dependencies = [ - "version_check", -] - [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-bidi" @@ -16047,9 +13872,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" @@ -16068,32 +13893,26 @@ checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-truncate" -version = "1.1.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ - "itertools 0.13.0", + "itertools 0.14.0", "unicode-segmentation", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-width" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -16101,12 +13920,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unit-prefix" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" - [[package]] name = "universal-hash" version = "0.5.1" @@ -16131,14 +13944,15 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -16153,12 +13967,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -16173,23 +13981,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.16", - "serde", -] - -[[package]] -name = "uuid" -version = "1.18.1" +version = "1.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] @@ -16199,42 +13997,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[package]] -name = "value-bag" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" -dependencies = [ - "value-bag-serde1", - "value-bag-sval2", -] - -[[package]] -name = "value-bag-serde1" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5" -dependencies = [ - "erased-serde", - "serde_core", - "serde_fmt", -] - -[[package]] -name = "value-bag-sval2" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f" -dependencies = [ - "sval", - "sval_buffer", - "sval_dynamic", - "sval_fmt", - "sval_json", - "sval_ref", - "sval_serde", -] - [[package]] name = "vcpkg" version = "0.2.15" @@ -16243,24 +14005,12 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "8.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" -dependencies = [ - "anyhow", - "cfg-if", - "rustversion", - "time", -] - -[[package]] -name = "vergen" -version = "9.0.6" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" +checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" dependencies = [ "anyhow", - "cargo_metadata 0.19.2", + "cargo_metadata", "derive_builder", "regex", "rustversion", @@ -16270,24 +14020,24 @@ dependencies = [ [[package]] name = "vergen-git2" -version = "1.0.7" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f6ee511ec45098eabade8a0750e76eec671e7fb2d9360c563911336bea9cac1" +checksum = "d51ab55ddf1188c8d679f349775362b0fa9e90bd7a4ac69838b2a087623f0d57" dependencies = [ "anyhow", "derive_builder", "git2", "rustversion", "time", - "vergen 9.0.6", + "vergen", "vergen-lib", ] [[package]] name = "vergen-lib" -version = "0.1.6" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" +checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" dependencies = [ "anyhow", "derive_builder", @@ -16308,7 +14058,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -16353,9 +14103,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] @@ -16368,35 +14118,33 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", "rustversion", + "serde", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -16404,31 +14152,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-streams" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" dependencies = [ "futures-util", "js-sys", @@ -16468,9 +14216,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -16492,14 +14240,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.4", + "webpki-root-certs 1.0.8", ] [[package]] name = "webpki-root-certs" -version = "1.0.4" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" dependencies = [ "rustls-pki-types", ] @@ -16510,30 +14258,18 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.4", + "webpki-roots 1.0.8", ] [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - [[package]] name = "whoami" version = "1.6.1" @@ -16572,7 +14308,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.48.0", ] [[package]] @@ -16581,16 +14317,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.62.2" @@ -16598,7 +14324,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" dependencies = [ "windows-collections", - "windows-core 0.62.2", + "windows-core", "windows-future", "windows-numerics", ] @@ -16609,19 +14335,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.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", + "windows-core", ] [[package]] @@ -16630,10 +14344,10 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", + "windows-implement", + "windows-interface", "windows-link", - "windows-result 0.4.1", + "windows-result", "windows-strings", ] @@ -16643,22 +14357,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" dependencies = [ - "windows-core 0.62.2", + "windows-core", "windows-link", "windows-threading", ] -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", -] - [[package]] name = "windows-implement" version = "0.60.2" @@ -16667,18 +14370,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -16689,7 +14381,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] @@ -16704,7 +14396,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ - "windows-core 0.62.2", + "windows-core", "windows-link", ] @@ -16715,19 +14407,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ "windows-link", - "windows-result 0.4.1", + "windows-result", "windows-strings", ] -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-result" version = "0.4.1" @@ -17054,46 +14737,33 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] [[package]] -name = "winreg" -version = "0.50.0" +name = "winnow" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" dependencies = [ - "cfg-if", - "windows-sys 0.48.0", + "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "ws_stream_wasm" @@ -17107,8 +14777,8 @@ dependencies = [ "log", "pharos", "rustc_version 0.4.1", - "send_wrapper 0.6.0", - "thiserror 2.0.17", + "send_wrapper", + "thiserror 2.0.18", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -17130,7 +14800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix 1.1.2", + "rustix 1.1.4", ] [[package]] @@ -17139,226 +14809,136 @@ version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" -[[package]] -name = "xxhash-rust" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" - [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" -dependencies = [ - "is-terminal", -] - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.7.5", - "zerofrom", -] [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", - "yoke-derive 0.8.1", + "yoke-derive", "zerofrom", ] [[package]] name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", - "synstructure", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "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.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.118", ] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", - "yoke 0.8.1", + "yoke", "zerofrom", + "zerovec", ] [[package]] name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke 0.7.5", - "zerofrom", - "zerovec-derive 0.10.3", -] - -[[package]] -name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ - "yoke 0.8.1", + "serde", + "yoke", "zerofrom", - "zerovec-derive 0.11.2", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", + "zerovec-derive", ] [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "zip" -version = "4.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" -dependencies = [ - "arbitrary", - "crc32fast", - "flate2", - "indexmap 2.12.0", - "memchr", - "zopfli", -] - -[[package]] -name = "zip-extract" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa5b9958fd0b5b685af54f2c3fa21fca05fe295ebaf3e77b6d24d96c4174037" -dependencies = [ - "log", - "thiserror 2.0.17", - "zip", + "syn 2.0.118", ] [[package]] -name = "zlib-rs" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" - -[[package]] -name = "zopfli" -version = "0.8.3" +name = "zmij" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index b3f881663..ed92983fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [workspace.package] -version = "1.0.6" +version = "0.3.0-beta.0" edition = "2021" -rust-version = "1.83" +rust-version = "1.93" license = "MIT OR Apache-2.0" exclude = [".github/"] @@ -25,7 +25,7 @@ members = [ "tests", ] -resolver = "2" +resolver = "3" [workspace.lints] rust.missing_debug_implementations = "warn" @@ -123,82 +123,77 @@ debug = "full" strip = "none" [workspace.dependencies] -# alloy -alloy-chains = { version = "0.2.5", default-features = false } -alloy-consensus = { version = "1.0.37", default-features = false } -alloy-eips = { version = "1.0.37", default-features = false } -alloy-genesis = { version = "1.0.37", default-features = false } -alloy-json-rpc = { version = "1.0.37", default-features = false } -alloy-network = { version = "1.0.37", default-features = false } -alloy-node-bindings = { version = "1.0.37", default-features = false } -alloy-primitives = { version = "1.4.1", default-features = false } -alloy-provider = { version = "1.0.37", default-features = false } -alloy-rpc-client = { version = "1.0.37", default-features = false } -alloy-rpc-types-engine = { version = "1.0.37", default-features = false } -alloy-rpc-types-anvil = { version = "1.0.37", default-features = false } -alloy-rpc-types-eth = { version = "1.0.37", default-features = false } -alloy-sol-types = { version = "1.4.1", default-features = false } -alloy-signer = { version = "1.0.37", default-features = false } -alloy-signer-local = { version = "1.0.37", default-features = false } -alloy-transport = { version = "1.0.37", default-features = false } +# DogeOS Reth 2 component family. Keep this immutable so the in-process execution graph is +# reproducible across rollup-node builds. +dogeos-chainspec = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-hardforks = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-protocol-types = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-reth-engine = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-reth-evm = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-reth-consensus = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-reth-node = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-reth-primitives = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-reth-rpc = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-reth-txpool = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } +dogeos-rpc-types = { git = "https://github.com/DogeOS69/dogeos-reth.git", rev = "8f0b98b056111e8f497a4c6dd78ef1f776b626a5", default-features = false } -# scroll-alloy -scroll-alloy-consensus = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -scroll-alloy-hardforks = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -scroll-alloy-network = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -scroll-alloy-provider = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -scroll-alloy-evm = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -scroll-alloy-rpc-types = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -scroll-alloy-rpc-types-engine = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } +# alloy +alloy-chains = { version = "0.2.34", default-features = false } +alloy-consensus = { version = "=1.8.2", default-features = false } +alloy-eips = { version = "1.8.2", default-features = false } +alloy-genesis = { version = "1.8.2", default-features = false } +alloy-json-rpc = { version = "=1.8.3", default-features = false } +alloy-network = { version = "1.8.2", default-features = false } +alloy-node-bindings = { version = "1.8.2", default-features = false } +alloy-primitives = { version = "=1.5.7", default-features = false } +alloy-provider = { version = "=1.8.2", default-features = false } +alloy-rpc-client = { version = "=1.8.3", default-features = false } +alloy-rpc-types-engine = { version = "=1.8.2", default-features = false } +alloy-rpc-types-anvil = { version = "1.8.2", default-features = false } +alloy-rpc-types-eth = { version = "=1.8.2", default-features = false } +alloy-sol-types = { version = "1.5.7", default-features = false } +alloy-signer = { version = "=1.8.2", default-features = false } +alloy-signer-local = { version = "=1.8.2", default-features = false } +alloy-transport = { version = "=1.8.3", default-features = false } # reth -reth-chainspec = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-db = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-e2e-test-utils = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7" } -reth-eth-wire = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-eth-wire-types = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-fs-util = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-network = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-network-api = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-network-p2p = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-network-peers = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-network-types = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-node-builder = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-node-core = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-node-api = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-node-types = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-payload-primitives = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-primitives = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-primitives-traits = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-provider = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-rpc-api = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-rpc-eth-api = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-rpc-eth-types = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-rpc-layer = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-rpc-server-types = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-storage-api = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-tasks = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-tokio-util = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-tracing = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-transaction-pool = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-trie-db = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-testing-utils = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-revm = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-evm = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-engine-local = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-cli = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-cli-util = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } - -# reth-scroll -reth-scroll-chainspec = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-consensus = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-cli = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-evm = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-rpc = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-engine-primitives = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-forks = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-node = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } -reth-scroll-primitives = { git = "https://github.com/scroll-tech/reth.git", tag = "scroll-v91.7", default-features = false } +reth-chainspec = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-db = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-e2e-test-utils = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232" } +reth-ethereum-cli = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-eth-wire = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-eth-wire-types = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-fs-util = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-network = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-network-api = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-network-p2p = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-network-peers = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-network-types = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-node-builder = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-node-core = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-node-api = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-node-types = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-payload-primitives = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-primitives-traits = { version = "=0.1.1", default-features = false } +reth-provider = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-rpc-api = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-rpc-builder = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-rpc-eth-api = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-rpc-eth-types = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-rpc-layer = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-rpc-server-types = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-storage-api = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-tasks = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-tokio-util = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-tracing = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-transaction-pool = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-trie-db = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-testing-utils = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-revm = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-evm = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-engine-local = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-cli = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } +reth-cli-util = { git = "https://github.com/DogeOS69/reth.git", rev = "972366a0bfc11cf6a0d5dc79d5e779cd81e32232", default-features = false } # rollup node rollup-node = { path = "crates/node" } @@ -244,11 +239,7 @@ tokio-stream = { version = "0.1", default-features = false } tracing = "0.1.0" getrandom = { version = "0.2", features = ["js"] } -[patch.crates-io] -revm = { git = "https://github.com/scroll-tech/revm", tag = "scroll-v91.1" } -op-revm = { git = "https://github.com/scroll-tech/revm", tag = "scroll-v91.1" } - -# [patch."https://github.com/scroll-tech/reth.git"] +# [patch."https://github.com/DogeOS69/reth.git"] # reth-chainspec = { path = "../reth/crates/chainspec" } # reth-e2e-test-utils = { path = "../reth/crates/e2e-test-utils" } # reth-eth-wire-types = { path = "../reth/crates/net/eth-wire-types" } diff --git a/Dockerfile b/Dockerfile index 5e3d40e13..b83f7f82f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ -FROM rust:1.88.0 AS chef +FROM rust:1.93-bookworm AS chef ARG CARGO_FEATURES="" +ENV CARGO_NET_GIT_FETCH_WITH_CLI=true # Install only the packages required to compile the workspace. Upgrading the # entire base image adds network and package churn without changing the Rust @@ -19,14 +20,30 @@ FROM chef AS builder WORKDIR /app COPY --from=planner /recipe.json recipe.json COPY .cargo /app/.cargo - # The source bind mount in the final build shadows /app, including # /app/target. Keep cargo-chef's artifacts outside that mount so the final # cargo build can reuse them instead of compiling the dependency graph twice. ENV CARGO_TARGET_DIR=/app-target -RUN cargo chef cook --release --bin rollup-node --recipe-path recipe.json +RUN --mount=type=secret,id=github_token \ + set -eu; \ + if [ -s /run/secrets/github_token ]; then \ + GITHUB_TOKEN="$(cat /run/secrets/github_token)"; \ + export GIT_CONFIG_COUNT=1; \ + export GIT_CONFIG_KEY_0="url.https://x-access-token:${GITHUB_TOKEN}@github.com/.insteadOf"; \ + export GIT_CONFIG_VALUE_0="https://github.com/"; \ + fi; \ + cargo chef cook ${CARGO_FEATURES:+--features $CARGO_FEATURES} --release \ + --recipe-path recipe.json --package rollup-node --bin rollup-node RUN --mount=target=. \ - cargo build ${CARGO_FEATURES:+--features $CARGO_FEATURES} --release --bin rollup-node + --mount=type=secret,id=github_token \ + set -eu; \ + if [ -s /run/secrets/github_token ]; then \ + GITHUB_TOKEN="$(cat /run/secrets/github_token)"; \ + export GIT_CONFIG_COUNT=1; \ + export GIT_CONFIG_KEY_0="url.https://x-access-token:${GITHUB_TOKEN}@github.com/.insteadOf"; \ + export GIT_CONFIG_VALUE_0="https://github.com/"; \ + fi; \ + cargo build ${CARGO_FEATURES:+--features $CARGO_FEATURES} --release --package rollup-node --bin rollup-node # Release diff --git a/MULTIARCH_BUILD.md b/MULTIARCH_BUILD.md index 47db44a45..cee0825dc 100644 --- a/MULTIARCH_BUILD.md +++ b/MULTIARCH_BUILD.md @@ -93,7 +93,7 @@ docker buildx install After the build is complete, you can check if the image contains multiple architectures: ```bash -docker buildx imagetools inspect scrolltech/rollup-node:latest +docker buildx imagetools inspect dogeos69/rollup-node:latest ``` ## Usage Recommendations diff --git a/Makefile b/Makefile index f6ac364cc..ef1cff487 100644 --- a/Makefile +++ b/Makefile @@ -106,19 +106,19 @@ pr: lint test docs .PHONY: docker docker: - docker build -t scrolltech/rollup-node:latest . -f Dockerfile + docker build -t dogeos69/rollup-node:latest . -f Dockerfile .PHONY: docker-nightly docker-nightly: - docker build -t scrolltech/rollup-node:latest-nightly --build-arg CARGO_FEATURES=js-tracer . -f Dockerfile + docker build -t dogeos69/rollup-node:latest-nightly --build-arg CARGO_FEATURES=js-tracer . -f Dockerfile .PHONY: docker-multiarch docker-multiarch: - docker buildx build --platform linux/amd64,linux/arm64 -t scrolltech/rollup-node:latest . -f Dockerfile + docker buildx build --platform linux/amd64,linux/arm64 -t dogeos69/rollup-node:latest . -f Dockerfile .PHONY: docker-multiarch-nightly docker-multiarch-nightly: - docker buildx build --platform linux/amd64,linux/arm64 -t scrolltech/rollup-node:latest-nightly --build-arg CARGO_FEATURES=js-tracer . -f Dockerfile + docker buildx build --platform linux/amd64,linux/arm64 -t dogeos69/rollup-node:latest-nightly --build-arg CARGO_FEATURES=js-tracer . -f Dockerfile .PHONY: docker-setup-buildx docker-setup-buildx: diff --git a/README.md b/README.md index 65b881ae9..409a8066c 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,30 @@ To test a specific crate: cargo test -p ``` +### L1 integration tests (external Anvil) + +The L1 sync/reorg integration tests in `crates/node/tests/l1_sync.rs` launch an +external Foundry `anvil` process as a simulated L1. They are pinned to a specific +Anvil build and refuse to run against any other, so you must install the exact +binary first. The reviewed build is Foundry `v1.5.0`, commit +`1c57854462289b2e71ee7654cd6666217ed86ffd`. + +Install it with the repository installer (downloads the checksum-pinned release and +verifies its version and commit), then point `ANVIL_BIN` at the result: + +```sh +ANVIL_BIN="$(.github/assets/install_anvil.sh "$PWD/.anvil-bin" | tail -n1)" + +ANVIL_BIN="$ANVIL_BIN" cargo test -p rollup-node --all-features --test l1_sync +# `make test` includes these L1 integration tests. +ANVIL_BIN="$ANVIL_BIN" make test +``` + +The tests resolve `anvil` from `ANVIL_BIN` if set, otherwise from `PATH`. Any binary +whose version/commit does not match the pin is rejected with an actionable error, so +a mutable `foundryup`/`stable` install is only usable if it happens to be that exact +commit. Unit-only and Docker-compose test selections do not need this host binary. + ## Running Lints To run all lints across the workspace: @@ -133,4 +157,4 @@ The release binary will be located at `target/release/rollup-node`. --- -For more details, see the documentation in each crate or open an issue if you have questions! \ No newline at end of file +For more details, see the documentation in each crate or open an issue if you have questions! diff --git a/book/src/docker-operations.md b/book/src/docker-operations.md index eacc30c9b..a1a79fac5 100644 --- a/book/src/docker-operations.md +++ b/book/src/docker-operations.md @@ -283,7 +283,7 @@ your URLs and API keys are correct. ### Rollup Node Service -**Image**: `scrolltech/rollup-node:v1.0.5` +**Image**: `dogeos69/rollup-node:v1.0.5` **Port Mappings**: diff --git a/crates/chain-orchestrator/Cargo.toml b/crates/chain-orchestrator/Cargo.toml index a2c511837..51b587062 100644 --- a/crates/chain-orchestrator/Cargo.toml +++ b/crates/chain-orchestrator/Cargo.toml @@ -15,12 +15,11 @@ alloy-consensus = { workspace = true } alloy-eips = { workspace = true } alloy-json-rpc.workspace = true alloy-primitives.workspace = true -alloy-provider.workspace = true +alloy-provider = { workspace = true, features = ["engine-api"] } alloy-rpc-types-engine.workspace = true alloy-transport.workspace = true # rollup-node -scroll-alloy-provider.workspace = true scroll-db.workspace = true scroll-engine.workspace = true rollup-node-providers.workspace = true @@ -30,13 +29,11 @@ rollup-node-signer.workspace = true rollup-node-watcher.workspace = true # scroll -reth-scroll-engine-primitives.workspace = true -reth-scroll-consensus.workspace = true -reth-scroll-node.workspace = true -reth-scroll-primitives.workspace = true -scroll-alloy-consensus.workspace = true -scroll-alloy-hardforks.workspace = true -scroll-alloy-network.workspace = true +dogeos-reth-engine.workspace = true +dogeos-reth-primitives.workspace = true +dogeos-protocol-types.workspace = true +dogeos-hardforks.workspace = true +dogeos-rpc-types.workspace = true scroll-derivation-pipeline.workspace = true scroll-network.workspace = true @@ -64,15 +61,18 @@ tracing.workspace = true alloy-consensus = { workspace = true, features = ["arbitrary"] } alloy-primitives = { workspace = true, features = ["arbitrary"] } alloy-rpc-client.workspace = true +alloy-rpc-types-eth.workspace = true alloy-transport.workspace = true # rollup-node +rollup-node-providers = { workspace = true, features = ["test-utils"] } scroll-db = { workspace = true, features = ["test-utils"] } +scroll-engine = { workspace = true, features = ["test-utils"] } rollup-node-primitives = { workspace = true, features = ["arbitrary"] } # scroll -reth-scroll-chainspec.workspace = true -reth-scroll-forks.workspace = true +dogeos-chainspec.workspace = true +dogeos-reth-consensus.workspace = true # reth reth-eth-wire-types.workspace = true @@ -93,12 +93,12 @@ test-utils = [ "reth-chainspec/test-utils", "reth-network-p2p/test-utils", "reth-primitives-traits/test-utils", - "reth-scroll-node/test-utils", "rollup-node-providers/test-utils", "rollup-node-watcher/test-utils", "scroll-db/test-utils", "scroll-engine/test-utils", "scroll-network/test-utils", + "reth-tasks/test-utils", ] serde = [ "dep:serde", @@ -106,15 +106,15 @@ serde = [ "alloy-eips/serde", "alloy-primitives/serde", "alloy-rpc-types-engine/serde", + "alloy-rpc-types-eth/serde", "parking_lot/serde", "rand/serde", "reth-eth-wire-types/serde", "reth-network-api/serde", "reth-primitives-traits/serde", - "reth-scroll-forks/serde", - "reth-scroll-primitives/serde", - "scroll-alloy-consensus/serde", - "scroll-alloy-hardforks/serde", + "dogeos-reth-primitives/serde", + "dogeos-protocol-types/serde", + "dogeos-hardforks/serde", "scroll-engine/serde", "scroll-network/serde", "rollup-node-primitives/serde", diff --git a/crates/chain-orchestrator/src/consensus.rs b/crates/chain-orchestrator/src/consensus.rs index 69df41c67..d327fffe5 100644 --- a/crates/chain-orchestrator/src/consensus.rs +++ b/crates/chain-orchestrator/src/consensus.rs @@ -1,8 +1,8 @@ use alloy_primitives::{Address, Signature}; +use dogeos_reth_primitives::DogeosBlock; use metrics::Counter; use metrics_derive::Metrics; use reth_primitives_traits::GotExpected; -use reth_scroll_primitives::ScrollBlock; use rollup_node_primitives::{sig_encode_hash, ConsensusUpdate}; use scroll_network::ConsensusError; use std::fmt::Debug; @@ -14,7 +14,7 @@ pub trait Consensus: Send + Sync + Debug { /// Validates a new block with the given signature. fn validate_new_block( &self, - block: &ScrollBlock, + block: &DogeosBlock, signature: &Signature, ) -> Result<(), ConsensusError>; /// Returns a boolean indicating whether the sequencer should sequence a block. @@ -31,7 +31,7 @@ impl Consensus for NoopConsensus { fn validate_new_block( &self, - _block: &ScrollBlock, + _block: &DogeosBlock, _signature: &Signature, ) -> Result<(), ConsensusError> { Ok(()) @@ -86,7 +86,7 @@ impl Consensus for SystemContractConsensus { fn validate_new_block( &self, - block: &ScrollBlock, + block: &DogeosBlock, signature: &Signature, ) -> Result<(), ConsensusError> { let hash = sig_encode_hash(&block.header); @@ -112,8 +112,8 @@ mod tests { use super::*; use alloy_consensus::{Signed, TxEip1559}; use alloy_primitives::{address, b256, bloom, bytes, TxKind, B64, U256}; + use dogeos_reth_primitives::DogeosBlockBody; use reth_primitives_traits::Header; - use reth_scroll_primitives::ScrollBlockBody; use std::{str::FromStr, sync::OnceLock}; #[test] @@ -127,7 +127,7 @@ mod tests { b256!("f257edab88796a76f6d19a9fadad44b2b16c28e7aa70322cc4c6abc857128998") }); - let block = ScrollBlock { + let block = DogeosBlock { header: Header { parent_hash: b256!("3ccf36621e1f75cd1bfd2ac39ff6a00d8a5bec02e52aa7064a4860a0d02d6013"), ommers_hash: b256!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), @@ -151,7 +151,7 @@ mod tests { parent_beacon_block_root: None, requests_hash: None, }, - body: ScrollBlockBody { + body: DogeosBlockBody { transactions: vec![ Signed::new_unhashed(TxEip1559 { chain_id: 534352, diff --git a/crates/chain-orchestrator/src/consolidation.rs b/crates/chain-orchestrator/src/consolidation.rs index 10ad0eb76..7a489c5d2 100644 --- a/crates/chain-orchestrator/src/consolidation.rs +++ b/crates/chain-orchestrator/src/consolidation.rs @@ -1,22 +1,27 @@ use super::ChainOrchestratorError; use alloy_provider::Provider; +use dogeos_rpc_types::Scroll; use futures::{stream::FuturesOrdered, TryStreamExt}; use rollup_node_primitives::{ BatchConsolidationOutcome, BatchInfo, BatchStatus, L2BlockInfoWithL1Messages, }; -use scroll_alloy_network::Scroll; -use scroll_derivation_pipeline::{BatchDerivationResult, DerivedAttributes}; +use scroll_derivation_pipeline::BatchDerivationResult; use scroll_engine::{block_matches_attributes, ForkchoiceState}; /// Reconciles a batch of derived attributes with the L2 chain to produce a reconciliation result. +/// +/// The batch is borrowed so reconciliation can be recomputed from fresh canonical L2 state on +/// every attempt. Reorg actions retain stable indices into the held batch instead of cloning the +/// derived attributes. pub(crate) async fn reconcile_batch>( l2_provider: L2P, - batch: BatchDerivationResult, + batch: &BatchDerivationResult, fcs: &ForkchoiceState, ) -> Result { let mut futures = FuturesOrdered::new(); - for attributes in batch.attributes { - let fut = async { + for (index, attributes) in batch.attributes.iter().enumerate() { + let l2_provider = &l2_provider; + let fut = async move { // Fetch the block corresponding to the derived attributes from the L2 provider. let current_block = l2_provider .get_block(attributes.block_number.into()) @@ -28,7 +33,7 @@ pub(crate) async fn reconcile_batch>( block } else { // The block does not exist, a reorg is needed. - return Ok::<_, ChainOrchestratorError>(BlockConsolidationAction::Reorg(attributes)); + return Ok::<_, ChainOrchestratorError>(BlockConsolidationAction::Reorg(index)); }; // Check if the block matches the derived attributes. @@ -47,7 +52,7 @@ pub(crate) async fn reconcile_batch>( } } else { // The block does not match the derived attributes, a reorg is needed. - Ok::<_, ChainOrchestratorError>(BlockConsolidationAction::Reorg(attributes)) + Ok::<_, ChainOrchestratorError>(BlockConsolidationAction::Reorg(index)) } }; futures.push_back(fut); @@ -99,14 +104,10 @@ impl BatchReconciliationResult { pub(crate) async fn into_batch_consolidation_outcome( self, reorg_results: Vec, + l2_head_updated: bool, ) -> Result { - // Create the batch consolidation outcome with the L2 head block number updated if there - // were any reorgs. - let mut consolidate_chain = BatchConsolidationOutcome::new( - self.batch_info, - self.target_status, - !reorg_results.is_empty(), - ); + let mut consolidate_chain = + BatchConsolidationOutcome::new(self.batch_info, self.target_status, l2_head_updated); // First append all non-reorg results to the consolidated chain. self.actions.into_iter().filter(|action| !action.is_reorg()).for_each(|action| { @@ -137,8 +138,8 @@ pub(crate) enum BlockConsolidationAction { /// The derived attributes match the L2 chain and the safe head is already at or beyond the /// block, so no action is needed. Skip(L2BlockInfoWithL1Messages), - /// Reorganize the chain with the given derived attributes. - Reorg(DerivedAttributes), + /// Reorganize the chain with the derived attributes at this stable pending-batch index. + Reorg(usize), } impl BlockConsolidationAction { @@ -162,7 +163,7 @@ impl BlockConsolidationAction { pub(crate) fn into_block_info(self) -> Option { match self { Self::UpdateFcs(info) | Self::Skip(info) => Some(info), - Self::Reorg(_attrs) => None, + Self::Reorg(_) => None, } } } @@ -174,9 +175,7 @@ impl std::fmt::Display for BlockConsolidationAction { write!(f, "UpdateSafeHead to block {}", info.block_info.number) } Self::Skip(info) => write!(f, "Skip block {}", info.block_info.number), - Self::Reorg(attrs) => { - write!(f, "Reorg to block {}", attrs.block_number) - } + Self::Reorg(index) => write!(f, "Reorg with derived attributes at index {index}"), } } } diff --git a/crates/chain-orchestrator/src/derivation.rs b/crates/chain-orchestrator/src/derivation.rs new file mode 100644 index 000000000..e88997ceb --- /dev/null +++ b/crates/chain-orchestrator/src/derivation.rs @@ -0,0 +1,1359 @@ +//! Ordered reconciliation for the single derived batch owned by the orchestrator. + +use crate::{ + consolidation::{reconcile_batch, BlockConsolidationAction}, + metrics::DerivedBatchMetrics, + status::{DerivationStatus, HeldBatchStatus}, + ChainOrchestratorError, +}; +use alloy_provider::Provider; +use alloy_rpc_types_engine::{ForkchoiceUpdated, PayloadId, PayloadStatus, PayloadStatusEnum}; +use dogeos_rpc_types::Scroll; +use rollup_node_primitives::{ + BatchConsolidationOutcome, BatchInfo, BatchStatus, BlockConsolidationOutcome, + L2BlockInfoWithL1Messages, +}; +use scroll_db::{Database, DatabaseReadOperations, DatabaseWriteOperations, UnwindResult}; +use scroll_derivation_pipeline::BatchDerivationResult; +use scroll_engine::{Engine, EngineError, ScrollEngineApi}; +use std::{pin::Pin, time::Duration}; +use tokio::time::{Instant, Sleep}; + +const INITIAL_HOLD_BACKOFF_MS: u64 = 2_000; +const MAX_HOLD_BACKOFF_MS: u64 = 30_000; + +const BUILD_FCU_METHOD: &str = "forkchoiceUpdated(build)"; +const GET_PAYLOAD_METHOD: &str = "getPayload"; +const NEW_PAYLOAD_METHOD: &str = "newPayload"; +const FCU_METHOD: &str = "forkchoiceUpdated"; + +/// The successful result of a reconciliation attempt. Events are emitted by the run loop only +/// after the database commit performed by the attempt has succeeded. +#[derive(Debug)] +pub(crate) struct ConsolidatedBatch { + pub(crate) batch_outcome: BatchConsolidationOutcome, + pub(crate) block_outcomes: Vec, +} + +/// A terminal attempt with structured classification for the fail-stop boundary. +#[derive(Debug)] +pub(crate) struct FatalAttempt { + pub(crate) method: &'static str, + pub(crate) outcome: &'static str, + pub(crate) error: Box, +} + +/// The result returned to the orchestrator after one scheduled attempt. +#[derive(Debug)] +pub(crate) enum AttemptStep { + Completed(ConsolidatedBatch), + Held, + Fatal(FatalAttempt), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum HoldStatus { + Syncing, + Accepted, +} + +impl HoldStatus { + const fn as_str(self) -> &'static str { + match self { + Self::Syncing => "SYNCING", + Self::Accepted => "ACCEPTED", + } + } +} + +#[derive(Debug, Clone, Copy)] +struct HoldReason { + method: &'static str, + status: HoldStatus, +} + +#[derive(Debug)] +enum AttemptFailure { + Hold(HoldReason), + Fatal(FatalAttempt), +} + +impl AttemptFailure { + fn fatal(method: &'static str, outcome: &'static str, error: ChainOrchestratorError) -> Self { + Self::Fatal(FatalAttempt { method, outcome, error: Box::new(error) }) + } +} + +#[derive(Debug)] +struct PendingBatch { + batch: BatchDerivationResult, + held_since: std::time::Instant, + attempts_started: u64, + last_hold: Option, + current_backoff_ms: Option, +} + +/// Copyable metadata used to revalidate a held batch after an L1 unwind. +#[derive(Debug, Clone, Copy)] +pub(crate) struct HeldBatchIdentity { + pub(crate) batch_info: BatchInfo, + pub(crate) target_status: BatchStatus, +} + +/// The effect of an L1 unwind on the single held slot. +#[derive(Debug, Clone, Copy)] +pub(crate) enum HeldReorgOutcome { + NoHeldBatch, + Invalidated { batch_info: BatchInfo, reason: &'static str }, + Survived { batch_info: BatchInfo }, +} + +/// Owns exactly one derived result and its pinned hold timer. +#[derive(Debug, Default)] +pub(crate) struct DerivationDriver { + pending: Option, + attempt_sleep: Option>>, + metrics: DerivedBatchMetrics, +} + +impl DerivationDriver { + /// Returns whether the pipeline may yield another result into the owned slot. + pub(crate) const fn can_accept_batch(&self) -> bool { + self.pending.is_none() + } + + /// Returns whether an immediate attempt or held retry is scheduled. + pub(crate) const fn is_attempt_scheduled(&self) -> bool { + self.attempt_sleep.is_some() + } + + /// Moves a newly yielded result into the slot before any Engine action is attempted. + pub(crate) fn hold_batch(&mut self, batch: BatchDerivationResult) { + assert!(self.pending.is_none(), "a derived batch is already held"); + let batch_info = batch.batch_info; + tracing::info!( + target: "scroll::chain_orchestrator", + batch_index = batch_info.index, + batch_hash = ?batch_info.hash, + blocks = batch.attributes.len(), + "Holding derived batch for reconciliation" + ); + self.pending = Some(PendingBatch { + batch, + held_since: std::time::Instant::now(), + attempts_started: 0, + last_hold: None, + current_backoff_ms: None, + }); + self.metrics.held.set(1.0); + self.schedule_immediate(); + } + + /// Waits on the pinned deadline. The same timer survives unrelated outer `select!` polls. + pub(crate) async fn wait_for_attempt(&mut self) { + match self.attempt_sleep.as_mut() { + Some(sleep) => sleep.as_mut().await, + None => std::future::pending().await, + } + } + + /// Runs one attempt. Only received `SYNCING`, plus `ACCEPTED` from `newPayload`, schedule a + /// further in-process reconciliation. + pub(crate) async fn run_attempt( + &mut self, + l2_client: &L2P, + engine: &mut Engine, + database: &Database, + ) -> AttemptStep + where + L2P: Provider, + EC: ScrollEngineApi + Sync + Send + 'static, + { + self.attempt_sleep = None; + let pending = self.pending.as_mut().expect("attempt requires a held batch"); + pending.attempts_started = pending.attempts_started.saturating_add(1); + pending.current_backoff_ms = None; + let attempt = pending.attempts_started; + let batch_info = pending.batch.batch_info; + self.metrics.attempts.increment(1); + + tracing::info!( + target: "scroll::chain_orchestrator", + batch_index = batch_info.index, + batch_hash = ?batch_info.hash, + attempt, + held_ms = saturating_millis(pending.held_since.elapsed()), + "Attempting derived batch reconciliation" + ); + + match reconcile_and_consolidate(l2_client, engine, database, &pending.batch).await { + Ok(consolidated) => { + self.pending = None; + self.metrics.held.set(0.0); + AttemptStep::Completed(consolidated) + } + Err(AttemptFailure::Hold(reason)) => { + let backoff = hold_backoff(attempt); + let backoff_ms = saturating_millis(backoff); + let pending = self.pending.as_mut().expect("held batch remains owned"); + pending.last_hold = Some(reason); + pending.current_backoff_ms = Some(backoff_ms); + self.attempt_sleep = + Some(Box::pin(tokio::time::sleep_until(Instant::now() + backoff))); + tracing::warn!( + target: "scroll::chain_orchestrator", + batch_index = batch_info.index, + batch_hash = ?batch_info.hash, + attempt, + held_ms = saturating_millis(pending.held_since.elapsed()), + backoff_ms, + method = reason.method, + status = reason.status.as_str(), + "Engine is not ready for derived batch; holding in place" + ); + AttemptStep::Held + } + Err(AttemptFailure::Fatal(fatal)) => { + self.metrics.fatal.increment(1); + AttemptStep::Fatal(fatal) + } + } + } + + /// Returns the identity needed to check whether an unwind invalidated the held work. + pub(crate) fn held_identity(&self) -> Option { + self.pending.as_ref().map(|pending| HeldBatchIdentity { + batch_info: pending.batch.batch_info, + target_status: pending.batch.target_status, + }) + } + + /// Atomically unwinds the database and decides whether the held row survives `ancestor`. + pub(crate) async fn unwind_and_revalidate( + &mut self, + database: &Database, + ancestor: u64, + ) -> Result<(UnwindResult, HeldReorgOutcome), ChainOrchestratorError> { + let held = self.held_identity(); + let (unwind_result, outcome) = database + .tx_mut(move |tx| async move { + let unwind_result = tx.unwind(ancestor).await?; + let Some(held) = held else { + return Ok::<_, ChainOrchestratorError>(( + unwind_result, + HeldReorgOutcome::NoHeldBatch, + )) + }; + + let stored = tx.get_batch_by_index(held.batch_info.index).await?; + let surviving_row = stored.as_ref().filter(|batch| { + batch.hash == held.batch_info.hash && batch.block_number <= ancestor + }); + let finalization_invalid = held.target_status.is_finalized() && + surviving_row.is_some_and(|batch| { + batch.finalized_block_number.is_none_or(|number| number > ancestor) + }); + let invalid_reason = match stored.as_ref() { + None => Some("batch row removed or reverted"), + Some(batch) if batch.hash != held.batch_info.hash => Some("batch hash changed"), + Some(batch) if batch.block_number > ancestor => Some("batch commit reverted"), + Some(_) if finalization_invalid => Some("batch finalization reverted"), + Some(_) => None, + }; + + let outcome = if let Some(reason) = invalid_reason { + if finalization_invalid { + // Do not overwrite a concurrent or unwind-produced status such as + // Reverted/Consolidated. Only the row still owned as Processing may be + // returned to Committed for catch-up rediscovery. + tx.transition_batch_status( + held.batch_info.hash, + BatchStatus::Processing, + BatchStatus::Committed, + ) + .await?; + } + HeldReorgOutcome::Invalidated { batch_info: held.batch_info, reason } + } else { + HeldReorgOutcome::Survived { batch_info: held.batch_info } + }; + + Ok((unwind_result, outcome)) + }) + .await?; + + if matches!(outcome, HeldReorgOutcome::Invalidated { .. }) { + self.invalidate(); + } + + Ok((unwind_result, outcome)) + } + + /// Clears an invalid held slot and its timer. + pub(crate) fn invalidate(&mut self) { + self.attempt_sleep = None; + if self.pending.take().is_some() { + self.metrics.held.set(0.0); + } + } + + /// Cancels only the scheduled/in-flight attempt state while retaining ownership of the batch. + pub(crate) fn cancel_attempt(&mut self) { + self.attempt_sleep = None; + } + + /// Schedules a fresh reconciliation after a surviving held batch is administratively unwound. + pub(crate) fn schedule_fresh_reconciliation(&mut self) { + if self.pending.is_some() { + self.schedule_immediate(); + } + } + + /// Returns a status snapshot including the pipeline work queued behind the held slot. + pub(crate) fn status(&self, queued: u64) -> DerivationStatus { + match &self.pending { + Some(pending) => DerivationStatus::Held(HeldBatchStatus { + batch_index: pending.batch.batch_info.index, + batch_hash: pending.batch.batch_info.hash, + attempts_started: pending.attempts_started, + held_duration_ms: saturating_millis(pending.held_since.elapsed()), + last_engine_method: pending.last_hold.map(|reason| reason.method.to_string()), + last_engine_status: pending + .last_hold + .map(|reason| reason.status.as_str().to_string()), + current_backoff_ms: pending.current_backoff_ms, + queued_behind: queued, + }), + None if queued > 0 => DerivationStatus::Deriving { queued }, + None => DerivationStatus::Idle, + } + } + + /// Returns structured fields used by the single fatal boundary record. + pub(crate) fn fatal_context(&self) -> Option<(BatchInfo, u64, u64)> { + self.pending.as_ref().map(|pending| { + ( + pending.batch.batch_info, + pending.attempts_started, + saturating_millis(pending.held_since.elapsed()), + ) + }) + } + + /// Records a fail-stop discovered outside the Engine attempt itself. + pub(crate) fn record_fatal(&self) { + self.metrics.fatal.increment(1); + } + + fn schedule_immediate(&mut self) { + if let Some(pending) = self.pending.as_mut() { + pending.current_backoff_ms = None; + } + self.attempt_sleep = Some(Box::pin(tokio::time::sleep_until(Instant::now()))); + } +} + +fn hold_backoff(attempt: u64) -> Duration { + let exponent = attempt.saturating_sub(1).min(63) as u32; + let multiplier = 1u64.checked_shl(exponent).unwrap_or(u64::MAX); + Duration::from_millis( + INITIAL_HOLD_BACKOFF_MS.saturating_mul(multiplier).min(MAX_HOLD_BACKOFF_MS), + ) +} + +fn saturating_millis(duration: Duration) -> u64 { + duration.as_millis().try_into().unwrap_or(u64::MAX) +} + +async fn reconcile_and_consolidate( + l2_client: &L2P, + engine: &mut Engine, + database: &Database, + batch: &BatchDerivationResult, +) -> Result +where + L2P: Provider, + EC: ScrollEngineApi + Sync + Send + 'static, +{ + let batch_info = batch.batch_info; + let reconciliation = reconcile_batch(l2_client, batch, engine.fcs()) + .await + .map_err(|error| AttemptFailure::fatal("reconcileBatch", "ERROR", error))?; + let target_status = reconciliation.target_status; + let aggregated = reconciliation.aggregate_actions(); + + let mut block_outcomes = Vec::new(); + let mut reorg_results = Vec::new(); + let mut l2_head_updated = false; + + for action in aggregated.actions { + let outcome = match action { + BlockConsolidationAction::Skip(_) => { + unreachable!("Skip actions have been filtered out in aggregation") + } + BlockConsolidationAction::UpdateFcs(block_info) => { + let target = block_info.block_info; + let current_head = *engine.fcs().head_block_info(); + // A prior checked FCU may have returned SYNCING, intentionally leaving the local + // FCS at its last confirmed value. If fresh reconciliation now finds the target + // canonical, advance head with safe so the candidate remains coherent. This also + // avoids an equal-height, different-hash head/safe pair. + let head = (current_head.number <= target.number && current_head != target) + .then_some(target); + let finalized = target_status.is_finalized().then_some(target); + let response = engine + .update_fcs_checked(head, Some(target), finalized) + .await + .map_err(engine_request_failure(batch_info, FCU_METHOD))?; + classify_checked_fcu(response, batch_info, Some(target.number))?; + l2_head_updated |= head.is_some(); + BlockConsolidationOutcome::UpdateFcs(block_info) + } + BlockConsolidationAction::Reorg(attribute_index) => { + let attributes = &batch.attributes[attribute_index]; + let safe = *engine.fcs().safe_block_info(); + if safe.number != attributes.block_number.saturating_sub(1) { + return Err(AttemptFailure::fatal( + "reconcileBatch", + "INVARIANT_ERROR", + ChainOrchestratorError::InvalidBatchReorg { + batch_info, + safe_block_number: safe.number, + derived_block_number: attributes.block_number, + }, + )); + } + + let build_response = engine + .build_payload(Some(safe), attributes.attributes.clone()) + .await + .map_err(engine_request_failure(batch_info, BUILD_FCU_METHOD))?; + let payload_id = classify_build_fcu(build_response, batch_info)?; + + let payload = engine + .get_payload(payload_id) + .await + .map_err(engine_request_failure(batch_info, GET_PAYLOAD_METHOD))?; + let block_info: L2BlockInfoWithL1Messages = + (&payload).try_into().map_err(|error| { + AttemptFailure::fatal( + GET_PAYLOAD_METHOD, + "CONVERSION_ERROR", + ChainOrchestratorError::RollupNodePrimitiveError(error), + ) + })?; + + let payload_status = engine + .new_payload(payload) + .await + .map_err(engine_request_failure(batch_info, NEW_PAYLOAD_METHOD))?; + classify_new_payload(payload_status, batch_info, block_info.block_info.number)?; + + let finalized = target_status.is_finalized().then_some(block_info.block_info); + let final_fcu = engine + .update_fcs_checked( + Some(block_info.block_info), + Some(block_info.block_info), + finalized, + ) + .await + .map_err(engine_request_failure(batch_info, FCU_METHOD))?; + classify_checked_fcu(final_fcu, batch_info, Some(block_info.block_info.number))?; + l2_head_updated = true; + + reorg_results.push(block_info.clone()); + BlockConsolidationOutcome::Reorged(block_info) + } + }; + block_outcomes.push(outcome); + } + + let batch_outcome = reconciliation + .into_batch_consolidation_outcome(reorg_results, l2_head_updated) + .await + .map_err(|error| AttemptFailure::fatal("consolidateBatch", "ERROR", error))?; + let mut persisted = batch_outcome.clone(); + persisted.with_skipped_l1_messages(batch.skipped_l1_messages.clone()); + database.insert_batch_consolidation_outcome(persisted).await.map_err(|error| { + AttemptFailure::fatal( + "insertBatchConsolidationOutcome", + "ERROR", + ChainOrchestratorError::DatabaseError(error), + ) + })?; + + Ok(ConsolidatedBatch { batch_outcome, block_outcomes }) +} + +fn engine_request_failure( + batch_info: BatchInfo, + method: &'static str, +) -> impl FnOnce(EngineError) -> AttemptFailure { + move |source| { + AttemptFailure::fatal( + method, + "ERROR", + ChainOrchestratorError::DerivedBatchEngineRequest { batch_info, method, source }, + ) + } +} + +fn classify_build_fcu( + response: ForkchoiceUpdated, + batch_info: BatchInfo, +) -> Result { + let PayloadStatus { status, latest_valid_hash } = response.payload_status; + match status { + PayloadStatusEnum::Valid => response.payload_id.ok_or_else(|| { + AttemptFailure::fatal( + BUILD_FCU_METHOD, + "VALID_MISSING_PAYLOAD_ID", + ChainOrchestratorError::MissingDerivedPayloadId { batch_info }, + ) + }), + PayloadStatusEnum::Syncing => Err(AttemptFailure::Hold(HoldReason { + method: BUILD_FCU_METHOD, + status: HoldStatus::Syncing, + })), + PayloadStatusEnum::Accepted => { + Err(unexpected_status(batch_info, BUILD_FCU_METHOD, "ACCEPTED")) + } + PayloadStatusEnum::Invalid { validation_error } => Err(invalid_status( + batch_info, + BUILD_FCU_METHOD, + None, + latest_valid_hash, + validation_error, + )), + } +} + +fn classify_new_payload( + response: PayloadStatus, + batch_info: BatchInfo, + block_number: u64, +) -> Result<(), AttemptFailure> { + match response.status { + PayloadStatusEnum::Valid => Ok(()), + PayloadStatusEnum::Syncing => Err(AttemptFailure::Hold(HoldReason { + method: NEW_PAYLOAD_METHOD, + status: HoldStatus::Syncing, + })), + PayloadStatusEnum::Accepted => Err(AttemptFailure::Hold(HoldReason { + method: NEW_PAYLOAD_METHOD, + status: HoldStatus::Accepted, + })), + PayloadStatusEnum::Invalid { validation_error } => Err(invalid_status( + batch_info, + NEW_PAYLOAD_METHOD, + Some(block_number), + response.latest_valid_hash, + validation_error, + )), + } +} + +fn classify_checked_fcu( + response: ForkchoiceUpdated, + batch_info: BatchInfo, + block_number: Option, +) -> Result<(), AttemptFailure> { + match response.payload_status.status { + PayloadStatusEnum::Valid => Ok(()), + PayloadStatusEnum::Syncing => Err(AttemptFailure::Hold(HoldReason { + method: FCU_METHOD, + status: HoldStatus::Syncing, + })), + PayloadStatusEnum::Accepted => Err(unexpected_status(batch_info, FCU_METHOD, "ACCEPTED")), + PayloadStatusEnum::Invalid { validation_error } => Err(invalid_status( + batch_info, + FCU_METHOD, + block_number, + response.payload_status.latest_valid_hash, + validation_error, + )), + } +} + +fn unexpected_status( + batch_info: BatchInfo, + method: &'static str, + status: &'static str, +) -> AttemptFailure { + AttemptFailure::fatal( + method, + status, + ChainOrchestratorError::UnexpectedDerivedPayloadStatus { batch_info, method, status }, + ) +} + +fn invalid_status( + batch_info: BatchInfo, + method: &'static str, + block_number: Option, + latest_valid_hash: Option, + validation_error: String, +) -> AttemptFailure { + AttemptFailure::fatal( + method, + "INVALID", + ChainOrchestratorError::InvalidDerivedPayload { + batch_info, + method, + block_number, + latest_valid_hash, + validation_error, + }, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ChainOrchestratorStatus, SyncState}; + use alloy_consensus::Header as ConsensusHeader; + use alloy_primitives::{Address, Bloom, Bytes, Sealable, B256, U256}; + use alloy_provider::ProviderBuilder; + use alloy_rpc_types_engine::{ExecutionPayloadV1, PayloadId}; + use alloy_rpc_types_eth::{Block as RpcBlock, Header as RpcHeader}; + use alloy_transport::mock::Asserter; + use dogeos_reth_engine::ScrollPayloadAttributes; + use dogeos_rpc_types::ScrollRpcTransaction; + use rollup_node_primitives::{BatchCommitData, BlockInfo}; + use scroll_db::{test_utils::setup_test_db, DatabaseReadOperations}; + use scroll_derivation_pipeline::DerivedAttributes; + use scroll_engine::{ + test_utils::{ScriptedEngineClient, ScriptedResponse}, + ForkchoiceState, + }; + use std::{collections::VecDeque, sync::Arc}; + + const SAFE: u64 = 100; + + #[derive(Clone, Copy)] + enum HoldBoundary { + BuildFcuSyncing, + NewPayloadSyncing, + NewPayloadAccepted, + FinalFcuSyncing, + } + + fn info(number: u64, tag: u8) -> BlockInfo { + BlockInfo { number, hash: B256::repeat_byte(tag) } + } + + fn payload_status(status: PayloadStatusEnum) -> PayloadStatus { + PayloadStatus { status, latest_valid_hash: None } + } + + fn fcu(status: PayloadStatusEnum, payload_id: Option) -> ForkchoiceUpdated { + ForkchoiceUpdated { payload_status: payload_status(status), payload_id } + } + + fn payload(number: u64) -> ExecutionPayloadV1 { + ExecutionPayloadV1 { + parent_hash: B256::ZERO, + fee_recipient: Address::ZERO, + state_root: B256::ZERO, + receipts_root: B256::ZERO, + logs_bloom: Bloom::default(), + prev_randao: B256::ZERO, + block_number: number, + gas_limit: 0, + gas_used: 0, + timestamp: 0, + extra_data: Bytes::new(), + base_fee_per_gas: U256::ZERO, + block_hash: B256::repeat_byte(0x22), + transactions: vec![], + } + } + + fn engine_at_safe(client: Arc) -> Engine { + let safe = info(SAFE, 0x11); + Engine::new(client, ForkchoiceState::from_block_info(safe)) + } + + fn batch(index: u64, target_status: BatchStatus) -> BatchDerivationResult { + BatchDerivationResult { + attributes: vec![DerivedAttributes { + block_number: SAFE + 1, + attributes: ScrollPayloadAttributes::default(), + }], + batch_info: BatchInfo::new(index, B256::repeat_byte(index as u8)), + skipped_l1_messages: vec![], + target_status, + } + } + + async fn insert_batch( + database: &Database, + index: u64, + block_number: u64, + finalized_block_number: Option, + ) { + database + .insert_batch(BatchCommitData { + hash: B256::repeat_byte(index as u8), + index, + block_number, + block_timestamp: 0, + calldata: Arc::new(Bytes::new()), + blob_versioned_hash: None, + finalized_block_number, + reverted_block_number: None, + }) + .await + .unwrap(); + } + + fn absent_block_provider(asserter: Asserter) -> impl Provider { + ProviderBuilder::<_, _, Scroll>::default().connect_mocked_client(asserter) + } + + fn push_absent_block(asserter: &Asserter) { + asserter.push_success(&Option::<()>::None); + } + + fn push_matching_empty_block( + asserter: &Asserter, + attributes: &ScrollPayloadAttributes, + ) -> BlockInfo { + let header = ConsensusHeader { + number: SAFE + 1, + timestamp: attributes.payload_attributes.timestamp, + mix_hash: attributes.payload_attributes.prev_randao, + beneficiary: attributes.block_data_hint.coinbase.unwrap_or_default(), + extra_data: attributes.block_data_hint.extra_data.clone().unwrap_or_default(), + state_root: attributes.block_data_hint.state_root.unwrap_or_default(), + nonce: attributes.block_data_hint.nonce.unwrap_or_default().into(), + ..Default::default() + }; + let sealed = header.seal_slow(); + let block_info = BlockInfo { number: SAFE + 1, hash: sealed.hash() }; + let rpc_header = RpcHeader::from_consensus(sealed, None, None); + let block = RpcBlock::::empty(rpc_header); + asserter.push_success(&Some(block)); + block_info + } + + fn make_attempt_due(driver: &mut DerivationDriver) { + driver.attempt_sleep = Some(Box::pin(tokio::time::sleep(Duration::ZERO))); + } + + fn script_hold_then_success(client: &ScriptedEngineClient, boundary: HoldBoundary) { + let valid_build = || fcu(PayloadStatusEnum::Valid, Some(PayloadId::new([7; 8]))); + let valid_fcu = || fcu(PayloadStatusEnum::Valid, None); + + match boundary { + HoldBoundary::BuildFcuSyncing => { + client.push_fork_choice_updated(ScriptedResponse::Ok(fcu( + PayloadStatusEnum::Syncing, + None, + ))); + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_build())); + client.push_get_payload(ScriptedResponse::Ok(payload(SAFE + 1))); + client.push_new_payload(ScriptedResponse::Ok(payload_status( + PayloadStatusEnum::Valid, + ))); + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_fcu())); + } + HoldBoundary::NewPayloadSyncing | HoldBoundary::NewPayloadAccepted => { + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_build())); + client.push_get_payload(ScriptedResponse::Ok(payload(SAFE + 1))); + let status = if matches!(boundary, HoldBoundary::NewPayloadSyncing) { + PayloadStatusEnum::Syncing + } else { + PayloadStatusEnum::Accepted + }; + client.push_new_payload(ScriptedResponse::Ok(payload_status(status))); + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_build())); + client.push_get_payload(ScriptedResponse::Ok(payload(SAFE + 1))); + client.push_new_payload(ScriptedResponse::Ok(payload_status( + PayloadStatusEnum::Valid, + ))); + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_fcu())); + } + HoldBoundary::FinalFcuSyncing => { + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_build())); + client.push_get_payload(ScriptedResponse::Ok(payload(SAFE + 1))); + client.push_new_payload(ScriptedResponse::Ok(payload_status( + PayloadStatusEnum::Valid, + ))); + client.push_fork_choice_updated(ScriptedResponse::Ok(fcu( + PayloadStatusEnum::Syncing, + None, + ))); + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_build())); + client.push_get_payload(ScriptedResponse::Ok(payload(SAFE + 1))); + client.push_new_payload(ScriptedResponse::Ok(payload_status( + PayloadStatusEnum::Valid, + ))); + client.push_fork_choice_updated(ScriptedResponse::Ok(valid_fcu())); + } + } + } + + async fn assert_hold_then_complete(boundary: HoldBoundary) { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, None).await; + let client = Arc::new(ScriptedEngineClient::new()); + script_hold_then_success(&client, boundary); + let mut engine = engine_at_safe(client.clone()); + let asserter = Asserter::new(); + push_absent_block(&asserter); + push_absent_block(&asserter); + let provider = absent_block_provider(asserter); + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(1, BatchStatus::Consolidated)); + + driver.wait_for_attempt().await; + assert!(matches!( + driver.run_attempt(&provider, &mut engine, &database).await, + AttemptStep::Held + )); + assert!(!driver.can_accept_batch(), "a later batch must remain behind the held slot"); + assert_eq!(engine.fcs().head_block_info().number, SAFE); + assert_eq!(engine.fcs().safe_block_info().number, SAFE); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(1)).await.unwrap(), + Some(BatchStatus::Committed), + "a hold must not commit a partial consolidation outcome" + ); + + make_attempt_due(&mut driver); + driver.wait_for_attempt().await; + let consolidated = match driver.run_attempt(&provider, &mut engine, &database).await { + AttemptStep::Completed(consolidated) => consolidated, + other => panic!("expected successful fresh reconciliation, got {other:?}"), + }; + assert_eq!(consolidated.block_outcomes.len(), 1); + assert_eq!(consolidated.batch_outcome.batch_info.index, 1); + assert!(driver.can_accept_batch()); + assert_eq!(engine.fcs().head_block_info().number, SAFE + 1); + assert_eq!(engine.fcs().safe_block_info().number, SAFE + 1); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(1)).await.unwrap(), + Some(BatchStatus::Consolidated), + "the successful retry commits the batch exactly once" + ); + assert_eq!( + database.get_l2_block_and_batch_info_by_hash(B256::repeat_byte(0x22)).await.unwrap(), + Some((info(SAFE + 1, 0x22), BatchInfo::new(1, B256::repeat_byte(1)))) + ); + } + + #[test] + fn hold_backoff_saturates_at_thirty_seconds() { + assert_eq!(hold_backoff(1), Duration::from_secs(2)); + assert_eq!(hold_backoff(2), Duration::from_secs(4)); + assert_eq!(hold_backoff(5), Duration::from_secs(30)); + assert_eq!(hold_backoff(u64::MAX), Duration::from_secs(30)); + } + + #[tokio::test] + async fn build_fcu_syncing_holds_then_completes_once() { + assert_hold_then_complete(HoldBoundary::BuildFcuSyncing).await; + } + + #[tokio::test] + async fn build_fcu_syncing_then_canonical_match_completes_once() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, None).await; + let client = Arc::new(ScriptedEngineClient::new()); + client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Syncing, None))); + client.push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Valid, None))); + let mut engine = engine_at_safe(client.clone()); + + let mut derived = batch(1, BatchStatus::Consolidated); + derived.attributes[0].attributes.transactions = Some(vec![]); + let asserter = Asserter::new(); + push_absent_block(&asserter); + let canonical = push_matching_empty_block(&asserter, &derived.attributes[0].attributes); + let provider = absent_block_provider(asserter); + let mut driver = DerivationDriver::default(); + driver.hold_batch(derived); + + driver.wait_for_attempt().await; + assert!(matches!( + driver.run_attempt(&provider, &mut engine, &database).await, + AttemptStep::Held + )); + assert_eq!(engine.fcs().head_block_info().number, SAFE); + + make_attempt_due(&mut driver); + driver.wait_for_attempt().await; + assert!(matches!( + driver.run_attempt(&provider, &mut engine, &database).await, + AttemptStep::Completed(_) + )); + assert_eq!(*engine.fcs().head_block_info(), canonical); + assert_eq!(*engine.fcs().safe_block_info(), canonical); + assert_eq!(client.fork_choice_updated_calls(), 2); + assert_eq!(client.get_payload_calls(), 0); + assert_eq!(client.new_payload_calls(), 0); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(1)).await.unwrap(), + Some(BatchStatus::Consolidated) + ); + } + + #[tokio::test] + async fn new_payload_syncing_holds_then_completes_once() { + assert_hold_then_complete(HoldBoundary::NewPayloadSyncing).await; + } + + #[tokio::test] + async fn new_payload_accepted_holds_then_completes_once() { + assert_hold_then_complete(HoldBoundary::NewPayloadAccepted).await; + } + + #[tokio::test] + async fn checked_final_fcu_syncing_does_not_advance_local_fcs() { + assert_hold_then_complete(HoldBoundary::FinalFcuSyncing).await; + } + + #[tokio::test] + async fn final_fcu_syncing_then_canonical_match_advances_database_head() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, None).await; + let mut derived = batch(1, BatchStatus::Consolidated); + derived.attributes[0].attributes.transactions = Some(vec![]); + + let asserter = Asserter::new(); + push_absent_block(&asserter); + let canonical = push_matching_empty_block(&asserter, &derived.attributes[0].attributes); + let provider = absent_block_provider(asserter); + + let client = Arc::new(ScriptedEngineClient::new()); + client.push_fork_choice_updated(ScriptedResponse::Ok(fcu( + PayloadStatusEnum::Valid, + Some(PayloadId::new([7; 8])), + ))); + let mut built_payload = payload(canonical.number); + built_payload.block_hash = canonical.hash; + client.push_get_payload(ScriptedResponse::Ok(built_payload)); + client.push_new_payload(ScriptedResponse::Ok(payload_status(PayloadStatusEnum::Valid))); + client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Syncing, None))); + client.push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Valid, None))); + let mut engine = engine_at_safe(client.clone()); + let mut driver = DerivationDriver::default(); + driver.hold_batch(derived); + + driver.wait_for_attempt().await; + assert!(matches!( + driver.run_attempt(&provider, &mut engine, &database).await, + AttemptStep::Held + )); + assert_eq!(engine.fcs().head_block_info().number, SAFE); + assert_eq!(database.get_l2_head_block_number().await.unwrap(), 0); + + make_attempt_due(&mut driver); + driver.wait_for_attempt().await; + let AttemptStep::Completed(consolidated) = + driver.run_attempt(&provider, &mut engine, &database).await + else { + panic!("canonical retry must complete") + }; + assert!(consolidated.batch_outcome.l2_head_updated); + assert_eq!(*engine.fcs().head_block_info(), canonical); + assert_eq!(*engine.fcs().safe_block_info(), canonical); + assert_eq!(database.get_l2_head_block_number().await.unwrap(), canonical.number); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(1)).await.unwrap(), + Some(BatchStatus::Consolidated) + ); + assert_eq!(client.fork_choice_updated_calls(), 3); + assert_eq!(client.get_payload_calls(), 1); + assert_eq!(client.new_payload_calls(), 1); + } + + #[derive(Debug, Clone, Copy)] + enum ExpectedClassification { + Success, + Hold { method: &'static str, status: HoldStatus }, + Fatal { method: &'static str, outcome: &'static str }, + } + + fn assert_classification( + result: Result, + expected: ExpectedClassification, + ) { + match (result, expected) { + (Ok(_), ExpectedClassification::Success) => {} + ( + Err(AttemptFailure::Hold(actual)), + ExpectedClassification::Hold { method, status }, + ) => { + assert_eq!(actual.method, method); + assert_eq!(actual.status, status); + } + ( + Err(AttemptFailure::Fatal(actual)), + ExpectedClassification::Fatal { method, outcome }, + ) => { + assert_eq!(actual.method, method); + assert_eq!(actual.outcome, outcome); + match outcome { + "INVALID" => assert!(matches!( + *actual.error, + ChainOrchestratorError::InvalidDerivedPayload { .. } + )), + "ACCEPTED" => assert!(matches!( + *actual.error, + ChainOrchestratorError::UnexpectedDerivedPayloadStatus { .. } + )), + "VALID_MISSING_PAYLOAD_ID" => assert!(matches!( + *actual.error, + ChainOrchestratorError::MissingDerivedPayloadId { .. } + )), + other => panic!("unhandled fatal classification {other}"), + } + } + _ => panic!("classification did not match expected result"), + } + } + + #[test] + fn engine_status_classification_matrix() { + let batch_info = BatchInfo::new(1, B256::repeat_byte(1)); + for (response, expected) in [ + ( + fcu(PayloadStatusEnum::Valid, Some(PayloadId::new([7; 8]))), + ExpectedClassification::Success, + ), + ( + fcu(PayloadStatusEnum::Valid, None), + ExpectedClassification::Fatal { + method: BUILD_FCU_METHOD, + outcome: "VALID_MISSING_PAYLOAD_ID", + }, + ), + ( + fcu(PayloadStatusEnum::Syncing, None), + ExpectedClassification::Hold { + method: BUILD_FCU_METHOD, + status: HoldStatus::Syncing, + }, + ), + ( + fcu(PayloadStatusEnum::Accepted, None), + ExpectedClassification::Fatal { method: BUILD_FCU_METHOD, outcome: "ACCEPTED" }, + ), + ( + fcu(PayloadStatusEnum::Invalid { validation_error: "invalid build".into() }, None), + ExpectedClassification::Fatal { method: BUILD_FCU_METHOD, outcome: "INVALID" }, + ), + ] { + assert_classification(classify_build_fcu(response, batch_info), expected); + } + + for (response, expected) in [ + (payload_status(PayloadStatusEnum::Valid), ExpectedClassification::Success), + ( + payload_status(PayloadStatusEnum::Syncing), + ExpectedClassification::Hold { + method: NEW_PAYLOAD_METHOD, + status: HoldStatus::Syncing, + }, + ), + ( + payload_status(PayloadStatusEnum::Accepted), + ExpectedClassification::Hold { + method: NEW_PAYLOAD_METHOD, + status: HoldStatus::Accepted, + }, + ), + ( + payload_status(PayloadStatusEnum::Invalid { + validation_error: "invalid payload".into(), + }), + ExpectedClassification::Fatal { method: NEW_PAYLOAD_METHOD, outcome: "INVALID" }, + ), + ] { + assert_classification(classify_new_payload(response, batch_info, SAFE + 1), expected); + } + + for (response, expected) in [ + (fcu(PayloadStatusEnum::Valid, None), ExpectedClassification::Success), + ( + fcu(PayloadStatusEnum::Syncing, None), + ExpectedClassification::Hold { method: FCU_METHOD, status: HoldStatus::Syncing }, + ), + ( + fcu(PayloadStatusEnum::Accepted, None), + ExpectedClassification::Fatal { method: FCU_METHOD, outcome: "ACCEPTED" }, + ), + ( + fcu(PayloadStatusEnum::Invalid { validation_error: "invalid fcu".into() }, None), + ExpectedClassification::Fatal { method: FCU_METHOD, outcome: "INVALID" }, + ), + ] { + assert_classification( + classify_checked_fcu(response, batch_info, Some(SAFE + 1)), + expected, + ); + } + } + + #[tokio::test] + async fn terminal_build_fcu_outcomes_fail_stop() { + let cases = [ + fcu( + PayloadStatusEnum::Invalid { + validation_error: "invalid derived payload".to_string(), + }, + None, + ), + fcu(PayloadStatusEnum::Valid, None), + fcu(PayloadStatusEnum::Accepted, None), + ]; + + for (offset, response) in cases.into_iter().enumerate() { + let index = offset as u64 + 1; + let database = setup_test_db().await; + insert_batch(&database, index, 1, None).await; + let client = Arc::new(ScriptedEngineClient::new()); + client.push_fork_choice_updated(ScriptedResponse::Ok(response)); + let mut engine = engine_at_safe(client.clone()); + let asserter = Asserter::new(); + push_absent_block(&asserter); + let provider = absent_block_provider(asserter); + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(index, BatchStatus::Consolidated)); + driver.wait_for_attempt().await; + + let AttemptStep::Fatal(fatal) = + driver.run_attempt(&provider, &mut engine, &database).await + else { + panic!("terminal build FCU response must fail-stop") + }; + assert_eq!(fatal.method, BUILD_FCU_METHOD); + assert_ne!(fatal.outcome, "ERROR"); + assert!(!driver.can_accept_batch()); + assert_eq!(client.get_payload_calls(), 0); + assert_eq!(client.new_payload_calls(), 0); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(index as u8)).await.unwrap(), + Some(BatchStatus::Committed) + ); + } + } + + #[tokio::test] + async fn transport_error_fail_stops_without_polling_next_batch() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, None).await; + let client = Arc::new(ScriptedEngineClient::new()); + client.push_fork_choice_updated(ScriptedResponse::TransportFailure); + let mut engine = engine_at_safe(client); + let asserter = Asserter::new(); + push_absent_block(&asserter); + let provider = absent_block_provider(asserter); + let mut pipeline = VecDeque::from([ + batch(1, BatchStatus::Consolidated), + batch(2, BatchStatus::Consolidated), + ]); + let mut driver = DerivationDriver::default(); + driver.hold_batch(pipeline.pop_front().unwrap()); + driver.wait_for_attempt().await; + + let AttemptStep::Fatal(fatal) = driver.run_attempt(&provider, &mut engine, &database).await + else { + panic!("transport failures must fail-stop") + }; + assert_eq!(fatal.method, BUILD_FCU_METHOD); + assert_eq!(fatal.outcome, "ERROR"); + assert!(!driver.can_accept_batch()); + assert_eq!(pipeline.len(), 1, "the later result must not be polled after fatal failure"); + } + + #[tokio::test] + async fn held_batch_blocks_next_pipeline_result() { + let mut driver = DerivationDriver::default(); + let mut pipeline = VecDeque::from([batch(2, BatchStatus::Consolidated)]); + driver.hold_batch(batch(1, BatchStatus::Consolidated)); + + if driver.can_accept_batch() { + pipeline.pop_front(); + } + assert_eq!(pipeline.len(), 1); + assert!(!driver.can_accept_batch()); + + driver.invalidate(); + if driver.can_accept_batch() { + pipeline.pop_front(); + } + assert!(pipeline.is_empty()); + } + + #[tokio::test] + async fn held_status_is_unsynced_and_reports_progress() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, None).await; + let client = Arc::new(ScriptedEngineClient::new()); + client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Syncing, None))); + let mut engine = engine_at_safe(client); + let asserter = Asserter::new(); + push_absent_block(&asserter); + let provider = absent_block_provider(asserter); + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(1, BatchStatus::Consolidated)); + driver.wait_for_attempt().await; + assert!(matches!( + driver.run_attempt(&provider, &mut engine, &database).await, + AttemptStep::Held + )); + + let mut sync = SyncState::default(); + sync.l1_mut().set_synced(); + let status = + ChainOrchestratorStatus::new(&sync, 1, 1, 1, engine.fcs().clone(), driver.status(3)); + assert!(!status.is_synced()); + let DerivationStatus::Held(held) = status.derivation else { + panic!("expected held status") + }; + assert_eq!(held.batch_index, 1); + assert_eq!(held.attempts_started, 1); + assert_eq!(held.last_engine_method.as_deref(), Some(BUILD_FCU_METHOD)); + assert_eq!(held.last_engine_status.as_deref(), Some("SYNCING")); + assert_eq!(held.current_backoff_ms, Some(INITIAL_HOLD_BACKOFF_MS)); + assert_eq!(held.queued_behind, 3); + } + + #[tokio::test] + async fn shutdown_interrupts_held_backoff() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, None).await; + let client = Arc::new(ScriptedEngineClient::new()); + client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Syncing, None))); + let mut engine = engine_at_safe(client); + let asserter = Asserter::new(); + push_absent_block(&asserter); + let provider = absent_block_provider(asserter); + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(1, BatchStatus::Consolidated)); + driver.wait_for_attempt().await; + assert!(matches!( + driver.run_attempt(&provider, &mut engine, &database).await, + AttemptStep::Held + )); + + tokio::select! { + biased; + () = tokio::time::sleep(Duration::from_millis(10)) => {} + () = driver.wait_for_attempt() => panic!("the two-second backoff fired before shutdown"), + } + assert!(!driver.can_accept_batch(), "clean shutdown leaves the held row owned"); + assert!(driver.is_attempt_scheduled()); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(1)).await.unwrap(), + Some(BatchStatus::Committed) + ); + } + + #[tokio::test] + async fn l1_reorg_invalidates_origin_dependent_held_batch() { + let database = setup_test_db().await; + insert_batch(&database, 1, 10, None).await; + let client = Arc::new(ScriptedEngineClient::new()); + client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Syncing, None))); + let mut engine = engine_at_safe(client.clone()); + let asserter = Asserter::new(); + push_absent_block(&asserter); + let provider = absent_block_provider(asserter); + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(1, BatchStatus::Consolidated)); + driver.wait_for_attempt().await; + assert!(matches!( + driver.run_attempt(&provider, &mut engine, &database).await, + AttemptStep::Held + )); + + let (_, outcome) = driver.unwind_and_revalidate(&database, 5).await.unwrap(); + assert!(matches!( + outcome, + HeldReorgOutcome::Invalidated { batch_info: BatchInfo { index: 1, .. }, .. } + )); + assert!(driver.can_accept_batch()); + assert!(!driver.is_attempt_scheduled()); + assert!(database.get_batch_by_index(1).await.unwrap().is_none()); + assert_eq!(database.get_l2_head_block_number().await.unwrap(), 0); + assert_eq!(engine.fcs().head_block_info().number, SAFE); + assert_eq!(client.fork_choice_updated_calls(), 1); + } + + #[tokio::test] + async fn surviving_unwind_waits_for_post_commit_repair_before_retry() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, None).await; + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(1, BatchStatus::Consolidated)); + driver.cancel_attempt(); + + let (_, outcome) = driver.unwind_and_revalidate(&database, 5).await.unwrap(); + assert!(matches!(outcome, HeldReorgOutcome::Survived { .. })); + assert!(!driver.can_accept_batch()); + assert!( + !driver.is_attempt_scheduled(), + "post-unwind provider/FCS repair must succeed before retry is scheduled" + ); + + driver.schedule_fresh_reconciliation(); + assert!(driver.is_attempt_scheduled()); + } + + #[tokio::test] + async fn reverted_finalization_resets_only_its_surviving_processing_row() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, Some(10)).await; + insert_batch(&database, 2, 1, None).await; + database.update_batch_status(B256::repeat_byte(1), BatchStatus::Processing).await.unwrap(); + database.update_batch_status(B256::repeat_byte(2), BatchStatus::Processing).await.unwrap(); + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(1, BatchStatus::Finalized)); + + let (_, outcome) = driver.unwind_and_revalidate(&database, 5).await.unwrap(); + assert!(matches!(outcome, HeldReorgOutcome::Invalidated { .. })); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(1)).await.unwrap(), + Some(BatchStatus::Committed) + ); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(2)).await.unwrap(), + Some(BatchStatus::Processing), + "unrelated Processing rows must remain untouched" + ); + } + + #[tokio::test] + async fn reverted_held_row_is_not_reset_to_committed() { + let database = setup_test_db().await; + insert_batch(&database, 1, 1, Some(10)).await; + database.update_batch_status(B256::repeat_byte(1), BatchStatus::Processing).await.unwrap(); + database + .set_batch_revert_block_number_for_batch_range( + 1, + 1, + BlockInfo { number: 4, hash: B256::repeat_byte(4) }, + ) + .await + .unwrap(); + let mut driver = DerivationDriver::default(); + driver.hold_batch(batch(1, BatchStatus::Finalized)); + driver.cancel_attempt(); + + let (_, outcome) = driver.unwind_and_revalidate(&database, 5).await.unwrap(); + assert!(matches!(outcome, HeldReorgOutcome::Invalidated { .. })); + assert_eq!( + database.get_batch_status_by_hash(B256::repeat_byte(1)).await.unwrap(), + Some(BatchStatus::Reverted), + "the targeted Processing -> Committed reset must not overwrite Reverted" + ); + } +} diff --git a/crates/chain-orchestrator/src/error.rs b/crates/chain-orchestrator/src/error.rs index 504daaba7..d8835213d 100644 --- a/crates/chain-orchestrator/src/error.rs +++ b/crates/chain-orchestrator/src/error.rs @@ -78,6 +78,55 @@ pub enum ChainOrchestratorError { /// The derivation pipeline found an invalid block for the given batch. #[error("The derivation pipeline found an invalid block: {0} for batch: {1}")] InvalidBatch(BlockInfo, BatchInfo), + /// An Engine request failed before returning a status for a derived batch. + #[error( + "Engine request {method} failed while reconciling derived batch {batch_info:?}: {source}" + )] + DerivedBatchEngineRequest { + /// The batch being reconciled. + batch_info: BatchInfo, + /// The Engine method that failed. + method: &'static str, + /// The typed Engine error. + #[source] + source: EngineError, + }, + /// A build forkchoice update returned `VALID` without a payload id. + #[error( + "Engine returned VALID without a payload id while reconciling derived batch {batch_info:?}" + )] + MissingDerivedPayloadId { + /// The batch being reconciled. + batch_info: BatchInfo, + }, + /// The Engine returned a terminal status while reconciling a derived batch. + #[error( + "Engine returned {status} during {method} while reconciling derived batch {batch_info:?}" + )] + UnexpectedDerivedPayloadStatus { + /// The batch being reconciled. + batch_info: BatchInfo, + /// The Engine method that returned the status. + method: &'static str, + /// The terminal Engine status. + status: &'static str, + }, + /// The Engine rejected a derived payload or forkchoice update as invalid. + #[error( + "Engine returned INVALID during {method} for derived batch {batch_info:?} at block {block_number:?}: latest_valid_hash={latest_valid_hash:?}, validation_error={validation_error}" + )] + InvalidDerivedPayload { + /// The batch being reconciled. + batch_info: BatchInfo, + /// The Engine method that returned `INVALID`. + method: &'static str, + /// The affected block number, when already known. + block_number: Option, + /// The latest hash the Engine considers valid. + latest_valid_hash: Option, + /// The Engine validation detail. + validation_error: String, + }, /// Attempted to reorg a batch but the safe block number does not match the derived /// block number - 1. #[error("Attempted to reorg batch {batch_info:?} for derived block number {derived_block_number} but expected safe block number is {safe_block_number} - we expect `safe block number = derived block number - 1`")] diff --git a/crates/chain-orchestrator/src/event.rs b/crates/chain-orchestrator/src/event.rs index 172322133..d76ef49c1 100644 --- a/crates/chain-orchestrator/src/event.rs +++ b/crates/chain-orchestrator/src/event.rs @@ -1,7 +1,7 @@ use alloy_consensus::Header; use alloy_primitives::{Signature, B256}; +use dogeos_reth_primitives::DogeosBlock; use reth_network_peers::PeerId; -use reth_scroll_primitives::ScrollBlock; use rollup_node_primitives::{ BatchConsolidationOutcome, BatchInfo, BlockConsolidationOutcome, BlockInfo, ChainImport, L2BlockInfoWithL1Messages, @@ -89,14 +89,14 @@ pub enum ChainOrchestratorEvent { /// An L2 consolidated block has been committed returning the [`L2BlockInfoWithL1Messages`]. L2ConsolidatedBlockCommitted(L2BlockInfoWithL1Messages), /// A new block has been sequenced by the sequencer. - BlockSequenced(ScrollBlock), + BlockSequenced(DogeosBlock), /// Block building was skipped because the built payload was empty and empty blocks are /// disabled. BlockBuildingSkipped, /// A new block has been signed by the signer. SignedBlock { /// The signed block. - block: ScrollBlock, + block: DogeosBlock, /// The signature of the signed block. signature: Signature, }, diff --git a/crates/chain-orchestrator/src/handle/command.rs b/crates/chain-orchestrator/src/handle/command.rs index afdf49a38..45d7baa2e 100644 --- a/crates/chain-orchestrator/src/handle/command.rs +++ b/crates/chain-orchestrator/src/handle/command.rs @@ -1,16 +1,15 @@ use crate::{ChainOrchestratorEvent, ChainOrchestratorStatus}; use reth_network_api::FullNetwork; -use reth_scroll_node::ScrollNetworkPrimitives; use reth_tokio_util::EventStream; use rollup_node_primitives::{BlockInfo, ChainImport, L1MessageEnvelope}; use scroll_db::L1MessageKey; -use scroll_network::{NewBlockWithPeer, ScrollNetworkHandle}; +use scroll_network::{DogeosNetworkPrimitives, NewBlockWithPeer, ScrollNetworkHandle}; use tokio::sync::oneshot; /// The commands that can be sent to the rollup manager. #[derive(Debug)] -pub enum ChainOrchestratorCommand> { +pub enum ChainOrchestratorCommand> { /// Command to build a new block. BuildBlock, /// Returns an event stream for rollup manager events. diff --git a/crates/chain-orchestrator/src/handle/mod.rs b/crates/chain-orchestrator/src/handle/mod.rs index ab78ddea9..775765619 100644 --- a/crates/chain-orchestrator/src/handle/mod.rs +++ b/crates/chain-orchestrator/src/handle/mod.rs @@ -3,11 +3,10 @@ use crate::ChainOrchestratorStatus; use super::ChainOrchestratorEvent; // use crate::manager::metrics::HandleMetrics; use reth_network_api::FullNetwork; -use reth_scroll_node::ScrollNetworkPrimitives; use reth_tokio_util::EventStream; use rollup_node_primitives::{BlockInfo, ChainImport, L1MessageEnvelope}; use scroll_db::L1MessageKey; -use scroll_network::{NewBlockWithPeer, ScrollNetworkHandle}; +use scroll_network::{DogeosNetworkPrimitives, NewBlockWithPeer, ScrollNetworkHandle}; use tokio::sync::{mpsc, oneshot}; use tracing::error; @@ -19,7 +18,7 @@ use metrics::ChainOrchestratorHandleMetrics; /// The handle used to send commands to the rollup manager. #[derive(Debug, Clone)] -pub struct ChainOrchestratorHandle> { +pub struct ChainOrchestratorHandle> { /// The channel used to send commands to the rollup manager. to_manager_tx: mpsc::UnboundedSender>, /// The metrics for the handle. @@ -29,7 +28,7 @@ pub struct ChainOrchestratorHandle, } -impl> ChainOrchestratorHandle { +impl> ChainOrchestratorHandle { /// Create a new rollup manager handle. pub fn new(to_manager_tx: mpsc::UnboundedSender>) -> Self { Self { diff --git a/crates/chain-orchestrator/src/lib.rs b/crates/chain-orchestrator/src/lib.rs index bde8f1431..77e6e90d4 100644 --- a/crates/chain-orchestrator/src/lib.rs +++ b/crates/chain-orchestrator/src/lib.rs @@ -5,34 +5,32 @@ use alloy_eips::Encodable2718; use alloy_primitives::{b256, bytes::Bytes, keccak256, B256}; use alloy_provider::Provider; use alloy_rpc_types_engine::ExecutionPayloadV1; +use dogeos_hardforks::DogeosHardforks; +use dogeos_protocol_types::{ScrollTxEnvelope, TxL1Message}; +use dogeos_reth_primitives::DogeosBlock; +use dogeos_rpc_types::Scroll; use futures::{stream, StreamExt, TryStreamExt}; use reth_chainspec::EthChainSpec; use reth_network_api::{BlockDownloaderProvider, FullNetwork}; use reth_network_p2p::{sync::SyncState as RethSyncState, FullBlockClient}; -use reth_scroll_node::ScrollNetworkPrimitives; -use reth_scroll_primitives::ScrollBlock; -use reth_tasks::shutdown::Shutdown; use reth_tokio_util::{EventSender, EventStream}; use rollup_node_primitives::{ - BatchCommitData, BatchInfo, BatchStatus, BlockConsolidationOutcome, BlockInfo, ChainImport, - L1MessageEnvelope, L2BlockInfoWithL1Messages, + BatchCommitData, BatchInfo, BatchStatus, BlockInfo, ChainImport, L1MessageEnvelope, + L2BlockInfoWithL1Messages, }; use rollup_node_providers::L1MessageProvider; use rollup_node_sequencer::{Sequencer, SequencerEvent}; use rollup_node_signer::{SignatureAsBytes, SignerEvent, SignerHandle}; use rollup_node_watcher::{L1Notification, L1WatcherHandle}; -use scroll_alloy_consensus::{ScrollTxEnvelope, TxL1Message}; -use scroll_alloy_hardforks::ScrollHardforks; -use scroll_alloy_network::Scroll; -use scroll_alloy_provider::ScrollEngineApi; use scroll_db::{ Database, DatabaseError, DatabaseReadOperations, DatabaseWriteOperations, L1MessageKey, UnwindResult, }; -use scroll_derivation_pipeline::{BatchDerivationResult, DerivationPipeline}; -use scroll_engine::Engine; +use scroll_derivation_pipeline::DerivationPipeline; +use scroll_engine::{Engine, ScrollEngineApi}; use scroll_network::{ - BlockImportOutcome, NewBlockWithPeer, ScrollNetwork, ScrollNetworkManagerEvent, + BlockImportOutcome, DogeosNetworkPrimitives, NewBlockWithPeer, ScrollNetwork, + ScrollNetworkManagerEvent, }; use std::{collections::VecDeque, sync::Arc, time::Instant, vec}; use tokio::sync::mpsc::{self, UnboundedReceiver}; @@ -44,7 +42,9 @@ mod consensus; pub use consensus::{Consensus, NoopConsensus, SystemContractConsensus}; mod consolidation; -use consolidation::{reconcile_batch, BlockConsolidationAction}; + +mod derivation; +use derivation::{AttemptStep, DerivationDriver, FatalAttempt, HeldReorgOutcome}; mod event; pub use event::ChainOrchestratorEvent; @@ -62,7 +62,7 @@ mod sync; pub use sync::{SyncMode, SyncState}; mod status; -pub use status::ChainOrchestratorStatus; +pub use status::{ChainOrchestratorStatus, DerivationStatus, HeldBatchStatus}; /// Wraps a future, metering the completion of it. macro_rules! metered { @@ -93,11 +93,19 @@ const BATCH_SIZE: usize = 100; #[cfg(any(test, feature = "test-utils"))] const BATCH_SIZE: usize = 1; +const fn l1_notification_receiver_may_poll( + l2_synced: bool, + derivation_pipeline_empty: bool, + derivation_driver_can_accept_batch: bool, +) -> bool { + l2_synced && derivation_pipeline_empty && derivation_driver_can_accept_batch +} + /// The [`ChainOrchestrator`] is responsible for orchestrating the progression of the L2 chain /// based on data consolidated from L1 and the data received over the p2p network. #[derive(Debug)] pub struct ChainOrchestrator< - N: FullNetwork, + N: FullNetwork, ChainSpec, L1MP, L2P, @@ -129,6 +137,8 @@ pub struct ChainOrchestrator< signer: Option, /// The derivation pipeline used to derive L2 blocks from batches. derivation_pipeline: DerivationPipeline, + /// Owns the single derived result being reconciled or held for Engine sync. + derivation_driver: DerivationDriver, /// Optional event sender for broadcasting events to listeners. event_sender: Option>, /// The metrics handler. @@ -136,8 +146,8 @@ pub struct ChainOrchestrator< } impl< - N: FullNetwork + Send + Sync + 'static, - ChainSpec: ScrollHardforks + EthChainSpec + Send + Sync + 'static, + N: FullNetwork + Send + Sync + 'static, + ChainSpec: DogeosHardforks + EthChainSpec + Send + Sync + 'static, L1MP: L1MessageProvider + Unpin + Clone + Send + Sync + 'static, L2P: Provider + 'static, EC: ScrollEngineApi + Sync + Send + 'static, @@ -174,6 +184,7 @@ impl< sequencer, signer, derivation_pipeline, + derivation_driver: DerivationDriver::default(), handle_rx, event_sender: None, metric_handler: MetricsHandler::default(), @@ -182,18 +193,72 @@ impl< )) } - /// Drives the [`ChainOrchestrator`] future until a [`Shutdown`] signal is received. - pub async fn run_until_shutdown(mut self, mut shutdown: Shutdown) { + /// Drives the [`ChainOrchestrator`] until shutdown or any held-derivation fail-stop boundary. + pub async fn run_until_shutdown( + mut self, + mut shutdown: impl std::future::Future + Unpin, + ) -> Result<(), ChainOrchestratorError> { loop { tokio::select! { biased; _guard = &mut shutdown => { self.notify(ChainOrchestratorEvent::Shutdown); - break; + return Ok(()) + } + () = self.derivation_driver.wait_for_attempt(), if self.derivation_driver.is_attempt_scheduled() => { + let metric = self.metric_handler + .get(Task::BatchReconciliation) + .expect("metric exists") + .clone(); + let started = Instant::now(); + let step = { + let mut attempt = Box::pin(self.derivation_driver.run_attempt( + &*self.l2_client, + &mut self.engine, + &self.database, + )); + tokio::select! { + biased; + _guard = &mut shutdown => None, + step = &mut attempt => Some(step), + } + }; + metric.task_duration.record(started.elapsed().as_secs_f64()); + + let Some(step) = step else { + self.notify(ChainOrchestratorEvent::Shutdown); + return Ok(()) + }; + + match step { + AttemptStep::Completed(consolidated) => { + for outcome in consolidated.block_outcomes { + self.notify(ChainOrchestratorEvent::BlockConsolidated(outcome)); + } + self.notify(ChainOrchestratorEvent::BatchConsolidated( + consolidated.batch_outcome, + )); + } + AttemptStep::Held => {} + AttemptStep::Fatal(fatal) => { + self.log_fatal_attempt(&fatal); + return Err(*fatal.error) + } + } } Some(command) = self.handle_rx.recv() => { + let held_unwind_context = matches!( + &command, + ChainOrchestratorCommand::RevertToL1Block(_) + ) + .then(|| self.derivation_driver.fatal_context()) + .flatten(); if let Err(err) = self.handle_command(command).await { + if let Some(context) = held_unwind_context { + self.log_fatal_held_operation(context, "administrative L1 unwind", &err); + return Err(err) + } tracing::error!(target: "scroll::chain_orchestrator", ?err, "Error handling command"); } } @@ -213,27 +278,72 @@ impl< } else { unreachable!() } - }, if self.sequencer.is_some() && self.sync_state.is_synced() => { + }, if self.sequencer.is_some() && self.sync_state.is_synced() && !self.has_pending_derivation_work() => { let res = self.handle_sequencer_event(event).await; self.handle_outcome(res); } - Some(batch) = self.derivation_pipeline.next() => { - let res = metered!(Task::BatchReconciliation, self, handle_derived_batch(batch)); - self.handle_outcome(res); + Some(batch) = self.derivation_pipeline.next(), if self.derivation_driver.can_accept_batch() => { + self.derivation_driver.hold_batch(batch); } Some(event) = self.network.events().next() => { let res = self.handle_network_event(event).await; self.handle_outcome(res); } - Some(notification) = self.l1_watcher.l1_notification_receiver().recv(), if self.sync_state.l2().is_synced() && self.derivation_pipeline.is_empty() => { - let res = self.handle_l1_notification(notification).await; - self.handle_outcome(res); + Some(notification) = self.l1_watcher.l1_notification_receiver().recv(), if l1_notification_receiver_may_poll( + self.sync_state.l2().is_synced(), + self.derivation_pipeline.is_empty(), + self.derivation_driver.can_accept_batch(), + ) => { + let result = self.handle_l1_notification(notification).await; + self.handle_outcome(result); } } } } + /// Returns whether derivation is queued or one result occupies the held slot. + const fn has_pending_derivation_work(&self) -> bool { + !self.derivation_driver.can_accept_batch() || !self.derivation_pipeline.is_empty() + } + + /// Writes a structured fail-stop record for an operation that made held validity uncertain. + fn log_fatal_held_operation( + &self, + (batch_info, attempt, held_ms): (BatchInfo, u64, u64), + operation: &'static str, + error: &ChainOrchestratorError, + ) { + self.derivation_driver.record_fatal(); + tracing::error!( + target: "scroll::chain_orchestrator", + batch_index = batch_info.index, + batch_hash = ?batch_info.hash, + attempt, + held_ms, + operation, + source = %error, + "Held-batch state is uncertain after L1 mutation; fail-stopping" + ); + } + + /// Writes the single structured fatal record immediately before the run loop returns `Err`. + fn log_fatal_attempt(&self, fatal: &FatalAttempt) { + let (batch_info, attempt, held_ms) = + self.derivation_driver.fatal_context().expect("a fatal attempt retains its held batch"); + tracing::error!( + target: "scroll::chain_orchestrator", + batch_index = batch_info.index, + batch_hash = ?batch_info.hash, + attempt, + held_ms, + method = fatal.method, + outcome = fatal.outcome, + source = %fatal.error, + "Derived batch reconciliation failed; fail-stopping" + ); + } + /// Handles the outcome of an operation, logging errors and notifying event listeners as /// appropriate. fn handle_outcome( @@ -353,6 +463,7 @@ impl< l1_finalized, l1_processed, self.engine.fcs().clone(), + self.derivation_driver.status(self.derivation_pipeline.len()), ); let _ = tx.send(status); } @@ -407,7 +518,9 @@ impl< }, ChainOrchestratorCommand::RevertToL1Block((block_number, tx)) => { self.sync_state.l1_mut().set_syncing(); - let unwind_result = self.database.unwind(block_number).await?; + self.derivation_driver.cancel_attempt(); + let (unwind_result, held_outcome) = + self.unwind_and_revalidate_held_batch(block_number).await?; // Check if the unwind impacts the fcs safe head. if let Some(block_info) = unwind_result.l2_safe_block_info { @@ -426,6 +539,10 @@ impl< // Revert the L1 watcher to the specified block. self.l1_watcher.revert_to_l1_block(block_number); + if matches!(held_outcome, HeldReorgOutcome::Survived { .. }) { + self.derivation_driver.schedule_fresh_reconciliation(); + } + self.notify(ChainOrchestratorEvent::UnwoundToL1Block(block_number)); let _ = tx.send(true); } @@ -470,96 +587,42 @@ impl< } } - /// Handles a derived batch by inserting the derived blocks into the database. - async fn handle_derived_batch( + /// Atomically unwinds and decides only the owned held result. Pipeline results that have not + /// yet yielded remain the separately tracked issue #32 and are outside this branch's scope. + async fn unwind_and_revalidate_held_batch( &mut self, - batch: BatchDerivationResult, - ) -> Result, ChainOrchestratorError> { - let batch_info = batch.batch_info; - tracing::info!(target: "scroll::chain_orchestrator", batch_info = ?batch_info, num_blocks = batch.attributes.len(), "Handling derived batch"); - - let skipped_l1_messages = batch.skipped_l1_messages.clone(); - let batch_reconciliation_result = - reconcile_batch(&self.l2_client, batch, self.engine.fcs()).await?; - let aggregated_actions = batch_reconciliation_result.aggregate_actions(); - - let mut reorg_results = vec![]; - for action in aggregated_actions.actions { - let outcome = match action { - BlockConsolidationAction::Skip(_) => { - unreachable!("Skip actions have been filtered out in aggregation") - } - BlockConsolidationAction::UpdateFcs(block_info) => { - tracing::info!(target: "scroll::chain_orchestrator", ?block_info, "Updating safe head to consolidated block"); - let finalized_block_info = batch_reconciliation_result - .target_status - .is_finalized() - .then_some(block_info.block_info); - self.engine - .update_fcs(None, Some(block_info.block_info), finalized_block_info) - .await?; - BlockConsolidationOutcome::UpdateFcs(block_info) - } - BlockConsolidationAction::Reorg(attributes) => { - tracing::info!(target: "scroll::chain_orchestrator", block_number = ?attributes.block_number, "Reorging chain to derived block"); - // We reorg the head to the safe block and then build the payload for the - // attributes. - let head = *self.engine.fcs().safe_block_info(); - if head.number != attributes.block_number - 1 { - return Err(ChainOrchestratorError::InvalidBatchReorg { - batch_info, - safe_block_number: head.number, - derived_block_number: attributes.block_number, - }); - } - let fcu = self.engine.build_payload(Some(head), attributes.attributes).await?; - let payload = self - .engine - .get_payload(fcu.payload_id.expect("payload_id can not be None")) - .await?; - - let block_info: L2BlockInfoWithL1Messages = (&payload) - .try_into() - .map_err(ChainOrchestratorError::RollupNodePrimitiveError)?; - let result = self.engine.new_payload(payload).await?; - if result.is_invalid() { - return Err(ChainOrchestratorError::InvalidBatch( - block_info.block_info, - batch_info, - )); - } - - // Update the forkchoice state to the new head. - let finalized_block_info = batch_reconciliation_result - .target_status - .is_finalized() - .then_some(block_info.block_info); - self.engine - .update_fcs( - Some(block_info.block_info), - Some(block_info.block_info), - finalized_block_info, - ) - .await?; - - reorg_results.push(block_info.clone()); - BlockConsolidationOutcome::Reorged(block_info) - } - }; - - self.notify(ChainOrchestratorEvent::BlockConsolidated(outcome.clone())); + ancestor: u64, + ) -> Result<(UnwindResult, HeldReorgOutcome), ChainOrchestratorError> { + let (unwind_result, outcome) = + self.derivation_driver.unwind_and_revalidate(&self.database, ancestor).await?; + match outcome { + HeldReorgOutcome::NoHeldBatch => {} + HeldReorgOutcome::Invalidated { batch_info, reason } => tracing::info!( + target: "scroll::chain_orchestrator", + batch_index = batch_info.index, + batch_hash = ?batch_info.hash, + ancestor, + reason, + "Invalidated held derived batch after L1 unwind" + ), + HeldReorgOutcome::Survived { batch_info } => tracing::info!( + target: "scroll::chain_orchestrator", + batch_index = batch_info.index, + batch_hash = ?batch_info.hash, + ancestor, + "Held derived batch survived L1 unwind; awaiting post-unwind repair" + ), } - let batch_consolidation_outcome = - batch_reconciliation_result.into_batch_consolidation_outcome(reorg_results).await?; - - // Insert the batch consolidation outcome into the database. - let mut consolidation_outcome = batch_consolidation_outcome.clone(); - consolidation_outcome.with_skipped_l1_messages(skipped_l1_messages); - - self.database.insert_batch_consolidation_outcome(consolidation_outcome).await?; + Ok((unwind_result, outcome)) + } - Ok(Some(ChainOrchestratorEvent::BatchConsolidated(batch_consolidation_outcome))) + /// Meters L1 reorg handling. + async fn handle_l1_reorg_and_revalidate( + &mut self, + block_number: u64, + ) -> Result, ChainOrchestratorError> { + metered!(Task::L1Reorg, self, handle_l1_reorg(block_number)) } /// Handles an L1 notification. @@ -574,7 +637,7 @@ impl< Ok(None) } L1Notification::Reorg(block_number) => { - metered!(Task::L1Reorg, self, handle_l1_reorg(*block_number)) + self.handle_l1_reorg_and_revalidate(*block_number).await } L1Notification::Consensus(update) => { self.consensus.update_config(update); @@ -674,8 +737,11 @@ impl< &mut self, block_number: u64, ) -> Result, ChainOrchestratorError> { + self.derivation_driver.cancel_attempt(); + let (unwind_result, held_outcome) = + self.unwind_and_revalidate_held_batch(block_number).await?; let UnwindResult { l1_block_number, queue_index, l2_head_block_number, l2_safe_block_info } = - self.database.unwind(block_number).await?; + unwind_result; let (l2_head_block_info, reverted_transactions) = if let Some(block_number) = l2_head_block_number { @@ -727,6 +793,10 @@ impl< // Add all reverted transactions to the transaction pool. self.reinsert_txs_into_pool(reverted_transactions).await; + if matches!(held_outcome, HeldReorgOutcome::Survived { .. }) { + self.derivation_driver.schedule_fresh_reconciliation(); + } + let event = ChainOrchestratorEvent::L1Reorg { l1_block_number, queue_index, @@ -1113,7 +1183,7 @@ impl< let parent_number = new_headers.front().expect("at least one header exists").number - 1; let fetch_count = HEADER_FETCH_COUNT.min(parent_number - current_safe_block_number); tracing::trace!(target: "scroll::chain_orchestrator", ?received_block_hash, ?received_block_number, ?parent_hash, ?parent_number, %current_safe_block_number, fetch_count, "Fetching headers to find common ancestor for fork"); - let headers: Vec = self + let headers: Vec = self .block_client .get_full_block_range(parent_hash, fetch_count) .await @@ -1160,7 +1230,7 @@ impl< /// Imports a chain of headers into the L2 chain. async fn import_chain( &mut self, - chain: Vec, + chain: Vec, block_with_peer: NewBlockWithPeer, ) -> Result { let chain_head_hash = chain.last().expect("at least one header exists").hash_slow(); @@ -1322,7 +1392,7 @@ impl< /// from L1. async fn validate_l1_messages( &self, - blocks: &[ScrollBlock], + blocks: &[DogeosBlock], ) -> Result<(), ChainOrchestratorError> { let l1_message_hashes = blocks .iter() @@ -1417,3 +1487,458 @@ async fn compute_l1_message_queue_hash( }; Ok(queue_hash) } + +#[cfg(test)] +mod run_loop_policy_tests { + use super::*; + use alloy_primitives::{Address, Bloom, Bytes, U256}; + use alloy_provider::ProviderBuilder; + use alloy_rpc_types_engine::{ + ExecutionPayloadV1, ForkchoiceUpdated, PayloadId, PayloadStatus, PayloadStatusEnum, + }; + use alloy_transport::mock::Asserter; + use dogeos_chainspec::{DogeosChainSpec, DOGEOS_DEV}; + use dogeos_reth_consensus::DogeosConsensus; + use dogeos_reth_engine::ScrollPayloadAttributes; + use reth_network_api::noop::NoopNetwork; + use reth_network_p2p::NoopFullBlockClient; + use rollup_node_primitives::BatchCommitData; + use rollup_node_providers::{test_utils::MockL1Provider, ScrollRootProvider}; + use scroll_db::test_utils::setup_test_db; + use scroll_derivation_pipeline::{BatchDerivationResult, DerivedAttributes}; + use scroll_engine::{ + test_utils::{ScriptedEngineClient, ScriptedResponse}, + ForkchoiceState, + }; + use scroll_network::{NetworkHandleMessage, ScrollNetworkHandle}; + use std::time::Duration; + use tokio::time; + + const SAFE: u64 = 100; + const TEST_L1_NOTIFICATION_CAPACITY: usize = 16; + + type TestNetwork = NoopNetwork; + type TestL1Provider = MockL1Provider>; + type TestOrchestrator = ChainOrchestrator< + TestNetwork, + DogeosChainSpec, + TestL1Provider, + ScrollRootProvider, + ScriptedEngineClient, + >; + + fn info(number: u64, tag: u8) -> BlockInfo { + BlockInfo { number, hash: B256::repeat_byte(tag) } + } + + fn fcu(status: PayloadStatusEnum, payload_id: Option) -> ForkchoiceUpdated { + ForkchoiceUpdated { + payload_status: PayloadStatus { status, latest_valid_hash: None }, + payload_id, + } + } + + fn payload(number: u64) -> ExecutionPayloadV1 { + ExecutionPayloadV1 { + parent_hash: B256::ZERO, + fee_recipient: Address::ZERO, + state_root: B256::ZERO, + receipts_root: B256::ZERO, + logs_bloom: Bloom::default(), + prev_randao: B256::ZERO, + block_number: number, + gas_limit: 0, + gas_used: 0, + timestamp: 0, + extra_data: Bytes::new(), + base_fee_per_gas: U256::ZERO, + block_hash: B256::repeat_byte(0x22), + transactions: vec![], + } + } + + fn script_syncing_hold_then_success(client: &ScriptedEngineClient) { + client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Syncing, None))); + client.push_fork_choice_updated(ScriptedResponse::Ok(fcu( + PayloadStatusEnum::Valid, + Some(PayloadId::new([7; 8])), + ))); + client.push_get_payload(ScriptedResponse::Ok(payload(SAFE + 1))); + client.push_new_payload(ScriptedResponse::Ok(PayloadStatus { + status: PayloadStatusEnum::Valid, + latest_valid_hash: None, + })); + client.push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Valid, None))); + } + + async fn test_scroll_network() -> ScrollNetwork> { + let (to_manager_tx, mut from_handle_rx) = mpsc::unbounded_channel(); + let handle = + ScrollNetworkHandle::new(to_manager_tx, NoopNetwork::::new()); + tokio::spawn(async move { + let events = EventSender::new(16); + while let Some(message) = from_handle_rx.recv().await { + if let NetworkHandleMessage::EventListener(response) = message { + let _ = response.send(events.new_listener()); + } + } + }); + handle.into_scroll_network().await + } + + async fn test_orchestrator( + database: Arc, + engine_client: Arc, + asserter: Asserter, + derived: BatchDerivationResult, + ) -> (TestOrchestrator, ChainOrchestratorHandle, mpsc::Sender>) + { + let engine = Engine::new( + engine_client, + ForkchoiceState::new(info(SAFE, 0x11), info(SAFE, 0x11), info(0, 0)), + ); + let l2_provider = + ProviderBuilder::<_, _, Scroll>::default().connect_mocked_client(asserter); + let l1_provider = MockL1Provider { db: database.clone(), blobs: Default::default() }; + let derivation_pipeline = + DerivationPipeline::new(l1_provider.clone(), database.clone(), 0).await; + + let (watcher_command_tx, _watcher_command_rx) = mpsc::unbounded_channel(); + let (notification_tx, notification_rx) = mpsc::channel(TEST_L1_NOTIFICATION_CAPACITY); + let l1_watcher = L1WatcherHandle::new(watcher_command_tx, notification_rx); + let block_client = Arc::new(FullBlockClient::new( + NoopFullBlockClient::::default(), + Arc::new(DogeosConsensus), + )); + let config = ChainOrchestratorConfig::::new(DOGEOS_DEV.clone(), 1, 0); + let (mut orchestrator, handle) = ChainOrchestrator::new( + database, + config, + block_client, + l2_provider, + l1_watcher, + test_scroll_network().await, + Box::new(NoopConsensus), + engine, + None::>, + None, + derivation_pipeline, + ) + .await + .unwrap(); + orchestrator.sync_state.l1_mut().set_synced(); + orchestrator.derivation_driver.hold_batch(derived); + + (orchestrator, handle, notification_tx) + } + + #[test] + fn l1_notification_receiver_requires_synced_idle_derivation() { + for (l2_synced, pipeline_empty, can_accept_batch, expected) in [ + (false, false, false, false), + (false, false, true, false), + (false, true, false, false), + (false, true, true, false), + (true, false, false, false), + (true, false, true, false), + (true, true, false, false), + (true, true, true, true), + ] { + assert_eq!( + l1_notification_receiver_may_poll(l2_synced, pipeline_empty, can_accept_batch), + expected, + "l2_synced={l2_synced}, pipeline_empty={pipeline_empty}, \ + can_accept_batch={can_accept_batch}" + ); + } + } + + #[tokio::test] + async fn notification_waits_until_held_slot_and_pipeline_are_empty() { + let database = Arc::new(setup_test_db().await); + database.insert_genesis_block(B256::ZERO).await.unwrap(); + database.set_processed_l1_block_number(5).await.unwrap(); + let batch_info = BatchInfo::new(1, B256::repeat_byte(1)); + database + .insert_batch(BatchCommitData { + hash: batch_info.hash, + index: batch_info.index, + block_number: 1, + block_timestamp: 0, + calldata: Arc::new(Bytes::new()), + blob_versioned_hash: None, + finalized_block_number: None, + reverted_block_number: None, + }) + .await + .unwrap(); + database.update_batch_status(batch_info.hash, BatchStatus::Processing).await.unwrap(); + + let engine_client = Arc::new(ScriptedEngineClient::new()); + script_syncing_hold_then_success(&engine_client); + + let asserter = Asserter::new(); + asserter.push_success(&Option::<()>::None); + asserter.push_success(&Option::<()>::None); + let (mut orchestrator, handle, notification_tx) = test_orchestrator( + database.clone(), + engine_client.clone(), + asserter, + BatchDerivationResult { + attributes: vec![DerivedAttributes { + block_number: SAFE + 1, + attributes: ScrollPayloadAttributes::default(), + }], + batch_info, + skipped_l1_messages: vec![], + target_status: BatchStatus::Consolidated, + }, + ) + .await; + let mut events = orchestrator.event_listener(); + + let (shutdown_tx, shutdown_rx) = tokio::sync::oneshot::channel(); + let run_task = tokio::spawn(orchestrator.run_until_shutdown(Box::pin(async move { + let _ = shutdown_rx.await; + }))); + + time::timeout(Duration::from_secs(2), async { + loop { + let status = handle.status().await.unwrap(); + if matches!( + status.derivation, + DerivationStatus::Held(HeldBatchStatus { attempts_started: 1, .. }) + ) { + break + } + tokio::task::yield_now().await; + } + }) + .await + .expect("first Engine SYNCING response must hold the batch"); + + notification_tx.send(Arc::new(L1Notification::Processed(10))).await.unwrap(); + time::sleep(Duration::from_millis(50)).await; + assert_eq!(notification_tx.capacity(), TEST_L1_NOTIFICATION_CAPACITY - 1); + assert_eq!( + database.get_processed_l1_block_number().await.unwrap(), + 5, + "the watcher channel must retain the notification while derivation is held" + ); + + time::timeout(Duration::from_secs(5), async { + loop { + if matches!( + events.next().await, + Some(ChainOrchestratorEvent::BatchConsolidated(outcome)) + if outcome.batch_info == batch_info + ) { + break + } + } + }) + .await + .expect("the held batch must consolidate"); + + time::timeout(Duration::from_secs(2), async { + while database.get_processed_l1_block_number().await.unwrap() != 10 { + tokio::task::yield_now().await; + } + }) + .await + .expect("the notification must apply once derivation is idle"); + assert_eq!(notification_tx.capacity(), TEST_L1_NOTIFICATION_CAPACITY); + assert!(matches!(handle.status().await.unwrap().derivation, DerivationStatus::Idle)); + assert_eq!(engine_client.fork_choice_updated_calls(), 3); + + let _ = shutdown_tx.send(()); + assert!(run_task.await.unwrap().is_ok()); + } + + #[tokio::test] + async fn queued_reorg_runs_after_consolidation_then_unwinds_it() { + let database = Arc::new(setup_test_db().await); + database.insert_genesis_block(B256::ZERO).await.unwrap(); + let batch_info = BatchInfo::new(1, B256::repeat_byte(1)); + database + .insert_batch(BatchCommitData { + hash: batch_info.hash, + index: batch_info.index, + block_number: 10, + block_timestamp: 0, + calldata: Arc::new(Bytes::new()), + blob_versioned_hash: None, + finalized_block_number: None, + reverted_block_number: None, + }) + .await + .unwrap(); + database.update_batch_status(batch_info.hash, BatchStatus::Processing).await.unwrap(); + + let engine_client = Arc::new(ScriptedEngineClient::new()); + script_syncing_hold_then_success(&engine_client); + engine_client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Valid, None))); + let asserter = Asserter::new(); + asserter.push_success(&Option::<()>::None); + asserter.push_success(&Option::<()>::None); + let (mut orchestrator, _handle, notification_tx) = test_orchestrator( + database.clone(), + engine_client.clone(), + asserter, + BatchDerivationResult { + attributes: vec![DerivedAttributes { + block_number: SAFE + 1, + attributes: ScrollPayloadAttributes::default(), + }], + batch_info, + skipped_l1_messages: vec![], + target_status: BatchStatus::Consolidated, + }, + ) + .await; + let mut events = orchestrator.event_listener(); + + let (shutdown_tx, shutdown_rx) = tokio::sync::oneshot::channel(); + let run_task = tokio::spawn(orchestrator.run_until_shutdown(Box::pin(async move { + let _ = shutdown_rx.await; + }))); + + time::timeout(Duration::from_secs(2), async { + while engine_client.fork_choice_updated_calls() < 1 { + tokio::task::yield_now().await; + } + }) + .await + .expect("first Engine SYNCING response must hold the batch"); + + notification_tx.send(Arc::new(L1Notification::Reorg(5))).await.unwrap(); + time::sleep(Duration::from_millis(50)).await; + assert_eq!(notification_tx.capacity(), TEST_L1_NOTIFICATION_CAPACITY - 1); + assert_eq!( + database.get_batch_status_by_hash(batch_info.hash).await.unwrap(), + Some(BatchStatus::Processing), + "the queued reorg must not preempt the held batch" + ); + + let observed = time::timeout(Duration::from_secs(5), async { + let mut observed = Vec::new(); + while observed.len() < 2 { + match events.next().await { + Some(ChainOrchestratorEvent::BatchConsolidated(outcome)) + if outcome.batch_info == batch_info => + { + observed.push("consolidated"); + } + Some(ChainOrchestratorEvent::L1Reorg { l1_block_number: 5, .. }) => { + observed.push("reorg") + } + _ => {} + } + } + observed + }) + .await + .expect("consolidation and the queued reorg must both complete"); + assert_eq!(observed, ["consolidated", "reorg"]); + assert_eq!(database.get_latest_l1_block_number().await.unwrap(), 5); + assert!(database.get_batch_by_index(batch_info.index).await.unwrap().is_none()); + assert_eq!(engine_client.fork_choice_updated_calls(), 4); + assert_eq!(engine_client.get_payload_calls(), 1); + assert_eq!(engine_client.new_payload_calls(), 1); + + let _ = shutdown_tx.send(()); + assert!(run_task.await.unwrap().is_ok()); + } + + #[tokio::test] + async fn administrative_post_unwind_engine_failure_fail_stops_without_retry() { + let database = Arc::new(setup_test_db().await); + database.insert_genesis_block(B256::ZERO).await.unwrap(); + let batch_info = BatchInfo::new(1, B256::repeat_byte(1)); + database + .insert_batch(BatchCommitData { + hash: batch_info.hash, + index: batch_info.index, + block_number: 1, + block_timestamp: 0, + calldata: Arc::new(Bytes::new()), + blob_versioned_hash: None, + finalized_block_number: None, + reverted_block_number: None, + }) + .await + .unwrap(); + database.update_batch_status(batch_info.hash, BatchStatus::Processing).await.unwrap(); + database + .insert_batch(BatchCommitData { + hash: B256::repeat_byte(2), + index: 2, + block_number: 10, + block_timestamp: 0, + calldata: Arc::new(Bytes::new()), + blob_versioned_hash: None, + finalized_block_number: None, + reverted_block_number: None, + }) + .await + .unwrap(); + + let engine_client = Arc::new(ScriptedEngineClient::new()); + engine_client + .push_fork_choice_updated(ScriptedResponse::Ok(fcu(PayloadStatusEnum::Syncing, None))); + engine_client.push_fork_choice_updated(ScriptedResponse::TransportFailure); + let asserter = Asserter::new(); + asserter.push_success(&Option::<()>::None); + let (orchestrator, handle, _notification_tx) = test_orchestrator( + database.clone(), + engine_client.clone(), + asserter, + BatchDerivationResult { + attributes: vec![DerivedAttributes { + block_number: SAFE + 1, + attributes: ScrollPayloadAttributes::default(), + }], + batch_info, + skipped_l1_messages: vec![], + target_status: BatchStatus::Consolidated, + }, + ) + .await; + + let (_shutdown_tx, shutdown_rx) = tokio::sync::oneshot::channel::<()>(); + let run_task = tokio::spawn(orchestrator.run_until_shutdown(Box::pin(async move { + let _ = shutdown_rx.await; + }))); + time::timeout(Duration::from_secs(2), async { + loop { + let status = handle.status().await.unwrap(); + if matches!( + status.derivation, + DerivationStatus::Held(HeldBatchStatus { attempts_started: 1, .. }) + ) { + break + } + tokio::task::yield_now().await; + } + }) + .await + .expect("first Engine SYNCING response must hold the batch"); + + let revert_task = tokio::spawn(async move { handle.revert_to_l1_block(5).await }); + let result = time::timeout(Duration::from_secs(2), run_task) + .await + .expect("post-unwind Engine failure must terminate the run loop") + .unwrap(); + assert!(revert_task.await.unwrap().is_err()); + assert!(matches!(result, Err(ChainOrchestratorError::EngineError(_)))); + assert_eq!(engine_client.fork_choice_updated_calls(), 2); + assert_eq!( + database.get_batch_status_by_hash(batch_info.hash).await.unwrap(), + Some(BatchStatus::Processing), + "the surviving held row must remain for restart recovery" + ); + assert!(database.get_batch_by_index(2).await.unwrap().is_none()); + } +} diff --git a/crates/chain-orchestrator/src/metrics.rs b/crates/chain-orchestrator/src/metrics.rs index 9918f040e..9efddfa39 100644 --- a/crates/chain-orchestrator/src/metrics.rs +++ b/crates/chain-orchestrator/src/metrics.rs @@ -1,6 +1,6 @@ -use metrics::Histogram; +use dogeos_reth_primitives::DogeosBlock; +use metrics::{Counter, Gauge, Histogram}; use metrics_derive::Metrics; -use reth_scroll_primitives::ScrollBlock; use std::{collections::HashMap, time::Instant}; use strum::{EnumIter, IntoEnumIterator}; @@ -28,7 +28,7 @@ impl MetricsHandler { } /// Finishes tracking the current block building task. - pub(crate) fn finish_block_building_recording(&mut self, block: Option<&ScrollBlock>) { + pub(crate) fn finish_block_building_recording(&mut self, block: Option<&DogeosBlock>) { let now = Instant::now(); if let Some(t) = self.block_building_meter.block_building_start.take() { let elapsed = now.duration_since(t).as_secs_f64(); @@ -117,6 +117,18 @@ pub(crate) struct ChainOrchestratorMetrics { pub task_duration: Histogram, } +/// Minimal observability for the fail-stop / Engine-hold derivation state. +#[derive(Metrics)] +#[metrics(scope = "chain_orchestrator")] +pub(crate) struct DerivedBatchMetrics { + /// Whether a derived batch currently occupies the held slot. + pub held: Gauge, + /// The number of reconciliation attempts started. + pub attempts: Counter, + /// The number of held-batch fail-stop events. + pub fatal: Counter, +} + /// A block building meter. #[derive(Debug, Default)] pub(crate) struct BlockBuildingMeter { diff --git a/crates/chain-orchestrator/src/status.rs b/crates/chain-orchestrator/src/status.rs index 128e7c595..5c54bebd6 100644 --- a/crates/chain-orchestrator/src/status.rs +++ b/crates/chain-orchestrator/src/status.rs @@ -1,4 +1,5 @@ use crate::sync::{SyncMode, SyncState}; +use alloy_primitives::B256; use scroll_engine::ForkchoiceState; /// The current status of the chain orchestrator. @@ -9,12 +10,14 @@ pub struct ChainOrchestratorStatus { pub l1: L1ChainStatus, /// The chain status for L2. pub l2: L2ChainStatus, + /// The progress of derivation and ordered batch reconciliation. + pub derivation: DerivationStatus, } impl ChainOrchestratorStatus { /// Returns true if the chain orchestrator is fully synced. pub const fn is_synced(&self) -> bool { - self.l1.status.is_synced() && self.l2.status.is_synced() + self.l1.status.is_synced() && self.l2.status.is_synced() && self.derivation.is_idle() } } @@ -26,6 +29,7 @@ impl ChainOrchestratorStatus { l1_finalized: u64, l1_processed: u64, l2_fcs: ForkchoiceState, + derivation: DerivationStatus, ) -> Self { Self { l1: L1ChainStatus { @@ -35,10 +39,56 @@ impl ChainOrchestratorStatus { processed: l1_processed, }, l2: L2ChainStatus { status: sync_state.l2().clone(), fcs: l2_fcs }, + derivation, } } } +/// The current state of the derivation pipeline and its single held reconciliation slot. +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", serde(tag = "state", rename_all = "snake_case"))] +pub enum DerivationStatus { + /// No batch is queued, deriving, or held. + Idle, + /// Batches are queued or being derived, but none has yielded into the held slot. + Deriving { + /// The number of active pipeline batches. + queued: u64, + }, + /// One batch is owned until it commits, is invalidated by an L1 unwind, or fail-stops. + Held(HeldBatchStatus), +} + +impl DerivationStatus { + /// Returns whether no derivation or reconciliation work remains. + pub const fn is_idle(&self) -> bool { + matches!(self, Self::Idle) + } +} + +/// Observable progress for the derived batch currently held in place. +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct HeldBatchStatus { + /// The held batch index. + pub batch_index: u64, + /// The held batch hash. + pub batch_hash: B256, + /// The number of attempts that have started, including an attempt currently in flight. + pub attempts_started: u64, + /// The time elapsed since the pipeline yielded this batch, in milliseconds. + pub held_duration_ms: u64, + /// The Engine method that most recently caused a hold, if an attempt has reached one. + pub last_engine_method: Option, + /// The most recently received hold status (`SYNCING` or `ACCEPTED`). + pub last_engine_status: Option, + /// The full delay scheduled before the next attempt, when backing off. + pub current_backoff_ms: Option, + /// The number of pipeline batches queued behind the held batch. + pub queued_behind: u64, +} + /// The status of the L1 chain. #[derive(Debug, Clone, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -63,3 +113,36 @@ pub struct L2ChainStatus { #[cfg_attr(feature = "serde", serde(flatten))] pub fcs: ForkchoiceState, } + +#[cfg(all(test, feature = "serde"))] +mod tests { + use super::*; + + #[test] + fn held_status_serde_round_trip() { + let mut sync = SyncState::default(); + sync.l1_mut().set_synced(); + let status = ChainOrchestratorStatus::new( + &sync, + 12, + 11, + 10, + ForkchoiceState::from_genesis(B256::repeat_byte(0x11)), + DerivationStatus::Held(HeldBatchStatus { + batch_index: 7, + batch_hash: B256::repeat_byte(0x22), + attempts_started: 3, + held_duration_ms: 9_000, + last_engine_method: Some("newPayload".to_string()), + last_engine_status: Some("ACCEPTED".to_string()), + current_backoff_ms: Some(8_000), + queued_behind: 2, + }), + ); + + let json = serde_json::to_string(&status).unwrap(); + let decoded: ChainOrchestratorStatus = serde_json::from_str(&json).unwrap(); + assert_eq!(decoded, status); + assert!(!decoded.is_synced()); + } +} diff --git a/crates/codec/Cargo.toml b/crates/codec/Cargo.toml index 581f8f642..0456cf91a 100644 --- a/crates/codec/Cargo.toml +++ b/crates/codec/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] # alloy -scroll-alloy-consensus.workspace = true +dogeos-protocol-types.workspace = true alloy-eips.workspace = true alloy-primitives.workspace = true alloy-rlp = { version = "0.3.10", default-features = false } diff --git a/crates/codec/src/decoding/batch.rs b/crates/codec/src/decoding/batch.rs index c90b10606..86b43bcd3 100644 --- a/crates/codec/src/decoding/batch.rs +++ b/crates/codec/src/decoding/batch.rs @@ -4,7 +4,7 @@ use crate::{ }; use alloy_primitives::{bytes::BufMut, keccak256, B256}; -use scroll_alloy_consensus::TxL1Message; +use dogeos_protocol_types::TxL1Message; /// The deserialized batch data. #[derive(Debug, Clone, PartialEq, Eq)] @@ -115,7 +115,7 @@ mod tests { use crate::decoding::{test_utils::read_to_bytes, v0::decode_v0, v1::decode_v1}; use alloy_primitives::b256; - use scroll_alloy_consensus::TxL1Message; + use dogeos_protocol_types::TxL1Message; #[test] fn test_should_compute_data_hash_v0() -> eyre::Result<()> { diff --git a/crates/database/db/Cargo.toml b/crates/database/db/Cargo.toml index 2d7ddcaf7..ebacca254 100644 --- a/crates/database/db/Cargo.toml +++ b/crates/database/db/Cargo.toml @@ -14,8 +14,8 @@ workspace = true alloy-primitives.workspace = true # scroll-alloy -scroll-alloy-consensus.workspace = true -scroll-alloy-rpc-types-engine.workspace = true +dogeos-protocol-types.workspace = true +dogeos-reth-engine.workspace = true # scroll scroll-migration = { workspace = true, optional = true } diff --git a/crates/database/db/src/db.rs b/crates/database/db/src/db.rs index f5c2fbf6c..88a61ddb2 100644 --- a/crates/database/db/src/db.rs +++ b/crates/database/db/src/db.rs @@ -7,11 +7,11 @@ use crate::{ UnwindResult, }; use alloy_primitives::{Signature, B256}; +use dogeos_reth_engine::BlockDataHint; use rollup_node_primitives::{ BatchCommitData, BatchConsolidationOutcome, BatchInfo, BlockInfo, L1BlockStartupInfo, L1MessageEnvelope, L2BlockInfoWithL1Messages, }; -use scroll_alloy_rpc_types_engine::BlockDataHint; use sea_orm::{ sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}, DatabaseConnection, SqlxSqliteConnector, TransactionTrait, @@ -253,6 +253,19 @@ impl DatabaseWriteOperations for Database { ) } + async fn transition_batch_status( + &self, + batch_hash: B256, + from: rollup_node_primitives::BatchStatus, + to: rollup_node_primitives::BatchStatus, + ) -> Result { + metered!( + DatabaseOperation::UpdateBatchStatus, + self, + tx_mut(move |tx| async move { tx.transition_batch_status(batch_hash, from, to).await }) + ) + } + async fn insert_batch(&self, batch_commit: BatchCommitData) -> Result<(), DatabaseError> { metered!( DatabaseOperation::InsertBatch, @@ -556,7 +569,7 @@ impl DatabaseReadOperations for Database { ) } - #[cfg(test)] + #[cfg(any(test, feature = "test-utils"))] async fn get_batch_status_by_hash( &self, batch_hash: B256, @@ -864,12 +877,12 @@ mod test { use std::sync::Arc; use arbitrary::{Arbitrary, Unstructured}; + use dogeos_protocol_types::TxL1Message; use futures::StreamExt; use rand::Rng; use rollup_node_primitives::{ BatchCommitData, BatchInfo, BlockInfo, L1MessageEnvelope, L2BlockInfoWithL1Messages, }; - use scroll_alloy_consensus::TxL1Message; use sea_orm::EntityTrait; #[tokio::test] diff --git a/crates/database/db/src/models/block_data.rs b/crates/database/db/src/models/block_data.rs index 372429887..321fc5e22 100644 --- a/crates/database/db/src/models/block_data.rs +++ b/crates/database/db/src/models/block_data.rs @@ -1,5 +1,5 @@ use alloy_primitives::{Address, B256, U256}; -use scroll_alloy_rpc_types_engine::BlockDataHint; +use dogeos_reth_engine::BlockDataHint; use sea_orm::entity::prelude::*; /// A database model that represents extra data for the block. diff --git a/crates/database/db/src/models/l1_message.rs b/crates/database/db/src/models/l1_message.rs index bb9eb1268..477e46c03 100644 --- a/crates/database/db/src/models/l1_message.rs +++ b/crates/database/db/src/models/l1_message.rs @@ -1,6 +1,6 @@ use alloy_primitives::{Address, B256, U256}; +use dogeos_protocol_types::TxL1Message; use rollup_node_primitives::L1MessageEnvelope; -use scroll_alloy_consensus::TxL1Message; use sea_orm::{entity::prelude::*, ActiveValue}; /// A database model that represents a L1 message. diff --git a/crates/database/db/src/operations.rs b/crates/database/db/src/operations.rs index dbb628b8d..fb46354f4 100644 --- a/crates/database/db/src/operations.rs +++ b/crates/database/db/src/operations.rs @@ -2,11 +2,11 @@ use super::{models, DatabaseError}; use crate::{ReadConnectionProvider, WriteConnectionProvider}; use alloy_primitives::{Signature, B256}; +use dogeos_reth_engine::BlockDataHint; use rollup_node_primitives::{ BatchCommitData, BatchConsolidationOutcome, BatchInfo, BatchStatus, BlockInfo, L1BlockStartupInfo, L1MessageEnvelope, L2BlockInfoWithL1Messages, Metadata, }; -use scroll_alloy_rpc_types_engine::BlockDataHint; use sea_orm::{ sea_query::{CaseStatement, Expr, OnConflict}, ColumnTrait, Condition, DbErr, EntityTrait, QueryFilter, QueryOrder, QuerySelect, @@ -107,6 +107,14 @@ pub trait DatabaseWriteOperations { status: BatchStatus, ) -> Result<(), DatabaseError>; + /// Changes a batch status only when its current status matches `from`. + async fn transition_batch_status( + &self, + batch_hash: B256, + from: BatchStatus, + to: BatchStatus, + ) -> Result; + /// Delete all [`BatchCommitData`]s with a batch index greater than the provided index. async fn delete_batches_gt_batch_index(&self, batch_index: u64) -> Result; @@ -382,6 +390,24 @@ impl DatabaseWriteOperations for T { Ok(()) } + async fn transition_batch_status( + &self, + batch_hash: B256, + from: BatchStatus, + to: BatchStatus, + ) -> Result { + tracing::trace!(target: "scroll::db", ?batch_hash, ?from, ?to, "Conditionally updating batch status in database."); + + let result = models::batch_commit::Entity::update_many() + .filter(models::batch_commit::Column::Hash.eq(batch_hash.to_vec())) + .filter(models::batch_commit::Column::Status.eq(from.as_str())) + .col_expr(models::batch_commit::Column::Status, Expr::value(to.as_str())) + .exec(self.get_connection()) + .await?; + + Ok(result.rows_affected == 1) + } + async fn finalize_batches_up_to_index( &self, batch_index: u64, @@ -967,7 +993,7 @@ pub trait DatabaseReadOperations { ) -> Result, DatabaseError>; /// Get the status of a batch by its hash. - #[cfg(test)] + #[cfg(any(test, feature = "test-utils"))] async fn get_batch_status_by_hash( &self, batch_hash: B256, @@ -1073,7 +1099,7 @@ impl DatabaseReadOperations for T { .map(|x| x.map(Into::into))?) } - #[cfg(test)] + #[cfg(any(test, feature = "test-utils"))] async fn get_batch_status_by_hash( &self, batch_hash: B256, diff --git a/crates/database/migration/Cargo.toml b/crates/database/migration/Cargo.toml index 872a070ed..909926926 100644 --- a/crates/database/migration/Cargo.toml +++ b/crates/database/migration/Cargo.toml @@ -16,7 +16,7 @@ reth-chainspec.workspace = true sea-orm = { workspace = true, features = ["sqlx-sqlite", "runtime-tokio-native-tls", "macros"] } sha2 = "0.10.9" tracing.workspace = true -reth-scroll-chainspec.workspace = true +dogeos-chainspec.workspace = true [dependencies.sea-orm-migration] version = "1.1.0" diff --git a/crates/database/migration/src/migration_info.rs b/crates/database/migration/src/migration_info.rs index a16749d31..678b6eea0 100644 --- a/crates/database/migration/src/migration_info.rs +++ b/crates/database/migration/src/migration_info.rs @@ -1,5 +1,5 @@ use alloy_primitives::{b256, B256}; -use reth_scroll_chainspec::{SCROLL_MAINNET_GENESIS_HASH, SCROLL_SEPOLIA_GENESIS_HASH}; +use dogeos_chainspec::{DOGEOS_CHIKYU_GENESIS_HASH, DOGEOS_MAINNET_GENESIS_HASH}; pub enum DataSource { Url(String), @@ -43,7 +43,7 @@ impl MigrationInfo for ScrollMainnetMigrationInfo { } fn genesis_hash() -> B256 { - SCROLL_MAINNET_GENESIS_HASH + DOGEOS_MAINNET_GENESIS_HASH } } @@ -59,7 +59,7 @@ impl MigrationInfo for ScrollMainnetTestMigrationInfo { } fn genesis_hash() -> B256 { - SCROLL_MAINNET_GENESIS_HASH + DOGEOS_MAINNET_GENESIS_HASH } } @@ -78,6 +78,6 @@ impl MigrationInfo for ScrollSepoliaMigrationInfo { } fn genesis_hash() -> B256 { - SCROLL_SEPOLIA_GENESIS_HASH + DOGEOS_CHIKYU_GENESIS_HASH } } diff --git a/crates/derivation-pipeline/Cargo.toml b/crates/derivation-pipeline/Cargo.toml index 1e56d2f83..6f4589721 100644 --- a/crates/derivation-pipeline/Cargo.toml +++ b/crates/derivation-pipeline/Cargo.toml @@ -16,8 +16,8 @@ alloy-primitives = { workspace = true, default-features = false } alloy-rpc-types-engine = { workspace = true, default-features = false } # scroll -scroll-alloy-consensus = { workspace = true, default-features = false } -scroll-alloy-rpc-types-engine.workspace = true +dogeos-protocol-types = { workspace = true, default-features = false } +dogeos-reth-engine.workspace = true # rollup node rollup-node-primitives.workspace = true @@ -49,8 +49,8 @@ tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } [features] default = ["std"] std = [ - "scroll-alloy-consensus/std", - "scroll-alloy-rpc-types-engine/std", + "dogeos-protocol-types/std", + "dogeos-reth-engine/std", "alloy-primitives/std", "alloy-rpc-types-engine/std", "alloy-eips/std", diff --git a/crates/derivation-pipeline/benches/pipeline.rs b/crates/derivation-pipeline/benches/pipeline.rs index 048af0d5c..3098eb6ba 100644 --- a/crates/derivation-pipeline/benches/pipeline.rs +++ b/crates/derivation-pipeline/benches/pipeline.rs @@ -4,12 +4,12 @@ use alloy_primitives::{Bytes, B256}; use criterion::{criterion_group, criterion_main, Criterion}; +use dogeos_protocol_types::TxL1Message; use futures::StreamExt; use rollup_node_primitives::{BatchCommitData, BatchInfo, BatchStatus, L1MessageEnvelope}; use rollup_node_providers::{ test_utils::MockL1Provider, FullL1Provider, L1Provider, S3BlobProvider, }; -use scroll_alloy_consensus::TxL1Message; use scroll_db::{ test_utils::setup_test_db, Database, DatabaseConnectionProvider, DatabaseWriteOperations, EntityTrait, diff --git a/crates/derivation-pipeline/src/cache.rs b/crates/derivation-pipeline/src/cache.rs index 059f8e7b1..40f01fe14 100644 --- a/crates/derivation-pipeline/src/cache.rs +++ b/crates/derivation-pipeline/src/cache.rs @@ -1,5 +1,5 @@ +use dogeos_reth_engine::BlockDataHint; use moka::future::Cache; -use scroll_alloy_rpc_types_engine::BlockDataHint; use scroll_db::{Database, DatabaseReadOperations}; use std::{sync::Arc, time::Duration}; use tokio::sync::Mutex; diff --git a/crates/derivation-pipeline/src/lib.rs b/crates/derivation-pipeline/src/lib.rs index aea3aceeb..9766b3377 100644 --- a/crates/derivation-pipeline/src/lib.rs +++ b/crates/derivation-pipeline/src/lib.rs @@ -6,10 +6,10 @@ use alloy_primitives::{Address, B256}; use alloy_rpc_types_engine::PayloadAttributes; use core::{fmt::Debug, future::Future, pin::Pin, task::Poll}; +use dogeos_reth_engine::ScrollPayloadAttributes; use futures::{stream::FuturesOrdered, Stream, StreamExt}; use rollup_node_primitives::{BatchCommitData, BatchInfo, BatchStatus, L1MessageEnvelope}; use rollup_node_providers::L1Provider; -use scroll_alloy_rpc_types_engine::{BlockDataHint, ScrollPayloadAttributes}; use scroll_codec::{decoding::payload::PayloadData, Codec, CodecError, DecodingError}; use scroll_db::{Database, DatabaseReadOperations, L1MessageKey}; use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender}; @@ -374,10 +374,7 @@ pub async fn derive( }, transactions: Some(txs), no_tx_pool: true, - block_data_hint: cache - .get(block.context.number) - .await? - .unwrap_or_else(BlockDataHint::none), + block_data_hint: cache.get(block.context.number).await?.unwrap_or_default(), gas_limit: Some(block.context.gas_limit), }, }; @@ -458,11 +455,11 @@ mod tests { use alloy_eips::Decodable2718; use alloy_primitives::{address, b256, bytes, U256}; + use dogeos_protocol_types::TxL1Message; + use dogeos_reth_engine::BlockDataHint; use futures::StreamExt; use rollup_node_primitives::L1MessageEnvelope; use rollup_node_providers::{test_utils::MockL1Provider, L1ProviderError}; - use scroll_alloy_consensus::TxL1Message; - use scroll_alloy_rpc_types_engine::BlockDataHint; use scroll_codec::decoding::test_utils::read_to_bytes; use scroll_db::{test_utils::setup_test_db, DatabaseWriteOperations}; use std::{collections::HashMap, path::PathBuf}; @@ -564,7 +561,7 @@ mod tests { }, transactions: Some(vec![bytes!("f88c8202658417d7840082a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001669aa2f583104ec4a07461e6555f927393ebdf5f183738450c3842bc3b86a1db7549d9bee21fadd0b1a06d7ba96897bd9fb8e838a327d3ca34be66da11955f10d1fb2264949071e9e8cd")]), no_tx_pool: true, - block_data_hint: BlockDataHint::none(), + block_data_hint: BlockDataHint::default(), gas_limit: Some(10_000_000), }; assert_eq!(attribute, expected); @@ -623,7 +620,7 @@ mod tests { }, transactions: Some(vec![bytes!("f88c8202658417d7840082a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001669aa2f583104ec4a07461e6555f927393ebdf5f183738450c3842bc3b86a1db7549d9bee21fadd0b1a06d7ba96897bd9fb8e838a327d3ca34be66da11955f10d1fb2264949071e9e8cd")]), no_tx_pool: true, - block_data_hint: BlockDataHint::none(), + block_data_hint: BlockDataHint::default(), gas_limit: Some(10_000_000), }; assert_eq!(attribute, expected); @@ -670,7 +667,7 @@ mod tests { }, transactions: Some(vec![bytes!("7ef901b7218302904094781e90f1c8fc4611c9b7497c3b47f99ef6969cbc80b901848ef1332e0000000000000000000000007f2b8c31f88b6006c382775eea88297ec1e3e9050000000000000000000000006ea73e05adc79974b931123675ea8f78ffdacdf0000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a4232e8748000000000000000000000000ca266224613396a0e8d4c2497dbc4f33dd6cdeff000000000000000000000000ca266224613396a0e8d4c2497dbc4f33dd6cdeff000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000947885bcbd5cecef1336b5300fb5186a12ddd8c478"), bytes!("7ef901b7228302904094781e90f1c8fc4611c9b7497c3b47f99ef6969cbc80b901848ef1332e0000000000000000000000007f2b8c31f88b6006c382775eea88297ec1e3e9050000000000000000000000006ea73e05adc79974b931123675ea8f78ffdacdf000000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a4232e8748000000000000000000000000982fe4a7cbd74bb3422ebe46333c3e8046c12c7f000000000000000000000000982fe4a7cbd74bb3422ebe46333c3e8046c12c7f00000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000947885bcbd5cecef1336b5300fb5186a12ddd8c478")]), no_tx_pool: true, - block_data_hint: BlockDataHint::none(), + block_data_hint: BlockDataHint::default(), gas_limit: Some(10_000_000), }; assert_eq!(attribute.attributes, expected); @@ -683,7 +680,7 @@ mod tests { }, transactions: Some(vec![bytes!("f88c8202658417d7840082a4f294530000000000000000000000000000000000000280a4bede39b500000000000000000000000000000000000000000000000000000001669aa2f583104ec4a07461e6555f927393ebdf5f183738450c3842bc3b86a1db7549d9bee21fadd0b1a06d7ba96897bd9fb8e838a327d3ca34be66da11955f10d1fb2264949071e9e8cd")]), no_tx_pool: true, - block_data_hint: BlockDataHint::none(), + block_data_hint: BlockDataHint::default(), gas_limit: Some(10_000_000), }; assert_eq!(attribute.attributes, expected); @@ -940,7 +937,7 @@ mod tests { }, transactions: Some(vec![bytes!("02f9017a830827501d8402c15db28404220c8b833bf0fa94d6238ad2887166031567616d9a54b21eb70e4dfd865af3107a4000b901042f73d60a000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000005727465727400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045254525400000000000000000000000000000000000000000000000000000000c080a01ab3cf2a93857170eb1a8a564a00dc54d9dbc081aff236614c05f00f89564e7ea076143846b8e83dbbedc9f7f39d9e1efafd2aa323af5977acbc3b7559eaa61338"), bytes!("02f90213830827505d830ebf5b8403c6fdd68303160094aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000014000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a96557e8b05a2e0dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001000000000000000000000000000000000000000000000000000000001ce571940000000000000000000000000000000000000000000000000000000000000000c001a038385859bdc661006ee04173ef0c5e7d259f213b38ec65c5ac5664cc2263588aa06edfcce7499e39f78ff336265222272f75e3b8b6292bc5e7a9b785ec2764357f"), bytes!("f901d43c84039387008301eb0694dc3d8318fbaec2de49281843f5bba22e78338146870110d9316ec000b901647c2ccc45000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006d1aa44dfe55c66e2dd413b045aaf3db92e8bf920000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004108690eca0b490e1a9ebaf85710cce8dd72d48eeb6e74f03fcf1ea58638afbe8808c5076a512e0993e77b117e938d8505bd41380209374a5fa1736040386f9c7a1c0000000000000000000000000000000000000000000000000000000000000083104ec3a00a9daf43e323158d459652563edb141a0df3f2b6d890f6307aac52c74e0bbbbfa02163e491f0cfbeec828ccf98b8877db9ba2a6552e18b2d4d3a8c5ded1d407d73"), bytes!("f8948201ef8402faf08083018a31940241fb446d6793866245b936f2c3418f818bdcd3879970b65dfdc000a4b6b55f250000000000000000000000000000000000000000000000000098c445ad57800083104ec4a097f352f786ffb1ddf9d942286cbd9ff6839f46093767c4326a1cf9bc1f117500a048cfccfe406c692cc717a670a0148fef79789aceb282cc3d0e6805593ad605cf"), bytes!("f90bd45c8402faf080830e3b1994a2a9fd768d482caf519d749d3123a133db278a66876a94d74f42ffffb90b645973bd5e000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f97000000000000000000000000000000000000000000000000006a94d74f42ffff000000000000000000000000000000000000000000000003e3fdab75eefcae8200000000000000000000000083412753e54768f8bed921e5556680e7a3e1910800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000066d85f8c0000000000000000000000000000000000000000000000000000000000000a600000000000000000000000006131b5fae19ea4f9d964eac0408e4408b66337b5000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000009e4e21fd0e90000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000005300000000000000000000000000000000000004000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f970000000000000000000000006131b5fae19ea4f9d964eac0408e4408b66337b50000000000000000000000000000000000000000000000000000000066d85f8c00000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000401b96cfd40000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000008f8ed95b3b3ed2979d1ee528f38ca3e481a94dd9000000000000000000000000530000000000000000000000000000000000000400000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000006a94d74f42ffff0000000000000000000000000000000000000000000000000000000000030f0b000000000000000000000000000000000000000000000000000000000000004063407a490000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000ccdf79ced5fd02af299d3548b4e35ed6163064bf00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000000000044a4e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000041783c314dc20000000000000003e6fce47750c3ecea0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f97000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000e7a23e2f9abf813ad55e55ce26c0712bf1593332000000000000000000000000000000000000000000000000006a94d74f42ffff000000000000000000000000000000000000000000000003da07eeddb6d6509a00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc8970000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000006a94d74f42ffff0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a8337cce66f217701071a68a503caa8bf139b1840000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002317b22536f75726365223a22686970706f2d73776170222c22416d6f756e74496e555344223a2237322e323133343430313133383636222c22416d6f756e744f7574555344223a2237312e3931343239373937333238373232222c22526566657272616c223a22222c22466c616773223a302c22416d6f756e744f7574223a223731373638373037373539383535313532373730222c2254696d657374616d70223a313732353435353036382c22496e74656772697479496e666f223a7b224b65794944223a2231222c225369676e6174757265223a22436d38564441314d3466386b696f525546383976695344495765474e785858726c3842643651396a70493057764c652b6f4d655246394472484e73544c463045315a5842736e55384b4a393173693447674631524d74614d334c777030324f5136383879704e796e436b3978425a4b2b796b427074416647614b35516a49794f45712f36494d4a654d3772626f59444675713166414f7370394634683543714c44622f7469722b507562677131474b693742556a6d6433584463796239386a70377a5132783533744e52766e52683955484f44636932516252634a6e337272394157327252397653697a4b46336874676c546b794a6a61725251446e735644772f3274687447595a4e7a516a417361354b717236323679796e466f49493175387779714b547a6b3052512f6f464d4a7a55752b454563704d752b4c626a7835322f50556c6735526678666568507066666a4a53514a773d3d227d7d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec3a0aa2e2380709f2b0c6b8fcc48ba4c6942aea501a867d2bfe27a5979a9900b9692a044a21df53a177fff5c1348b3cdb23f82bab41b8fea58d68138234a302d87d904"), bytes!("f88d8201078403938700830100a794e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134da0883104ec3a054336f213352ee4faf92a752befcfe39c7a6a18ce3d7bcc56b6dc875454d76dba00e9ebd78c3aa468f4d311e3ebfeb0c8c79a1f3cfc3a26ed71d3665fc6820b5d5"), bytes!("02f8b28308275024830ebf5b8403c6fdd6830415a894ec53c830f4444a8a56455c6836b5d2aa794289aa80b844830cbbbd000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c00000000000000000000000000000000000000000000000021b745fecb550714c080a0e8f444aca5c459c27676e185579de1d6cb5eb88d4e350fd6dade07946ede16a8a0165e301acebf43a608e747e07b2e32ddd86cebb24ec98440c34b919c49fcedd7"), bytes!("02f9025483082750518403db832c8403db832c8308bcf394c47300428b6ad2c7d03bb76d05a176058b47e6b080b901e4f17325e70000000000000000000000000000000000000000000000000000000000000020d57de4f41c3d3cc855eadef68f98c0d4edd22d57161d96b7c06d2f4336cc3b490000000000000000000000000000000000000000000000000000000000000040000000000000000000000000295f5db3e40c5155271eaf9058d54b185c5fff1300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002dbce60ebeaafb77e5472308f432f78ac3ae07d90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000074670a3998d9d6622e32d0847ff5977c37e0ec91000000000000000000000000000000000000000000000000000000000004e900c080a0f63bb59e762a76fe9252065519362897d63795bedffe88fc922a683c82e7e8d0a07693bc90d37b2922650f8e065a0daac6ea71af62c83b4fa69285e7c511785b7a"), bytes!("f902ae819a8403ef1480830ae583940b4d5229bb5201e277d3937ce1704227c96bbc5f80b902443c0427150000000000000000000000000000000000000000000000000000000000000020d57de4f41c3d3cc855eadef68f98c0d4edd22d57161d96b7c06d2f4336cc3b4900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001bd63bc394b1e44a60f0d5ea4fbb61937d973ddcd80b241370f7939607494853112eb2c36e5e4a5d7b9184961380642680541125dfdd9c0764b7a2efad85f926c30000000000000000000000001f4a828ff025fa8270bfd1d4d952e75079bb593d0000000000000000000000000000000000000000000000000000000066d868f00000000000000000000000005b0d7cfaf6557f026591fc29b8f050d7537b476400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000c5d859d4bb0963c8f946d3b3751e4976165b38e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000083104ec3a088eb2685bd6b79ae008d6b0ee74b09341d79f590c8b3faea5dfa2237644bc716a01482d3425fa581941b057a4d20960a90f20ce9e43fb425e537d565be705b3e10"), bytes!("02f8768308275083018b348398968085012d5fe6308275309409dcae886c35e45f2545c0087725e36e18b032eb865af3107a43ea80c001a0922e3023fc0a04bb29ec74efecebb381535ef2453907b101b342f8254fa73072a04b5c97606536ab8d9b7ffec96fab415729c53d18b5ff12f5a4fd148f4aa42d15"), bytes!("02f8b1830827505e830ebf5b8403c6fdd682d9c494e97c507e2b88ab55c61d528f506e13e35dcb8f1580b844a22cb4650000000000000000000000000cab6977a9c70e04458b740476b498b2140196410000000000000000000000000000000000000000000000000000000000000001c080a0dab66684749d0773893d7cce976dc4a8d2182db8a59044cd9bbd4d0d64f432a1a01bfe61ca3ceae4a81c3668369c36a0eda672f45d63e3935b13f2a694611da6d6"), bytes!("02f902138308275059830ebf5b8403c6fdd68306cff794c47300428b6ad2c7d03bb76d05a176058b47e6b080b901a4f17325e70000000000000000000000000000000000000000000000000000000000000020d57de4f41c3d3cc855eadef68f98c0d4edd22d57161d96b7c06d2f4336cc3b490000000000000000000000000000000000000000000000000000000000000040000000000000000000000000dcde5e9d35d5a1fe9e0eb3185459b3323e09b73b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001121f46b5581b5285bc571703cd772b336aa12e600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000c001a054dc43a6d710d99764add84512d022b4961dd39bfe366967acec0d39a5ab820fa050362c7b199a5bae81b1b56b2bb70058f64a70a01044821232b2c11aef78250d"), bytes!("02f8b983082750288402e577518402f49919830309f194ec53c830f4444a8a56455c6836b5d2aa794289aa86d8bcb85faa78b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c0000000000000000000000000000000000000000000000000000d8bcb85faa78c080a0b12f8b14c62254ac38a2e0f567fa67c642ed485c43d9f2db2a1f93ada8173c86a0178e3a021c50b57fc6f949201d2e1667a243ba0ea94dbf3199abeecea6c20194"), bytes!("f88c81a78402faf080830100a794e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134da0883104ec3a059393dff7dc95d7e2f74053268bc1ab67e03ea0aa115929cd31912fca57d8c66a07330a31a06c957e6b4b31eee08a37c5dc15e31d1a37d4284475adc0a248fa920"),]), no_tx_pool: true, - block_data_hint: BlockDataHint::none(), + block_data_hint: BlockDataHint::default(), gas_limit: Some(10_000_000), }; assert_eq!(attribute.attributes, expected); diff --git a/crates/engine/Cargo.toml b/crates/engine/Cargo.toml index a87365cc9..42405899d 100644 --- a/crates/engine/Cargo.toml +++ b/crates/engine/Cargo.toml @@ -14,14 +14,14 @@ workspace = true alloy-chains.workspace = true alloy-eips.workspace = true alloy-primitives.workspace = true -alloy-provider.workspace = true +alloy-provider = { workspace = true, features = ["engine-api"] } alloy-rpc-types-engine.workspace = true +alloy-transport.workspace = true -# scroll-alloy -scroll-alloy-hardforks.workspace = true -scroll-alloy-network.workspace = true -scroll-alloy-provider.workspace = true -scroll-alloy-rpc-types-engine.workspace = true +# DogeOS protocol +dogeos-hardforks.workspace = true +dogeos-rpc-types.workspace = true +dogeos-reth-engine.workspace = true # reth reth-chainspec.workspace = true @@ -29,16 +29,14 @@ reth-network-api.workspace = true reth-payload-primitives.workspace = true reth-primitives-traits.workspace = true -# reth-scroll -reth-scroll-chainspec.workspace = true -reth-scroll-primitives.workspace = true -reth-scroll-engine-primitives.workspace = true +dogeos-chainspec.workspace = true +dogeos-reth-primitives.workspace = true # rollup-node rollup-node-primitives.workspace = true # misc -async-trait = { workspace = true, optional = true } +async-trait.workspace = true eyre.workspace = true futures.workspace = true metrics.workspace = true @@ -47,18 +45,18 @@ serde = { workspace = true, optional = true, features = ["derive"] } thiserror.workspace = true tokio.workspace = true tracing.workspace = true +jsonrpsee = { version = "0.26.0", features = ["client"] } [dev-dependencies] alloy-consensus.workspace = true arbitrary.workspace = true async-trait.workspace = true reth-testing-utils.workspace = true -scroll-alloy-consensus.workspace = true -scroll-alloy-rpc-types-engine = { workspace = true, features = ["arbitrary"] } +dogeos-protocol-types = { workspace = true, features = ["arbitrary"] } +dogeos-reth-engine.workspace = true [features] test-utils = [ - "dep:async-trait", "reth-chainspec/test-utils", "reth-primitives-traits/test-utils", ] @@ -67,13 +65,12 @@ serde = [ "alloy-eips/serde", "alloy-primitives/serde", "alloy-rpc-types-engine/serde", - "reth-scroll-primitives/serde", - "scroll-alloy-rpc-types-engine/serde", + "dogeos-reth-primitives/serde", "alloy-chains/serde", "reth-network-api/serde", - "scroll-alloy-hardforks/serde", + "dogeos-hardforks/serde", "reth-primitives-traits/serde", "alloy-consensus/serde", - "scroll-alloy-consensus/serde", + "dogeos-protocol-types/serde", "rollup-node-primitives/serde", ] diff --git a/crates/engine/src/api.rs b/crates/engine/src/api.rs new file mode 100644 index 000000000..f8a7fb9dd --- /dev/null +++ b/crates/engine/src/api.rs @@ -0,0 +1,119 @@ +//! Scroll-compatible Engine API surface retained by the rollup orchestrator. + +use alloy_provider::Provider; +use alloy_rpc_types_engine::{ + ExecutionPayloadV1, ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus, +}; +use alloy_transport::TransportErrorKind; +use dogeos_reth_engine::ScrollPayloadAttributes; +use dogeos_rpc_types::Scroll; +use jsonrpsee::core::client::ClientT; + +/// Result returned by the rollup Engine API client. +pub type ScrollEngineApiResult = alloy_transport::TransportResult; + +/// Authenticated Engine API client backed by Reth's JWT-aware JSON-RPC client. +#[derive(Debug, Clone)] +pub struct ScrollAuthApiEngineClient { + client: C, +} + +impl ScrollAuthApiEngineClient { + /// Creates an authenticated Engine API adapter. + pub const fn new(client: C) -> Self { + Self { client } + } +} + +/// Engine methods used by the rollup-owned forkchoice and sequencing services. +#[async_trait::async_trait] +pub trait ScrollEngineApi: Send + Sync { + /// Submits a V1 execution payload. + async fn new_payload_v1( + &self, + payload: ExecutionPayloadV1, + ) -> ScrollEngineApiResult; + + /// Updates forkchoice and optionally starts a Scroll payload build. + async fn fork_choice_updated_v1( + &self, + fork_choice_state: ForkchoiceState, + payload_attributes: Option, + ) -> ScrollEngineApiResult; + + /// Fetches a built V1 execution payload. + async fn get_payload_v1( + &self, + payload_id: PayloadId, + ) -> ScrollEngineApiResult; +} + +#[async_trait::async_trait] +impl

ScrollEngineApi for P +where + P: Provider + Send + Sync, +{ + async fn new_payload_v1( + &self, + payload: ExecutionPayloadV1, + ) -> ScrollEngineApiResult { + self.client().request("engine_newPayloadV1", (payload,)).await + } + + async fn fork_choice_updated_v1( + &self, + fork_choice_state: ForkchoiceState, + payload_attributes: Option, + ) -> ScrollEngineApiResult { + self.client() + .request("engine_forkchoiceUpdatedV1", (fork_choice_state, payload_attributes)) + .await + } + + async fn get_payload_v1( + &self, + payload_id: PayloadId, + ) -> ScrollEngineApiResult { + self.client().request("engine_getPayloadV1", (payload_id,)).await + } +} + +#[async_trait::async_trait] +impl ScrollEngineApi for ScrollAuthApiEngineClient +where + C: ClientT + Send + Sync, +{ + async fn new_payload_v1( + &self, + payload: ExecutionPayloadV1, + ) -> ScrollEngineApiResult { + self.client + .request("engine_newPayloadV1", jsonrpsee::rpc_params![payload]) + .await + .map_err(TransportErrorKind::custom) + } + + async fn fork_choice_updated_v1( + &self, + fork_choice_state: ForkchoiceState, + payload_attributes: Option, + ) -> ScrollEngineApiResult { + self.client + .request( + "engine_forkchoiceUpdatedV1", + jsonrpsee::rpc_params![fork_choice_state, payload_attributes], + ) + .await + .map_err(TransportErrorKind::custom) + } + + async fn get_payload_v1( + &self, + payload_id: PayloadId, + ) -> ScrollEngineApiResult { + self.client + .request("engine_getPayloadV1", jsonrpsee::rpc_params![payload_id]) + .await + .map_err(TransportErrorKind::custom) + } +} diff --git a/crates/engine/src/engine.rs b/crates/engine/src/engine.rs index 6d49a9fed..78a9a9d59 100644 --- a/crates/engine/src/engine.rs +++ b/crates/engine/src/engine.rs @@ -1,9 +1,9 @@ use super::{EngineError, ForkchoiceState}; +use crate::ScrollEngineApi; use alloy_rpc_types_engine::{ ExecutionPayloadV1, ForkchoiceUpdated, PayloadStatus, PayloadStatusEnum, }; use rollup_node_primitives::BlockInfo; -use scroll_alloy_provider::ScrollEngineApi; use std::sync::Arc; /// The engine that communicates with the execution layer. @@ -73,6 +73,35 @@ where Ok(result) } + /// Issues a forkchoice update without payload attributes and commits the candidate local + /// forkchoice state only when the Engine returns `VALID`. + /// + /// The existing [`Self::update_fcs`] intentionally advances local state on `SYNCING` for + /// optimistic-sync callers. Derived-batch reconciliation needs the stricter behavior here so a + /// held batch can retry from the last confirmed local state. The raw response is returned for + /// classification by that caller. + pub async fn update_fcs_checked( + &mut self, + head: Option, + safe: Option, + finalized: Option, + ) -> Result { + tracing::trace!(target: "scroll::engine", ?head, ?safe, ?finalized, current = ?self.fcs, "Updating fork choice state (checked)"); + if head.is_none() && safe.is_none() && finalized.is_none() { + return Err(EngineError::fcs_no_update_provided()); + } + + let mut candidate = self.fcs.clone(); + candidate.update(head, safe, finalized)?; + + let result = self.client.fork_choice_updated_v1(candidate.get_alloy_fcs(), None).await?; + if matches!(result.payload_status.status, PayloadStatusEnum::Valid) { + self.fcs = candidate; + } + + Ok(result) + } + /// Optimistically sync to the given block. pub async fn optimistic_sync( &mut self, @@ -128,7 +157,7 @@ where pub async fn build_payload( &self, head: Option, - attributes: scroll_alloy_rpc_types_engine::ScrollPayloadAttributes, + attributes: dogeos_reth_engine::ScrollPayloadAttributes, ) -> Result { tracing::trace!(target: "scroll::engine", ?attributes, "Building new payload with attributes"); diff --git a/crates/engine/src/error.rs b/crates/engine/src/error.rs index acaf3fe01..fef4a9802 100644 --- a/crates/engine/src/error.rs +++ b/crates/engine/src/error.rs @@ -23,7 +23,7 @@ pub enum EngineError { FcsError(#[from] FcsError), /// An error occurred in the transport layer. #[error("Transport error: {0}")] - TransportError(#[from] scroll_alloy_provider::ScrollEngineApiError), + TransportError(#[from] alloy_transport::TransportError), } impl EngineError { diff --git a/crates/engine/src/fcs.rs b/crates/engine/src/fcs.rs index e512ea9ba..51a6b4a4b 100644 --- a/crates/engine/src/fcs.rs +++ b/crates/engine/src/fcs.rs @@ -4,11 +4,11 @@ use alloy_eips::{BlockId, BlockNumberOrTag}; use alloy_primitives::{Sealable, B256}; use alloy_provider::Provider; use alloy_rpc_types_engine::ForkchoiceState as AlloyForkchoiceState; +use dogeos_chainspec::{DOGEOS_CHIKYU_GENESIS_HASH, DOGEOS_MAINNET_GENESIS_HASH}; +use dogeos_rpc_types::Scroll; use reth_chainspec::EthChainSpec; use reth_primitives_traits::BlockHeader; -use reth_scroll_chainspec::{SCROLL_MAINNET_GENESIS_HASH, SCROLL_SEPOLIA_GENESIS_HASH}; use rollup_node_primitives::BlockInfo; -use scroll_alloy_network::Scroll; /// The fork choice state. /// @@ -176,8 +176,8 @@ pub fn genesis_hash_from_chain_spec>( chain_spec: CS, ) -> Option { match chain_spec.chain().named() { - Some(NamedChain::Scroll) => Some(SCROLL_MAINNET_GENESIS_HASH), - Some(NamedChain::ScrollSepolia) => Some(SCROLL_SEPOLIA_GENESIS_HASH), + Some(NamedChain::Scroll) => Some(DOGEOS_MAINNET_GENESIS_HASH), + Some(NamedChain::ScrollSepolia) => Some(DOGEOS_CHIKYU_GENESIS_HASH), Some(NamedChain::Dev) | None => Some(chain_spec.genesis_header().hash_slow()), _ => None, } diff --git a/crates/engine/src/lib.rs b/crates/engine/src/lib.rs index 09c7463e3..3541ceb55 100644 --- a/crates/engine/src/lib.rs +++ b/crates/engine/src/lib.rs @@ -4,6 +4,9 @@ pub use error::{EngineError, FcsError}; mod error; +mod api; +pub use api::{ScrollAuthApiEngineClient, ScrollEngineApi, ScrollEngineApiResult}; + pub use fcs::{genesis_hash_from_chain_spec, ForkchoiceState}; mod fcs; diff --git a/crates/engine/src/payload.rs b/crates/engine/src/payload.rs index 471546275..60f0362f8 100644 --- a/crates/engine/src/payload.rs +++ b/crates/engine/src/payload.rs @@ -1,6 +1,6 @@ use alloy_primitives::B64; +use dogeos_reth_engine::ScrollPayloadAttributes; use reth_primitives_traits::{AlloyBlockHeader, Block, BlockBody}; -use scroll_alloy_rpc_types_engine::ScrollPayloadAttributes; use tracing::debug; @@ -75,7 +75,7 @@ pub fn block_matches_attributes(attributes: &ScrollPayloadAttributes, return false; } - // nonce defaults to `Some(0x0000000000000000)` for `ScrollBlock`. + // nonce defaults to `Some(0x0000000000000000)` for `DogeosBlock`. if B64::from(block_data.nonce.unwrap_or_default()) != header.nonce().unwrap_or_default() { debug!( target: "scroll::engine::driver", @@ -96,11 +96,12 @@ mod tests { use alloy_consensus::Header; use alloy_eips::Encodable2718; use alloy_primitives::{Bytes, B256, U256}; + use alloy_rpc_types_engine::PayloadAttributes; use arbitrary::{Arbitrary, Unstructured}; - use reth_scroll_primitives::ScrollBlock; + use dogeos_protocol_types::ScrollTxEnvelope; + use dogeos_reth_engine::BlockDataHint; + use dogeos_reth_primitives::DogeosBlock; use reth_testing_utils::{generators, generators::Rng}; - use scroll_alloy_consensus::ScrollTxEnvelope; - use scroll_alloy_rpc_types_engine::BlockDataHint; #[test] fn test_matching_payloads() -> eyre::Result<()> { @@ -117,15 +118,16 @@ mod tests { .collect::>(); let prev_randao = B256::arbitrary(&mut unstructured)?; let timestamp = u64::arbitrary(&mut unstructured)?; - let block_data_hint = BlockDataHint::arbitrary(&mut unstructured)?; + let block_data_hint = BlockDataHint::default(); - let mut attributes = ScrollPayloadAttributes::arbitrary(&mut unstructured)?; - attributes.transactions = Some(encoded_transactions); - attributes.payload_attributes.timestamp = timestamp; - attributes.payload_attributes.prev_randao = prev_randao; - attributes.block_data_hint = block_data_hint.clone(); + let attributes = ScrollPayloadAttributes { + payload_attributes: PayloadAttributes { timestamp, prev_randao, ..Default::default() }, + transactions: Some(encoded_transactions), + block_data_hint: block_data_hint.clone(), + ..Default::default() + }; - let block = ScrollBlock { + let block = DogeosBlock { header: Header { parent_hash, timestamp, @@ -158,8 +160,8 @@ mod tests { let difficulty = U256::arbitrary(&mut unstructured)?; let extra_data = Bytes::arbitrary(&mut unstructured)?; - let attributes = ScrollPayloadAttributes::arbitrary(&mut unstructured)?; - let block = ScrollBlock { + let attributes = ScrollPayloadAttributes::default(); + let block = DogeosBlock { header: Header { parent_hash, timestamp, diff --git a/crates/engine/src/test_utils.rs b/crates/engine/src/test_utils.rs index 32ba1b4a3..75014b324 100644 --- a/crates/engine/src/test_utils.rs +++ b/crates/engine/src/test_utils.rs @@ -1,12 +1,19 @@ //! Test utilities for the engine crate. -use alloy_primitives::{BlockHash, U64}; +use crate::{ScrollEngineApi, ScrollEngineApiResult}; use alloy_rpc_types_engine::{ - ClientVersionV1, ExecutionPayloadBodiesV1, ExecutionPayloadV1, ForkchoiceState, - ForkchoiceUpdated, PayloadId, PayloadStatus, + ExecutionPayloadV1, ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus, +}; +use alloy_transport::TransportErrorKind; +use dogeos_reth_engine::ScrollPayloadAttributes; +use std::{ + collections::VecDeque, + sync::{ + atomic::{AtomicU64, Ordering}, + Mutex, + }, + time::Duration, }; -use scroll_alloy_provider::{ScrollEngineApi, ScrollEngineApiResult}; -use scroll_alloy_rpc_types_engine::ScrollPayloadAttributes; /// A [`ScrollEngineApi`] implementation that panics when any method is called. #[derive(Debug)] @@ -35,33 +42,119 @@ impl ScrollEngineApi for PanicEngineClient { ) -> ScrollEngineApiResult { panic!("PanicEngineClient does not support get_payload_v1") } +} - async fn get_payload_bodies_by_hash_v1( - &self, - _block_hashes: Vec, - ) -> ScrollEngineApiResult { - panic!("PanicEngineClient does not support get_payload_bodies_by_hash_v1") +/// A response returned by one scripted Engine method call. +#[derive(Debug, Clone)] +pub enum ScriptedResponse { + /// Return a successful response. + Ok(T), + /// Return a generic transport failure. + TransportFailure, + /// Delay before resolving to the nested response. + DelayThen(Duration, Box), +} + +async fn resolve( + queue: &Mutex>>, + method: &'static str, +) -> ScrollEngineApiResult { + let mut response = queue + .lock() + .expect("scripted response mutex poisoned") + .pop_front() + .unwrap_or_else(|| panic!("scripted engine client: {method} queue is empty")); + loop { + match response { + ScriptedResponse::Ok(value) => return Ok(value), + ScriptedResponse::TransportFailure => { + return Err(TransportErrorKind::custom(std::io::Error::other( + "scripted transport failure", + ))) + } + ScriptedResponse::DelayThen(delay, inner) => { + tokio::time::sleep(delay).await; + response = *inner; + } + } + } +} + +/// A [`ScrollEngineApi`] implementation backed by per-method FIFO response queues. +#[derive(Debug, Default)] +pub struct ScriptedEngineClient { + new_payload: Mutex>>, + fork_choice_updated: Mutex>>, + get_payload: Mutex>>, + new_payload_calls: AtomicU64, + fork_choice_updated_calls: AtomicU64, + get_payload_calls: AtomicU64, +} + +impl ScriptedEngineClient { + /// Creates an empty scripted client. + pub fn new() -> Self { + Self::default() + } + + /// Queues a `newPayload` response. + pub fn push_new_payload(&self, response: ScriptedResponse) { + self.new_payload.lock().expect("scripted response mutex poisoned").push_back(response); + } + + /// Queues a `forkchoiceUpdated` response. Calls with and without attributes share call order. + pub fn push_fork_choice_updated(&self, response: ScriptedResponse) { + self.fork_choice_updated + .lock() + .expect("scripted response mutex poisoned") + .push_back(response); + } + + /// Queues a `getPayload` response. + pub fn push_get_payload(&self, response: ScriptedResponse) { + self.get_payload.lock().expect("scripted response mutex poisoned").push_back(response); + } + + /// Returns the number of `newPayload` calls. + pub fn new_payload_calls(&self) -> u64 { + self.new_payload_calls.load(Ordering::SeqCst) + } + + /// Returns the number of `forkchoiceUpdated` calls. + pub fn fork_choice_updated_calls(&self) -> u64 { + self.fork_choice_updated_calls.load(Ordering::SeqCst) } - async fn get_payload_bodies_by_range_v1( + /// Returns the number of `getPayload` calls. + pub fn get_payload_calls(&self) -> u64 { + self.get_payload_calls.load(Ordering::SeqCst) + } +} + +#[async_trait::async_trait] +impl ScrollEngineApi for ScriptedEngineClient { + async fn new_payload_v1( &self, - _start: U64, - _count: U64, - ) -> ScrollEngineApiResult { - panic!("PanicEngineClient does not support get_payload_bodies_by_range_v1") + _payload: ExecutionPayloadV1, + ) -> ScrollEngineApiResult { + self.new_payload_calls.fetch_add(1, Ordering::SeqCst); + resolve(&self.new_payload, "new_payload_v1").await } - async fn get_client_version_v1( + async fn fork_choice_updated_v1( &self, - _client_version: ClientVersionV1, - ) -> ScrollEngineApiResult> { - panic!("PanicEngineClient does not support get_client_version_v1") + _fork_choice_state: ForkchoiceState, + _payload_attributes: Option, + ) -> ScrollEngineApiResult { + self.fork_choice_updated_calls.fetch_add(1, Ordering::SeqCst); + resolve(&self.fork_choice_updated, "fork_choice_updated_v1").await } - async fn exchange_capabilities( + async fn get_payload_v1( &self, - _capabilities: Vec, - ) -> ScrollEngineApiResult> { - panic!("PanicEngineClient does not support exchange_capabilities") + _payload_id: PayloadId, + ) -> ScrollEngineApiResult { + self.get_payload_calls.fetch_add(1, Ordering::SeqCst); + resolve(&self.get_payload, "get_payload_v1").await } } diff --git a/crates/l1/Cargo.toml b/crates/l1/Cargo.toml index dd584c1cf..7c85c8a94 100644 --- a/crates/l1/Cargo.toml +++ b/crates/l1/Cargo.toml @@ -15,7 +15,7 @@ alloy-primitives.workspace = true alloy-sol-types.workspace = true # scroll alloy -scroll-alloy-consensus.workspace = true +dogeos-protocol-types.workspace = true # misc arbitrary = { workspace = true, optional = true, features = ["derive"] } @@ -27,7 +27,7 @@ thiserror.workspace = true default = ["std"] std = [ "alloy-primitives/std", - "scroll-alloy-consensus/std", + "dogeos-protocol-types/std", "alloy-sol-types/std", "derive_more/std", "bitvec/std", diff --git a/crates/l1/src/abi/logs.rs b/crates/l1/src/abi/logs.rs index 429442c51..5294e5f50 100644 --- a/crates/l1/src/abi/logs.rs +++ b/crates/l1/src/abi/logs.rs @@ -1,6 +1,6 @@ use alloy_primitives::Log; use alloy_sol_types::{sol, SolEvent}; -use scroll_alloy_consensus::TxL1Message; +use dogeos_protocol_types::TxL1Message; sol! { #[cfg_attr(feature = "test-utils", derive(arbitrary::Arbitrary))] diff --git a/crates/network/Cargo.toml b/crates/network/Cargo.toml index 6971d2797..0baf05901 100644 --- a/crates/network/Cargo.toml +++ b/crates/network/Cargo.toml @@ -22,11 +22,11 @@ reth-storage-api.workspace = true reth-tokio-util.workspace = true # scroll -reth-scroll-chainspec.workspace = true -reth-scroll-node.workspace = true -reth-scroll-primitives.workspace = true +dogeos-chainspec.workspace = true +dogeos-protocol-types.workspace = true +dogeos-reth-primitives.workspace = true rollup-node-primitives.workspace = true -scroll-alloy-hardforks.workspace = true +dogeos-hardforks.workspace = true scroll-wire.workspace = true # misc @@ -45,17 +45,17 @@ serde = [ "reth-network/serde", "reth-network-api/serde", "reth-network-types/serde", - "reth-scroll-primitives/serde", + "dogeos-reth-primitives/serde", "scroll-wire/serde", "reth-primitives-traits/serde", "reth-storage-api/serde", - "scroll-alloy-hardforks/serde", + "dogeos-hardforks/serde", "rollup-node-primitives/serde", + "dogeos-protocol-types/serde", ] test-utils = [ "reth-chainspec/test-utils", "reth-network/test-utils", "reth-network-types/test-utils", "reth-primitives-traits/test-utils", - "reth-scroll-node/test-utils", ] diff --git a/crates/network/src/eth_wire.rs b/crates/network/src/eth_wire.rs new file mode 100644 index 000000000..546b733c2 --- /dev/null +++ b/crates/network/src/eth_wire.rs @@ -0,0 +1,183 @@ +use dogeos_reth_primitives::DogeosBlock; +use reth_eth_wire_types::NewBlock as EthWireNewBlock; +use reth_network::{ + import::{BlockImport, BlockImportEvent, NewBlockEvent}, + message::{NewBlockMessage, PeerMessage}, + NetworkHandle, +}; +use reth_network_api::PeerId; +use std::{ + task::{Context, Poll}, + time::{Duration, Instant}, +}; +use tokio::sync::mpsc::{error::TrySendError, Sender}; +use tracing::{trace, warn}; + +use crate::DogeosNetworkPrimitives; + +/// Capacity of the queue bridging Reth's `eth` block-import callback into the rollup network +/// manager. Bounding the queue prevents a remote peer from buffering unvalidated blocks faster +/// than the serial consumer drains them; announcements beyond the bound are dropped. +pub const ETH_WIRE_BLOCK_CHANNEL_SIZE: usize = 1000; + +/// Minimum interval between warnings about announcements dropped on a full bridge queue. +const DROP_LOG_INTERVAL: Duration = Duration::from_secs(5); + +/// A full block announcement received from the `eth` wire protocol. +#[derive(Debug, Clone)] +pub struct EthWireBlockWithPeer { + /// Peer that announced the block. + pub peer_id: PeerId, + /// Announced block, without the total-difficulty wrapper. + pub block: DogeosBlock, +} + +/// Bridges Reth's block-import callback into the rollup-owned network manager. +#[derive(Debug)] +pub struct EthWireBlockImport { + sender: Sender, + /// Announcements dropped since the last full-queue warning. + dropped_since_log: u64, + /// Time of the last full-queue warning. + last_drop_log: Option, +} + +impl EthWireBlockImport { + /// Creates a new bridge backed by `sender`. + pub const fn new(sender: Sender) -> Self { + Self { sender, dropped_since_log: 0, last_drop_log: None } + } +} + +impl BlockImport> for EthWireBlockImport { + fn on_new_block( + &mut self, + peer_id: PeerId, + incoming_block: NewBlockEvent>, + ) { + if let NewBlockEvent::Block(message) = incoming_block { + // Reserve a slot before cloning: on a full queue the announcement is dropped anyway, + // so this avoids paying for a block clone that would be discarded immediately. + match self.sender.try_reserve() { + Ok(permit) => { + permit + .send(EthWireBlockWithPeer { peer_id, block: message.block.block.clone() }); + } + Err(TrySendError::Full(())) => { + // The serial consumer is behind; drop the announcement instead of buffering + // unboundedly. The block is recovered later through re-announcements or sync. + self.dropped_since_log += 1; + if self.last_drop_log.is_none_or(|last| last.elapsed() >= DROP_LOG_INTERVAL) { + warn!( + target: "scroll::network::eth_wire", + // `dropped` aggregates announcements from every peer since the last + // warning; `latest_peer` is only the most recent sender, not the sole + // source of the drops. + dropped = self.dropped_since_log, + latest_peer = %peer_id, + "eth-wire block queue is full, dropping announcements" + ); + self.dropped_since_log = 0; + self.last_drop_log = Some(Instant::now()); + } + } + Err(TrySendError::Closed(())) => { + trace!( + target: "scroll::network::eth_wire", + %peer_id, + "eth-wire block queue is closed, dropping announcement" + ); + } + } + } + } + + fn poll( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll>> { + Poll::Pending + } +} + +/// Capability required by the rollup network manager to announce a block to one `eth` peer. +pub trait EthWirePeerSender { + /// Sends `block` to `peer_id` without broadcasting it to scroll-wire capable peers. + fn eth_wire_announce_block_to_peer( + &self, + peer_id: PeerId, + block: EthWireNewBlock, + hash: alloy_primitives::B256, + ); +} + +impl EthWirePeerSender for NetworkHandle { + fn eth_wire_announce_block_to_peer( + &self, + peer_id: PeerId, + block: EthWireNewBlock, + hash: alloy_primitives::B256, + ) { + let message = NewBlockMessage { hash, block: std::sync::Arc::new(block) }; + self.send_eth_message(peer_id, PeerMessage::NewBlock(message)); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy_primitives::B256; + use std::sync::Arc; + + fn block_event(number: u64) -> NewBlockEvent> { + let mut new_block = EthWireNewBlock::::default(); + new_block.block.header.number = number; + NewBlockEvent::Block(NewBlockMessage { hash: B256::ZERO, block: Arc::new(new_block) }) + } + + #[tokio::test] + async fn forwards_announcements_with_peer_attribution() { + let (tx, mut rx) = tokio::sync::mpsc::channel(2); + let mut import = EthWireBlockImport::new(tx); + let peer_id = PeerId::repeat_byte(1); + + import.on_new_block(peer_id, block_event(7)); + + let received = rx.recv().await.expect("announcement should be bridged"); + assert_eq!(received.peer_id, peer_id); + assert_eq!(received.block.header.number, 7); + } + + #[tokio::test] + async fn drops_announcements_when_queue_is_full() { + let (tx, mut rx) = tokio::sync::mpsc::channel(1); + let mut import = EthWireBlockImport::new(tx); + let peer_id = PeerId::repeat_byte(2); + + // The first announcement fills the queue; the two overflowing ones must be + // dropped without blocking or panicking. + import.on_new_block(peer_id, block_event(1)); + import.on_new_block(peer_id, block_event(2)); + import.on_new_block(peer_id, block_event(3)); + + let received = rx.recv().await.expect("first announcement should be delivered"); + assert_eq!(received.block.header.number, 1); + assert!(rx.try_recv().is_err(), "overflowing announcements must be dropped"); + + // The first drop is logged immediately and resets the counter; the second drop + // within the log interval is accounted for the next warning. + assert!(import.last_drop_log.is_some()); + assert_eq!(import.dropped_since_log, 1); + } + + #[tokio::test] + async fn ignores_announcements_after_receiver_is_dropped() { + let (tx, rx) = tokio::sync::mpsc::channel(1); + drop(rx); + let mut import = EthWireBlockImport::new(tx); + + // Must not panic when the consumer is gone. + import.on_new_block(PeerId::repeat_byte(3), block_event(1)); + assert_eq!(import.dropped_since_log, 0); + } +} diff --git a/crates/network/src/event.rs b/crates/network/src/event.rs index 52c734896..1bd10a46c 100644 --- a/crates/network/src/event.rs +++ b/crates/network/src/event.rs @@ -1,12 +1,12 @@ use alloy_primitives::Signature; +use dogeos_reth_primitives::DogeosBlock; use reth_network_api::PeerId; -use reth_scroll_primitives::ScrollBlock; /// A new block with the peer id that it was received from. #[derive(Debug, Clone, PartialEq, Eq)] pub struct NewBlockWithPeer { pub peer_id: PeerId, - pub block: ScrollBlock, + pub block: DogeosBlock, pub signature: Signature, } diff --git a/crates/network/src/handle.rs b/crates/network/src/handle.rs index 5fa8cfe94..9d0e05d19 100644 --- a/crates/network/src/handle.rs +++ b/crates/network/src/handle.rs @@ -1,8 +1,8 @@ use super::ScrollNetwork; use crate::ScrollNetworkManagerEvent; use alloy_primitives::Signature; +use dogeos_reth_primitives::DogeosBlock; use reth_network_api::FullNetwork; -use reth_scroll_primitives::ScrollBlock; use reth_tokio_util::EventStream; use std::sync::Arc; use tokio::sync::{mpsc::UnboundedSender, oneshot}; @@ -56,7 +56,7 @@ impl ScrollNetworkHandle { } /// Announces a block to the network. - pub fn announce_block(&self, block: ScrollBlock, signature: Signature) { + pub fn announce_block(&self, block: DogeosBlock, signature: Signature) { self.send_message(NetworkHandleMessage::AnnounceBlock { block, signature }); } @@ -90,7 +90,7 @@ impl ScrollNetworkHandle { #[derive(Debug)] pub enum NetworkHandleMessage { AnnounceBlock { - block: ScrollBlock, + block: DogeosBlock, signature: Signature, }, BlockImportOutcome(super::BlockImportOutcome), diff --git a/crates/network/src/import.rs b/crates/network/src/import.rs index df723eb48..038ed8c95 100644 --- a/crates/network/src/import.rs +++ b/crates/network/src/import.rs @@ -1,7 +1,7 @@ use alloy_primitives::{bytes::Bytes, Address}; +use dogeos_reth_primitives::DogeosBlock; use reth_network_peers::PeerId; use reth_primitives_traits::{crypto::RecoveryError, GotExpected}; -use reth_scroll_primitives::ScrollBlock; use scroll_wire::NewBlock; use thiserror::Error; @@ -29,15 +29,15 @@ impl BlockImportOutcome { /// Creates a new `BlockImportOutcome` instance for a valid block header with the given peer ID /// and new block. - pub fn valid_block(peer: PeerId, block: ScrollBlock, signature: Bytes) -> Self { + pub fn valid_block(peer: PeerId, block: DogeosBlock, signature: Bytes) -> Self { Self { peer, result: Ok(BlockValidation::ValidBlock { new_block: NewBlock { signature, block } }), } } - /// Returns an `Option` depending on the `BlockImportOutcome` result. - pub fn block(&self) -> Option { + /// Returns an `Option` depending on the `BlockImportOutcome` result. + pub fn block(&self) -> Option { match &self.result { Ok(BlockValidation::ValidBlock { new_block }) => Some(new_block.block.clone()), _ => None, diff --git a/crates/network/src/lib.rs b/crates/network/src/lib.rs index 9ece171e9..aa4bb5c81 100644 --- a/crates/network/src/lib.rs +++ b/crates/network/src/lib.rs @@ -1,6 +1,11 @@ mod event; pub use event::{NewBlockWithPeer, ScrollNetworkManagerEvent}; +mod eth_wire; +pub use eth_wire::{ + EthWireBlockImport, EthWireBlockWithPeer, EthWirePeerSender, ETH_WIRE_BLOCK_CHANNEL_SIZE, +}; + mod handle; pub use handle::{NetworkHandleMessage, ScrollNetworkHandle}; @@ -13,11 +18,17 @@ pub use import::{ mod manager; pub use manager::ScrollNetworkManager; +pub use dogeos_chainspec::DOGEOS_MAINNET; pub use reth_network::{EthNetworkPrimitives, NetworkConfigBuilder}; -pub use reth_scroll_chainspec::SCROLL_MAINNET; use reth_tokio_util::EventStream; pub use scroll_wire::ScrollWireConfig; +/// Network primitives shared by the DogeOS Reth 2 node and rollup-owned networking services. +pub type DogeosNetworkPrimitives = reth_network::primitives::BasicNetworkPrimitives< + dogeos_reth_primitives::DogeosPrimitives, + dogeos_protocol_types::ScrollPooledTransaction, +>; + /// The main network struct that encapsulates the network handle and event stream. #[derive(Debug)] pub struct ScrollNetwork { diff --git a/crates/network/src/manager.rs b/crates/network/src/manager.rs index 2ab7e6f1d..ed4010c14 100644 --- a/crates/network/src/manager.rs +++ b/crates/network/src/manager.rs @@ -1,9 +1,10 @@ use crate::{BlockImportError, BlockValidationError}; use super::{ - BlockImportOutcome, BlockValidation, NetworkHandleMessage, NewBlockWithPeer, - ScrollNetworkHandle, ScrollNetworkManagerEvent, + BlockImportOutcome, BlockValidation, EthWireBlockWithPeer, EthWirePeerSender, + NetworkHandleMessage, NewBlockWithPeer, ScrollNetworkHandle, ScrollNetworkManagerEvent, }; +use crate::DogeosNetworkPrimitives; use alloy_primitives::{Address, Signature, B256, U128}; use futures::StreamExt; use reth_chainspec::EthChainSpec; @@ -12,20 +13,17 @@ use reth_network::{ cache::LruCache, NetworkConfig as RethNetworkConfig, NetworkHandle as RethNetworkHandle, NetworkManager as RethNetworkManager, }; -use reth_network_api::{block::NewBlockWithPeer as RethNewBlockWithPeer, FullNetwork, PeerId}; -use reth_scroll_node::ScrollNetworkPrimitives; -use reth_scroll_primitives::ScrollBlock; +use reth_network_api::{FullNetwork, PeerId}; use reth_storage_api::BlockNumReader as BlockNumReaderT; -use reth_tokio_util::{EventSender, EventStream}; +use reth_tokio_util::EventSender; use rollup_node_primitives::{sig_encode_hash, BlockInfo}; -use scroll_alloy_hardforks::ScrollHardforks; use scroll_wire::{ NewBlock, ScrollWireConfig, ScrollWireEvent, ScrollWireManager, ScrollWireProtocolHandler, LRU_CACHE_SIZE, }; use std::{collections::HashMap, sync::Arc}; -use tokio::sync::mpsc::{self, UnboundedReceiver}; -use tokio_stream::wrappers::UnboundedReceiverStream; +use tokio::sync::mpsc::{self, Receiver, UnboundedReceiver}; +use tokio_stream::wrappers::{ReceiverStream, UnboundedReceiverStream}; use tracing::trace; /// The size of the ECDSA signature in bytes. @@ -44,14 +42,14 @@ const EVENT_CHANNEL_SIZE: usize = 5000; #[derive(Debug)] pub struct ScrollNetworkManager { /// The chain spec used by the rollup node. - chain_spec: Arc, + _chain_spec: Arc, /// The inner network handle which is used to communicate with the inner network. inner_network_handle: N, /// Receiver half of the channel set up between this type and the [`FullNetwork`], receives /// [`NetworkHandleMessage`]s. from_handle_rx: UnboundedReceiverStream, /// The receiver for new blocks received from the network (used to bridge from eth-wire). - eth_wire_listener: Option>>, + eth_wire_listener: Option>, /// The scroll wire protocol manager. pub scroll_wire: ScrollWireManager, /// The LRU cache used to track already seen (block,signature) pair. @@ -69,19 +67,19 @@ pub struct ScrollNetworkManager { event_sender: EventSender, } -impl - ScrollNetworkManager, CS> +impl + ScrollNetworkManager, CS> { /// Creates a new [`ScrollNetworkManager`] instance from the provided configuration and block /// import. pub async fn new( chain_spec: Arc, - mut network_config: RethNetworkConfig, + mut network_config: RethNetworkConfig, scroll_wire_config: ScrollWireConfig, - eth_wire_listener: Option>>, + eth_wire_listener: Option>, td_constant: U128, authorized_signer: Option

, - ) -> (Self, ScrollNetworkHandle>) { + ) -> (Self, ScrollNetworkHandle>) { // Create the scroll-wire protocol handler. let (scroll_wire_handler, events) = ScrollWireProtocolHandler::new(scroll_wire_config); @@ -90,7 +88,7 @@ impl // Create the inner network manager. let inner_network_manager = - RethNetworkManager::::new(network_config).await.unwrap(); + RethNetworkManager::::new(network_config).await.unwrap(); let inner_network_handle = inner_network_manager.handle().clone(); // Create the channel for sending messages to the network manager. @@ -110,13 +108,13 @@ impl ( Self { - chain_spec, + _chain_spec: chain_spec, inner_network_handle, from_handle_rx: from_handle_rx.into(), scroll_wire, blocks_seen, peer_state, - eth_wire_listener, + eth_wire_listener: eth_wire_listener.map(Into::into), td_constant, authorized_signer, event_sender, @@ -129,8 +127,8 @@ impl } impl< - N: FullNetwork, - CS: ScrollHardforks + EthChainSpec + Send + Sync + 'static, + N: FullNetwork + EthWirePeerSender, + CS: EthChainSpec + Send + Sync + 'static, > ScrollNetworkManager { /// Creates a new [`ScrollNetworkManager`] instance from the provided parts. @@ -141,7 +139,7 @@ impl< chain_spec: Arc, inner_network_handle: N, events: UnboundedReceiver, - eth_wire_listener: Option>>, + eth_wire_listener: Option>, td_constant: U128, authorized_signer: Option
, ) -> (Self, ScrollNetworkHandle) { @@ -159,13 +157,13 @@ impl< ( Self { - chain_spec, + _chain_spec: chain_spec, inner_network_handle, from_handle_rx: from_handle_rx.into(), scroll_wire, blocks_seen, peer_state, - eth_wire_listener, + eth_wire_listener: eth_wire_listener.map(Into::into), td_constant, authorized_signer, event_sender, @@ -229,10 +227,8 @@ impl< } async fn next_eth_wire_block( - eth_wire_listener: &mut Option< - EventStream>, - >, - ) -> Option> { + eth_wire_listener: &mut Option>, + ) -> Option { match eth_wire_listener.as_mut() { Some(listener) => listener.next().await, None => std::future::pending().await, @@ -410,18 +406,14 @@ impl< /// Handles a new block received from the eth-wire protocol. fn handle_eth_wire_block( &mut self, - block: reth_network_api::block::NewBlockWithPeer, + block: EthWireBlockWithPeer, ) -> Option { - let reth_network_api::block::NewBlockWithPeer { peer_id, mut block } = block; + let EthWireBlockWithPeer { peer_id, mut block } = block; - // We purge the extra data field post euclid v2 to align with protocol specification. - let extra_data = if self.chain_spec.is_euclid_v2_active_at_timestamp(block.timestamp) { - let extra_data = block.extra_data.clone(); - block.header.extra_data = Default::default(); - extra_data - } else { - block.extra_data.clone() - }; + // DogeOS history begins at Feynman, so signed-header handling is always active: retain the + // signature bytes separately and hash/import the cleared header. + let extra_data = block.extra_data.clone(); + block.header.extra_data = Default::default(); // If we can extract a signature from the extra data we validate consensus and then attempt // import via the EngineAPI in the `handle_new_block` method. The signature is extracted diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 221aab7d4..8d8f21ef5 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -22,6 +22,18 @@ workspace = true # async trait support async-trait.workspace = true +# DogeOS Reth 2 execution component family +dogeos-chainspec = { workspace = true, features = ["std"] } +dogeos-hardforks = { workspace = true, features = ["std"] } +dogeos-protocol-types = { workspace = true, features = ["std"] } +dogeos-reth-engine = { workspace = true, features = ["std"] } +dogeos-reth-evm = { workspace = true, features = ["std"] } +dogeos-reth-consensus.workspace = true +dogeos-reth-node.workspace = true +dogeos-reth-primitives = { workspace = true, features = ["std", "serde", "reth-codec"] } +dogeos-reth-rpc = { workspace = true, features = ["std"] } +dogeos-rpc-types = { workspace = true, features = ["std", "reth"] } + # alloy alloy-chains.workspace = true alloy-consensus.workspace = true @@ -37,25 +49,12 @@ alloy-signer-aws = "1.0.30" alloy-signer = "1.0.30" alloy-transport.workspace = true -scroll-alloy-consensus.workspace = true -scroll-alloy-evm.workspace = true -scroll-alloy-hardforks.workspace = true -scroll-alloy-network.workspace = true -scroll-alloy-provider.workspace = true - reth-primitives-traits.workspace = true -reth-scroll-engine-primitives.workspace = true -reth-scroll-evm.workspace = true -reth-scroll-cli.workspace = true -reth-scroll-consensus.workspace = true -reth-scroll-primitives.workspace = true -reth-scroll-chainspec.workspace = true -reth-scroll-node.workspace = true -reth-scroll-rpc.workspace = true reth-chainspec.workspace = true reth-cli.workspace = true reth-cli-util.workspace = true +reth-ethereum-cli.workspace = true reth-eth-wire-types.workspace = true reth-evm.workspace = true reth-node-builder.workspace = true @@ -69,6 +68,7 @@ reth-network-peers.workspace = true reth-provider.workspace = true reth-revm.workspace = true reth-rpc-api.workspace = true +reth-rpc-builder.workspace = true reth-rpc-eth-api.workspace = true reth-rpc-eth-types.workspace = true reth-tasks.workspace = true @@ -90,7 +90,7 @@ aws-config = "1.8.0" aws-sdk-kms = "1.76.0" # test-utils -anvil = { git = "https://github.com/foundry-rs/foundry.git", rev = "2c84e1c970d11ef5023a77d8002a1cb70b143888", default-features = false, optional = true } +alloy-node-bindings = { workspace = true, optional = true } alloy-rpc-types-eth = { workspace = true, optional = true } alloy-rpc-types-anvil = { workspace = true, optional = true } reth-db = { workspace = true, optional = true, features = ["test-utils"] } @@ -100,8 +100,6 @@ reth-fs-util = { workspace = true, optional = true } reth-rpc-layer = { workspace = true, optional = true } reth-rpc-server-types = { workspace = true, optional = true } reth-storage-api = { workspace = true, optional = true } -scroll-alloy-rpc-types-engine = { workspace = true, optional = true } -scroll-alloy-rpc-types.workspace = true # debug-toolkit dependencies alloy-sol-types = { workspace = true, optional = true } @@ -126,9 +124,9 @@ serde_json.workspace = true jsonrpsee = { version = "0.26.0", features = ["server", "client", "macros"] } rayon.workspace = true reqwest.workspace = true +reqwest-13 = { package = "reqwest", version = "0.13", default-features = false, features = ["rustls"] } tokio.workspace = true tracing.workspace = true -console-subscriber = "0.5.0" # pprof dependencies pprof = { version = "0.15.0", features = ["flamegraph", "prost-codec"] } @@ -141,6 +139,7 @@ alloy-chains.workspace = true alloy-consensus.workspace = true alloy-genesis.workspace = true alloy-eips.workspace = true +alloy-sol-types.workspace = true futures.workspace = true reth-db = { workspace = true, features = ["test-utils"] } reth-e2e-test-utils.workspace = true @@ -149,19 +148,18 @@ reth-provider.workspace = true reth-primitives-traits.workspace = true reth-rpc-layer.workspace = true reth-rpc-server-types.workspace = true -reth-scroll-node = { workspace = true, features = ["test-utils"] } reth-storage-api.workspace = true reth-tasks.workspace = true reth-tokio-util.workspace = true reth-tracing.workspace = true rollup-node = { workspace = true, features = ["test-utils"] } -scroll-alloy-rpc-types-engine.workspace = true +scroll-l1.workspace = true serde_json = { workspace = true, features = ["alloc"] } color-eyre = "0.6" alloy-rpc-types-eth = { workspace = true } [features] -js-tracer = ["reth-scroll-node/js-tracer", "reth-scroll-rpc/js-tracer"] +js-tracer = [] debug-toolkit = [ "test-utils", "dep:alloy-sol-types", @@ -183,26 +181,26 @@ test-utils = [ "reth-node-builder/test-utils", "reth-provider/test-utils", "reth-revm/test-utils", - "reth-scroll-node/test-utils", "reth-transaction-pool/test-utils", "rollup-node-providers/test-utils", "rollup-node-watcher/test-utils", "scroll-db/test-utils", "scroll-engine/test-utils", + "scroll-l1/test-utils", "rollup-node/test-utils", "reth-e2e-test-utils", "reth-rpc-server-types", "reth-rpc-layer", - "scroll-alloy-rpc-types-engine", "reth-primitives-traits/test-utils", "reth-network-p2p/test-utils", "rollup-node-chain-orchestrator/test-utils", "scroll-network/test-utils", - "anvil", + "alloy-node-bindings", "reth-storage-api", "alloy-rpc-types-eth", "alloy-rpc-types-anvil", "alloy-provider/anvil-api", - "alloy-provider/anvil-node", + "alloy-provider/reqwest", "reth-db?/test-utils", + "reth-tasks/test-utils", ] diff --git a/crates/node/src/add_ons/handle.rs b/crates/node/src/add_ons/handle.rs deleted file mode 100644 index a762df35e..000000000 --- a/crates/node/src/add_ons/handle.rs +++ /dev/null @@ -1,28 +0,0 @@ -use reth_network_api::FullNetwork; -use reth_node_api::FullNodeComponents; -use reth_node_builder::rpc::{RpcHandle, RpcHandleProvider}; -use reth_rpc_eth_api::EthApiTypes; -use reth_scroll_node::ScrollNetworkPrimitives; -use rollup_node_chain_orchestrator::ChainOrchestratorHandle; - -/// A handle for scroll addons, which includes handles for the rollup manager and RPC server. -#[derive(Debug, Clone)] -pub struct ScrollAddOnsHandle< - Node: FullNodeComponents>, - EthApi: EthApiTypes, -> { - /// The handle used to send commands to the rollup manager. - pub rollup_manager_handle: ChainOrchestratorHandle, - /// The handle used to send commands to the RPC server. - pub rpc_handle: RpcHandle, -} - -impl< - Node: FullNodeComponents>, - EthApi: EthApiTypes, - > RpcHandleProvider for ScrollAddOnsHandle -{ - fn rpc_handle(&self) -> &RpcHandle { - &self.rpc_handle - } -} diff --git a/crates/node/src/add_ons/mod.rs b/crates/node/src/add_ons/mod.rs index 50b9410d5..f004df5f7 100644 --- a/crates/node/src/add_ons/mod.rs +++ b/crates/node/src/add_ons/mod.rs @@ -2,35 +2,27 @@ use super::args::ScrollRollupNodeConfig; use crate::constants; - -use reth_evm::{ConfigureEngineEvm, EvmFactory, EvmFactoryFor}; -use reth_network::NetworkProtocols; -use reth_network_api::FullNetwork; -use reth_node_api::{AddOnsContext, NodeAddOns, PayloadTypes}; +use dogeos_chainspec::DogeosChainSpec; +use dogeos_reth_engine::DogeosEngineTypes; +use dogeos_reth_evm::{ScrollEvmConfig, ScrollTransactionIntoTxEnv}; +use dogeos_reth_node::{DogeosEngineValidatorBuilder, DogeosEthApiBuilder, DogeosStorage}; +use dogeos_reth_primitives::DogeosPrimitives; +use reth_evm::{EvmFactory, EvmFactoryFor}; +use reth_network::NetworkHandle; +use reth_node_api::{AddOnsContext, NodeAddOns}; use reth_node_builder::{ rpc::{ BasicEngineApiBuilder, BasicEngineValidatorBuilder, EngineValidatorAddOn, EthApiBuilder, - Identity, RethRpcAddOns, RethRpcMiddleware, RpcAddOns, + Identity, RethRpcAddOns, RethRpcMiddleware, RpcAddOns, RpcHandle, }, FullNodeComponents, }; use reth_node_types::NodeTypes; use reth_revm::context::{BlockEnv, TxEnv}; -use reth_rpc_eth_types::error::FromEvmError; -use reth_scroll_chainspec::ScrollChainSpec; -use reth_scroll_engine_primitives::ScrollEngineTypes; -use reth_scroll_evm::ScrollNextBlockEnvAttributes; -use reth_scroll_node::{ - ScrollEngineValidatorBuilder, ScrollNetworkPrimitives, ScrollNodeTypes, ScrollStorage, -}; -use reth_scroll_primitives::ScrollPrimitives; -use reth_scroll_rpc::{eth::ScrollEthApiBuilder, ScrollEthApiError}; -use scroll_alloy_evm::ScrollTransactionIntoTxEnv; +use reth_rpc_builder::RethRpcModule; +use reth_rpc_eth_types::{error::FromEvmError, EthApiError}; use scroll_wire::ScrollWireEvent; -use std::sync::Arc; - -mod handle; -pub use handle::ScrollAddOnsHandle; +use std::sync::{Arc, OnceLock}; mod remote_block_source; pub use remote_block_source::RemoteBlockSourceAddOn; @@ -44,66 +36,76 @@ pub use rpc::{ mod rollup; pub use rollup::IsDevChain; use rollup::RollupManagerAddOn; -use tokio::sync::mpsc::UnboundedReceiver; +use scroll_network::{DogeosNetworkPrimitives, EthWireBlockWithPeer}; +use tokio::sync::mpsc::{Receiver, UnboundedReceiver}; + +pub(crate) type RollupManagerHandle = rollup_node_chain_orchestrator::ChainOrchestratorHandle< + reth_network::NetworkHandle, +>; /// Add-ons for the Scroll follower node. #[derive(Debug)] pub struct ScrollRollupNodeAddOns where - N: FullNodeComponents, - ScrollEthApiBuilder: EthApiBuilder, + N: FullNodeComponents>, + DogeosEthApiBuilder: EthApiBuilder, { /// Rpc add-ons responsible for launching the RPC servers and instantiating the RPC handlers /// and eth-api. pub rpc_add_ons: RpcAddOns< N, - ScrollEthApiBuilder, - ScrollEngineValidatorBuilder, - BasicEngineApiBuilder, - BasicEngineValidatorBuilder, + DogeosEthApiBuilder, + DogeosEngineValidatorBuilder, + BasicEngineApiBuilder, + BasicEngineValidatorBuilder, RpcMiddleware, >, /// Rollup manager addon responsible for managing the components of the rollup node. pub rollup_manager_addon: RollupManagerAddOn, + + /// Shared handle populated after the rollup manager launches. + rollup_manager_handle: Arc>, } impl ScrollRollupNodeAddOns where - N: FullNodeComponents, - ScrollEthApiBuilder: EthApiBuilder, + N: FullNodeComponents>, + DogeosEthApiBuilder: EthApiBuilder, { /// Create a new instance of [`ScrollRollupNodeAddOns`]. pub fn new( config: ScrollRollupNodeConfig, scroll_wire_event: UnboundedReceiver, + eth_wire_event: Receiver, + rollup_manager_handle: Arc>, ) -> Self { let rpc_add_ons = RpcAddOns::new( - ScrollEthApiBuilder::default() - .with_min_suggested_priority_fee( - config.gas_price_oracle_args.default_suggested_priority_fee, - ) - .with_payload_size_limit(constants::DEFAULT_PAYLOAD_SIZE_LIMIT) - .with_sequencer(config.network_args.sequencer_url.clone()), - ScrollEngineValidatorBuilder::default(), + DogeosEthApiBuilder::without_scroll_wire(), + DogeosEngineValidatorBuilder::default(), BasicEngineApiBuilder::default(), BasicEngineValidatorBuilder::default(), Identity::new(), ); - let rollup_manager_addon = RollupManagerAddOn::new(config, scroll_wire_event); - Self { rpc_add_ons, rollup_manager_addon } + let rollup_manager_addon = + RollupManagerAddOn::new(config, scroll_wire_event, eth_wire_event); + Self { rpc_add_ons, rollup_manager_addon, rollup_manager_handle } } } impl ScrollRollupNodeAddOns where - N: FullNodeComponents, - ScrollEthApiBuilder: EthApiBuilder, + N: FullNodeComponents>, + DogeosEthApiBuilder: EthApiBuilder, { /// Sets the provided middleware for the rollup node addons. pub fn with_middleware(self, middleware: T) -> ScrollRollupNodeAddOns { let rpc_add_ons = self.rpc_add_ons.with_rpc_middleware(middleware); - ScrollRollupNodeAddOns { rpc_add_ons, rollup_manager_addon: self.rollup_manager_addon } + ScrollRollupNodeAddOns { + rpc_add_ons, + rollup_manager_addon: self.rollup_manager_addon, + rollup_manager_handle: self.rollup_manager_handle, + } } } @@ -111,31 +113,31 @@ impl NodeAddOns for ScrollRollupNodeAddOns, - Evm: ConfigureEngineEvm< - <::Payload as PayloadTypes>::ExecutionData, - NextBlockEnvCtx = ScrollNextBlockEnvAttributes, - >, - Network: FullNetwork + NetworkProtocols, + Evm = ScrollEvmConfig, + Network = NetworkHandle, >, - ScrollEthApiError: FromEvmError, + EthApiError: FromEvmError, EvmFactoryFor: EvmFactory, BlockEnv = BlockEnv>, RpcMiddleware: RethRpcMiddleware, { - type Handle = ScrollAddOnsHandle>::EthApi>; + type Handle = RpcHandle>::EthApi>; async fn launch_add_ons(self, ctx: AddOnsContext<'_, N>) -> eyre::Result { - let Self { mut rpc_add_ons, rollup_manager_addon: rollup_node_manager_addon } = self; - rpc_add_ons.eth_api_builder.with_propagate_local_transactions( - !ctx.config.txpool.no_local_transactions_propagation, - ); - + let Self { + mut rpc_add_ons, + rollup_manager_addon: rollup_node_manager_addon, + rollup_manager_handle: shared_rollup_manager_handle, + } = self; let (tx, rx) = tokio::sync::oneshot::channel(); let rpc_config = rollup_node_manager_addon.config().rpc_args.clone(); + let min_suggested_priority_fee = + rollup_node_manager_addon.config().gas_price_oracle_args.default_suggested_priority_fee; + let sequencer_url = rollup_node_manager_addon.config().network_args.sequencer_url.clone(); let remote_block_source_config = rollup_node_manager_addon.config().remote_block_source_args.clone(); @@ -143,6 +145,45 @@ where let rollup_node_rpc_ext = Arc::new(RollupNodeRpcExt::::new(rx)); rpc_add_ons = rpc_add_ons.extend_rpc_modules(move |ctx| { + let priority_fee_api = dogeos_reth_rpc::DogeosPriorityFeeApi::new( + ctx.registry.eth_api().clone(), + ctx.registry.eth_api().gas_oracle().config().max_price, + min_suggested_priority_fee, + constants::DEFAULT_PAYLOAD_SIZE_LIMIT, + ); + ctx.modules.add_or_replace_if_module_configured( + RethRpcModule::Eth, + priority_fee_api.into_rpc()?, + )?; + + let forwarder_url = sequencer_url + .as_deref() + .map(reqwest::Url::parse) + .transpose()? + .or_else(|| ctx.config().rpc.rpc_forwarder.clone()); + if let Some(url) = forwarder_url { + let sequencer = dogeos_reth_rpc::SequencerClient::with_http_client( + url.as_str(), + reqwest_13::Client::new(), + )?; + let forwarder = dogeos_reth_rpc::DogeosRawTransactionForwarder::new( + ctx.registry.eth_api().clone(), + sequencer, + ctx.registry.tasks().clone(), + !ctx.config().txpool.no_local_transactions_propagation, + ); + ctx.modules.add_or_replace_if_module_configured( + RethRpcModule::Eth, + forwarder.into_rpc()?, + )?; + } + + let witness_api = dogeos_reth_rpc::DogeosDebugWitnessApi::new(ctx.registry.debug_api()); + ctx.modules.add_or_replace_if_module_configured( + RethRpcModule::Debug, + witness_api.into_rpc()?, + )?; + // Always register rollupNode API (read-only operations) if rpc_config.basic_enabled { ctx.modules @@ -159,6 +200,9 @@ where let rpc_handle = rpc_add_ons.launch_add_ons_with(ctx.clone(), |_| Ok(())).await?; let rollup_manager_handle = rollup_node_manager_addon.launch(ctx.clone(), rpc_handle.clone()).await?; + shared_rollup_manager_handle + .set(rollup_manager_handle.clone()) + .map_err(|_| eyre::eyre!("rollup manager handle was already initialized"))?; // Only send handle if RPC is enabled if rpc_config.basic_enabled || rpc_config.admin_enabled { @@ -176,14 +220,14 @@ where .await?; ctx.node .task_executor() - .spawn_critical_with_shutdown_signal("remote_block_source", |shutdown| async move { - if let Err(e) = remote_source.run_until_shutdown(shutdown).await { + .spawn_critical_with_graceful_shutdown_signal("remote_block_source", |shutdown| async move { + if let Err(e) = remote_source.run_until_shutdown(shutdown.ignore_guard()).await { tracing::error!(target: "scroll::remote_source", ?e, "Remote block source failed"); } }); } - Ok(ScrollAddOnsHandle { rollup_manager_handle, rpc_handle }) + Ok(rpc_handle) } } @@ -191,22 +235,19 @@ impl RethRpcAddOns for ScrollRollupNodeAddOns, - Evm: ConfigureEngineEvm< - <::Payload as PayloadTypes>::ExecutionData, - NextBlockEnvCtx = ScrollNextBlockEnvAttributes, + ChainSpec = DogeosChainSpec, + Primitives = DogeosPrimitives, + Storage = DogeosStorage, + Payload = DogeosEngineTypes, >, - Network: FullNetwork + NetworkProtocols, + Evm = ScrollEvmConfig, + Network = NetworkHandle, >, - ScrollEthApiError: FromEvmError, + EthApiError: FromEvmError, EvmFactoryFor: EvmFactory, BlockEnv = BlockEnv>, RpcMiddleware: RethRpcMiddleware, { - type EthApi = >::EthApi; + type EthApi = >::EthApi; fn hooks_mut(&mut self) -> &mut reth_node_builder::rpc::RpcHooks { self.rpc_add_ons.hooks_mut() @@ -217,19 +258,16 @@ impl EngineValidatorAddOn for ScrollRollupNodeAddOns where N: FullNodeComponents< Types: NodeTypes< - ChainSpec = ScrollChainSpec, - Primitives = ScrollPrimitives, - Payload = ScrollEngineTypes, - >, - Evm: ConfigureEngineEvm< - <::Payload as PayloadTypes>::ExecutionData, - NextBlockEnvCtx = ScrollNextBlockEnvAttributes, + ChainSpec = DogeosChainSpec, + Primitives = DogeosPrimitives, + Payload = DogeosEngineTypes, >, - Network: FullNetwork + NetworkProtocols, + Evm = ScrollEvmConfig, + Network = NetworkHandle, >, - ScrollEthApiBuilder: EthApiBuilder, + DogeosEthApiBuilder: EthApiBuilder, { - type ValidatorBuilder = BasicEngineValidatorBuilder; + type ValidatorBuilder = BasicEngineValidatorBuilder; fn engine_validator_builder(&self) -> Self::ValidatorBuilder { EngineValidatorAddOn::engine_validator_builder(&self.rpc_add_ons) diff --git a/crates/node/src/add_ons/remote_block_source.rs b/crates/node/src/add_ons/remote_block_source.rs index e39063703..81a908757 100644 --- a/crates/node/src/add_ons/remote_block_source.rs +++ b/crates/node/src/add_ons/remote_block_source.rs @@ -6,15 +6,13 @@ use alloy_primitives::Signature; use alloy_provider::{Provider, ProviderBuilder, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_transport::layers::RetryBackoffLayer; +use dogeos_rpc_types::Scroll; use futures::StreamExt; use reth_network_api::{FullNetwork, PeerId}; use reth_provider::BlockReader; -use reth_scroll_node::ScrollNetworkPrimitives; -use reth_tasks::shutdown::Shutdown; use reth_tokio_util::EventStream; use rollup_node_chain_orchestrator::{ChainOrchestratorEvent, ChainOrchestratorHandle}; -use scroll_alloy_network::Scroll; -use scroll_network::NewBlockWithPeer; +use scroll_network::{DogeosNetworkPrimitives, NewBlockWithPeer}; use tokio::time::{interval, Duration}; /// Remote block source add-on that imports blocks from a trusted remote L2 node @@ -22,7 +20,7 @@ use tokio::time::{interval, Duration}; #[derive(Debug)] pub struct RemoteBlockSourceAddOn where - N: FullNetwork, + N: FullNetwork, { /// Configuration for the remote block source. config: RemoteBlockSourceArgs, @@ -40,7 +38,7 @@ where impl RemoteBlockSourceAddOn where - N: FullNetwork + Send + Sync + 'static, + N: FullNetwork + Send + Sync + 'static, { /// Creates a new remote block source add-on. pub async fn new( @@ -103,7 +101,10 @@ where } /// Runs the remote block source until shutdown. - pub async fn run_until_shutdown(mut self, mut shutdown: Shutdown) -> eyre::Result<()> { + pub async fn run_until_shutdown( + mut self, + mut shutdown: impl std::future::Future + Unpin, + ) -> eyre::Result<()> { let mut poll_interval = interval(Duration::from_millis(self.config.poll_interval_ms)); loop { diff --git a/crates/node/src/add_ons/rollup.rs b/crates/node/src/add_ons/rollup.rs index 5c76d6ff2..e9c624f43 100644 --- a/crates/node/src/add_ons/rollup.rs +++ b/crates/node/src/add_ons/rollup.rs @@ -1,17 +1,17 @@ use crate::args::ScrollRollupNodeConfig; +use dogeos_chainspec::{ChainConfig, DogeosChainSpec, ScrollChainConfig}; +use dogeos_hardforks::DogeosHardforks; use reth_chainspec::NamedChain; use reth_network::NetworkProtocols; use reth_network_api::FullNetwork; use reth_node_api::{FullNodeTypes, NodeTypes}; use reth_node_builder::{rpc::RpcHandle, AddOnsContext, FullNodeComponents}; use reth_rpc_eth_api::EthApiTypes; -use reth_scroll_chainspec::{ChainConfig, ScrollChainConfig, ScrollChainSpec}; -use reth_scroll_node::ScrollNetworkPrimitives; use rollup_node_chain_orchestrator::ChainOrchestratorHandle; -use scroll_alloy_hardforks::ScrollHardforks; +use scroll_network::{DogeosNetworkPrimitives, EthWireBlockWithPeer}; use scroll_wire::ScrollWireEvent; -use tokio::sync::mpsc::UnboundedReceiver; +use tokio::sync::mpsc::{Receiver, UnboundedReceiver}; /// Implementing the trait allows the type to return whether it is configured for dev chain. #[auto_impl::auto_impl(Arc)] @@ -20,7 +20,7 @@ pub trait IsDevChain { fn is_dev_chain(&self) -> bool; } -impl IsDevChain for ScrollChainSpec { +impl IsDevChain for DogeosChainSpec { fn is_dev_chain(&self) -> bool { let named: Result = self.chain.try_into(); named.is_ok_and(|n| matches!(n, NamedChain::Dev)) @@ -32,6 +32,7 @@ impl IsDevChain for ScrollChainSpec { pub struct RollupManagerAddOn { config: ScrollRollupNodeConfig, scroll_wire_event: UnboundedReceiver, + eth_wire_event: Receiver, } impl RollupManagerAddOn { @@ -39,8 +40,9 @@ impl RollupManagerAddOn { pub const fn new( config: ScrollRollupNodeConfig, scroll_wire_event: UnboundedReceiver, + eth_wire_event: Receiver, ) -> Self { - Self { config, scroll_wire_event } + Self { config, scroll_wire_event, eth_wire_event } } /// Returns a reference to the scroll rollup node config. @@ -56,18 +58,30 @@ impl RollupManagerAddOn { ) -> eyre::Result> where <::Types as NodeTypes>::ChainSpec: - ChainConfig + ScrollHardforks + IsDevChain, - N::Network: NetworkProtocols + FullNetwork, + ChainConfig + DogeosHardforks + IsDevChain, + N::Network: NetworkProtocols + + FullNetwork + + scroll_network::EthWirePeerSender, { let (chain_orchestrator, handle) = self .config - .build((&ctx).into(), self.scroll_wire_event, rpc.rpc_server_handles) + .build( + (&ctx).into(), + self.scroll_wire_event, + self.eth_wire_event, + rpc.rpc_server_handles, + ) .await?; - ctx.node - .task_executor() - .spawn_critical_with_shutdown_signal("rollup_node_manager", |shutdown| { - chain_orchestrator.run_until_shutdown(shutdown) - }); + ctx.node.task_executor().spawn_critical_with_graceful_shutdown_signal( + "rollup_node_manager", + |shutdown| async move { + if let Err(error) = + chain_orchestrator.run_until_shutdown(shutdown.ignore_guard()).await + { + panic!("fatal chain orchestrator error: {error}"); + } + }, + ); Ok(handle) } } diff --git a/crates/node/src/add_ons/rpc.rs b/crates/node/src/add_ons/rpc.rs index 1340ba896..70953014d 100644 --- a/crates/node/src/add_ons/rpc.rs +++ b/crates/node/src/add_ons/rpc.rs @@ -5,10 +5,10 @@ use jsonrpsee::{ types::{error, ErrorObjectOwned}, }; use reth_network_api::FullNetwork; -use reth_scroll_node::ScrollNetworkPrimitives; use rollup_node_chain_orchestrator::{ChainOrchestratorHandle, ChainOrchestratorStatus}; use rollup_node_primitives::L1MessageEnvelope; use scroll_db::L1MessageKey; +use scroll_network::DogeosNetworkPrimitives; use tokio::sync::{oneshot, Mutex, OnceCell}; /// RPC extension for rollup node management operations. @@ -22,7 +22,7 @@ use tokio::sync::{oneshot, Mutex, OnceCell}; #[derive(Debug)] pub struct RollupNodeRpcExt where - N: FullNetwork, + N: FullNetwork, { /// Cached rollup manager handle, initialized lazily via `OnceCell` handle: tokio::sync::OnceCell>, @@ -32,7 +32,7 @@ where impl RollupNodeRpcExt where - N: FullNetwork, + N: FullNetwork, { /// Creates a new RPC extension with a receiver for the rollup manager handle. /// @@ -124,7 +124,7 @@ pub trait RollupNodeAdminApi { #[async_trait] impl RollupNodeApiServer for RollupNodeRpcExt where - N: FullNetwork, + N: FullNetwork, { async fn status(&self) -> RpcResult { let handle = self.rollup_manager_handle().await.map_err(|e| { @@ -187,7 +187,7 @@ where #[async_trait] impl RollupNodeAdminApiServer for RollupNodeRpcExt where - N: FullNetwork, + N: FullNetwork, { async fn enable_automatic_sequencing(&self) -> RpcResult { let handle = self.rollup_manager_handle().await.map_err(|e| { @@ -248,7 +248,7 @@ where #[async_trait] impl RollupNodeApiServer for std::sync::Arc> where - N: FullNetwork, + N: FullNetwork, { async fn status(&self) -> RpcResult { (**self).status().await @@ -270,7 +270,7 @@ where #[async_trait] impl RollupNodeAdminApiServer for std::sync::Arc> where - N: FullNetwork, + N: FullNetwork, { async fn enable_automatic_sequencing(&self) -> RpcResult { (**self).enable_automatic_sequencing().await diff --git a/crates/node/src/args.rs b/crates/node/src/args.rs index 7afc0bb52..c0018657c 100644 --- a/crates/node/src/args.rs +++ b/crates/node/src/args.rs @@ -3,6 +3,7 @@ use crate::{ constants::{self}, context::RollupNodeContext, pprof::PprofConfig, + signer_rotation::SignerRotationWatchdog, }; use alloy_chains::NamedChain; use alloy_consensus::BlockHeader; @@ -15,16 +16,15 @@ use alloy_signer_local::PrivateKeySigner; use alloy_transport::layers::RetryBackoffLayer; use aws_sdk_kms::config::BehaviorVersion; use clap::ArgAction; +use dogeos_chainspec::{ChainConfig, DogeosChainSpec, ScrollChainConfig, SCROLL_FEE_VAULT_ADDRESS}; +use dogeos_hardforks::DogeosHardforks; +use dogeos_reth_consensus::DogeosConsensus; +use dogeos_rpc_types::Scroll; use reth_chainspec::EthChainSpec; use reth_network::NetworkProtocols; use reth_network_api::FullNetwork; use reth_network_p2p::FullBlockClient; use reth_node_builder::{rpc::RethRpcServerHandles, NodeConfig as RethNodeConfig}; -use reth_scroll_chainspec::{ - ChainConfig, ScrollChainConfig, ScrollChainSpec, SCROLL_FEE_VAULT_ADDRESS, -}; -use reth_scroll_consensus::ScrollBeaconConsensus; -use reth_scroll_node::ScrollNetworkPrimitives; use rollup_node_chain_orchestrator::{ ChainOrchestrator, ChainOrchestratorConfig, ChainOrchestratorHandle, Consensus, NoopConsensus, SystemContractConsensus, @@ -37,20 +37,17 @@ use rollup_node_sequencer::{ L1MessageInclusionMode, PayloadBuildingConfig, Sequencer, SequencerConfig, }; use rollup_node_watcher::{L1Watcher, L1WatcherCommand}; -use scroll_alloy_hardforks::ScrollHardforks; -use scroll_alloy_network::Scroll; -use scroll_alloy_provider::{ScrollAuthApiEngineClient, ScrollEngineApi}; use scroll_db::{ Database, DatabaseConnectionProvider, DatabaseError, DatabaseMaintenance, DatabaseReadOperations, DatabaseWriteOperations, }; use scroll_derivation_pipeline::DerivationPipeline; -use scroll_engine::{Engine, ForkchoiceState}; +use scroll_engine::{Engine, ForkchoiceState, ScrollAuthApiEngineClient, ScrollEngineApi}; use scroll_migration::{traits::ScrollMigrator, MigratorTrait}; -use scroll_network::ScrollNetworkManager; +use scroll_network::{DogeosNetworkPrimitives, EthWireBlockWithPeer, ScrollNetworkManager}; use scroll_wire::ScrollWireEvent; -use std::{fs, path::PathBuf, sync::Arc}; -use tokio::sync::mpsc::UnboundedReceiver; +use std::{fmt, fs, path::PathBuf, sync::Arc}; +use tokio::sync::mpsc::{Receiver, UnboundedReceiver}; /// Test-related configuration arguments. #[derive(Debug, Clone, Default, clap::Args)] @@ -123,6 +120,12 @@ pub struct ScrollRollupNodeConfig { impl ScrollRollupNodeConfig { /// Validate that either signer key file or AWS KMS key ID is provided when sequencer is enabled pub fn validate(&self) -> Result<(), String> { + if self.consensus_args.exit_on_signer_rotation && self.sequencer_args.sequencer_enabled { + return Err( + "--consensus.exit-on-signer-rotation must not be used on a sequencer".to_string() + ); + } + if self.sequencer_args.sequencer_enabled & !matches!(self.consensus_args.algorithm, ConsensusAlgorithm::Noop) { @@ -142,6 +145,22 @@ impl ScrollRollupNodeConfig { } } + if self.consensus_args.exit_on_signer_rotation { + if self.l1_provider_args.url.is_none() { + return Err("--consensus.exit-on-signer-rotation requires --l1.url".to_string()); + } + if self.consensus_args.authorized_signer.is_some() { + return Err("--consensus.exit-on-signer-rotation cannot be used with \ + --consensus.authorized-signer because restart would re-pin the same signer" + .to_string()); + } + if self.consensus_args.algorithm != ConsensusAlgorithm::SystemContract { + return Err("--consensus.exit-on-signer-rotation requires \ + --consensus.algorithm system-contract" + .to_string()); + } + } + if self.consensus_args.algorithm == ConsensusAlgorithm::SystemContract && self.consensus_args.authorized_signer.is_none() && self.l1_provider_args.url.is_none() @@ -156,10 +175,32 @@ impl ScrollRollupNodeConfig { Ok(()) } + /// Builds the optional follower signer-rotation watchdog from the node configuration. + pub fn signer_rotation_watchdog( + &self, + chain_spec: &DogeosChainSpec, + ) -> eyre::Result> { + if !self.consensus_args.exit_on_signer_rotation { + return Ok(None); + } + + self.validate().map_err(eyre::Report::msg)?; + let l1_url = + self.l1_provider_args.url.clone().ok_or_else(|| { + eyre::eyre!("--consensus.exit-on-signer-rotation requires --l1.url") + })?; + let node_config = NodeConfig::from_chainspec(chain_spec)?; + + Ok(Some(SignerRotationWatchdog::new( + l1_url, + node_config.address_book.system_contract_address, + ))) + } + /// Hydrate the config by initializing the database connection. pub async fn hydrate( &mut self, - node_config: RethNodeConfig, + node_config: RethNodeConfig, ) -> eyre::Result<()> { // Instantiate the database let db_path = node_config.datadir().db(); @@ -184,11 +225,12 @@ impl ScrollRollupNodeConfig { self, ctx: RollupNodeContext, events: UnboundedReceiver, + eth_wire_events: Receiver, rpc_server_handles: RethRpcServerHandles, ) -> eyre::Result<( ChainOrchestrator< N, - impl ScrollHardforks + EthChainSpec + IsDevChain + Clone + 'static, + impl DogeosHardforks + EthChainSpec + IsDevChain + Clone + 'static, impl L1MessageProvider + Clone, impl Provider + Clone, impl ScrollEngineApi, @@ -196,10 +238,12 @@ impl ScrollRollupNodeConfig { ChainOrchestratorHandle, )> where - N: FullNetwork + NetworkProtocols, + N: FullNetwork + + NetworkProtocols + + scroll_network::EthWirePeerSender, CS: EthChainSpec + ChainConfig - + ScrollHardforks + + DogeosHardforks + IsDevChain + 'static, { @@ -217,7 +261,7 @@ impl ScrollRollupNodeConfig { Ok(handle) => { tracing::info!(target: "rollup_node::pprof", "pprof server started successfully"); // Spawn the pprof server task - ctx.task_executor.spawn_critical("pprof_server", async move { + ctx.task_executor.spawn_critical_task("pprof_server", async move { if let Err(e) = handle.await { tracing::error!(target: "rollup_node::pprof", "pprof server error: {:?}", e); } @@ -281,7 +325,7 @@ impl ScrollRollupNodeConfig { // Fetch the database from the hydrated config. let db = self.database.clone().expect("should hydrate config before build"); let db_maintenance = DatabaseMaintenance::new(db.clone()); - ctx.task_executor.spawn(db_maintenance.run()); + ctx.task_executor.spawn_task(db_maintenance.run()); // Run the database migrations if let Some(named) = chain_spec.chain().named() { @@ -367,10 +411,8 @@ impl ScrollRollupNodeConfig { let chain_spec = Arc::new(chain_spec.clone()); // Instantiate the network manager - let eth_wire_listener = self - .network_args - .enable_eth_scroll_wire_bridge - .then_some(ctx.network.eth_wire_block_listener().await?); + let eth_wire_listener = + self.network_args.enable_eth_scroll_wire_bridge.then_some(eth_wire_events); // TODO: remove this once we deprecate l2geth. let authorized_signer = self.network_args.effective_signer(chain_spec.chain().named()); @@ -383,7 +425,7 @@ impl ScrollRollupNodeConfig { td_constant(chain_spec.chain().named()), authorized_signer, ); - ctx.task_executor.spawn(scroll_network_manager.run()); + ctx.task_executor.spawn_task(scroll_network_manager.run()); tracing::info!(target: "scroll::node::args", fcs = ?fcs, payload_building_duration = ?self.sequencer_args.payload_building_duration, "Starting engine driver"); let engine = Engine::new(Arc::new(engine_api), fcs); @@ -493,7 +535,7 @@ impl ScrollRollupNodeConfig { .fetch_client() .await .expect("failed to fetch block client"), - Arc::new(ScrollBeaconConsensus::new(chain_spec.clone())), + Arc::new(DogeosConsensus), ); let l1_v2_message_queue_start_index = l1_v2_message_queue_start_index(chain_spec.chain().named()); @@ -552,8 +594,8 @@ pub struct RollupNodeDatabaseArgs { pub rn_db_path: Option, } -/// The database arguments. -#[derive(Debug, Default, Clone, clap::Args)] +/// The consensus arguments. +#[derive(Default, Clone, clap::Args)] pub struct ConsensusArgs { /// The type of consensus to use. #[arg( @@ -566,12 +608,38 @@ pub struct ConsensusArgs { /// The optional authorized signer for system contract consensus. #[arg(long = "consensus.authorized-signer", value_name = "ADDRESS")] pub authorized_signer: Option
, + + /// Exit the process (code 70) when the authorized signer in the L1 system contract rotates + /// away from the watchdog's first successful L1 observation after startup. Intended for + /// follower nodes run under a supervisor with a restart policy; the restart re-reads the + /// signer. Sequencer rotation remains a manual operation. + #[arg(long = "consensus.exit-on-signer-rotation", default_value_t = false)] + pub exit_on_signer_rotation: bool, +} + +// Keep the disabled field out of Debug output so default startup config logging remains +// byte-identical. Enabled configurations include it for observability. +impl fmt::Debug for ConsensusArgs { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut debug = f.debug_struct("ConsensusArgs"); + debug + .field("algorithm", &self.algorithm) + .field("authorized_signer", &self.authorized_signer); + if self.exit_on_signer_rotation { + debug.field("exit_on_signer_rotation", &self.exit_on_signer_rotation); + } + debug.finish() + } } impl ConsensusArgs { /// Create a new [`ConsensusArgs`] with the no-op consensus algorithm. pub const fn noop() -> Self { - Self { algorithm: ConsensusAlgorithm::Noop, authorized_signer: None } + Self { + algorithm: ConsensusAlgorithm::Noop, + authorized_signer: None, + exit_on_signer_rotation: false, + } } /// Creates a consensus instance based on the configured algorithm and authorized signer. @@ -666,6 +734,16 @@ pub struct RollupNodeNetworkArgs { /// The valid signer address for the network. #[arg(long = "network.valid_signer", value_name = "VALID_SIGNER")] pub signer_address: Option
, + /// Temporary: enable the legacy geth-to-Reth downloaded-header transform for the one-way + /// Testnet crossover, where a lagging Reth node canonicalizes signed headers downloaded from + /// the last l2geth sequencer. Defaults to `false`, is rejected on `DogeOS` Mainnet, and is + /// scheduled for removal with the rest of the geth compatibility code. + #[arg( + long = "network.legacy-geth-header-transform", + default_value_t = false, + action = ArgAction::Set + )] + pub legacy_geth_header_transform: bool, } impl Default for RollupNodeNetworkArgs { @@ -675,6 +753,7 @@ impl Default for RollupNodeNetworkArgs { enable_scroll_wire: true, sequencer_url: None, signer_address: None, + legacy_geth_header_transform: false, } } } @@ -683,8 +762,8 @@ impl RollupNodeNetworkArgs { /// Get the default authorized signer address for the given chain. pub const fn default_authorized_signer(chain: Option) -> Option
{ match chain { - Some(NamedChain::Scroll) => Some(constants::SCROLL_MAINNET_SIGNER), - Some(NamedChain::ScrollSepolia) => Some(constants::SCROLL_SEPOLIA_SIGNER), + Some(NamedChain::Scroll) => Some(constants::DOGEOS_MAINNET_SIGNER), + Some(NamedChain::ScrollSepolia) => Some(constants::DOGEOS_CHIKYU_SIGNER), _ => None, } } @@ -985,8 +1064,8 @@ pub struct RemoteBlockSourceArgs { /// Returns the total difficulty constant for the given chain. const fn td_constant(chain: Option) -> U128 { match chain { - Some(NamedChain::Scroll) => constants::SCROLL_MAINNET_TD_CONSTANT, - Some(NamedChain::ScrollSepolia) => constants::SCROLL_SEPOLIA_TD_CONSTANT, + Some(NamedChain::Scroll) => constants::DOGEOS_MAINNET_TD_CONSTANT, + Some(NamedChain::ScrollSepolia) => constants::DOGEOS_CHIKYU_TD_CONSTANT, _ => U128::ZERO, // Default to zero for other chains } } @@ -994,8 +1073,8 @@ const fn td_constant(chain: Option) -> U128 { /// The L1 message queue index at which queue hashes should be computed . const fn l1_v2_message_queue_start_index(chain: Option) -> u64 { match chain { - Some(NamedChain::Scroll) => constants::SCROLL_MAINNET_V2_MESSAGE_QUEUE_START_INDEX, - Some(NamedChain::ScrollSepolia) => constants::SCROLL_SEPOLIA_V2_MESSAGE_QUEUE_START_INDEX, + Some(NamedChain::Scroll) => constants::DOGEOS_MAINNET_V2_MESSAGE_QUEUE_START_INDEX, + Some(NamedChain::ScrollSepolia) => constants::DOGEOS_CHIKYU_V2_MESSAGE_QUEUE_START_INDEX, _ => 0, } } @@ -1003,19 +1082,121 @@ const fn l1_v2_message_queue_start_index(chain: Option) -> u64 { #[cfg(test)] mod tests { use super::*; + use clap::Parser; use std::path::PathBuf; + #[derive(Debug, Parser)] + struct ConsensusCli { + #[command(flatten)] + consensus: ConsensusArgs, + } + + fn rotation_watchdog_config() -> ScrollRollupNodeConfig { + ScrollRollupNodeConfig { + test_args: TestArgs::default(), + consensus_args: ConsensusArgs { + algorithm: ConsensusAlgorithm::SystemContract, + authorized_signer: None, + exit_on_signer_rotation: true, + }, + database_args: RollupNodeDatabaseArgs::default(), + chain_orchestrator_args: ChainOrchestratorArgs::default(), + engine_driver_args: EngineDriverArgs::default(), + blob_provider_args: BlobProviderArgs::default(), + l1_provider_args: L1ProviderArgs { + url: Some("http://localhost:8545".parse().unwrap()), + ..Default::default() + }, + sequencer_args: SequencerArgs::default(), + network_args: RollupNodeNetworkArgs::default(), + rpc_args: RpcArgs::default(), + signer_args: SignerArgs::default(), + gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), + pprof_args: PprofArgs::default(), + remote_block_source_args: RemoteBlockSourceArgs::default(), + database: None, + require_l1_data_fee_buffer: false, + } + } + + #[test] + fn exit_on_signer_rotation_defaults_to_false_when_parsed() { + let cli = ConsensusCli::parse_from(["rollup-node"]); + + assert!(!cli.consensus.exit_on_signer_rotation); + } + + #[test] + fn consensus_debug_omits_disabled_rotation_flag() { + assert_eq!( + format!("{:#?}", ConsensusArgs::default()), + "ConsensusArgs {\n algorithm: SystemContract,\n authorized_signer: None,\n}" + ); + } + + #[test] + fn consensus_debug_includes_enabled_rotation_flag() { + let args = ConsensusArgs { exit_on_signer_rotation: true, ..Default::default() }; + + assert!(format!("{args:#?}").contains("exit_on_signer_rotation: true")); + } + + #[test] + fn exit_on_signer_rotation_requires_l1_url() { + let mut config = rotation_watchdog_config(); + config.l1_provider_args.url = None; + + assert_eq!( + config.validate().unwrap_err(), + "--consensus.exit-on-signer-rotation requires --l1.url" + ); + } + + #[test] + fn exit_on_signer_rotation_conflicts_with_pinned_signer() { + let mut config = rotation_watchdog_config(); + config.consensus_args.authorized_signer = Some(Address::new([0x11; 20])); + + assert_eq!( + config.validate().unwrap_err(), + "--consensus.exit-on-signer-rotation cannot be used with \ + --consensus.authorized-signer because restart would re-pin the same signer" + ); + } + + #[test] + fn exit_on_signer_rotation_requires_system_contract_consensus() { + let mut config = rotation_watchdog_config(); + config.consensus_args.algorithm = ConsensusAlgorithm::Noop; + + assert_eq!( + config.validate().unwrap_err(), + "--consensus.exit-on-signer-rotation requires --consensus.algorithm system-contract" + ); + } + + #[test] + fn exit_on_signer_rotation_rejects_sequencer() { + let mut config = rotation_watchdog_config(); + config.sequencer_args.sequencer_enabled = true; + + assert_eq!( + config.validate().unwrap_err(), + "--consensus.exit-on-signer-rotation must not be used on a sequencer" + ); + } + #[test] fn test_network_args_default_authorized_signer() { // Test Scroll mainnet let mainnet_signer = RollupNodeNetworkArgs::default_authorized_signer(Some(NamedChain::Scroll)); - assert_eq!(mainnet_signer, Some(constants::SCROLL_MAINNET_SIGNER)); + assert_eq!(mainnet_signer, Some(constants::DOGEOS_MAINNET_SIGNER)); // Test Scroll Sepolia let sepolia_signer = RollupNodeNetworkArgs::default_authorized_signer(Some(NamedChain::ScrollSepolia)); - assert_eq!(sepolia_signer, Some(constants::SCROLL_SEPOLIA_SIGNER)); + assert_eq!(sepolia_signer, Some(constants::DOGEOS_CHIKYU_SIGNER)); // Test other chains let other_signer = @@ -1040,11 +1221,11 @@ mod tests { let network_args_default = RollupNodeNetworkArgs::default(); assert_eq!( network_args_default.effective_signer(Some(NamedChain::Scroll)), - Some(constants::SCROLL_MAINNET_SIGNER) + Some(constants::DOGEOS_MAINNET_SIGNER) ); assert_eq!( network_args_default.effective_signer(Some(NamedChain::ScrollSepolia)), - Some(constants::SCROLL_SEPOLIA_SIGNER) + Some(constants::DOGEOS_CHIKYU_SIGNER) ); assert_eq!(network_args_default.effective_signer(Some(NamedChain::Mainnet)), None); } @@ -1065,6 +1246,7 @@ mod tests { consensus_args: ConsensusArgs { algorithm: ConsensusAlgorithm::SystemContract, authorized_signer: None, + exit_on_signer_rotation: false, }, database: None, rpc_args: RpcArgs::default(), @@ -1133,6 +1315,7 @@ mod tests { consensus_args: ConsensusArgs { algorithm: ConsensusAlgorithm::SystemContract, authorized_signer: None, + exit_on_signer_rotation: false, }, database: None, rpc_args: RpcArgs::default(), diff --git a/crates/node/src/builder/network.rs b/crates/node/src/builder/network.rs index 4b32d4d32..c2f928d5f 100644 --- a/crates/node/src/builder/network.rs +++ b/crates/node/src/builder/network.rs @@ -1,25 +1,25 @@ -use alloy_primitives::{Address, Signature, B256}; +use alloy_chains::NamedChain; +use alloy_consensus::BlockHeader as _; +use alloy_primitives::{Address, Signature}; +use dogeos_chainspec::DogeosChainSpec; +use dogeos_reth_primitives::DogeosPrimitives; use reth_chainspec::EthChainSpec; -use reth_eth_wire_types::BasicNetworkPrimitives; use reth_network::{ config::NetworkMode, + primitives::BasicNetworkPrimitives, protocol::{RlpxSubProtocol, RlpxSubProtocols}, - transform::header::{HeaderResponseTransform, HeaderTransform}, + transform::header::HeaderTransform, NetworkConfig, NetworkHandle, NetworkManager, PeersInfo, }; -use reth_node_api::TxTy; +use reth_node_api::{NodeTypes, TxTy}; use reth_node_builder::{components::NetworkBuilder, BuilderContext, FullNodeTypes}; -use reth_node_types::NodeTypes; use reth_primitives_traits::{BlockHeader, Header}; -use reth_scroll_chainspec::ScrollChainSpec; -use reth_scroll_primitives::ScrollPrimitives; use reth_transaction_pool::{PoolTransaction, TransactionPool}; use rollup_node_primitives::sig_encode_hash; -use rollup_node_signer::SignatureAsBytes; -use scroll_alloy_hardforks::ScrollHardforks; -use scroll_db::{Database, DatabaseReadOperations, DatabaseWriteOperations}; +use scroll_network::{EthWireBlockImport, EthWireBlockWithPeer}; use std::{fmt, fmt::Debug, sync::Arc}; -use tracing::{debug, info, trace, warn}; +use tokio::sync::mpsc::Sender; +use tracing::{debug, info}; use crate::args::RollupNodeNetworkArgs; @@ -28,16 +28,25 @@ use crate::args::RollupNodeNetworkArgs; pub struct ScrollNetworkBuilder { /// Additional `RLPx` sub-protocols to be added to the network. scroll_sub_protocols: RlpxSubProtocols, - /// A reference to the rollup-node `Database`. - rollup_node_db: Arc, - /// The address for which we should persist and serve signatures for. + /// The address expected to have signed downloaded legacy headers. signer: Option
, + /// Sender used to bridge Reth's `eth` block-import callback into the rollup network manager. + eth_wire_block_tx: Sender, + /// Temporary: enable the legacy geth-to-Reth downloaded-header transform for the one-way + /// Testnet crossover. Prohibited on `DogeOS` Mainnet. Scheduled for removal with the rest of + /// the geth compatibility code. + legacy_geth_header_transform: bool, } impl ScrollNetworkBuilder { - /// Create a new [`ScrollNetworkBuilder`] with provided rollup node database. - pub fn new(rollup_node_db: Arc) -> Self { - Self { scroll_sub_protocols: RlpxSubProtocols::default(), rollup_node_db, signer: None } + /// Create a new [`ScrollNetworkBuilder`]. + pub fn new(eth_wire_block_tx: Sender) -> Self { + Self { + scroll_sub_protocols: RlpxSubProtocols::default(), + signer: None, + eth_wire_block_tx, + legacy_geth_header_transform: false, + } } /// Add a scroll sub-protocol to the network builder. @@ -46,70 +55,95 @@ impl ScrollNetworkBuilder { self } - /// Set the signer for which we will persist and serve signatures if included in block header - /// extra data field. + /// Set the signer expected to have signed downloaded legacy headers. pub const fn with_signer(mut self, signer: Option
) -> Self { self.signer = signer; self } + + /// Enable or disable the temporary legacy geth-to-Reth downloaded-header transform. + pub const fn with_legacy_geth_header_transform(mut self, enabled: bool) -> Self { + self.legacy_geth_header_transform = enabled; + self + } } impl NetworkBuilder for ScrollNetworkBuilder where Node: - FullNodeTypes>, + FullNodeTypes>, Pool: TransactionPool< Transaction: PoolTransaction< Consensus = TxTy, - Pooled = scroll_alloy_consensus::ScrollPooledTransaction, + Pooled = dogeos_protocol_types::ScrollPooledTransaction, >, > + Unpin + 'static, { - type Network = NetworkHandle; + type Network = NetworkHandle; async fn build_network( self, ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { - // get the header transform. let chain_spec = ctx.chain_spec(); + let named_chain = chain_spec.chain().named(); let authorized_signer = if self.signer.is_none() { - RollupNodeNetworkArgs::default_authorized_signer(chain_spec.chain().named()) + RollupNodeNetworkArgs::default_authorized_signer(named_chain) } else { self.signer }; - let transform = ScrollHeaderTransform::new( - chain_spec.clone(), - self.rollup_node_db.clone(), - authorized_signer, - ); - let request_transform = ScrollRequestHeaderTransform::new( - chain_spec, - self.rollup_node_db.clone(), + + // The downloaded-header transform is `None` unless the temporary crossover control is + // explicitly enabled, and is prohibited on DogeOS Mainnet. + let header_transform = resolve_header_transform( + self.legacy_geth_header_transform, + named_chain, authorized_signer, - ); + )?; // set the network mode to work. let config = ctx.network_config()?; let config = NetworkConfig { network_mode: NetworkMode::Work, - header_transform: Arc::new(transform), + block_import: Box::new(EthWireBlockImport::new(self.eth_wire_block_tx)), + header_transform, extra_protocols: self.scroll_sub_protocols, ..config }; let network = NetworkManager::builder(config).await?; - let handle = ctx.start_network(network, pool, Some(Arc::new(request_transform))); + let handle = ctx.start_network(network, pool); info!(target: "reth::cli", enode=%handle.local_node_record(), "P2P networking initialized"); Ok(handle) } } /// Network primitive types used by Scroll networks. -type ScrollNetworkPrimitives = - BasicNetworkPrimitives; +type DogeosNetworkPrimitives = + BasicNetworkPrimitives; + +/// Resolves the optional downloaded-header transform for the given crossover setting and chain. +/// +/// The legacy transform exists only for the temporary one-way Testnet geth-to-Reth crossover. It +/// defaults off (`None`), and enabling it on `DogeOS` Mainnet (`NamedChain::Scroll`) is rejected so +/// Mainnet always runs with the ordinary Reth download path. The decision is intentionally gated on +/// the chain identity rather than the configured signer, because Mainnet and Chikyu both configure +/// an authorized signer. +fn resolve_header_transform( + legacy_enabled: bool, + chain: Option, + authorized_signer: Option
, +) -> eyre::Result>>> { + if !legacy_enabled { + return Ok(None); + } + if chain == Some(NamedChain::Scroll) { + eyre::bail!("network.legacy-geth-header-transform must not be enabled on DogeOS Mainnet"); + } + Ok(Some(Arc::new(ScrollHeaderTransform::new(authorized_signer)))) +} /// Errors that can occur during signature validation #[derive(Debug, Clone, PartialEq, Eq)] @@ -120,8 +154,6 @@ pub(crate) enum HeaderTransformError { InvalidSigner(Address), /// Signature recovery failed RecoveryFailed, - /// Database operation failed - DatabaseError(String), } impl fmt::Display for HeaderTransformError { @@ -130,171 +162,69 @@ impl fmt::Display for HeaderTransformError { Self::InvalidSignature => write!(f, "Invalid signature length, expected 65 bytes"), Self::InvalidSigner(signer) => write!(f, "Invalid signer, not authorized: {}", signer), Self::RecoveryFailed => write!(f, "Failed to recover signer from signature"), - Self::DatabaseError(msg) => write!(f, "Database error: {}", msg), } } } impl std::error::Error for HeaderTransformError {} -/// An implementation of a [`HeaderTransform`] for downloaded headers for Scroll. +/// A downloaded-header [`HeaderTransform`] for the temporary legacy geth-to-Reth crossover. +/// +/// Legacy l2geth headers carry the block signature in `extra_data`, but the canonical `DogeOS` +/// header hashes over empty `extra_data`. This transform canonicalizes downloaded headers by +/// stripping `extra_data` so they match the sequenced form. Signer verification is performed for +/// observability only: it logs but never drops or rejects a header. Header acceptance is decided by +/// the downstream hash/linkage/consensus checks, exactly as before — the prior implementation also +/// returned the canonicalized header regardless of signer verification (it only gated an +/// out-of-band signature persistence that no longer exists). #[derive(Debug, Clone)] #[non_exhaustive] -pub(crate) struct ScrollHeaderTransform { - chain_spec: Arc, - db: Arc, +pub(crate) struct ScrollHeaderTransform { signer: Option
, } -impl - ScrollHeaderTransform -{ - /// Returns a new instance of the [`ScrollHeaderTransform`] from the provider chain spec. - pub(crate) const fn new( - chain_spec: Arc, - db: Arc, - signer: Option
, - ) -> Self { - Self { chain_spec, db, signer } +impl ScrollHeaderTransform { + /// Returns a new [`ScrollHeaderTransform`]. + pub(crate) const fn new(signer: Option
) -> Self { + Self { signer } } } #[async_trait::async_trait] -impl - HeaderTransform for ScrollHeaderTransform -{ - async fn map(&self, mut headers: Vec) -> Vec { - // TODO: remove this once we deprecated l2geth +impl HeaderTransform
for ScrollHeaderTransform { + async fn map(&self, mut headers: Vec
) -> Vec
{ + // TODO: remove this once we deprecate l2geth. let signer = self.signer; - let chain_spec = self.chain_spec.clone(); - - // Process headers in a blocking task to avoid blocking the async runtime - let (headers, signatures) = tokio::task::spawn_blocking(move || { + // Recover signers on a blocking task to keep secp256k1 work off the async runtime. The + // transform must return exactly one header per input and preserve ordering. + tokio::task::spawn_blocking(move || { use rayon::prelude::*; - let signatures: Vec<(B256, Signature)> = headers.par_iter_mut().filter_map(|header| { - if !chain_spec.is_euclid_v2_active_at_timestamp(header.timestamp()) { - return None - } - - let signature_bytes = std::mem::take(header.extra_data_mut()); - let signature = if let Ok(sig) = parse_65b_signature(&signature_bytes) { - sig - } else { + headers.par_iter_mut().for_each(|header| { + // Canonicalize: strip the legacy signature carried in extra_data. + let signature_bytes = std::mem::take(&mut header.extra_data); + let Ok(signature) = parse_65b_signature(&signature_bytes) else { debug!( - target: "scroll::network::header_transform", - "Header signature persistence skipped due to invalid signature, block number: {:?}, header hash: {:?}", - header.number(), - header.hash_slow(), - + target: "scroll::network::header_transform", + number = header.number(), + "downloaded header carried no parseable legacy signature; canonicalized without signer verification", ); - return None + return; }; - - // Recover and verify signer - let hash = header.hash_slow(); + // Observability-only signer check against the canonicalized header. if let Err(err) = recover_and_verify_signer(&signature, header, signer) { debug!( target: "scroll::network::header_transform", - "Header signature persistence failed, block number: {:?}, header hash: {:?}, error: {}", - header.number(), - hash, err + number = header.number(), + %err, + "downloaded header failed legacy signer verification (observability only)", ); - return None; } - - Some((hash, signature)) - } - ).collect(); - - (headers, signatures) - }).await.expect("header transform task panicked"); - - // Store signatures in database - trace!( - target: "scroll::network::header_transform", - count = signatures.len(), - "Persisting block signatures to database", - ); - if let Err(e) = self.db.insert_signatures(signatures).await { - warn!(target: "scroll::network::header_transform", "Failed to store signatures in database: {:?}", e); - } - - headers - } -} - -/// An implementation of a [`HeaderTransform`] for header request responses for Scroll. -#[derive(Debug, Clone)] -#[non_exhaustive] -pub(crate) struct ScrollRequestHeaderTransform { - chain_spec: ChainSpec, - db: Arc, - signer: Option
, -} - -impl - ScrollRequestHeaderTransform -{ - /// Returns a new instance of the [`ScrollHeaderTransform`] from the provider chain spec. - pub(crate) const fn new( - chain_spec: ChainSpec, - db: Arc, - signer: Option
, - ) -> Self { - Self { chain_spec, db, signer } - } -} - -#[async_trait::async_trait] -impl - HeaderResponseTransform for ScrollRequestHeaderTransform -{ - async fn map(&self, mut header: H) -> H { - if !self.chain_spec.is_euclid_v2_active_at_timestamp(header.timestamp()) { - return header; - } - - // read the signature from the rollup node. - let hash = header.hash_slow(); - - let signature = self.db.get_signature(hash).await.inspect_err(|e| { - warn!(target: "scroll::network::request_header_transform", - "Failed to get block signature from database, block number: {:?}, header hash: {:?}, error: {}", - header.number(), - hash, - HeaderTransformError::DatabaseError(e.to_string()) - ) + }); + headers }) - .ok() - .flatten(); - - // If we have a signature in the database and it matches configured signer then add it - // to the extra data field - if let Some(sig) = signature { - if let Err(err) = recover_and_verify_signer(&sig, &header, self.signer) { - warn!( - target: "scroll::network::request_header_transform", - "Found invalid signature(different from the hardcoded signer={:?}) for block number: {:?}, header hash: {:?}, sig: {:?}, error: {}", - self.signer, - header.number(), - hash, - sig.to_string(), - err - ); - } else { - *header.extra_data_mut() = sig.sig_as_bytes().into(); - } - } else { - debug!( - target: "scroll::network::request_header_transform", - "No signature found in database for block number: {:?}, header hash: {:?}", - header.number(), - hash, - ); - } - - header + .await + .expect("header transform task panicked") } } @@ -356,3 +286,75 @@ fn header_to_alloy(header: &H) -> Header { requests_hash: header.requests_hash(), } } + +#[cfg(test)] +mod tests { + use super::*; + use alloy_primitives::Bytes; + + fn header_with_extra(number: u64, extra: Vec) -> Header { + Header { number, extra_data: Bytes::from(extra), ..Default::default() } + } + + #[test] + fn legacy_transform_disabled_yields_no_hook() { + // Default-off on every chain, including a configured-signer chain. + for chain in [None, Some(NamedChain::Scroll), Some(NamedChain::ScrollSepolia)] { + let hook = resolve_header_transform(false, chain, Some(Address::repeat_byte(1))) + .expect("disabled transform must never error"); + assert!(hook.is_none(), "disabled crossover must produce no header transform"); + } + } + + #[test] + fn legacy_transform_rejected_on_mainnet() { + let result = + resolve_header_transform(true, Some(NamedChain::Scroll), Some(Address::repeat_byte(1))); + assert!(result.is_err(), "enabling the legacy transform on Mainnet must be rejected"); + } + + #[test] + fn legacy_transform_enabled_on_testnet_and_custom_chains() { + // Chikyu/Testnet (ScrollSepolia) and a custom chain (None) may enable it explicitly. + for chain in [Some(NamedChain::ScrollSepolia), None] { + let hook = resolve_header_transform(true, chain, Some(Address::repeat_byte(1))) + .expect("enabling the legacy transform off Mainnet must succeed"); + assert!(hook.is_some(), "enabled crossover must install a header transform"); + } + } + + #[tokio::test] + async fn map_canonicalizes_preserving_order_and_cardinality() { + // Distinct, non-signature extra_data payloads across three ordered headers. + let transform = ScrollHeaderTransform::new(Some(Address::repeat_byte(9))); + let input = vec![ + header_with_extra(1, vec![0xaa; 65]), + header_with_extra(2, vec![0xbb; 10]), + header_with_extra(3, vec![]), + ]; + + let out = transform.map(input).await; + + // Cardinality and ordering are preserved. + assert_eq!(out.len(), 3); + assert_eq!(out.iter().map(|h| h.number).collect::>(), vec![1, 2, 3]); + // Canonicalization strips extra_data from every header. + assert!(out.iter().all(|h| h.extra_data.is_empty())); + } + + #[tokio::test] + async fn map_keeps_headers_with_invalid_or_unauthorized_signatures() { + // With an authorized signer configured, an unverifiable signature must not drop the + // header: signer checking is observability only. + let transform = ScrollHeaderTransform::new(Some(Address::repeat_byte(7))); + let input = vec![ + header_with_extra(1, vec![0x01; 65]), // valid length, unauthorized signer + header_with_extra(2, vec![0x02; 3]), // wrong length, cannot recover a signature + ]; + + let out = transform.map(input).await; + + assert_eq!(out.len(), 2, "headers must survive failed signer verification"); + assert!(out.iter().all(|h| h.extra_data.is_empty()), "extra_data is always canonicalized"); + } +} diff --git a/crates/node/src/chainspec.rs b/crates/node/src/chainspec.rs new file mode 100644 index 000000000..e4d3c1b96 --- /dev/null +++ b/crates/node/src/chainspec.rs @@ -0,0 +1,27 @@ +//! `DogeOS` chain spec parsing for the rollup-node CLI. + +use dogeos_chainspec::{DogeosChainSpec, DOGEOS_CHIKYU, DOGEOS_DEV, DOGEOS_MAINNET}; +use reth_cli::chainspec::{parse_genesis, ChainSpecParser}; +use std::sync::Arc; + +/// Built-in chain names accepted by the rollup node. +pub const SUPPORTED_CHAINS: &[&str] = &["dogeos-mainnet", "dogeos-chikyu", "dev"]; + +/// Parses built-in `DogeOS` networks and custom genesis JSON files or strings. +#[derive(Clone, Debug, Default)] +pub struct DogeosChainSpecParser; + +impl ChainSpecParser for DogeosChainSpecParser { + type ChainSpec = DogeosChainSpec; + + const SUPPORTED_CHAINS: &'static [&'static str] = SUPPORTED_CHAINS; + + fn parse(value: &str) -> eyre::Result> { + Ok(match value { + "dogeos-mainnet" => DOGEOS_MAINNET.clone(), + "dogeos-chikyu" => DOGEOS_CHIKYU.clone(), + "dev" => DOGEOS_DEV.clone(), + _ => Arc::new(DogeosChainSpec::from_custom_genesis(parse_genesis(value)?)), + }) + } +} diff --git a/crates/node/src/constants.rs b/crates/node/src/constants.rs index 0908b1ec4..43c455a5d 100644 --- a/crates/node/src/constants.rs +++ b/crates/node/src/constants.rs @@ -56,25 +56,25 @@ pub const SCROLL_GAS_LIMIT: u64 = 20_000_000; /// The constant value that must be added to the block number to get the total difficulty for Scroll /// mainnet. -pub(crate) const SCROLL_MAINNET_TD_CONSTANT: U128 = U128::from_limbs([14906960, 0]); +pub(crate) const DOGEOS_MAINNET_TD_CONSTANT: U128 = U128::from_limbs([14906960, 0]); /// The constant value that must be added to the block number to get the total difficulty for Scroll /// Sepolia. -pub(crate) const SCROLL_SEPOLIA_TD_CONSTANT: U128 = U128::from_limbs([8484488, 0]); +pub(crate) const DOGEOS_CHIKYU_TD_CONSTANT: U128 = U128::from_limbs([8484488, 0]); /// The L1 message queue index at which the V2 L1 message queue was enabled on mainnet. -pub(crate) const SCROLL_MAINNET_V2_MESSAGE_QUEUE_START_INDEX: u64 = 953885; +pub(crate) const DOGEOS_MAINNET_V2_MESSAGE_QUEUE_START_INDEX: u64 = 953885; /// The L1 message queue index at which queue hashes should be computed on sepolia. -pub(crate) const SCROLL_SEPOLIA_V2_MESSAGE_QUEUE_START_INDEX: u64 = 1062110; +pub(crate) const DOGEOS_CHIKYU_V2_MESSAGE_QUEUE_START_INDEX: u64 = 1062110; /// TODO: remove this once we deprecated l2geth. /// The authorized signer address for Scroll mainnet. -pub(crate) const SCROLL_MAINNET_SIGNER: Address = +pub(crate) const DOGEOS_MAINNET_SIGNER: Address = address!("0xD83C4892BB5aA241B63d8C4C134920111E142A20"); /// The authorized signer address for Scroll sepolia. -pub(crate) const SCROLL_SEPOLIA_SIGNER: Address = +pub(crate) const DOGEOS_CHIKYU_SIGNER: Address = address!("0x687E0E85AD67ff71aC134CF61b65905b58Ab43b2"); /// The url for pprof diff --git a/crates/node/src/debug_toolkit/repl/attach.rs b/crates/node/src/debug_toolkit/repl/attach.rs index 0f28382a8..f2929973a 100644 --- a/crates/node/src/debug_toolkit/repl/attach.rs +++ b/crates/node/src/debug_toolkit/repl/attach.rs @@ -10,9 +10,9 @@ use alloy_provider::{Provider, ProviderBuilder}; use alloy_signer_local::PrivateKeySigner; use colored::Colorize; use crossterm::terminal::{disable_raw_mode, enable_raw_mode}; +use dogeos_rpc_types::Scroll; use reqwest::Url; use rollup_node_chain_orchestrator::ChainOrchestratorStatus; -use scroll_alloy_network::Scroll; use std::{io::Write, path::PathBuf, time::Duration}; /// Interactive REPL that attaches to a running node via JSON-RPC. diff --git a/crates/node/src/debug_toolkit/repl/local.rs b/crates/node/src/debug_toolkit/repl/local.rs index 7db6ca5e0..fc13f07a8 100644 --- a/crates/node/src/debug_toolkit/repl/local.rs +++ b/crates/node/src/debug_toolkit/repl/local.rs @@ -18,13 +18,13 @@ use alloy_signer_local::PrivateKeySigner; use alloy_sol_types::{sol, SolCall}; use colored::Colorize; use crossterm::terminal::{disable_raw_mode, enable_raw_mode}; +use dogeos_rpc_types::Scroll; use futures::StreamExt; use reth_network::PeersInfo; use reth_network_api::Peers; use reth_network_peers::NodeRecord; use reth_rpc_api::EthApiServer; use reth_transaction_pool::TransactionPool; -use scroll_alloy_network::Scroll; use std::{io::Write, path::PathBuf, str::FromStr, time::Duration}; // L1 contract addresses diff --git a/crates/node/src/debug_toolkit/shared/rpc.rs b/crates/node/src/debug_toolkit/shared/rpc.rs index fba00113c..21899d74a 100644 --- a/crates/node/src/debug_toolkit/shared/rpc.rs +++ b/crates/node/src/debug_toolkit/shared/rpc.rs @@ -1,7 +1,7 @@ //! Shared JSON-RPC helpers for debug toolkit REPLs. use alloy_provider::{Provider, RootProvider}; -use scroll_alloy_network::Scroll; +use dogeos_rpc_types::Scroll; use std::borrow::Cow; /// Call a typed JSON-RPC method and deserialize into `R`. diff --git a/crates/node/src/debug_toolkit/shared/status.rs b/crates/node/src/debug_toolkit/shared/status.rs index 749fff0ce..9216d3b9a 100644 --- a/crates/node/src/debug_toolkit/shared/status.rs +++ b/crates/node/src/debug_toolkit/shared/status.rs @@ -1,7 +1,40 @@ //! Shared rendering for rollup node status outputs. use colored::Colorize; -use rollup_node_chain_orchestrator::ChainOrchestratorStatus; +use rollup_node_chain_orchestrator::{ChainOrchestratorStatus, DerivationStatus}; + +/// Print derivation and held-batch progress. +pub(crate) fn print_derivation_status(status: &ChainOrchestratorStatus) { + println!("{}", "Derivation:".underline()); + match &status.derivation { + DerivationStatus::Idle => println!(" State: {}", "idle".green()), + DerivationStatus::Deriving { queued } => { + println!(" State: {}", "deriving".yellow()); + println!(" Queued: {queued}"); + } + DerivationStatus::Held(batch) => { + println!(" State: {}", "held".yellow()); + println!( + " Batch: #{} ({:.12}...)", + batch.batch_index, + format!("{:?}", batch.batch_hash) + ); + println!(" Attempt: {}", batch.attempts_started); + println!(" Held: {}ms", batch.held_duration_ms); + if let (Some(method), Some(engine_status)) = + (&batch.last_engine_method, &batch.last_engine_status) + { + println!(" Engine: {method} -> {engine_status}"); + } + if let Some(backoff_ms) = batch.current_backoff_ms { + println!(" Backoff: {backoff_ms}ms"); + } + if batch.queued_behind > 0 { + println!(" Queued: {}", batch.queued_behind); + } + } + } +} /// Print L2/L1 overview sections used by `status`. pub(crate) fn print_status_overview(status: &ChainOrchestratorStatus) { @@ -36,6 +69,8 @@ pub(crate) fn print_status_overview(status: &ChainOrchestratorStatus) { " Synced: {}", if status.l1.status.is_synced() { "true".green() } else { "false".red() } ); + + print_derivation_status(status); } /// Print detailed sync status used by `sync-status`. @@ -66,6 +101,8 @@ pub(crate) fn print_sync_status(status: &ChainOrchestratorStatus) { } ); println!(); + print_derivation_status(status); + println!(); println!("{}", "Forkchoice:".underline()); let fcs = &status.l2.fcs; diff --git a/crates/node/src/lib.rs b/crates/node/src/lib.rs index 5be56d744..dc4c607c6 100644 --- a/crates/node/src/lib.rs +++ b/crates/node/src/lib.rs @@ -3,10 +3,12 @@ pub mod add_ons; mod args; mod builder; +mod chainspec; pub mod constants; mod context; mod node; pub mod pprof; +pub mod signer_rotation; #[cfg(feature = "test-utils")] pub mod test_utils; @@ -16,5 +18,6 @@ pub mod debug_toolkit; pub use add_ons::*; pub use args::*; pub use builder::network::ScrollNetworkBuilder; +pub use chainspec::{DogeosChainSpecParser, SUPPORTED_CHAINS}; pub use context::RollupNodeContext; pub use node::ScrollRollupNode; diff --git a/crates/node/src/main.rs b/crates/node/src/main.rs index b7bb10e60..5d2bd7ac9 100644 --- a/crates/node/src/main.rs +++ b/crates/node/src/main.rs @@ -1,25 +1,48 @@ //! Scroll binary +use reth_node_builder::TreeConfig; +use std::sync::atomic::{AtomicBool, Ordering}; + +const DEFAULT_PERSISTENCE_THRESHOLD: u64 = 0; +const DEFAULT_PERSISTENCE_BACKPRESSURE_THRESHOLD: u64 = 16; +static SIGNER_ROTATION_EXIT_REQUESTED: AtomicBool = AtomicBool::new(false); + #[global_allocator] static ALLOC: reth_cli_util::allocator::Allocator = reth_cli_util::allocator::new_allocator(); +const fn with_rollup_tree_overrides(tree_config: TreeConfig) -> TreeConfig { + tree_config + .with_always_process_payload_attributes_on_canonical_head(true) + .with_unwind_canonical_header(true) + // Use the legacy processor due to performance issues with Reth's state root task. + .with_legacy_state_root(true) +} + fn main() { use clap::Parser; + use dogeos_reth_consensus::DogeosConsensus; + use dogeos_reth_evm::ScrollEvmConfig; + use reth_ethereum_cli::Cli; use reth_node_builder::EngineNodeLauncher; - use reth_scroll_cli::{Cli, ScrollChainSpecParser}; - use rollup_node::{ScrollRollupNode, ScrollRollupNodeConfig}; + use reth_node_core::args::DefaultEngineValues; + use rollup_node::{ + signer_rotation::EXIT_CODE_SIGNER_ROTATION, DogeosChainSpecParser, ScrollRollupNode, + ScrollRollupNodeConfig, + }; + use std::sync::Arc; use tracing::info; + DefaultEngineValues::default() + .with_persistence_threshold(DEFAULT_PERSISTENCE_THRESHOLD) + .with_persistence_backpressure_threshold(DEFAULT_PERSISTENCE_BACKPRESSURE_THRESHOLD) + .try_init() + .expect("engine defaults must be initialized before parsing CLI arguments"); + // set default log level to info if RUST_LOG is not set if std::env::var("RUST_LOG").is_err() { std::env::set_var("RUST_LOG", "info"); } - // enable tokio-console subscriber - if std::env::var("ENABLE_CONSOLE_SUBSCRIBER").is_ok_and(|v| v == "1") { - console_subscriber::init(); - } - reth_cli_util::sigsegv_handler::install(); // Enable backtraces unless a RUST_BACKTRACE value has already been explicitly provided. @@ -27,8 +50,13 @@ fn main() { std::env::set_var("RUST_BACKTRACE", "1"); } - if let Err(err) = Cli::::parse().run( - |builder, args| async move { + let result = Cli::::parse() + .run_with_components::( + |chain_spec| ( + ScrollEvmConfig::dogeos(chain_spec), + Arc::new(DogeosConsensus), + ), + async move |builder, args| { info!(target: "reth::cli", "Launching node"); // Modify the chain spec based on the CLI args. @@ -36,6 +64,7 @@ fn main() { let mut chain_spec = (*config.chain).clone(); chain_spec.config.l1_data_fee_buffer_check = args.require_l1_data_fee_buffer; let config = config.with_chain(chain_spec); + let watchdog = args.signer_rotation_watchdog(config.chain.as_ref())?; // Launch the node. let handle = builder @@ -48,15 +77,16 @@ fn main() { // on top of heads part of the canonical state. Not // providing this argument leads the `EngineTree` to ignore // the payload building attributes: - let tree_config = builder - .config() - .engine - .tree_config() - .with_always_process_payload_attributes_on_canonical_head(true) - .with_persistence_threshold(0) - .with_unwind_canonical_header(true) - // Use legacy state root processor due to performance issues with the new state root processor in reth. - .with_legacy_state_root(true); + let tree_config = + with_rollup_tree_overrides(builder.config().engine.tree_config()); + info!( + target: "reth::cli", + persistence_threshold = tree_config.persistence_threshold(), + persistence_backpressure_threshold = + tree_config.persistence_backpressure_threshold(), + memory_block_buffer_target = tree_config.memory_block_buffer_target(), + "Engine persistence configured" + ); let launcher = EngineNodeLauncher::new( builder.task_executor().clone(), builder.config().datadir(), @@ -65,10 +95,64 @@ fn main() { builder.launch_with(launcher) }) .await?; - handle.node_exit_future.await + match watchdog { + None => handle.node_exit_future.await, + Some(watchdog) => { + let exit = handle.node_exit_future; + tokio::pin!(exit); + tokio::select! { + res = &mut exit => res, + rotation = watchdog.wait_for_rotation() => { + tracing::warn!( + target: "rollup_node::signer_rotation", + baseline = %rotation.baseline, + observed = %rotation.observed, + exit_code = EXIT_CODE_SIGNER_ROTATION, + "authorized signer rotated on L1; exiting for supervised restart" + ); + // Returning lets Reth perform its normal bounded graceful runtime + // shutdown. The marker preserves the distinct process exit code after + // that shutdown completes. + SIGNER_ROTATION_EXIT_REQUESTED.store(true, Ordering::SeqCst); + Ok(()) + } + } + } + } }, - ) { + ); + + if SIGNER_ROTATION_EXIT_REQUESTED.load(Ordering::SeqCst) { + if let Err(err) = &result { + eprintln!("Error during signer-rotation shutdown: {err:?}"); + } + std::process::exit(EXIT_CODE_SIGNER_ROTATION); + } + + if let Err(err) = result { eprintln!("Error: {err:?}"); std::process::exit(1); } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn rollup_tree_overrides_preserve_persistence_settings() { + let tree_config = TreeConfig::default() + .with_persistence_backpressure_threshold(24) + .with_persistence_threshold(8) + .with_memory_block_buffer_target(0); + + let tree_config = with_rollup_tree_overrides(tree_config); + + assert_eq!(tree_config.persistence_threshold(), 8); + assert_eq!(tree_config.persistence_backpressure_threshold(), 24); + assert_eq!(tree_config.memory_block_buffer_target(), 0); + assert!(tree_config.always_process_payload_attributes_on_canonical_head()); + assert!(tree_config.unwind_canonical_header()); + assert!(tree_config.legacy_state_root()); + } +} diff --git a/crates/node/src/node.rs b/crates/node/src/node.rs index 4086ebcda..ca191939e 100644 --- a/crates/node/src/node.rs +++ b/crates/node/src/node.rs @@ -3,34 +3,40 @@ use crate::{args::ScrollRollupNodeConfig, builder::network::ScrollNetworkBuilder, constants}; use std::time::Duration; -use super::add_ons::ScrollRollupNodeAddOns; +use super::add_ons::{RollupManagerHandle, ScrollRollupNodeAddOns}; +use dogeos_chainspec::DogeosChainSpec; +use dogeos_reth_node::{ + DogeosConsensusBuilder, DogeosExecutorBuilder, DogeosNodeTypes, DogeosPayloadBuilderBuilder, + DogeosPoolBuilder, DogeosStorage, +}; use reth_network::protocol::IntoRlpxSubProtocol; use reth_node_api::NodeTypes; use reth_node_builder::{ components::{BasicPayloadServiceBuilder, ComponentsBuilder}, FullNodeTypes, Node, NodeAdapter, NodeComponentsBuilder, NodeConfig, }; -use reth_scroll_chainspec::ScrollChainSpec; -use reth_scroll_node::{ - ScrollConsensusBuilder, ScrollExecutorBuilder, ScrollNode, ScrollPayloadBuilderBuilder, - ScrollPoolBuilder, -}; +use scroll_network::{EthWireBlockWithPeer, ETH_WIRE_BLOCK_CHANNEL_SIZE}; use scroll_wire::{ScrollWireConfig, ScrollWireEvent, ScrollWireProtocolHandler}; -use std::sync::Arc; -use tokio::sync::{mpsc::UnboundedReceiver, Mutex}; +use std::sync::{Arc, OnceLock}; +use tokio::sync::{ + mpsc::{Receiver, UnboundedReceiver}, + Mutex, +}; /// The Scroll node implementation. #[derive(Clone, Debug)] pub struct ScrollRollupNode { config: ScrollRollupNodeConfig, scroll_wire_events: Arc>>>, + eth_wire_events: Arc>>>, + rollup_manager_handle: Arc>, } impl ScrollRollupNode { /// Create a new instance of [`ScrollRollupNode`]. pub async fn new( mut config: ScrollRollupNodeConfig, - node_config: NodeConfig, + node_config: NodeConfig, ) -> Self { config .validate() @@ -42,7 +48,18 @@ impl ScrollRollupNode { .map_err(|e| eyre::eyre!("Configuration hydration failed: {}", e)) .expect("Configuration hydration failed"); - Self { config, scroll_wire_events: Arc::new(Mutex::new(None)) } + Self { + config, + scroll_wire_events: Arc::new(Mutex::new(None)), + eth_wire_events: Arc::new(Mutex::new(None)), + rollup_manager_handle: Arc::new(OnceLock::new()), + } + } + + /// Returns the rollup manager handle after the node add-ons have launched. + #[cfg(feature = "test-utils")] + pub(crate) fn rollup_manager_handle(&self) -> Option<&RollupManagerHandle> { + self.rollup_manager_handle.get() } } @@ -52,11 +69,11 @@ where { type ComponentsBuilder = ComponentsBuilder< N, - ScrollPoolBuilder, - BasicPayloadServiceBuilder, + DogeosPoolBuilder, + BasicPayloadServiceBuilder, ScrollNetworkBuilder, - ScrollExecutorBuilder, - ScrollConsensusBuilder, + DogeosExecutorBuilder, + DogeosConsensusBuilder, >; type AddOns = ScrollRollupNodeAddOns< @@ -68,11 +85,15 @@ where ScrollWireProtocolHandler::new(ScrollWireConfig::new(true)); *self.scroll_wire_events.try_lock().unwrap() = Some(events); + let (eth_wire_block_tx, eth_wire_events) = + tokio::sync::mpsc::channel(ETH_WIRE_BLOCK_CHANNEL_SIZE); + *self.eth_wire_events.try_lock().unwrap() = Some(eth_wire_events); - let mut network_builder = ScrollNetworkBuilder::new( - self.config.database.clone().expect("database is set via hydration"), - ) - .with_signer(self.config.network_args.signer_address); + let mut network_builder = ScrollNetworkBuilder::new(eth_wire_block_tx) + .with_signer(self.config.network_args.signer_address) + .with_legacy_geth_header_transform( + self.config.network_args.legacy_geth_header_transform, + ); // Only add scroll-wire sub-protocol if enabled if self.config.network_args.enable_scroll_wire { @@ -80,28 +101,33 @@ where network_builder.with_sub_protocol(scroll_wire_handler.into_rlpx_sub_protocol()); } - ScrollNode::components() - .payload(BasicPayloadServiceBuilder::new(ScrollPayloadBuilderBuilder { + ComponentsBuilder::default() + .node_types::() + .pool(DogeosPoolBuilder::default()) + .executor(DogeosExecutorBuilder::default()) + .payload(BasicPayloadServiceBuilder::new(DogeosPayloadBuilderBuilder { payload_building_time_limit: Duration::from_millis( self.config.sequencer_args.payload_building_duration, ), - best_transactions: (), block_da_size_limit: Some(constants::DEFAULT_PAYLOAD_SIZE_LIMIT), })) .network(network_builder) + .consensus(DogeosConsensusBuilder) } fn add_ons(&self) -> Self::AddOns { ScrollRollupNodeAddOns::new( self.config.clone(), self.scroll_wire_events.try_lock().unwrap().take().unwrap(), + self.eth_wire_events.try_lock().unwrap().take().unwrap(), + self.rollup_manager_handle.clone(), ) } } impl NodeTypes for ScrollRollupNode { - type Primitives = ::Primitives; - type ChainSpec = ::ChainSpec; - type Storage = ::Storage; - type Payload = ::Payload; + type Primitives = ::Primitives; + type ChainSpec = DogeosChainSpec; + type Storage = DogeosStorage; + type Payload = ::Payload; } diff --git a/crates/node/src/signer_rotation.rs b/crates/node/src/signer_rotation.rs new file mode 100644 index 000000000..516b9c87f --- /dev/null +++ b/crates/node/src/signer_rotation.rs @@ -0,0 +1,282 @@ +//! Follower signer-rotation watchdog. +//! +//! The watchdog polls the authorized-signer slot and resolves when a rotation away from its +//! baseline is confirmed. Its baseline is the first successful watchdog read, so a rotation in +//! the window between the node's startup read and that first read will not be detected until the +//! next rotation. The caller is responsible for shutting down the process; restarting under a +//! supervisor is the signer-refresh mechanism. + +use alloy_primitives::Address; +use alloy_provider::ProviderBuilder; +use rollup_node_providers::SystemContractProvider; +use std::time::Duration; + +/// Process exit code used after a confirmed authorized-signer rotation. +pub const EXIT_CODE_SIGNER_ROTATION: i32 = 70; +/// Interval between authorized-signer reads. +const DEFAULT_POLL_INTERVAL: Duration = Duration::from_secs(12); +/// Number of matching non-baseline reads required to confirm a rotation. +const DEFAULT_CONFIRMATIONS: u32 = 3; + +/// Emit a periodic warning after this many consecutive failed signer reads. +const FAILURE_WARNING_INTERVAL: u32 = 25; +const POLL_READ_TIMEOUT: Duration = Duration::from_secs(10); + +/// A confirmed signer rotation. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Rotation { + /// Authorized signer observed when the watchdog started. + pub baseline: Address, + /// Newly observed authorized signer. + pub observed: Address, +} + +/// Pure confirmation state machine for authorized-signer observations. +#[derive(Debug)] +struct RotationDetector { + confirmations: u32, + baseline: Option
, + candidate: Option
, + streak: u32, +} + +impl RotationDetector { + /// Creates a detector requiring `confirmations` matching non-baseline observations. + fn new(confirmations: u32) -> Self { + assert!(confirmations > 0, "rotation confirmations must be greater than zero"); + Self { confirmations, baseline: None, candidate: None, streak: 0 } + } + + /// Records one poll result and returns a rotation once it is confirmed. + /// + /// `None` represents a failed read. Failures leave the detector state unchanged so RPC + /// uncertainty can never cause an exit. + fn observe(&mut self, value: Option
) -> Option { + let value = value?; + let Some(baseline) = self.baseline else { + self.baseline = Some(value); + return None; + }; + + if value == baseline { + self.candidate = None; + self.streak = 0; + return None; + } + + if self.candidate == Some(value) { + self.streak = self.streak.saturating_add(1); + } else { + self.candidate = Some(value); + self.streak = 1; + } + + (self.streak >= self.confirmations).then_some(Rotation { baseline, observed: value }) + } +} + +/// Polls L1 until an authorized-signer rotation is confirmed. +#[derive(Debug)] +pub struct SignerRotationWatchdog { + l1_url: reqwest::Url, + system_contract: Address, +} + +impl SignerRotationWatchdog { + /// Creates a watchdog using the production polling interval and confirmation count. + pub const fn new(l1_url: reqwest::Url, system_contract: Address) -> Self { + Self { l1_url, system_contract } + } + + /// Resolves only after a confirmed rotation; otherwise remains pending indefinitely. + pub async fn wait_for_rotation(self) -> Rotation { + let Self { l1_url, system_contract } = self; + let provider = ProviderBuilder::new().connect_http(l1_url); + let mut detector = RotationDetector::new(DEFAULT_CONFIRMATIONS); + let mut consecutive_failures = 0_u32; + + loop { + let observation = match tokio::time::timeout( + POLL_READ_TIMEOUT, + provider.authorized_signer(system_contract), + ) + .await + { + Ok(Ok(signer)) => Some(signer), + Ok(Err(err)) => { + tracing::debug!( + target: "rollup_node::signer_rotation", + ?err, + "signer poll failed; will retry" + ); + None + } + Err(err) => { + tracing::debug!( + target: "rollup_node::signer_rotation", + ?err, + timeout = ?POLL_READ_TIMEOUT, + "signer poll timed out; will retry" + ); + None + } + }; + + if observation.is_some() { + consecutive_failures = 0; + } else { + consecutive_failures = consecutive_failures.saturating_add(1); + if consecutive_failures == FAILURE_WARNING_INTERVAL { + tracing::warn!( + target: "rollup_node::signer_rotation", + failures = consecutive_failures, + "authorized-signer polling is repeatedly failing; watchdog remains fail-open" + ); + consecutive_failures = 0; + } + } + + if detector.baseline.is_none() { + if let Some(baseline) = observation { + tracing::info!( + target: "rollup_node::signer_rotation", + %baseline, + %system_contract, + "authorized-signer watchdog baseline established" + ); + if baseline == Address::ZERO { + tracing::warn!( + target: "rollup_node::signer_rotation", + %system_contract, + "authorized-signer watchdog baseline is zero; verify the L1 URL and sync state if unexpected" + ); + } + } + } + + if let Some(rotation) = detector.observe(observation) { + return rotation; + } + + tokio::time::sleep(DEFAULT_POLL_INTERVAL).await; + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + const SIGNER_A: Address = Address::new([0x11; 20]); + const SIGNER_B: Address = Address::new([0x22; 20]); + const SIGNER_C: Address = Address::new([0x33; 20]); + + #[test] + fn stable_value_never_confirms_rotation() { + let mut detector = RotationDetector::new(3); + + for _ in 0..100 { + assert_eq!(detector.observe(Some(SIGNER_A)), None); + } + } + + #[test] + fn clean_rotation_fires_after_exact_confirmation_count() { + let mut detector = RotationDetector::new(3); + + assert_eq!(detector.observe(Some(SIGNER_A)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!( + detector.observe(Some(SIGNER_B)), + Some(Rotation { baseline: SIGNER_A, observed: SIGNER_B }) + ); + } + + #[test] + fn returning_to_baseline_resets_candidate_streak() { + let mut detector = RotationDetector::new(3); + + assert_eq!(detector.observe(Some(SIGNER_A)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(Some(SIGNER_A)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + } + + #[test] + fn switching_candidate_resets_confirmation_streak() { + let mut detector = RotationDetector::new(3); + + assert_eq!(detector.observe(Some(SIGNER_A)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(Some(SIGNER_C)), None); + assert_eq!(detector.observe(Some(SIGNER_C)), None); + assert_eq!( + detector.observe(Some(SIGNER_C)), + Some(Rotation { baseline: SIGNER_A, observed: SIGNER_C }) + ); + } + + #[test] + fn read_failures_do_not_change_confirmation_state() { + let mut detector = RotationDetector::new(3); + + assert_eq!(detector.observe(None), None); + assert_eq!(detector.observe(Some(SIGNER_A)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(None), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!(detector.observe(None), None); + assert_eq!( + detector.observe(Some(SIGNER_B)), + Some(Rotation { baseline: SIGNER_A, observed: SIGNER_B }) + ); + } + + #[test] + fn zero_address_is_valid_as_baseline_and_observed_signer() { + let mut from_zero = RotationDetector::new(2); + assert_eq!(from_zero.observe(Some(Address::ZERO)), None); + assert_eq!(from_zero.observe(Some(SIGNER_A)), None); + assert_eq!( + from_zero.observe(Some(SIGNER_A)), + Some(Rotation { baseline: Address::ZERO, observed: SIGNER_A }) + ); + + let mut to_zero = RotationDetector::new(2); + assert_eq!(to_zero.observe(Some(SIGNER_A)), None); + assert_eq!(to_zero.observe(Some(Address::ZERO)), None); + assert_eq!( + to_zero.observe(Some(Address::ZERO)), + Some(Rotation { baseline: SIGNER_A, observed: Address::ZERO }) + ); + } + + #[test] + fn one_confirmation_fires_on_first_changed_value() { + let mut detector = RotationDetector::new(1); + + assert_eq!(detector.observe(Some(SIGNER_A)), None); + assert_eq!( + detector.observe(Some(SIGNER_B)), + Some(Rotation { baseline: SIGNER_A, observed: SIGNER_B }) + ); + } + + #[test] + fn first_successful_read_after_failures_establishes_baseline() { + let mut detector = RotationDetector::new(2); + + assert_eq!(detector.observe(None), None); + assert_eq!(detector.observe(None), None); + assert_eq!(detector.observe(Some(SIGNER_A)), None); + assert_eq!(detector.observe(Some(SIGNER_B)), None); + assert_eq!( + detector.observe(Some(SIGNER_B)), + Some(Rotation { baseline: SIGNER_A, observed: SIGNER_B }) + ); + } +} diff --git a/crates/node/src/test_utils/block_builder.rs b/crates/node/src/test_utils/block_builder.rs index 8b9a88931..b7989fde9 100644 --- a/crates/node/src/test_utils/block_builder.rs +++ b/crates/node/src/test_utils/block_builder.rs @@ -4,9 +4,9 @@ use super::fixture::TestFixture; use crate::test_utils::EventAssertions; use alloy_primitives::B256; +use dogeos_protocol_types::ScrollTransaction; +use dogeos_reth_primitives::DogeosBlock; use reth_primitives_traits::transaction::TxHashRef; -use reth_scroll_primitives::ScrollBlock; -use scroll_alloy_consensus::ScrollTransaction; /// Builder for constructing and validating blocks in tests. #[derive(Debug)] @@ -91,7 +91,7 @@ impl<'a> BlockBuilder<'a> { } /// Build the block and validate against expectations. - pub async fn build_and_await_block(self) -> eyre::Result { + pub async fn build_and_await_block(self) -> eyre::Result { let sequencer_node = self.fixture.nodes[0].as_ref().expect("sequencer node has been shutdown"); @@ -124,7 +124,7 @@ impl<'a> BlockBuilder<'a> { } /// Validate the block against expectations. - fn validate_block(self, block: &ScrollBlock) -> eyre::Result { + fn validate_block(self, block: &DogeosBlock) -> eyre::Result { // Check transaction count if let Some(expected_count) = self.expected_tx_count { if block.body.transactions.len() != expected_count { diff --git a/crates/node/src/test_utils/event_utils.rs b/crates/node/src/test_utils/event_utils.rs index 931dc8041..f9066a0a8 100644 --- a/crates/node/src/test_utils/event_utils.rs +++ b/crates/node/src/test_utils/event_utils.rs @@ -3,8 +3,8 @@ use super::fixture::TestFixture; use std::time::Duration; +use dogeos_reth_primitives::DogeosBlock; use futures::{FutureExt, StreamExt}; -use reth_scroll_primitives::ScrollBlock; use rollup_node_chain_orchestrator::ChainOrchestratorEvent; use rollup_node_primitives::ChainImport; use tokio::time::timeout; @@ -33,7 +33,7 @@ impl<'a> EventWaiter<'a> { } /// Wait for block sequenced event on all specified nodes. - pub async fn block_sequenced(self, target: u64) -> eyre::Result { + pub async fn block_sequenced(self, target: u64) -> eyre::Result { self.wait_for_event_on_all(|e| { if let ChainOrchestratorEvent::BlockSequenced(block) = e { (block.header.number == target).then(|| block.clone()) @@ -196,7 +196,7 @@ impl<'a> EventWaiter<'a> { } /// Wait for new block received event on all specified nodes. - pub async fn new_block_received(self) -> eyre::Result { + pub async fn new_block_received(self) -> eyre::Result { self.wait_for_event_on_all(|e| { if let ChainOrchestratorEvent::NewBlockReceived(block_with_peer) = e { Some(block_with_peer.block.clone()) diff --git a/crates/node/src/test_utils/fixture.rs b/crates/node/src/test_utils/fixture.rs index 58e60a5e7..7a7323a5e 100644 --- a/crates/node/src/test_utils/fixture.rs +++ b/crates/node/src/test_utils/fixture.rs @@ -5,13 +5,14 @@ use super::{ }; use crate::{ constants, BlobProviderArgs, ChainOrchestratorArgs, ConsensusAlgorithm, ConsensusArgs, - EngineDriverArgs, L1ProviderArgs, PprofArgs, RollupNodeDatabaseArgs, + DogeosChainSpecParser, EngineDriverArgs, L1ProviderArgs, PprofArgs, RollupNodeDatabaseArgs, RollupNodeGasPriceOracleArgs, RollupNodeNetworkArgs, RpcArgs, ScrollRollupNode, ScrollRollupNodeConfig, SequencerArgs, SignerArgs, TestArgs, }; use alloy_eips::BlockNumberOrTag; use alloy_network::Ethereum; +use alloy_node_bindings::{Anvil, AnvilInstance}; use alloy_primitives::Address; use alloy_provider::{ext::AnvilApi, layers::CacheLayer, Provider, ProviderBuilder}; use alloy_rpc_client::RpcClient; @@ -19,7 +20,10 @@ use alloy_rpc_types_anvil::ReorgOptions; use alloy_rpc_types_eth::Block; use alloy_signer_local::PrivateKeySigner; use alloy_transport::layers::RetryBackoffLayer; -use reth_chainspec::EthChainSpec; +use dogeos_chainspec::{DogeosChainSpec, DOGEOS_DEV}; +use dogeos_protocol_types::ScrollPooledTransaction; +use dogeos_reth_primitives::DogeosPrimitives; +use dogeos_rpc_types::ScrollRpcTransaction; use reth_cli::chainspec::ChainSpecParser; use reth_e2e_test_utils::{wallet::Wallet, NodeHelperType, TmpDB}; use reth_eth_wire_types::BasicNetworkPrimitives; @@ -30,22 +34,16 @@ use reth_node_builder::NodeTypes; use reth_node_core::exit::NodeExitFuture; use reth_node_types::NodeTypesWithDBAdapter; use reth_provider::providers::BlockchainProvider; -use reth_scroll_chainspec::{ScrollChainSpec, SCROLL_DEV}; -use reth_scroll_cli::ScrollChainSpecParser; -use reth_scroll_primitives::ScrollPrimitives; -use reth_tasks::TaskManager; +use reth_tasks::TaskExecutor; use reth_tokio_util::EventStream; use rollup_node_chain_orchestrator::{ChainOrchestratorEvent, ChainOrchestratorHandle}; -use rollup_node_primitives::BlockInfo; use rollup_node_sequencer::L1MessageInclusionMode; -use scroll_alloy_consensus::ScrollPooledTransaction; -use scroll_alloy_provider::{ScrollAuthApiEngineClient, ScrollEngineApi}; -use scroll_alloy_rpc_types::Transaction; -use scroll_engine::{Engine, ForkchoiceState}; use std::{ + ffi::{OsStr, OsString}, fmt::{Debug, Formatter}, ops::{Deref, DerefMut}, - path::PathBuf, + path::{Path, PathBuf}, + process::Command, sync::Arc, }; use tokio::sync::Mutex; @@ -68,7 +66,9 @@ pub struct TestFixture { /// L1 provider for making L1 RPC calls (if connected to real L1). pub l1_provider: Option, /// Optional Anvil instance for L1 simulation. - pub anvil: Option, + /// + /// Owns the external `anvil` child process; dropping the fixture terminates it. + pub anvil: Option, /// The configuration for the nodes. pub config: ScrollRollupNodeConfig, /// Whether this fixture has a remote source node (always the last node). @@ -106,7 +106,7 @@ impl Drop for TestFixture { /// The network handle to the Scroll network. pub type ScrollNetworkHandle = - NetworkHandle>; + NetworkHandle>; /// The blockchain test provider. pub type TestBlockChainProvider = @@ -130,20 +130,23 @@ pub enum NodeType { pub struct ScrollNodeTestComponents { /// The node helper type for the test node. pub node: ScrollTestNode, - /// The task manager for the test node. - pub task_manager: TaskManager, + /// The task executor for the test node. + pub task_executor: TaskExecutor, /// The exit future for the test node. pub exit_future: NodeExitFuture, + /// Handle to the rollup manager launched alongside the Reth node. + pub rollup_manager_handle: ChainOrchestratorHandle, } impl ScrollNodeTestComponents { /// Create new test node components. pub async fn new( node: ScrollTestNode, - task_manager: TaskManager, + task_executor: TaskExecutor, exit_future: NodeExitFuture, + rollup_manager_handle: ChainOrchestratorHandle, ) -> Self { - Self { node, task_manager, exit_future } + Self { node, task_executor, exit_future, rollup_manager_handle } } } @@ -171,8 +174,6 @@ impl Deref for ScrollNodeTestComponents { pub struct NodeHandle { /// The underlying node context. pub node: ScrollNodeTestComponents, - /// Engine instance for this node. - pub engine: Engine>, /// Chain orchestrator listener. pub chain_orchestrator_rx: EventStream, /// Chain orchestrator handle. @@ -184,23 +185,12 @@ pub struct NodeHandle { impl NodeHandle { /// Create a new node handle. pub async fn new(node: ScrollNodeTestComponents, typ: NodeType) -> eyre::Result { - // Create engine for the node - let genesis_hash = node.inner.chain_spec().genesis_hash(); - let auth_client = node.inner.engine_http_client(); - let engine_client = Arc::new(ScrollAuthApiEngineClient::new(auth_client)) - as Arc; - let fcs = ForkchoiceState::new( - BlockInfo { hash: genesis_hash, number: 0 }, - Default::default(), - Default::default(), - ); - let engine = Engine::new(Arc::new(engine_client), fcs); - - let rollup_manager_handle = node.inner.add_ons_handle.rollup_manager_handle.clone(); - let chain_orchestrator_rx = - node.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await?; + // Block production drives the node through the rollup-manager handle, so the + // handle only needs to observe chain-orchestrator events. + let rollup_manager_handle = node.rollup_manager_handle.clone(); + let chain_orchestrator_rx = rollup_manager_handle.get_event_listener().await?; - Ok(Self { node, engine, chain_orchestrator_rx, rollup_manager_handle, typ }) + Ok(Self { node, chain_orchestrator_rx, rollup_manager_handle, typ }) } /// Returns true if this is a handle to the sequencer. @@ -223,7 +213,6 @@ impl Debug for NodeHandle { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.debug_struct("NodeHandle") .field("node", &"NodeHelper") - .field("engine", &"Box") .field("rollup_manager_handle", &self.rollup_manager_handle) .finish() } @@ -305,7 +294,7 @@ impl TestFixture { } /// Get the current (latest) block from a specific node. - pub async fn get_block(&self, node_index: usize) -> eyre::Result> { + pub async fn get_block(&self, node_index: usize) -> eyre::Result> { use reth_rpc_api::EthApiServer; let node = self.nodes[node_index] @@ -321,7 +310,7 @@ impl TestFixture { } /// Get the current (latest) block from the sequencer node. - pub async fn get_sequencer_block(&self) -> eyre::Result> { + pub async fn get_sequencer_block(&self) -> eyre::Result> { self.get_block(0).await } @@ -354,7 +343,7 @@ impl TestFixture { ); let client = RpcClient::builder() .layer(retry_layer) - .http(anvil.http_endpoint().parse().expect("failed to parse anvil http endpoint")); + .http(anvil.endpoint().parse().expect("failed to parse anvil http endpoint")); let cache_layer = CacheLayer::new(constants::L1_PROVIDER_CACHE_MAX_ITEMS); ProviderBuilder::new().layer(cache_layer).connect_client(client) }) @@ -569,7 +558,7 @@ impl TestFixtureBuilder { /// If the input is a file path (contains '/' or ends with '.json'), it will /// load the genesis from the file. pub fn with_chain(mut self, chain: &str) -> eyre::Result { - let chain_spec: Arc = ScrollChainSpecParser::parse(chain)?; + let chain_spec: Arc = DogeosChainSpecParser::parse(chain)?; self.chain_spec = Some(chain_spec); Ok(self) } @@ -735,7 +724,7 @@ impl TestFixtureBuilder { /// Build the test fixture. pub async fn build(mut self) -> eyre::Result { - let chain_spec = self.chain_spec.unwrap_or_else(|| SCROLL_DEV.clone()); + let chain_spec = self.chain_spec.unwrap_or_else(|| DOGEOS_DEV.clone()); // Start Anvil if requested let anvil = if self.anvil_config.enabled { @@ -744,12 +733,11 @@ impl TestFixtureBuilder { self.anvil_config.chain_id, self.anvil_config.block_time, self.anvil_config.slots_in_an_epoch, - ) - .await?; + )?; // Parse endpoint URL once and reuse let endpoint_url = handle - .http_endpoint() + .endpoint() .parse::() .map_err(|e| eyre::eyre!("Failed to parse Anvil endpoint URL: {}", e))?; @@ -831,37 +819,171 @@ impl TestFixtureBuilder { }) } - /// Spawn an Anvil instance with the given configuration. - async fn spawn_anvil( - state_path: Option<&std::path::Path>, + /// Spawn an external Anvil instance with the given configuration. + /// + /// The `anvil` executable is resolved from the [`ANVIL_BIN_ENV`] environment + /// variable, falling back to `anvil` on `PATH`. A compatibility preflight + /// (see [`check_anvil_version`]) runs before every spawn so that a missing or + /// mismatched binary produces an actionable error rather than an opaque test + /// failure. + fn spawn_anvil( + state_path: Option<&Path>, chain_id: Option, block_time: Option, slots_in_an_epoch: u64, - ) -> eyre::Result { - let mut config = anvil::NodeConfig { port: 0, ..Default::default() }; + ) -> eyre::Result { + let program = anvil_executable(); + preflight_anvil_version(&program)?; + + // Bind to an ephemeral port; `try_spawn` parses the real port from stdout. + let mut anvil = Anvil::new().path(program).port(0u16); if let Some(id) = chain_id { - config.chain_id = Some(id); + anvil = anvil.chain_id(id); } - // Configure block time if let Some(time) = block_time { - config.block_time = Some(std::time::Duration::from_secs(time)); + anvil = anvil.block_time(time); } - // Load state from file if provided + // Load the pre-populated L1 state (batch contracts, funded accounts) that the + // in-process backend previously deserialized via `SerializableState::load`. if let Some(path) = state_path { - let state = anvil::eth::backend::db::SerializableState::load(path).map_err(|e| { - eyre::eyre!("Failed to load Anvil state from {}: {:?}", path.display(), e) - })?; - tracing::info!("Loaded Anvil state from: {}", path.display()); - config.init_state = Some(state); + if !path.exists() { + return Err(eyre::eyre!("Anvil state file not found: {}", path.display())); + } + anvil = anvil.arg("--load-state").arg(path); + tracing::info!("Loading Anvil state from: {}", path.display()); } - config.slots_in_an_epoch = slots_in_an_epoch; + anvil = anvil.arg("--slots-in-an-epoch").arg(slots_in_an_epoch.to_string()); + + anvil.try_spawn().map_err(|e| eyre::eyre!("Failed to spawn Anvil: {e}")) + } +} + +/// Environment variable that overrides the `anvil` executable used by the L1 +/// integration-test fixture. When unset, `anvil` is resolved from `PATH`. +pub const ANVIL_BIN_ENV: &str = "ANVIL_BIN"; + +/// The commit that uniquely identifies the accepted Anvil build: the official +/// Foundry `v1.5.0` release. This is the definitive pin — the same source is +/// published both as the immutable `v1.5.0` tag (whose `--version` reports +/// `1.5.0-v1.5.0`) and via the mutable `stable` channel (`1.5.0-stable`), so the +/// version string is matched only by prefix. See `.github/assets/install_anvil.sh`. +const REQUIRED_ANVIL_COMMIT: &str = "1c57854462289b2e71ee7654cd6666217ed86ffd"; + +/// Version prefix the accepted release reports, ignoring the build-channel suffix. +const REQUIRED_ANVIL_VERSION_PREFIX: &str = "1.5.0"; + +/// Resolve the `anvil` executable, honoring the [`ANVIL_BIN_ENV`] override. +fn anvil_executable() -> OsString { + std::env::var_os(ANVIL_BIN_ENV).unwrap_or_else(|| OsString::from("anvil")) +} + +/// Run the Anvil compatibility preflight, returning an actionable error unless the +/// resolved binary reports the pinned version and commit. +fn preflight_anvil_version(program: &OsStr) -> eyre::Result<()> { + let output = Command::new(program).arg("--version").output().map_err(|e| { + eyre::eyre!( + "failed to execute Anvil binary `{}`: {e}\nInstall the pinned release with \ + .github/assets/install_anvil.sh and point {ANVIL_BIN_ENV} at it (or add `anvil` to PATH).", + program.to_string_lossy(), + ) + })?; + + if !output.status.success() { + return Err(eyre::eyre!( + "Anvil binary `{}` exited with {} for `--version`; stderr: {}", + program.to_string_lossy(), + output.status, + String::from_utf8_lossy(&output.stderr).trim(), + )); + } + + let stdout = String::from_utf8_lossy(&output.stdout); + check_anvil_version(&stdout).map_err(|e| { + eyre::eyre!( + "{e}\nresolved Anvil binary: `{}`\nInstall the pinned release with \ + .github/assets/install_anvil.sh and point {ANVIL_BIN_ENV} at it.", + program.to_string_lossy(), + ) + }) +} + +/// Verify that `anvil --version` output matches the pinned release. +/// +/// The commit is matched exactly; the version is matched by prefix because the same +/// build is published under different channel suffixes. The expected output begins +/// with two lines of the form: +/// +/// ```text +/// anvil Version: 1.5.0-v1.5.0 +/// Commit SHA: 1c57854462289b2e71ee7654cd6666217ed86ffd +/// ``` +fn check_anvil_version(version_output: &str) -> eyre::Result<()> { + let version = parse_version_field(version_output, "anvil Version:").ok_or_else(|| { + eyre::eyre!("could not find `anvil Version:` line in `anvil --version` output") + })?; + let commit = parse_version_field(version_output, "Commit SHA:").ok_or_else(|| { + eyre::eyre!("could not find `Commit SHA:` line in `anvil --version` output") + })?; + + if !version.starts_with(REQUIRED_ANVIL_VERSION_PREFIX) || commit != REQUIRED_ANVIL_COMMIT { + return Err(eyre::eyre!( + "incompatible Anvil: found version `{version}` commit `{commit}`, \ + require version `{REQUIRED_ANVIL_VERSION_PREFIX}*` commit `{REQUIRED_ANVIL_COMMIT}`", + )); + } + + Ok(()) +} + +/// Extract the trimmed value following `label` from the first matching line. +fn parse_version_field<'a>(output: &'a str, label: &str) -> Option<&'a str> { + output.lines().find_map(|line| line.trim().strip_prefix(label).map(str::trim)) +} + +#[cfg(test)] +mod tests { + use super::{check_anvil_version, REQUIRED_ANVIL_COMMIT}; + + fn version_output(version: &str, commit: &str) -> String { + format!( + "anvil Version: {version}\nCommit SHA: {commit}\nBuild Timestamp: \ + 2025-11-26T09:14:24.173470686Z\nBuild Profile: maxperf\n", + ) + } + + #[test] + fn accepts_tagged_release_suffix() { + // The immutable `v1.5.0` archive CI installs reports this suffix. + let output = version_output("1.5.0-v1.5.0", REQUIRED_ANVIL_COMMIT); + assert!(check_anvil_version(&output).is_ok()); + } + + #[test] + fn accepts_stable_channel_suffix() { + // A local `foundryup stable` build at the same commit reports this suffix. + let output = version_output("1.5.0-stable", REQUIRED_ANVIL_COMMIT); + assert!(check_anvil_version(&output).is_ok()); + } + + #[test] + fn rejects_wrong_version() { + let output = version_output("1.4.0-stable", REQUIRED_ANVIL_COMMIT); + assert!(check_anvil_version(&output).is_err()); + } + + #[test] + fn rejects_wrong_commit() { + let output = version_output("1.5.0-v1.5.0", "0000000000000000000000000000000000000000"); + assert!(check_anvil_version(&output).is_err()); + } - // Spawn Anvil and return the NodeHandle - let (_api, handle) = anvil::spawn(config).await; - Ok(handle) + #[test] + fn rejects_missing_fields() { + assert!(check_anvil_version("anvil 1.5.0\n").is_err()); + assert!(check_anvil_version("").is_err()); } } diff --git a/crates/node/src/test_utils/l1_helpers.rs b/crates/node/src/test_utils/l1_helpers.rs index 04d101686..96797bd30 100644 --- a/crates/node/src/test_utils/l1_helpers.rs +++ b/crates/node/src/test_utils/l1_helpers.rs @@ -4,9 +4,9 @@ use super::fixture::TestFixture; use std::{fmt::Debug, str::FromStr, sync::Arc}; use alloy_primitives::{Address, Bytes, B256, U256}; +use dogeos_protocol_types::TxL1Message; use rollup_node_primitives::{BatchCommitData, BlockInfo, ConsensusUpdate}; use rollup_node_watcher::L1Notification; -use scroll_alloy_consensus::TxL1Message; /// Helper for managing L1 interactions in tests. #[derive(Debug)] diff --git a/crates/node/src/test_utils/mod.rs b/crates/node/src/test_utils/mod.rs index 84b264db0..ea14a0038 100644 --- a/crates/node/src/test_utils/mod.rs +++ b/crates/node/src/test_utils/mod.rs @@ -90,20 +90,18 @@ use alloy_primitives::Bytes; use reth_chainspec::EthChainSpec; use reth_db::test_utils::create_test_rw_db_with_path; use reth_e2e_test_utils::{ - node::NodeTestContext, transaction::TransactionTestContext, wallet::Wallet, Adapter, - TmpNodeAddOnsHandle, TmpNodeEthApi, + node::NodeTestContext, transaction::TransactionTestContext, wallet::Wallet, }; -use reth_engine_local::LocalPayloadAttributesBuilder; use reth_node_builder::{ - rpc::RpcHandleProvider, EngineNodeLauncher, Node, NodeBuilder, NodeConfig, - NodeHandle as RethNodeHandle, NodeTypes, PayloadAttributesBuilder, PayloadTypes, TreeConfig, + EngineNodeLauncher, Node, NodeBuilder, NodeConfig, NodeHandle as RethNodeHandle, NodeTypes, + TreeConfig, }; use reth_node_core::args::{ DiscoveryArgs, NetworkArgs, PayloadBuilderArgs, RpcServerArgs, TxPoolArgs, }; use reth_provider::providers::BlockchainProvider; use reth_rpc_server_types::RpcModuleSelection; -use reth_tasks::TaskManager; +use reth_tasks::TaskExecutor; use rollup_node_sequencer::L1MessageInclusionMode; use std::sync::Arc; use tokio::sync::Mutex; @@ -125,15 +123,7 @@ pub async fn setup_engine( Vec, Vec>>, Wallet, -)> -where - LocalPayloadAttributesBuilder<::ChainSpec>: - PayloadAttributesBuilder< - <::Payload as PayloadTypes>::PayloadAttributes, - >, - TmpNodeAddOnsHandle: - RpcHandleProvider, TmpNodeEthApi>, -{ +)> { let network_config = NetworkArgs { discovery: DiscoveryArgs { disable_discovery: true, ..DiscoveryArgs::default() }, trusted_peers: trusted_peers.clone().unwrap_or_default(), @@ -166,7 +156,13 @@ where .with_rpc(RpcServerArgs::default().with_http().with_http_api(RpcModuleSelection::All)) .with_unused_ports() .set_dev(is_dev) - .with_txpool(TxPoolArgs { no_local_transactions_propagation, ..Default::default() }); + .with_txpool(TxPoolArgs { + no_local_transactions_propagation, + // Raise the per-account slot limit far above the reth default (16) so tests can + // queue many transactions from a single wallet without hitting the pool cap. + max_account_slots: 16_384, + ..Default::default() + }); // Check if we already have provided a database for a node (reboot scenario) let db = if let Some((_, provided_db)) = &reboot_info { @@ -212,16 +208,21 @@ where let span = span!(Level::INFO, "node", node_index); let _enter = span.enter(); - let task_manager = TaskManager::current(); + // Use the lightweight test runtime (2-thread tokio/rayon pools) rather than + // TaskExecutor::default(), which builds full CPU-sized pools per node. setup_engine + // creates one executor per node and the integration suite runs several multi-node + // fixtures in parallel, so default pools would allocate hundreds of threads on + // high-core CI runners. + let task_executor = TaskExecutor::test(); let testing_node = NodeBuilder::new(node_config.clone()) .with_database(db.clone()) - .with_launch_context(task_manager.executor()); + .with_launch_context(task_executor.clone()); let testing_config = testing_node.config().clone(); - let node = ScrollRollupNode::new(scroll_node_config.clone(), testing_config).await; + let rollup_node = ScrollRollupNode::new(scroll_node_config.clone(), testing_config).await; let RethNodeHandle { node, node_exit_future } = testing_node .with_types_and_provider::>() - .with_components(node.components_builder()) - .with_add_ons(node.add_ons()) + .with_components(rollup_node.components_builder()) + .with_add_ons(rollup_node.add_ons()) .launch_with_fn(|builder| { let tree_config = TreeConfig::default() .with_always_process_payload_attributes_on_canonical_head(true) @@ -235,6 +236,10 @@ where builder.launch_with(launcher) }) .await?; + let rollup_manager_handle = rollup_node + .rollup_manager_handle() + .cloned() + .ok_or_else(|| eyre::eyre!("rollup manager handle was not initialized"))?; let mut node = NodeTestContext::new(node, |_| panic!("should not build payloads using this method")) @@ -252,7 +257,13 @@ where } } - let node = ScrollNodeTestComponents::new(node, task_manager, node_exit_future).await; + let node = ScrollNodeTestComponents::new( + node, + task_executor, + node_exit_future, + rollup_manager_handle, + ) + .await; nodes.push(node); } @@ -263,7 +274,7 @@ where /// Generate a transfer transaction with the given wallet. pub async fn generate_tx(wallet: Arc>) -> Bytes { let mut wallet = wallet.lock().await; - let tx_fut = TransactionTestContext::transfer_tx_nonce_bytes( + let tx_fut = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet.chain_id, wallet.inner.clone(), wallet.inner_nonce, diff --git a/crates/node/src/test_utils/network_helpers.rs b/crates/node/src/test_utils/network_helpers.rs index 25dcbc62b..3721a9eb6 100644 --- a/crates/node/src/test_utils/network_helpers.rs +++ b/crates/node/src/test_utils/network_helpers.rs @@ -42,14 +42,14 @@ //! ```rust,ignore //! use rollup_node::test_utils::{TestFixture, NetworkHelpers}; //! use alloy_primitives::{Signature, U256}; -//! use reth_scroll_primitives::ScrollBlock; +//! use dogeos_reth_primitives::DogeosBlock; //! //! #[tokio::test] //! async fn test_block_announce() -> eyre::Result<()> { //! let mut fixture = TestFixture::sequencer().with_nodes(2).build().await?; //! //! // Create a block -//! let block = ScrollBlock::default(); +//! let block = DogeosBlock::default(); //! let signature = Signature::new(U256::from(1), U256::from(1), false); //! //! // Announce from node 0 @@ -61,8 +61,8 @@ use super::fixture::{ScrollNetworkHandle, TestFixture}; use alloy_primitives::Signature; +use dogeos_reth_primitives::DogeosBlock; use reth_network_api::{PeerId, PeerInfo, Peers}; -use reth_scroll_primitives::ScrollBlock; use std::time::Duration; use tokio::time; @@ -117,7 +117,7 @@ impl<'a> NetworkHelper<'a> { /// Announce a block from this node to the network. pub async fn announce_block( &self, - block: ScrollBlock, + block: DogeosBlock, signature: Signature, ) -> eyre::Result<()> { let handle = self.network_handle().await?; diff --git a/crates/node/src/test_utils/reboot.rs b/crates/node/src/test_utils/reboot.rs index e210e21e2..6c87395e1 100644 --- a/crates/node/src/test_utils/reboot.rs +++ b/crates/node/src/test_utils/reboot.rs @@ -30,21 +30,16 @@ impl TestFixture { } tracing::info!("Shutting down node at index {}", node_index); - let NodeHandle { - node, - engine: _, - mut chain_orchestrator_rx, - rollup_manager_handle: _r_h, - typ: _, - } = self - .nodes - .get_mut(node_index) - .and_then(|opt| opt.take()) - .expect("Node existence checked above"); - let ScrollNodeTestComponents { node, task_manager, exit_future } = node; - - tokio::task::spawn_blocking(|| { - if !task_manager.graceful_shutdown_with_timeout(Duration::from_secs(10)) { + let NodeHandle { node, mut chain_orchestrator_rx, rollup_manager_handle: _r_h, typ: _ } = + self.nodes + .get_mut(node_index) + .and_then(|opt| opt.take()) + .expect("Node existence checked above"); + let ScrollNodeTestComponents { node, task_executor, exit_future, rollup_manager_handle: _ } = + node; + + tokio::task::spawn_blocking(move || { + if !task_executor.graceful_shutdown_with_timeout(Duration::from_secs(10)) { return Err(eyre::eyre!("Failed to shutdown tasks within timeout")); } eyre::Ok(()) diff --git a/crates/node/src/test_utils/tx_helpers.rs b/crates/node/src/test_utils/tx_helpers.rs index 0a85afc2a..39bc18e0c 100644 --- a/crates/node/src/test_utils/tx_helpers.rs +++ b/crates/node/src/test_utils/tx_helpers.rs @@ -60,7 +60,7 @@ impl<'a> TransferTxBuilder<'a> { let mut wallet = self.tx_helper.fixture.wallet.lock().await; // Generate the transaction - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet.chain_id, wallet.inner.clone(), wallet.inner_nonce, @@ -85,7 +85,7 @@ impl<'a> TransferTxBuilder<'a> { pub async fn build(self) -> eyre::Result { let mut wallet = self.tx_helper.fixture.wallet.lock().await; - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet.chain_id, wallet.inner.clone(), wallet.inner_nonce, diff --git a/crates/node/tests/e2e.rs b/crates/node/tests/e2e.rs index 32eaf5f12..479785cd8 100644 --- a/crates/node/tests/e2e.rs +++ b/crates/node/tests/e2e.rs @@ -4,14 +4,14 @@ use alloy_eips::BlockNumberOrTag; use alloy_primitives::{address, b256, Address, Bytes, Signature, B256, U256}; use alloy_signer::Signer; use alloy_signer_local::PrivateKeySigner; +use alloy_sol_types::SolCall; +use dogeos_chainspec::{DogeosChainSpec, DOGEOS_CHIKYU, DOGEOS_DEV, DOGEOS_MAINNET}; +use dogeos_hardforks::{DogeosHardfork, ForkCondition}; +use dogeos_reth_primitives::DogeosBlock; use futures::{task::noop_waker_ref, FutureExt, StreamExt}; use reth_chainspec::EthChainSpec; use reth_network::{NetworkConfigBuilder, NetworkEventListenerProvider, PeersInfo}; -use reth_network_api::block::EthWireProvider; use reth_rpc_api::EthApiServer; -use reth_scroll_chainspec::{ScrollChainSpec, SCROLL_DEV, SCROLL_MAINNET, SCROLL_SEPOLIA}; -use reth_scroll_node::ScrollNetworkPrimitives; -use reth_scroll_primitives::ScrollBlock; use reth_storage_api::BlockReader; use reth_tasks::shutdown::signal as shutdown_signal; use reth_tokio_util::EventStream; @@ -25,10 +25,13 @@ use rollup_node::{ RollupNodeAdminApiClient, RollupNodeContext, }; use rollup_node_chain_orchestrator::{ChainOrchestratorEvent, SyncMode}; -use rollup_node_primitives::{sig_encode_hash, BatchCommitData, BlockInfo}; +use rollup_node_primitives::{sig_encode_hash, BatchCommitData, BatchStatus, BlockInfo}; use rollup_node_watcher::L1Notification; -use scroll_db::{test_utils::setup_test_db, L1MessageKey}; -use scroll_network::NewBlockWithPeer; +use scroll_db::{ + test_utils::setup_test_db, DatabaseReadOperations, DatabaseWriteOperations, L1MessageKey, +}; +use scroll_l1::abi::calls::commitBatchCall; +use scroll_network::{DogeosNetworkPrimitives, NewBlockWithPeer, ETH_WIRE_BLOCK_CHANNEL_SIZE}; use scroll_wire::{ScrollWireConfig, ScrollWireProtocolHandler}; use std::{ future::Future, @@ -133,7 +136,7 @@ async fn can_penalize_peer_for_invalid_block() -> eyre::Result<()> { fixture.check_reputation_on(1).of_node(0).await?.equals(0).await?; // Create invalid block - let mut block = ScrollBlock::default(); + let mut block = DogeosBlock::default(); block.header.number = 1; block.header.parent_hash = fixture.chain_spec.genesis_header.hash(); @@ -174,7 +177,7 @@ async fn can_penalize_peer_for_invalid_block() -> eyre::Result<()> { async fn can_penalize_peer_for_invalid_signature() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let chain_spec = (*SCROLL_DEV).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); // Create two signers - one authorized and one unauthorized let authorized_signer = PrivateKeySigner::random().with_chain_id(Some(chain_spec.chain().id())); @@ -389,7 +392,7 @@ async fn can_forward_tx_to_sequencer() -> eyre::Result<()> { let mut follower_node_config = default_test_scroll_rollup_node_config(); // Create the chain spec for scroll mainnet with Euclid v2 activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); let (mut sequencer_node, _dbs, _wallet) = setup_engine(sequencer_node_config, 1, chain_spec.clone(), false, true, None, None) .await @@ -408,24 +411,14 @@ async fn can_forward_tx_to_sequencer() -> eyre::Result<()> { sequencer_node[0].network.next_session_established().await; // generate rollup node manager event streams for each node - let sequencer_rnm_handle = sequencer_node[0].inner.add_ons_handle.rollup_manager_handle.clone(); + let sequencer_rnm_handle = sequencer_node[0].rollup_manager_handle.clone(); let mut sequencer_events = sequencer_rnm_handle.get_event_listener().await.unwrap(); - let mut follower_events = follower_node[0] - .inner - .add_ons_handle - .rollup_manager_handle - .get_event_listener() - .await - .unwrap(); + let mut follower_events = + follower_node[0].rollup_manager_handle.get_event_listener().await.unwrap(); // Send a notification to set the L1 to synced - let sequencer_l1_watcher_mock = sequencer_node[0] - .inner - .add_ons_handle - .rollup_manager_handle - .l1_watcher_mock - .clone() - .unwrap(); + let sequencer_l1_watcher_mock = + sequencer_node[0].rollup_manager_handle.l1_watcher_mock.clone().unwrap(); sequencer_l1_watcher_mock.notification_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); sequencer_events.next().await; sequencer_events.next().await; @@ -450,7 +443,15 @@ async fn can_forward_tx_to_sequencer() -> eyre::Result<()> { // inject a transaction into the pool of the follower node let tx = generate_tx(wallet).await; - follower_node[0].rpc.inject_tx(tx).await.unwrap(); + if let Err(e) = follower_node[0].rpc.inject_tx(tx).await { + // Tolerate the tx already being in the follower pool (it can arrive via gossip from the + // sequencer peer); re-raise anything else. + let msg = format!("{e:?}"); + assert!( + msg.contains("already known") || msg.contains("AlreadyImported"), + "failed to inject tx into follower pool: {msg}" + ); + } tokio::time::sleep(tokio::time::Duration::from_secs(10)).await; @@ -556,8 +557,10 @@ async fn can_sequence_and_gossip_transactions() -> eyre::Result<()> { async fn can_bridge_blocks() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // Create the chain spec for scroll dev with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); + // Signed legacy fixture is pre-Tsuki; retain DOGEOS_DEV genesis and Galileo rules. + let mut chain_spec = (**DOGEOS_DEV).clone(); + chain_spec.inner.hardforks.insert(DogeosHardfork::Tsuki, ForkCondition::Never); + let chain_spec = Arc::new(chain_spec); // Setup the bridge node and a standard node. let (mut nodes, _dbs, _wallet) = setup_engine( @@ -573,17 +576,19 @@ async fn can_bridge_blocks() -> eyre::Result<()> { let mut bridge_node = nodes.pop().unwrap(); let bridge_peer_id = bridge_node.network.record().id; let bridge_node_l1_watcher_tx = - bridge_node.inner.add_ons_handle.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); + bridge_node.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); // Send a notification to set the L1 to synced bridge_node_l1_watcher_tx.notification_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); // Instantiate the scroll NetworkManager. - let network_config = NetworkConfigBuilder::::with_rng_secret_key() - .disable_discovery() - .with_unused_listener_port() - .with_pow() - .build_with_noop_provider(chain_spec.clone()); + let network_config = NetworkConfigBuilder::::with_rng_secret_key( + bridge_node.task_executor.clone(), + ) + .disable_discovery() + .with_unused_listener_port() + .with_pow() + .build_with_noop_provider(chain_spec.clone()); let scroll_wire_config = ScrollWireConfig::new(true); let (scroll_network, scroll_network_handle) = scroll_network::ScrollNetworkManager::new( chain_spec.clone(), @@ -602,11 +607,13 @@ async fn can_bridge_blocks() -> eyre::Result<()> { bridge_node.network.next_session_established().await; // Create a standard NetworkManager to send blocks to the bridge node. - let network_config = NetworkConfigBuilder::::with_rng_secret_key() - .disable_discovery() - .with_pow() - .with_unused_listener_port() - .build_with_noop_provider(chain_spec); + let network_config = NetworkConfigBuilder::::with_rng_secret_key( + bridge_node.task_executor.clone(), + ) + .disable_discovery() + .with_pow() + .with_unused_listener_port() + .build_with_noop_provider(chain_spec); // Create the standard NetworkManager. let network = reth_network::NetworkManager::new(network_config) @@ -616,7 +623,7 @@ async fn can_bridge_blocks() -> eyre::Result<()> { let mut network_events = network_handle.event_listener(); // Spawn the standard NetworkManager. - bridge_node.task_manager.executor().spawn(network); + bridge_node.task_executor.spawn_task(network); // Connect the standard NetworkManager to the bridge node. bridge_node.network.add_peer(network_handle.local_node_record()).await; @@ -624,7 +631,7 @@ async fn can_bridge_blocks() -> eyre::Result<()> { let _ = network_events.next().await; // Send a block from the standard NetworkManager to the bridge node. - let mut block_1: reth_scroll_primitives::ScrollBlock = + let mut block_1: dogeos_reth_primitives::DogeosBlock = serde_json::from_str(include_str!("../assets/block.json")).unwrap(); // Compute the block hash while masking the extra data which isn't used in block hash @@ -665,7 +672,8 @@ async fn can_bridge_blocks() -> eyre::Result<()> { #[tokio::test] async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let chain_spec = (*SCROLL_MAINNET).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); + let genesis_timestamp = chain_spec.genesis_header().timestamp; // Launch a node let (mut nodes, _dbs, _wallet) = setup_engine( @@ -688,8 +696,13 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() .parse() .expect("valid url that will not be used as test batches use calldata")]); config.hydrate(node.inner.config.clone()).await?; + let database = config.database.clone().expect("hydrated config has a database"); let (_, events) = ScrollWireProtocolHandler::new(ScrollWireConfig::new(true)); + // Hold the ETH-wire block sender for as long as the orchestrator runs; dropping it would + // close the receiver the orchestrator polls. + let (_eth_wire_block_tx, eth_wire_block_rx) = + tokio::sync::mpsc::channel(ETH_WIRE_BLOCK_CHANNEL_SIZE); let (chain_orchestrator, handle) = config .clone() .build( @@ -701,20 +714,21 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() node.inner.task_executor.clone(), ), events, - node.inner.add_ons_handle.rpc_handle.rpc_server_handles.clone(), + eth_wire_block_rx, + node.inner.add_ons_handle.rpc_server_handles.clone(), ) .await?; // Spawn a task that constantly polls the rnm to make progress. let (signal, shutdown) = shutdown_signal(); - tokio::spawn(async { + let orchestrator_task = tokio::spawn(async { let (_signal, inner) = shutdown_signal(); let chain_orchestrator = chain_orchestrator.run_until_shutdown(inner); tokio::select! { biased; - _ = shutdown => {}, - _ = chain_orchestrator => {}, + _ = shutdown => Ok(()), + result = chain_orchestrator => result, } }); @@ -726,7 +740,7 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() // Load test batches let block_0_info = BlockInfo { number: 18318207, hash: B256::random() }; - let raw_calldata_0 = read_to_bytes("./tests/testdata/batch_0_calldata.bin")?; + let raw_calldata_0 = empty_batch_calldata(1, 4, genesis_timestamp + 1); let batch_0_data = BatchCommitData { hash: b256!("5AAEB6101A47FC16866E80D77FFE090B6A7B3CF7D988BE981646AB6AEDFA2C42"), index: 1, @@ -738,7 +752,7 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() reverted_block_number: None, }; let block_1_info = BlockInfo { number: 18318215, hash: B256::random() }; - let raw_calldata_1 = read_to_bytes("./tests/testdata/batch_1_calldata.bin")?; + let raw_calldata_1 = empty_batch_calldata(5, 53, genesis_timestamp + 2); let batch_1_data = BatchCommitData { hash: b256!("AA8181F04F8E305328A6117FA6BC13FA2093A3C4C990C5281DF95A1CB85CA18F"), index: 2, @@ -776,14 +790,21 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() // Lets iterate over all blocks expected to be derived from the first batch commit. let consolidation_outcome = loop { let event = rnm_events.next().await; - println!("Received event: {:?}", event); if let Some(ChainOrchestratorEvent::BatchConsolidated(consolidation_outcome)) = event { break consolidation_outcome; } }; assert_eq!(consolidation_outcome.blocks.len(), 4, "Expected 4 blocks to be consolidated"); - // Now we send the second batch commit and finalize it. + l1_notification_tx.notification_tx.send(Arc::new(L1Notification::Synced)).await?; + loop { + if matches!(rnm_events.next().await, Some(ChainOrchestratorEvent::ChainConsolidated { .. })) + { + break; + } + } + + // Start the second batch, then stop while its remote Engine effects are only partially applied. l1_notification_tx .notification_tx .send(Arc::new(L1Notification::BatchCommit { @@ -791,65 +812,57 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() data: batch_1_data.clone(), })) .await?; - l1_notification_tx - .notification_tx - .send(Arc::new(L1Notification::BatchFinalization { - hash: batch_1_data.hash, - index: batch_1_data.index, - block_info: block_1_info, - })) - .await?; - - // Lets finalize the second batch. - l1_notification_tx - .notification_tx - .send(Arc::new(L1Notification::Finalized(block_1_info.number))) - .await?; - - // The second batch commit contains 42 blocks (5-57), lets iterate until the rnm has - // consolidated up to block 40. - let mut i = 5; - let hash = loop { - let hash = loop { - if let Some(ChainOrchestratorEvent::BlockConsolidated(consolidation_outcome)) = - rnm_events.next().await - { - assert_eq!(consolidation_outcome.block_info().block_info.number, i); - break consolidation_outcome.block_info().block_info.hash; + let rpc = node.rpc.inner.eth_api(); + time::timeout(Duration::from_secs(10), async { + loop { + let latest = rpc + .block_by_number(BlockNumberOrTag::Latest, false) + .await? + .expect("latest block must exist") + .header + .number; + if latest >= 5 { + return Ok::<_, eyre::Report>(()) } - }; - if i == 40 { - break hash; + tokio::task::yield_now().await; } - i += 1; - }; - - // Fetch the safe and head block hashes from the EN. - let rpc = node.rpc.inner.eth_api(); - let safe_block_hash = - rpc.block_by_number(BlockNumberOrTag::Safe, false).await?.expect("safe block must exist"); - let head_block_hash = - rpc.block_by_number(BlockNumberOrTag::Latest, false).await?.expect("head block must exist"); + }) + .await + .expect("batch 2 must start building before shutdown")?; - // Assert that the safe block hash is the same as the hash of the last consolidated block. - assert_eq!( - safe_block_hash.header.hash, hash, - "Safe block hash does not match expected - hash" - ); - assert_eq!( - head_block_hash.header.hash, hash, - "Head block hash does not match - expected hash" - ); - - // Simulate a shutdown of the rollup node manager by dropping it. + // Stop the orchestrator and wait for it to release the database before rebuilding it. signal.fire(); drop(l1_notification_tx); drop(rnm_events); + orchestrator_task.await??; + let partial_head = rpc + .block_by_number(BlockNumberOrTag::Latest, false) + .await? + .expect("latest block must exist after shutdown") + .header + .number; + assert!( + (5..57).contains(&partial_head), + "shutdown must leave an actual partial batch-2 Engine head, got {partial_head}" + ); + time::timeout(Duration::from_secs(10), async { + loop { + if rpc.block_by_number(5.into(), false).await.ok().flatten().is_some() { + break; + } + tokio::task::yield_now().await; + } + }) + .await + .expect("the partial canonical chain must become queryable before restart"); + database.update_batch_status(batch_1_data.hash, BatchStatus::Processing).await?; + assert_eq!(database.get_l2_head_block_number().await?, 4); // Start the RNM again. let (_, events) = ScrollWireProtocolHandler::new(ScrollWireConfig::new(true)); + // Separately named sender for the restarted orchestrator, held for its lifetime. + let (_eth_wire_block_tx_restart, eth_wire_block_rx_restart) = + tokio::sync::mpsc::channel(ETH_WIRE_BLOCK_CHANNEL_SIZE); let (chain_orchestrator, handle) = config .clone() .build( @@ -861,63 +874,79 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() node.inner.task_executor.clone(), ), events, - node.inner.add_ons_handle.rpc_handle.rpc_server_handles.clone(), + eth_wire_block_rx_restart, + node.inner.add_ons_handle.rpc_server_handles.clone(), ) .await?; let l1_notification_tx = handle.l1_watcher_mock.clone().unwrap(); + assert_eq!( + database.get_batch_status_by_hash(batch_1_data.hash).await?, + Some(BatchStatus::Committed), + "startup must make the interrupted batch eligible for rediscovery" + ); // Spawn a task that constantly polls the rnm to make progress. - let (_signal, shutdown) = shutdown_signal(); - tokio::spawn(async { + let (restart_signal, shutdown) = shutdown_signal(); + let restarted_task = tokio::spawn(async { let (_signal, inner) = shutdown_signal(); let chain_orchestrator = chain_orchestrator.run_until_shutdown(inner); tokio::select! { biased; - _ = shutdown => {}, - _ = chain_orchestrator => {}, + _ = shutdown => Ok(()), + result = chain_orchestrator => result, } }); // Request an event stream from the rollup node manager. let mut rnm_events = handle.get_event_listener().await?; - // Send the second batch again to mimic the watcher behaviour. - let block_1_info = BlockInfo { number: 18318215, hash: B256::random() }; - l1_notification_tx - .notification_tx - .send(Arc::new(L1Notification::Finalized(block_1_info.number))) - .await?; - - // Lets fetch the first consolidated block event - this should be the first block of the batch. - let l2_block = loop { - if let Some(ChainOrchestratorEvent::BlockConsolidated(consolidation_outcome)) = - rnm_events.next().await - { - break consolidation_outcome.block_info().clone(); + let status_database = database.clone(); + let batch_hash = batch_1_data.hash; + let processing_observer = tokio::spawn(async move { + loop { + match status_database.get_batch_status_by_hash(batch_hash).await { + Ok(Some(BatchStatus::Processing)) => return true, + Ok(Some(BatchStatus::Consolidated)) | Err(_) => return false, + Ok(_) => tokio::task::yield_now().await, + } } - }; + }); - // One issue #273 is completed, we will again have safe blocks != finalized blocks, and this - // should be changed to 1. Assert that the consolidated block is the first block that was not - // previously processed of the batch. - assert_eq!( - l2_block.block_info.number, 41, - "Consolidated block number does not match expected number" - ); + l1_notification_tx.notification_tx.send(Arc::new(L1Notification::Synced)).await?; - // Lets now iterate over all remaining blocks expected to be derived from the second batch - // commit. - for i in 42..=57 { + let (recovered_blocks, recovered_outcome) = time::timeout(Duration::from_secs(10), async { + let mut recovered_blocks = Vec::new(); loop { - if let Some(ChainOrchestratorEvent::BlockConsolidated(consolidation_outcome)) = - rnm_events.next().await - { - assert!(consolidation_outcome.block_info().block_info.number == i); - break; + match rnm_events.next().await { + Some(ChainOrchestratorEvent::BlockConsolidated(outcome)) => { + recovered_blocks.push(outcome.block_info().block_info.number); + } + Some(ChainOrchestratorEvent::BatchConsolidated(outcome)) + if outcome.batch_info.index == batch_1_data.index => + { + break (recovered_blocks, outcome) + } + _ => {} } } - } + }) + .await + .expect("restart recovery must consolidate batch 2"); + + assert!(processing_observer.await?, "startup catch-up must mark the batch Processing"); + assert_eq!( + recovered_blocks, + (partial_head..=57).collect::>(), + "the matching partial head must be reused before building only the missing suffix" + ); + assert_eq!(recovered_outcome.blocks.len(), 53); + assert_eq!(recovered_outcome.target_status, BatchStatus::Consolidated); + assert_eq!( + database.get_batch_status_by_hash(batch_1_data.hash).await?, + Some(BatchStatus::Consolidated) + ); + assert_eq!(database.get_l2_head_block_number().await?, 57); let finalized_block = rpc .block_by_number(BlockNumberOrTag::Finalized, false) @@ -928,8 +957,8 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() let head_block = rpc.block_by_number(BlockNumberOrTag::Latest, false).await?.expect("head block must exist"); assert_eq!( - finalized_block.header.number, 57, - "Finalized block number should be 57 after all blocks are consolidated" + finalized_block.header.number, 4, + "restart recovery must not finalize an unfinalized batch" ); assert_eq!( safe_block.header.number, 57, @@ -940,6 +969,9 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() "Head block number should be 57 after all blocks are consolidated" ); + restart_signal.fire(); + restarted_task.await??; + Ok(()) } @@ -948,7 +980,7 @@ async fn shutdown_consolidates_most_recent_batch_on_startup() -> eyre::Result<() #[tokio::test] async fn graceful_shutdown_sets_fcs_to_latest_signed_block_in_db_on_start_up() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let chain_spec = (*SCROLL_DEV).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); // Create a config with a random signer. let mut config = default_sequencer_test_scroll_rollup_node_config(); @@ -968,6 +1000,10 @@ async fn graceful_shutdown_sets_fcs_to_latest_signed_block_in_db_on_start_up() - config.hydrate(node.inner.config.clone()).await?; let (_, events) = ScrollWireProtocolHandler::new(ScrollWireConfig::new(true)); + // Hold the ETH-wire block sender for as long as the orchestrator runs; dropping it would + // close the receiver the orchestrator polls. + let (_eth_wire_block_tx, eth_wire_block_rx) = + tokio::sync::mpsc::channel(ETH_WIRE_BLOCK_CHANNEL_SIZE); let (rnm, handle) = config .clone() .build( @@ -979,7 +1015,8 @@ async fn graceful_shutdown_sets_fcs_to_latest_signed_block_in_db_on_start_up() - node.inner.task_executor.clone(), ), events, - node.inner.add_ons_handle.rpc_handle.rpc_server_handles.clone(), + eth_wire_block_rx, + node.inner.add_ons_handle.rpc_server_handles.clone(), ) .await?; let (_signal, shutdown) = shutdown_signal(); @@ -1042,6 +1079,9 @@ async fn graceful_shutdown_sets_fcs_to_latest_signed_block_in_db_on_start_up() - // Start the RNM again. let (_, events) = ScrollWireProtocolHandler::new(ScrollWireConfig::new(true)); + // Separately named sender for the restarted orchestrator, held for its lifetime. + let (_eth_wire_block_tx_restart, eth_wire_block_rx_restart) = + tokio::sync::mpsc::channel(ETH_WIRE_BLOCK_CHANNEL_SIZE); let (rnm, handle) = config .clone() .build( @@ -1053,14 +1093,15 @@ async fn graceful_shutdown_sets_fcs_to_latest_signed_block_in_db_on_start_up() - node.inner.task_executor.clone(), ), events, - node.inner.add_ons_handle.rpc_handle.rpc_server_handles.clone(), + eth_wire_block_rx_restart, + node.inner.add_ons_handle.rpc_server_handles.clone(), ) .await?; // Launch the rnm in a task. tokio::spawn(async { let (_signal, inner) = shutdown_signal(); - rnm.run_until_shutdown(inner).await; + rnm.run_until_shutdown(inner).await.expect("restarted orchestrator must keep running"); }); // Check the fcs. @@ -1076,21 +1117,21 @@ async fn graceful_shutdown_sets_fcs_to_latest_signed_block_in_db_on_start_up() - async fn can_revert_to_l1_block() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // Create a follower test fixture using SCROLL_MAINNET chain spec let mut fixture = TestFixture::builder() .followers(1) - .with_chain_spec(SCROLL_MAINNET.clone()) + .with_chain_spec(DOGEOS_DEV.clone()) .with_memory_db() .build() .await?; + let genesis_timestamp = DOGEOS_DEV.genesis_header().timestamp; - // Load test batches + // In-family empty batches covering L2 1..=4 and 5..=57. let batch_0_block_info = BlockInfo { number: 18318207, hash: B256::random() }; - let raw_calldata_0 = read_to_bytes("./tests/testdata/batch_0_calldata.bin")?; + let raw_calldata_0 = empty_batch_calldata(1, 4, genesis_timestamp + 1); let batch_0_hash = b256!("5AAEB6101A47FC16866E80D77FFE090B6A7B3CF7D988BE981646AB6AEDFA2C42"); let batch_1_block_info = BlockInfo { number: 18318215, hash: B256::random() }; - let raw_calldata_1 = read_to_bytes("./tests/testdata/batch_1_calldata.bin")?; + let raw_calldata_1 = empty_batch_calldata(5, 53, genesis_timestamp + 2); let batch_1_hash = b256!("AA8181F04F8E305328A6117FA6BC13FA2093A3C4C990C5281DF95A1CB85CA18F"); // Send a Synced notification to the chain orchestrator @@ -1186,22 +1227,22 @@ async fn can_revert_to_l1_block() -> eyre::Result<()> { async fn consolidates_committed_batches_after_chain_consolidation() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // Create a follower test fixture using SCROLL_MAINNET chain spec let mut fixture = TestFixture::builder() .followers(1) - .with_chain_spec(SCROLL_MAINNET.clone()) + .with_chain_spec(DOGEOS_DEV.clone()) .with_memory_db() .build() .await?; + let genesis_timestamp = DOGEOS_DEV.genesis_header().timestamp; - // Load test batches + // In-family empty batches covering L2 1..=4 and 5..=57. let batch_0_block_info = BlockInfo { number: 18318207, hash: B256::random() }; - let raw_calldata_0 = read_to_bytes("./tests/testdata/batch_0_calldata.bin")?; + let raw_calldata_0 = empty_batch_calldata(1, 4, genesis_timestamp + 1); let batch_0_hash = b256!("5AAEB6101A47FC16866E80D77FFE090B6A7B3CF7D988BE981646AB6AEDFA2C42"); let batch_0_finalization_block_info = BlockInfo { number: 18318210, hash: B256::random() }; let batch_1_block_info = BlockInfo { number: 18318215, hash: B256::random() }; - let raw_calldata_1 = read_to_bytes("./tests/testdata/batch_1_calldata.bin")?; + let raw_calldata_1 = empty_batch_calldata(5, 53, genesis_timestamp + 2); let batch_1_hash = b256!("AA8181F04F8E305328A6117FA6BC13FA2093A3C4C990C5281DF95A1CB85CA18F"); let batch_1_finalization_block_info = BlockInfo { number: 18318220, hash: B256::random() }; @@ -1282,24 +1323,24 @@ async fn consolidates_committed_batches_after_chain_consolidation() -> eyre::Res async fn can_handle_batch_revert_with_reorg() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // Create a follower test fixture using SCROLL_MAINNET chain spec let mut fixture = TestFixture::builder() .followers(1) - .with_chain_spec(SCROLL_MAINNET.clone()) + .with_chain_spec(DOGEOS_DEV.clone()) .with_memory_db() .build() .await?; + let genesis_timestamp = DOGEOS_DEV.genesis_header().timestamp; // Send a Synced notification to the chain orchestrator fixture.l1().sync().await?; - // Load test batches + // In-family empty batches covering L2 1..=4 and 5..=57. let batch_0_block_info = BlockInfo { number: 18318207, hash: B256::random() }; - let raw_calldata_0 = read_to_bytes("./tests/testdata/batch_0_calldata.bin")?; + let raw_calldata_0 = empty_batch_calldata(1, 4, genesis_timestamp + 1); let batch_0_hash = b256!("5AAEB6101A47FC16866E80D77FFE090B6A7B3CF7D988BE981646AB6AEDFA2C42"); let batch_1_block_info = BlockInfo { number: 18318215, hash: B256::random() }; - let raw_calldata_1 = read_to_bytes("./tests/testdata/batch_1_calldata.bin")?; + let raw_calldata_1 = empty_batch_calldata(5, 53, genesis_timestamp + 2); let batch_1_hash = b256!("AA8181F04F8E305328A6117FA6BC13FA2093A3C4C990C5281DF95A1CB85CA18F"); let batch_1_revert_block_info = BlockInfo { number: 18318216, hash: B256::random() }; @@ -1658,9 +1699,9 @@ async fn test_custom_genesis_block_production_and_propagation() -> eyre::Result< let custom_genesis = serde_json::from_str(custom_genesis_json).expect("Custom genesis JSON should be valid"); - // Create a custom ScrollChainSpec using the from_custom_genesis method + // Create a custom DogeosChainSpec using the from_custom_genesis method // This simulates what would happen when using --chain flag with a custom file - let custom_chain_spec = Arc::new(ScrollChainSpec::from_custom_genesis(custom_genesis)); + let custom_chain_spec = Arc::new(DogeosChainSpec::from_custom_genesis(custom_genesis)); // Launch 2 nodes: node0=sequencer and node1=follower. let mut fixture = TestFixture::builder() @@ -1671,9 +1712,9 @@ async fn test_custom_genesis_block_production_and_propagation() -> eyre::Result< .await?; // Verify the genesis hash is different from all predefined networks - assert_ne!(custom_chain_spec.genesis_hash(), SCROLL_DEV.genesis_hash()); - assert_ne!(custom_chain_spec.genesis_hash(), SCROLL_SEPOLIA.genesis_hash()); - assert_ne!(custom_chain_spec.genesis_hash(), SCROLL_MAINNET.genesis_hash()); + assert_ne!(custom_chain_spec.genesis_hash(), DOGEOS_DEV.genesis_hash()); + assert_ne!(custom_chain_spec.genesis_hash(), DOGEOS_CHIKYU.genesis_hash()); + assert_ne!(custom_chain_spec.genesis_hash(), DOGEOS_MAINNET.genesis_hash()); // Verify both nodes start with the same genesis hash from the custom chain spec assert_eq!( @@ -1736,8 +1777,9 @@ async fn can_rpc_enable_disable_sequencing() -> eyre::Result<()> { fixture.l1().sync().await?; // Test that sequencing is initially enabled (blocks produced automatically) - tokio::time::sleep(Duration::from_millis(100)).await; - assert_ne!(fixture.get_sequencer_block().await?.header.number, 0, "Should produce blocks"); + fixture.expect_event().block_sequenced(1).await?; + let block_num = fixture.get_sequencer_block().await?.header.number; + assert_ne!(block_num, 0, "Should produce blocks"); // Disable automatic sequencing via RPC let client = fixture.sequencer().node.rpc_client().expect("Should have rpc client"); @@ -1906,28 +1948,31 @@ async fn can_reject_l2_block_with_unknown_l1_message() -> eyre::Result<()> { async fn can_gossip_over_eth_wire() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // Create the chain spec for scroll dev with Feynman activated and a test genesis. + // Create 2 nodes with scroll-wire disabled so blocks can only propagate over eth-wire. let mut fixture = TestFixture::builder() .sequencer() .followers(1) - .with_sequencer_auto_start(true) - .block_time(40) + .block_time(0) + .allow_empty_blocks(true) .with_scroll_wire(false) + .payload_building_duration(1000) .build() .await?; - // Set the L1 synced on the sequencer node to start block production. + // Set the L1 to synced on the sequencer node. fixture.l1().for_node(0).sync().await?; - fixture.expect_event().l1_synced().await?; + fixture.expect_event_on(0).l1_synced().await?; - let mut eth_wire_blocks = - fixture.follower(0).node.inner.network.eth_wire_block_listener().await?; + // Build a block on the sequencer. + let block = fixture.build_block().build_and_await_block().await?; - if let Some(block) = eth_wire_blocks.next().await { - println!("Received block from eth-wire network: {block:?}"); - } else { - panic!("Failed to receive block from eth-wire network"); - } + // The follower must receive the sequenced block over eth-wire and extend its chain. + let received = fixture.expect_event_on(1).new_block_received().await?; + fixture.expect_event_on(1).chain_extended(block.header.number).await?; + assert_eq!(received.header.hash_slow(), block.header.hash_slow()); + + // Assert the follower imported exactly the sequenced block. + assert_eq!(fixture.get_block(1).await?.header.hash_slow(), block.header.hash_slow()); Ok(()) } @@ -1938,7 +1983,7 @@ async fn signer_rotation() -> eyre::Result<()> { reth_tracing::init_test_tracing(); // Create the chain spec for scroll dev with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); // Create two signers. let signer_1 = PrivateKeySigner::random().with_chain_id(Some(chain_spec.chain().id())); @@ -2027,6 +2072,37 @@ pub fn read_to_bytes>(path: P) -> eyre::Result Ok(Bytes::from_str(&std::fs::read_to_string(path)?)?) } +/// Encodes one V0 calldata batch containing deterministic transaction-free blocks. +fn empty_batch_calldata(first_block: u64, block_count: u8, timestamp: u64) -> Bytes { + let mut parent_batch_header = Vec::with_capacity(89); + parent_batch_header.push(0); + parent_batch_header.extend_from_slice(&0u64.to_be_bytes()); + parent_batch_header.extend_from_slice(&0u64.to_be_bytes()); + parent_batch_header.extend_from_slice(&0u64.to_be_bytes()); + parent_batch_header.extend_from_slice(B256::ZERO.as_slice()); + parent_batch_header.extend_from_slice(B256::ZERO.as_slice()); + + let mut chunk = Vec::with_capacity(1 + usize::from(block_count) * 60); + chunk.push(block_count); + for number in first_block..first_block + u64::from(block_count) { + chunk.extend_from_slice(&number.to_be_bytes()); + chunk.extend_from_slice(×tamp.to_be_bytes()); + chunk.extend_from_slice(&U256::ZERO.to_be_bytes::<32>()); + chunk.extend_from_slice(&SCROLL_GAS_LIMIT.to_be_bytes()); + chunk.extend_from_slice(&0u16.to_be_bytes()); + chunk.extend_from_slice(&0u16.to_be_bytes()); + } + + commitBatchCall { + version: 0, + parent_batch_header: parent_batch_header.into(), + chunks: vec![chunk.into()], + skipped_l1_message_bitmap: Bytes::new(), + } + .abi_encode() + .into() +} + /// Waits for n events to be emitted. async fn wait_n_events( events: &mut EventStream, diff --git a/crates/node/tests/l1_data_fee_buffer.rs b/crates/node/tests/l1_data_fee_buffer.rs index e22894b3a..e63fcca81 100644 --- a/crates/node/tests/l1_data_fee_buffer.rs +++ b/crates/node/tests/l1_data_fee_buffer.rs @@ -5,20 +5,20 @@ use std::str::FromStr; use alloy_eips::eip2718::Encodable2718; use alloy_primitives::{private::rand::random_iter, Address, Bytes, TxKind, B256, U256}; use alloy_rpc_types_eth::{TransactionInput, TransactionRequest}; +use dogeos_chainspec::{DogeosChainSpecBuilder, ScrollChainConfig, DOGEOS_DEV}; +use dogeos_reth_evm::gas_price_oracle::L1_GAS_PRICE_ORACLE_ADDRESS; +use dogeos_rpc_types::ScrollTransactionRequest; use reth_chainspec::EthChainSpec; use reth_rpc_api::EthApiServer; use reth_rpc_eth_api::SignableTxRequest; -use reth_scroll_chainspec::{ScrollChainConfig, ScrollChainSpecBuilder, SCROLL_DEV}; use rollup_node::test_utils::TestFixture; -use scroll_alloy_evm::gas_price_oracle::L1_GAS_PRICE_ORACLE_ADDRESS; -use scroll_alloy_rpc_types::ScrollTransactionRequest; use std::sync::Arc; #[tokio::test] async fn test_l1_data_fee_buffer() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let mut genesis = SCROLL_DEV.genesis.clone(); + let mut genesis = DOGEOS_DEV.genesis.clone(); // Fund the genesis signer with a balance that will be: // - Sufficient for 1x L1 data fee @@ -41,13 +41,8 @@ async fn test_l1_data_fee_buffer() -> eyre::Result<()> { } // Build the chain spec with the modified genesis. - let chain_spec = Arc::new( - ScrollChainSpecBuilder::default() - .chain(SCROLL_DEV.chain()) - .genesis(genesis) - .with_forks(SCROLL_DEV.hardforks.clone()) - .build(ScrollChainConfig::dev()), - ); + let chain_spec = + Arc::new(DogeosChainSpecBuilder::dev().genesis(genesis).build(ScrollChainConfig::dev())); // Base test fixture builder (created twice since .build() consumes it) let base_fixture = || { diff --git a/crates/node/tests/sync.rs b/crates/node/tests/sync.rs index 3f3d21bbc..517519747 100644 --- a/crates/node/tests/sync.rs +++ b/crates/node/tests/sync.rs @@ -1,11 +1,12 @@ //! Contains tests related to RN and EN sync. use alloy_primitives::{b256, Address, B256, U256}; +use dogeos_chainspec::{DOGEOS_CHIKYU, DOGEOS_DEV}; +use dogeos_protocol_types::TxL1Message; use futures::StreamExt; use reqwest::Url; use reth_provider::{BlockIdReader, BlockReader}; use reth_rpc_eth_api::helpers::EthTransactions; -use reth_scroll_chainspec::{SCROLL_DEV, SCROLL_SEPOLIA}; use reth_tokio_util::EventStream; use rollup_node::{ test_utils::{ @@ -20,7 +21,6 @@ use rollup_node_chain_orchestrator::ChainOrchestratorEvent; use rollup_node_primitives::BlockInfo; use rollup_node_sequencer::L1MessageInclusionMode; use rollup_node_watcher::L1Notification; -use scroll_alloy_consensus::TxL1Message; use std::{path::PathBuf, sync::Arc}; #[tokio::test] @@ -42,6 +42,7 @@ async fn test_should_consolidate_to_block_15k() -> eyre::Result<()> { enable_scroll_wire: false, sequencer_url: None, signer_address: None, + legacy_geth_header_transform: false, }, database_args: RollupNodeDatabaseArgs::default(), chain_orchestrator_args: ChainOrchestratorArgs { @@ -82,7 +83,7 @@ async fn test_should_consolidate_to_block_15k() -> eyre::Result<()> { require_l1_data_fee_buffer: false, }; - let chain_spec = (*SCROLL_SEPOLIA).clone(); + let chain_spec = (*DOGEOS_CHIKYU).clone(); let (mut nodes, _dbs, _wallet) = setup_engine(node_config, 1, chain_spec.clone(), false, false, None, None).await?; let node = nodes.pop().unwrap(); @@ -555,7 +556,7 @@ async fn test_chain_orchestrator_l1_reorg() -> eyre::Result<()> { }; // Create the chain spec for scroll dev with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); // Create a sequencer node and an unsynced node. let (mut nodes, _dbs, _wallet) = setup_engine( @@ -570,19 +571,17 @@ async fn test_chain_orchestrator_l1_reorg() -> eyre::Result<()> { .await .unwrap(); let mut sequencer = nodes.pop().unwrap(); - let sequencer_handle = sequencer.inner.rollup_manager_handle.clone(); + let sequencer_handle = sequencer.rollup_manager_handle.clone(); let mut sequencer_events = sequencer_handle.get_event_listener().await?; - let sequencer_l1_watcher_tx = - sequencer.inner.add_ons_handle.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); + let sequencer_l1_watcher_tx = sequencer.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); let (mut nodes, _dbs, _wallet) = setup_engine(node_config.clone(), 1, chain_spec.clone(), false, false, None, None) .await .unwrap(); let mut follower = nodes.pop().unwrap(); - let mut follower_events = follower.inner.rollup_manager_handle.get_event_listener().await?; - let follower_l1_watcher_tx = - follower.inner.add_ons_handle.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); + let mut follower_events = follower.rollup_manager_handle.get_event_listener().await?; + let follower_l1_watcher_tx = follower.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); // Connect the nodes together. sequencer.connect(&mut follower).await; diff --git a/crates/node/tests/testdata/anvil_state.json b/crates/node/tests/testdata/anvil_state.json index f146320b7..b55c7abce 100644 --- a/crates/node/tests/testdata/anvil_state.json +++ b/crates/node/tests/testdata/anvil_state.json @@ -1 +1 @@ -{"block":{"number":"0x0","beneficiary":"0x0000000000000000000000000000000000000000","timestamp":"0x691f4a7e","gas_limit":30000000,"basefee":1000000000,"difficulty":"0x0","prevrandao":"0x914c95edd972548327a6ca062ad7f5c99f970383d9dab950cca537d508f48170","blob_excess_gas_and_price":{"excess_blob_gas":0,"blob_gasprice":1}},"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x5208","code":"0x","storage":{}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80636d46e98711610114578063b30b5010116100a9578063c1aa4e1911610079578063c1aa4e1914610557578063cd172b231461056a578063ea5f084f14610591578063eb43a133146105b0578063f2fde38b146105c3575f80fd5b8063b30b501014610516578063b571d3dd1461051e578063bd6f916b14610531578063bedb86fb14610544575f80fd5b80638da5cb5b116100e45780638da5cb5b146104c35780639bbaa2ba146104d45780639eee46a1146104e7578063aacb5fd61461050e575f80fd5b80636d46e9871461047d578063715018a61461049f57806371e96ddb146104a75780638a336231146104b0575f80fd5b80632571098d116101955780633fdeecb2116101655780633fdeecb2146104315780634030cf29146104445780635c975abb146104575780635cd8a76b146104625780636989ca7c1461046a575f80fd5b80632571098d1461039957806327dcaf6f146103b85780632b7ac3f3146103cb57806333d7e2bd1461040a575f80fd5b8063116a1f42116101d0578063116a1f421461032c5780631794bb3c146103525780631d49e457146103675780632362f03e1461037a575f80fd5b806303c7f4af14610201578063059def611461024557806306582acb146102675780630a245924146102fa575b5f80fd5b6102287f000000000000000000000000000000000000000000000000000000000008274f81565b6040516001600160401b0390911681526020015b60405180910390f35b60a154600160401b90046001600160401b03165b60405190815260200161023c565b60a1546102b1906001600160401b0380821691600160401b810490911690600160801b810463ffffffff1690600160a01b810460ff1690600160a81b90046001600160581b031685565b604080516001600160401b03968716815295909416602086015263ffffffff9092169284019290925260ff90911660608301526001600160581b0316608082015260a00161023c565b61031c610308366004612086565b609b6020525f908152604090205460ff1681565b604051901515815260200161023c565b61031c61033a3660046120a6565b60a154600160401b90046001600160401b0316101590565b6103656103603660046120bd565b6105d6565b005b610365610375366004612086565b6106db565b6102596103883660046120a6565b609d6020525f908152604090205481565b6102596103a73660046120a6565b609e6020525f908152604090205481565b6103656103c6366004612106565b610769565b6103f27f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750881565b6040516001600160a01b03909116815260200161023c565b6103f27f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b61036561043f3660046121a2565b610b6f565b6103656104523660046121e9565b610d46565b60655460ff1661031c565b610365610e66565b610365610478366004612086565b610fcf565b61031c61048b366004612086565b609a6020525f908152604090205460ff1681565b610365611025565b61025960a05481565b6103656104be366004612086565b611038565b6033546001600160a01b03166103f2565b6103656104e2366004612227565b6110bf565b6103f27f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61031c61112d565b61036561114c565b61036561052c366004612086565b6111d7565b61036561053f366004612257565b61122d565b6103656105523660046122ab565b611258565b6103656105653660046122ca565b611279565b6103f27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61025961059f3660046120a6565b609f6020525f908152604090205481565b6103656105be36600461234f565b611459565b6103656105d1366004612086565b6114b5565b5f54610100900460ff16158080156105f457505f54600160ff909116105b8061060d5750303b15801561060d57505f5460ff166001145b6106325760405162461bcd60e51b81526004016106299061239b565b60405180910390fd5b5f805460ff191660011790558015610653575f805461ff0019166101001790555b61065b61152b565b6097829055609980546001600160a01b038086166001600160a01b031992831617909255609880549287169290911691909117905580156106d5575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6106e3611559565b6001600160a01b0381163b1561070c57604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609b6020908152604091829020805460ff1916600190811790915591519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e91015b60405180910390a250565b33321415806107785750333b15155b156107965760405163d8127f5f60e01b815260040160405180910390fd5b6040805160a08101825260a1546001600160401b038082168352600160401b8204166020830152600160801b810463ffffffff1692820192909252600160a01b820460ff166060820152600160a81b9091046001600160581b031660808201526107fe61112d565b610b0a575f807f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e06001600160a01b031663fe3ec6d36040518163ffffffff1660e01b81526004016040805180830381865afa15801561085f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088391906123fb565b62ffffff16915062ffffff1691505f7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610912919061242c565b90504261091f8383612457565b108061093f57504283856040015163ffffffff1661093d9190612457565b105b15610aed57835f01516001600160401b031684602001516001600160401b03161015610a0f5783516001600160401b03165b84602001516001600160401b03168111156109ba575f818152609d602052604090205480156109a9575f828152609d60205260408120555b506109b38161246a565b9050610971565b50835f01516001600160401b0316846020015160016109d9919061247f565b6001600160401b03167f9ee73ead2e4d8c2933d5fb9be41cbdf5c477dcb07e441b4b082c6797e4b6fde360405160405180910390a35b610a22846060015160ff166001806115b3565b60ff16606085018190526020808601516001600160401b031680875260a180546040808a015160808b01516001600160801b03199093168517600160401b86021764ffffffffff60801b1916600160801b63ffffffff9092169190910260ff60a01b191617600160a01b909602959095176001600160a81b0316600160a81b6001600160581b0390921691909102179055825160018152918201527fd6756219c796b0d9bf065e40dcf1deea84ecb37744e35eb8ad8d89994bbfd0b5910160405180910390a1610b06565b604051634df567b960e01b815260040160405180910390fd5b5050505b5f610b1583806124a6565b604051610b239291906124e8565b60405180910390209050610b3a85858360016115d6565b610b68610b4784806124a6565b602086013560408701356060880135610b6360808a018a6124a6565b611767565b5050505050565b80610b8d5760405163f9a9465f60e01b815260040160405180910390fd5b5f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415610bd55760405163c22a199f60e01b815260040160405180910390fd5b5f80610be285855f611973565b5050915091505f610bf7836011015160c01c90565b600984015160c01c600185015160c01c855160f81c01010190508015610c305760405163f4f38de560e01b815260040160405180910390fd5b505f610c3d836019015190565b03610c5b576040516303d840a960e41b815260040160405180910390fd5b5f610c67836039015190565b14610c8557604051632781461960e11b815260040160405180910390fd5b5f8080527fc5dc36ae4e7617e4c4d23ddfcde33c79e9ed64c300aed766a9288a6b9b31f63d829055609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959788490556040518291907f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f908290a3604080518481525f60208201819052839290917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a35050505050565b610d4e611559565b60a1546001600160401b03165f80610d67858585611973565b5092505091506007610d7a835160f81c90565b1015610d995760405163bacd96e960e01b815260040160405180910390fd5b60a154600160401b90046001600160401b0316811015610dcc57604051632ad7756360e11b815260040160405180910390fd5b825b81811115610e0a575f818152609d60205260409020548015610df9575f828152609d60205260408120555b50610e038161246a565b9050610dce565b5082610e17826001612457565b6040517f9ee73ead2e4d8c2933d5fb9be41cbdf5c477dcb07e441b4b082c6797e4b6fde3905f90a360a1805467ffffffffffffffff19166001600160401b039290921691909117905550505050565b5f54600290610100900460ff16158015610e8657505f5460ff8083169116105b610ea25760405162461bcd60e51b81526004016106299061239b565b5f805461ffff191660ff831617610100179055609c5460015b8181015f908152609d602052604090205415610ed95760011b610ebb565b60011c5b8015610f06578181015f908152609d602052604090205415610efe57908101905b60011c610edd565b506040805160a0810182526001600160401b03928316808252609c5490931660208083018290524263ffffffff168385018190525f60608501819052608090940184905260a180546001600160801b031916909617600160401b909302929092176fffffffffffffffffffffffffffffffff16600160801b9092026001600160a01b031691909117909355805461ff00191690555160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498910160405180910390a150565b610fd7611559565b6001600160a01b0381165f818152609a60209081526040808320805460ff19169055519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161075e565b61102d611559565b6110365f611a83565b565b611040611559565b6001600160a01b0381163b1561106957604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609a6020908152604091829020805460ff1916600190811790915591519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161075e565b335f908152609a602052604090205460ff166110ee57604051631e6edd6f60e11b815260040160405180910390fd5b6110f6611ad4565b6110fe61112d565b1561111c576040516306dd1dd560e01b815260040160405180910390fd5b6111288383835f6115d6565b505050565b60a1545f9061114790600160a01b900460ff166001611b1a565b905090565b611154611559565b60a15461116d90600160a01b900460ff1660015f6115b3565b60a1805460ff92909216600160a01b0260ff60a01b1983168117909155604080515f81526001600160401b03928316929093169190911760208301527fd6756219c796b0d9bf065e40dcf1deea84ecb37744e35eb8ad8d89994bbfd0b591015b60405180910390a1565b6111df611559565b6001600160a01b0381165f818152609b60209081526040808320805460ff19169055519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e910161075e565b5f8061123a878786611b29565b5050925092505061124f81838787875f611c0b565b50505050505050565b611260611559565b80156112715761126e611d1d565b50565b61126e611d72565b335f908152609b602052604090205460ff166112a857604051637b263b1760e01b815260040160405180910390fd5b6112b0611ad4565b6112b861112d565b156112d6576040516306dd1dd560e01b815260040160405180910390fd5b60a154600160a01b900460ff165f6112ee8282611b1a565b90508061143f577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166327cc8d6e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611351573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611375919061242c565b7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b031663416bdfa16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f5919061242c565b14611413576040516322122a4760e11b815260040160405180910390fd5b61141f825f60016115b3565b60a1805460ff92909216600160a01b0260ff60a01b199092169190911790555b61144e89898989898989611767565b505050505050505050565b335f908152609b602052604090205460ff1661148857604051637b263b1760e01b815260040160405180910390fd5b611490611ad4565b5f805f61149e878787611b29565b509350935093505061124f82848388886001611c0b565b6114bd611559565b6001600160a01b0381166115225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610629565b61126e81611a83565b5f54610100900460ff166115515760405162461bcd60e51b8152600401610629906124f7565b611036611dab565b6033546001600160a01b031633146110365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610629565b6001821b8316909218915f81156115ce57826001901b841793505b509192915050565b60078460ff1610156115fb5760405163bacd96e960e01b815260040160405180910390fd5b60a1546001600160401b03165f818152609d602052604090205484146116345760405163150e0a2160e11b815260040160405180910390fd5b5f5b80498061166357815f0361165d57604051632974c17360e21b815260040160405180910390fd5b50611700565b61166e600184612457565b92505f611682604080516049810190915290565b9050611691818960ff16611dda565b60c084901b6001820152602981018790526009810182905260498120604051819086907f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f905f90a380975085156116ea57505050611700565b50505080806116f890612542565b915050611636565b508284146117315760405162daaebf60e11b8152600481018290526024810184905260448101859052606401610629565b5f818152609d6020526040902093909355505060a1805467ffffffffffffffff19166001600160401b0390921691909117905550565b5f805f806117768b8b8a611b29565b9450509350935093505f895f14611823576001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663c6172e1f6117c160018d61255a565b6040518263ffffffff1660e01b81526004016117df91815260200190565b602060405180830381865afa1580156117fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181e919061242c565b611825565b5f5b90505f7f000000000000000000000000000000000000000000000000000000000008274f82611854858761255a565b5f868152609e6020908152604080832054609d83529281902054905160c09690961b6001600160c01b03191691860191909152602885019390935260e09190911b6001600160e01b0319166048840152604c830152606c820152608c81018b905260ac810186905260cc81018a905260ec0160408051601f19818403018152908290526322a262c960e01b825291506001600160a01b037f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750816906322a262c99061192a90899088908d908d90889060040161256d565b5f6040518083038186803b158015611940575f80fd5b505afa158015611952573d5f803e3d5ffd5b5050505061196484868d8d8d5f611c0b565b50505050505050505050505050565b5f808080863560f81c818181036119985761198e8989611de1565b90965090506119cc565b600282116119aa5761198e8989611e5a565b600682116119bc5761198e8989611ecb565b6119c68989611f07565b90965090505b80862094506119df866001015160c01c90565b9350600682116119f457601186015160c01c92505b86841115611a155760405163113d34cf60e11b815260040160405180910390fd5b5f848152609d60205260409020548514801590611a5a57505f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415155b15611a785760405163150e0a2160e11b815260040160405180910390fd5b505093509350935093565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60655460ff16156110365760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610629565b600182821c8116145b92915050565b5f8080808085611b4c5760405163f9a9465f60e01b815260040160405180910390fd5b6040805160a08101825260a1546001600160401b03808216808452600160401b83049091166020840152600160801b820463ffffffff1693830193909352600160a01b810460ff166060830152600160a81b90046001600160581b03166080820152905f90611bbe908b908b90611973565b602086015192995090975095506001600160401b031693509050828511611bf85760405163092d315560e41b815260040160405180910390fd5b5160f81c99949850929650909450925050565b6040805160a08101825260a180546001600160401b03808216808552600160a01b80840460ff1660608701819052600160a81b8086046001600160581b031660808901819052948f166020808a0182905263ffffffff42168a8c018190526001600160801b0319909816909517600160401b9091021764ffffffffff60801b1916600160801b90960260ff60a01b1916959095179102176001600160a81b031691909202179091555f898152609e8252838120879055609f90915291909120839055611cd78583611f3a565b6040805185815260208101859052879189917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a350505050505050565b611d25611ad4565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d5a3390565b6040516001600160a01b0390911681526020016111cd565b611d7a612022565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611d5a565b5f54610100900460ff16611dd15760405162461bcd60e51b8152600401610629906124f7565b61103633611a83565b8082535050565b5f816059811015611e055760405163027f9c1f60e11b815260040160405180910390fd5b6040519150808483378082016040525f611e23836009015160c01c90565b905061010060ff8201046020026059018214611e525760405163c2110c9b60e01b815260040160405180910390fd5b509250929050565b5f816079811015611e7e5760405163a40ab48b60e01b815260040160405180910390fd5b6040519150808483378082016040525f611e9c836009015160c01c90565b905061010060ff8201046020026079018214611e5257604051630c1c91df60e21b815260040160405180910390fd5b5f8160c18114611eee576040516332496bf560e21b815260040160405180910390fd5b6040805160c181019091525b9150808483379250929050565b5f8160498114611f2a57604051632568f03f60e11b815260040160405180910390fd5b6040805160498101909152611efa565b811561201e578015611fbf57604051630e0143f560e21b8152600481018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b0316906338050fd4906024015f604051808303815f87803b158015611fa5575f80fd5b505af1158015611fb7573d5f803e3d5ffd5b505050505050565b604051630e0143f560e21b8152600481018390527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906338050fd4906024015f604051808303815f87803b158015611fa5575f80fd5b5050565b60655460ff166110365760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610629565b80356001600160a01b0381168114612081575f80fd5b919050565b5f60208284031215612096575f80fd5b61209f8261206b565b9392505050565b5f602082840312156120b6575f80fd5b5035919050565b5f805f606084860312156120cf575f80fd5b6120d88461206b565b92506120e66020850161206b565b9150604084013590509250925092565b803560ff81168114612081575f80fd5b5f805f60608486031215612118575f80fd5b612121846120f6565b92506020840135915060408401356001600160401b03811115612142575f80fd5b840160a08187031215612153575f80fd5b809150509250925092565b5f8083601f84011261216e575f80fd5b5081356001600160401b03811115612184575f80fd5b60208301915083602082850101111561219b575f80fd5b9250929050565b5f805f604084860312156121b4575f80fd5b83356001600160401b038111156121c9575f80fd5b6121d58682870161215e565b909790965060209590950135949350505050565b5f80602083850312156121fa575f80fd5b82356001600160401b0381111561220f575f80fd5b61221b8582860161215e565b90969095509350505050565b5f805f60608486031215612239575f80fd5b612242846120f6565b95602085013595506040909401359392505050565b5f805f805f6080868803121561226b575f80fd5b85356001600160401b03811115612280575f80fd5b61228c8882890161215e565b9099909850602088013597604081013597506060013595509350505050565b5f602082840312156122bb575f80fd5b8135801515811461209f575f80fd5b5f805f805f805f60a0888a0312156122e0575f80fd5b87356001600160401b03808211156122f6575f80fd5b6123028b838c0161215e565b909950975060208a0135965060408a0135955060608a0135945060808a013591508082111561232f575f80fd5b5061233c8a828b0161215e565b989b979a50959850939692959293505050565b5f805f8060608587031215612362575f80fd5b84356001600160401b03811115612377575f80fd5b6123838782880161215e565b90989097506020870135966040013595509350505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b805162ffffff81168114612081575f80fd5b5f806040838503121561240c575f80fd5b612415836123e9565b9150612423602084016123e9565b90509250929050565b5f6020828403121561243c575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611b2357611b23612443565b5f8161247857612478612443565b505f190190565b6001600160401b0381811683821601908082111561249f5761249f612443565b5092915050565b5f808335601e198436030181126124bb575f80fd5b8301803591506001600160401b038211156124d4575f80fd5b60200191503681900382131561219b575f80fd5b818382375f9101908152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f6001820161255357612553612443565b5060010190565b81810381811115611b2357611b23612443565b8581525f602086602084015260806040840152846080840152848660a08501375f60a08685010152601f1980601f870116840160a085820301606086015285518060a08301525f5b818110156125d15787810185015183820160c0015284016125b5565b505f60c0828401015260c083601f830116830101945050505050969550505050505056fea164736f6c6343000818000a","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000033":"0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x0000000000000000000000000000000000000000000000000000000000000097":"0x0000000000000000000000000000000000000000000000000000000000000064","0x0000000000000000000000000000000000000000000000000000000000000098":"0x000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9","0x0000000000000000000000000000000000000000000000000000000000000099":"0x0000000000000000000000009a676e781a523b5d0c0e43731313a708cb607508","0x000000000000000000000000000000000000000000000000000000000000009c":"0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000000000000000000000000000000000000000000a1":"0x00000000000000000000000068d4180000000000000000000000000000000000","0x35fc5993f6158720375840ee7e788ea393d23dd7e7b4b98143d0d76537902793":"0x0000000000000000000000000000000000000000000000000000000000000000","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x000000000000000000000000322813fd9a801c5507c9de605d63cea4f2ce6c44","0x386ca4caf6b5d029b6056a7ab8ca7941f9c6f68fcf59a75e75818295fb25dee7":"0x0000000000000000000000000000000000000000000000000000000000000001","0x519b983e2ba668682b54fa96c5e2c1964c3c7d3fcee5983542094edbf173fb79":"0x0000000000000000000000000000000000000000000000000000000000000001","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xf24c9b7a6e27fca79cc310b25760ddef32a28603":{"nonce":0,"balance":"0x0","code":"0x","storage":{}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":1,"balance":"0x21e19e0b6a140b55df8","code":"0x","storage":{}}},"best_block_number":0,"blocks":[{"header":{"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","miner":"0x0000000000000000000000000000000000000000","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","receiptsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","difficulty":"0x0","number":"0x0","gasLimit":"0x1c9c380","gasUsed":"0x0","timestamp":"0x691f4a7e","extraData":"0x","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","baseFeePerGas":"0x3b9aca00","withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","blobGasUsed":"0x0","excessBlobGas":"0x0","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"transactions":[],"ommers":[]}],"transactions":[{"info":{"transaction_hash":"0xeb645b5f887de12932af905f38216be1261ab6e86449eed4358f627eff19b3af","transaction_index":0,"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","to":"0xf24c9b7a6e27fca79cc310b25760ddef32a28603","contract_address":null,"traces":[{"parent":null,"children":[],"idx":0,"trace":{"depth":0,"success":true,"caller":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","address":"0xf24c9b7a6e27fca79cc310b25760ddef32a28603","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0x","output":"0x","gas_used":0,"gas_limit":0,"status":"Stop","steps":[],"decoded":null},"logs":[],"ordering":[]}],"exit":"Stop","out":"0x","nonce":0,"gas_used":21000},"receipt":{"type":"0x2","status":"0x1","cumulativeGasUsed":"0x5208","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},"block_hash":"0xa96a5f9cf080483d4ec9ee0e425805d232cdc0b77e8c07f8336838afff199cb6","block_number":0}],"historical_states":null} \ No newline at end of file +{"block":{"number":"0x0","beneficiary":"0x0000000000000000000000000000000000000000","timestamp":"0x691f4a7e","gas_limit":30000000,"basefee":1000000000,"difficulty":"0x0","prevrandao":"0x914c95edd972548327a6ca062ad7f5c99f970383d9dab950cca537d508f48170","blob_excess_gas_and_price":{"excess_blob_gas":0,"blob_gasprice":1}},"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x5208","code":"0x","storage":{}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80636d46e98711610114578063b30b5010116100a9578063c1aa4e1911610079578063c1aa4e1914610557578063cd172b231461056a578063ea5f084f14610591578063eb43a133146105b0578063f2fde38b146105c3575f80fd5b8063b30b501014610516578063b571d3dd1461051e578063bd6f916b14610531578063bedb86fb14610544575f80fd5b80638da5cb5b116100e45780638da5cb5b146104c35780639bbaa2ba146104d45780639eee46a1146104e7578063aacb5fd61461050e575f80fd5b80636d46e9871461047d578063715018a61461049f57806371e96ddb146104a75780638a336231146104b0575f80fd5b80632571098d116101955780633fdeecb2116101655780633fdeecb2146104315780634030cf29146104445780635c975abb146104575780635cd8a76b146104625780636989ca7c1461046a575f80fd5b80632571098d1461039957806327dcaf6f146103b85780632b7ac3f3146103cb57806333d7e2bd1461040a575f80fd5b8063116a1f42116101d0578063116a1f421461032c5780631794bb3c146103525780631d49e457146103675780632362f03e1461037a575f80fd5b806303c7f4af14610201578063059def611461024557806306582acb146102675780630a245924146102fa575b5f80fd5b6102287f000000000000000000000000000000000000000000000000000000000008274f81565b6040516001600160401b0390911681526020015b60405180910390f35b60a154600160401b90046001600160401b03165b60405190815260200161023c565b60a1546102b1906001600160401b0380821691600160401b810490911690600160801b810463ffffffff1690600160a01b810460ff1690600160a81b90046001600160581b031685565b604080516001600160401b03968716815295909416602086015263ffffffff9092169284019290925260ff90911660608301526001600160581b0316608082015260a00161023c565b61031c610308366004612086565b609b6020525f908152604090205460ff1681565b604051901515815260200161023c565b61031c61033a3660046120a6565b60a154600160401b90046001600160401b0316101590565b6103656103603660046120bd565b6105d6565b005b610365610375366004612086565b6106db565b6102596103883660046120a6565b609d6020525f908152604090205481565b6102596103a73660046120a6565b609e6020525f908152604090205481565b6103656103c6366004612106565b610769565b6103f27f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750881565b6040516001600160a01b03909116815260200161023c565b6103f27f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b61036561043f3660046121a2565b610b6f565b6103656104523660046121e9565b610d46565b60655460ff1661031c565b610365610e66565b610365610478366004612086565b610fcf565b61031c61048b366004612086565b609a6020525f908152604090205460ff1681565b610365611025565b61025960a05481565b6103656104be366004612086565b611038565b6033546001600160a01b03166103f2565b6103656104e2366004612227565b6110bf565b6103f27f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61031c61112d565b61036561114c565b61036561052c366004612086565b6111d7565b61036561053f366004612257565b61122d565b6103656105523660046122ab565b611258565b6103656105653660046122ca565b611279565b6103f27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61025961059f3660046120a6565b609f6020525f908152604090205481565b6103656105be36600461234f565b611459565b6103656105d1366004612086565b6114b5565b5f54610100900460ff16158080156105f457505f54600160ff909116105b8061060d5750303b15801561060d57505f5460ff166001145b6106325760405162461bcd60e51b81526004016106299061239b565b60405180910390fd5b5f805460ff191660011790558015610653575f805461ff0019166101001790555b61065b61152b565b6097829055609980546001600160a01b038086166001600160a01b031992831617909255609880549287169290911691909117905580156106d5575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6106e3611559565b6001600160a01b0381163b1561070c57604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609b6020908152604091829020805460ff1916600190811790915591519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e91015b60405180910390a250565b33321415806107785750333b15155b156107965760405163d8127f5f60e01b815260040160405180910390fd5b6040805160a08101825260a1546001600160401b038082168352600160401b8204166020830152600160801b810463ffffffff1692820192909252600160a01b820460ff166060820152600160a81b9091046001600160581b031660808201526107fe61112d565b610b0a575f807f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e06001600160a01b031663fe3ec6d36040518163ffffffff1660e01b81526004016040805180830381865afa15801561085f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088391906123fb565b62ffffff16915062ffffff1691505f7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610912919061242c565b90504261091f8383612457565b108061093f57504283856040015163ffffffff1661093d9190612457565b105b15610aed57835f01516001600160401b031684602001516001600160401b03161015610a0f5783516001600160401b03165b84602001516001600160401b03168111156109ba575f818152609d602052604090205480156109a9575f828152609d60205260408120555b506109b38161246a565b9050610971565b50835f01516001600160401b0316846020015160016109d9919061247f565b6001600160401b03167f9ee73ead2e4d8c2933d5fb9be41cbdf5c477dcb07e441b4b082c6797e4b6fde360405160405180910390a35b610a22846060015160ff166001806115b3565b60ff16606085018190526020808601516001600160401b031680875260a180546040808a015160808b01516001600160801b03199093168517600160401b86021764ffffffffff60801b1916600160801b63ffffffff9092169190910260ff60a01b191617600160a01b909602959095176001600160a81b0316600160a81b6001600160581b0390921691909102179055825160018152918201527fd6756219c796b0d9bf065e40dcf1deea84ecb37744e35eb8ad8d89994bbfd0b5910160405180910390a1610b06565b604051634df567b960e01b815260040160405180910390fd5b5050505b5f610b1583806124a6565b604051610b239291906124e8565b60405180910390209050610b3a85858360016115d6565b610b68610b4784806124a6565b602086013560408701356060880135610b6360808a018a6124a6565b611767565b5050505050565b80610b8d5760405163f9a9465f60e01b815260040160405180910390fd5b5f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415610bd55760405163c22a199f60e01b815260040160405180910390fd5b5f80610be285855f611973565b5050915091505f610bf7836011015160c01c90565b600984015160c01c600185015160c01c855160f81c01010190508015610c305760405163f4f38de560e01b815260040160405180910390fd5b505f610c3d836019015190565b03610c5b576040516303d840a960e41b815260040160405180910390fd5b5f610c67836039015190565b14610c8557604051632781461960e11b815260040160405180910390fd5b5f8080527fc5dc36ae4e7617e4c4d23ddfcde33c79e9ed64c300aed766a9288a6b9b31f63d829055609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959788490556040518291907f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f908290a3604080518481525f60208201819052839290917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a35050505050565b610d4e611559565b60a1546001600160401b03165f80610d67858585611973565b5092505091506007610d7a835160f81c90565b1015610d995760405163bacd96e960e01b815260040160405180910390fd5b60a154600160401b90046001600160401b0316811015610dcc57604051632ad7756360e11b815260040160405180910390fd5b825b81811115610e0a575f818152609d60205260409020548015610df9575f828152609d60205260408120555b50610e038161246a565b9050610dce565b5082610e17826001612457565b6040517f9ee73ead2e4d8c2933d5fb9be41cbdf5c477dcb07e441b4b082c6797e4b6fde3905f90a360a1805467ffffffffffffffff19166001600160401b039290921691909117905550505050565b5f54600290610100900460ff16158015610e8657505f5460ff8083169116105b610ea25760405162461bcd60e51b81526004016106299061239b565b5f805461ffff191660ff831617610100179055609c5460015b8181015f908152609d602052604090205415610ed95760011b610ebb565b60011c5b8015610f06578181015f908152609d602052604090205415610efe57908101905b60011c610edd565b506040805160a0810182526001600160401b03928316808252609c5490931660208083018290524263ffffffff168385018190525f60608501819052608090940184905260a180546001600160801b031916909617600160401b909302929092176fffffffffffffffffffffffffffffffff16600160801b9092026001600160a01b031691909117909355805461ff00191690555160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498910160405180910390a150565b610fd7611559565b6001600160a01b0381165f818152609a60209081526040808320805460ff19169055519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161075e565b61102d611559565b6110365f611a83565b565b611040611559565b6001600160a01b0381163b1561106957604051632c0fc2e160e11b815260040160405180910390fd5b6001600160a01b0381165f818152609a6020908152604091829020805460ff1916600190811790915591519182527f631cb110fbe6a87fba5414d6b2cff02264480535cd1f5abdbc4fa638bc0b5692910161075e565b335f908152609a602052604090205460ff166110ee57604051631e6edd6f60e11b815260040160405180910390fd5b6110f6611ad4565b6110fe61112d565b1561111c576040516306dd1dd560e01b815260040160405180910390fd5b6111288383835f6115d6565b505050565b60a1545f9061114790600160a01b900460ff166001611b1a565b905090565b611154611559565b60a15461116d90600160a01b900460ff1660015f6115b3565b60a1805460ff92909216600160a01b0260ff60a01b1983168117909155604080515f81526001600160401b03928316929093169190911760208301527fd6756219c796b0d9bf065e40dcf1deea84ecb37744e35eb8ad8d89994bbfd0b591015b60405180910390a1565b6111df611559565b6001600160a01b0381165f818152609b60209081526040808320805460ff19169055519182527f967f99d5d403870e4356ff46556df3a6b6ba1f50146639aaedfb9f248eb8661e910161075e565b5f8061123a878786611b29565b5050925092505061124f81838787875f611c0b565b50505050505050565b611260611559565b80156112715761126e611d1d565b50565b61126e611d72565b335f908152609b602052604090205460ff166112a857604051637b263b1760e01b815260040160405180910390fd5b6112b0611ad4565b6112b861112d565b156112d6576040516306dd1dd560e01b815260040160405180910390fd5b60a154600160a01b900460ff165f6112ee8282611b1a565b90508061143f577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166327cc8d6e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611351573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611375919061242c565b7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b031663416bdfa16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f5919061242c565b14611413576040516322122a4760e11b815260040160405180910390fd5b61141f825f60016115b3565b60a1805460ff92909216600160a01b0260ff60a01b199092169190911790555b61144e89898989898989611767565b505050505050505050565b335f908152609b602052604090205460ff1661148857604051637b263b1760e01b815260040160405180910390fd5b611490611ad4565b5f805f61149e878787611b29565b509350935093505061124f82848388886001611c0b565b6114bd611559565b6001600160a01b0381166115225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610629565b61126e81611a83565b5f54610100900460ff166115515760405162461bcd60e51b8152600401610629906124f7565b611036611dab565b6033546001600160a01b031633146110365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610629565b6001821b8316909218915f81156115ce57826001901b841793505b509192915050565b60078460ff1610156115fb5760405163bacd96e960e01b815260040160405180910390fd5b60a1546001600160401b03165f818152609d602052604090205484146116345760405163150e0a2160e11b815260040160405180910390fd5b5f5b80498061166357815f0361165d57604051632974c17360e21b815260040160405180910390fd5b50611700565b61166e600184612457565b92505f611682604080516049810190915290565b9050611691818960ff16611dda565b60c084901b6001820152602981018790526009810182905260498120604051819086907f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f905f90a380975085156116ea57505050611700565b50505080806116f890612542565b915050611636565b508284146117315760405162daaebf60e11b8152600481018290526024810184905260448101859052606401610629565b5f818152609d6020526040902093909355505060a1805467ffffffffffffffff19166001600160401b0390921691909117905550565b5f805f806117768b8b8a611b29565b9450509350935093505f895f14611823576001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663c6172e1f6117c160018d61255a565b6040518263ffffffff1660e01b81526004016117df91815260200190565b602060405180830381865afa1580156117fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181e919061242c565b611825565b5f5b90505f7f000000000000000000000000000000000000000000000000000000000008274f82611854858761255a565b5f868152609e6020908152604080832054609d83529281902054905160c09690961b6001600160c01b03191691860191909152602885019390935260e09190911b6001600160e01b0319166048840152604c830152606c820152608c81018b905260ac810186905260cc81018a905260ec0160408051601f19818403018152908290526322a262c960e01b825291506001600160a01b037f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750816906322a262c99061192a90899088908d908d90889060040161256d565b5f6040518083038186803b158015611940575f80fd5b505afa158015611952573d5f803e3d5ffd5b5050505061196484868d8d8d5f611c0b565b50505050505050505050505050565b5f808080863560f81c818181036119985761198e8989611de1565b90965090506119cc565b600282116119aa5761198e8989611e5a565b600682116119bc5761198e8989611ecb565b6119c68989611f07565b90965090505b80862094506119df866001015160c01c90565b9350600682116119f457601186015160c01c92505b86841115611a155760405163113d34cf60e11b815260040160405180910390fd5b5f848152609d60205260409020548514801590611a5a57505f8052609e6020527fedae58bba15aea52a58242ef195db2cc4de2b75de265dbb0d58482df22a959785415155b15611a785760405163150e0a2160e11b815260040160405180910390fd5b505093509350935093565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60655460ff16156110365760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610629565b600182821c8116145b92915050565b5f8080808085611b4c5760405163f9a9465f60e01b815260040160405180910390fd5b6040805160a08101825260a1546001600160401b03808216808452600160401b83049091166020840152600160801b820463ffffffff1693830193909352600160a01b810460ff166060830152600160a81b90046001600160581b03166080820152905f90611bbe908b908b90611973565b602086015192995090975095506001600160401b031693509050828511611bf85760405163092d315560e41b815260040160405180910390fd5b5160f81c99949850929650909450925050565b6040805160a08101825260a180546001600160401b03808216808552600160a01b80840460ff1660608701819052600160a81b8086046001600160581b031660808901819052948f166020808a0182905263ffffffff42168a8c018190526001600160801b0319909816909517600160401b9091021764ffffffffff60801b1916600160801b90960260ff60a01b1916959095179102176001600160a81b031691909202179091555f898152609e8252838120879055609f90915291909120839055611cd78583611f3a565b6040805185815260208101859052879189917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a350505050505050565b611d25611ad4565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d5a3390565b6040516001600160a01b0390911681526020016111cd565b611d7a612022565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611d5a565b5f54610100900460ff16611dd15760405162461bcd60e51b8152600401610629906124f7565b61103633611a83565b8082535050565b5f816059811015611e055760405163027f9c1f60e11b815260040160405180910390fd5b6040519150808483378082016040525f611e23836009015160c01c90565b905061010060ff8201046020026059018214611e525760405163c2110c9b60e01b815260040160405180910390fd5b509250929050565b5f816079811015611e7e5760405163a40ab48b60e01b815260040160405180910390fd5b6040519150808483378082016040525f611e9c836009015160c01c90565b905061010060ff8201046020026079018214611e5257604051630c1c91df60e21b815260040160405180910390fd5b5f8160c18114611eee576040516332496bf560e21b815260040160405180910390fd5b6040805160c181019091525b9150808483379250929050565b5f8160498114611f2a57604051632568f03f60e11b815260040160405180910390fd5b6040805160498101909152611efa565b811561201e578015611fbf57604051630e0143f560e21b8152600481018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b0316906338050fd4906024015f604051808303815f87803b158015611fa5575f80fd5b505af1158015611fb7573d5f803e3d5ffd5b505050505050565b604051630e0143f560e21b8152600481018390527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906338050fd4906024015f604051808303815f87803b158015611fa5575f80fd5b5050565b60655460ff166110365760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610629565b80356001600160a01b0381168114612081575f80fd5b919050565b5f60208284031215612096575f80fd5b61209f8261206b565b9392505050565b5f602082840312156120b6575f80fd5b5035919050565b5f805f606084860312156120cf575f80fd5b6120d88461206b565b92506120e66020850161206b565b9150604084013590509250925092565b803560ff81168114612081575f80fd5b5f805f60608486031215612118575f80fd5b612121846120f6565b92506020840135915060408401356001600160401b03811115612142575f80fd5b840160a08187031215612153575f80fd5b809150509250925092565b5f8083601f84011261216e575f80fd5b5081356001600160401b03811115612184575f80fd5b60208301915083602082850101111561219b575f80fd5b9250929050565b5f805f604084860312156121b4575f80fd5b83356001600160401b038111156121c9575f80fd5b6121d58682870161215e565b909790965060209590950135949350505050565b5f80602083850312156121fa575f80fd5b82356001600160401b0381111561220f575f80fd5b61221b8582860161215e565b90969095509350505050565b5f805f60608486031215612239575f80fd5b612242846120f6565b95602085013595506040909401359392505050565b5f805f805f6080868803121561226b575f80fd5b85356001600160401b03811115612280575f80fd5b61228c8882890161215e565b9099909850602088013597604081013597506060013595509350505050565b5f602082840312156122bb575f80fd5b8135801515811461209f575f80fd5b5f805f805f805f60a0888a0312156122e0575f80fd5b87356001600160401b03808211156122f6575f80fd5b6123028b838c0161215e565b909950975060208a0135965060408a0135955060608a0135945060808a013591508082111561232f575f80fd5b5061233c8a828b0161215e565b989b979a50959850939692959293505050565b5f805f8060608587031215612362575f80fd5b84356001600160401b03811115612377575f80fd5b6123838782880161215e565b90989097506020870135966040013595509350505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b805162ffffff81168114612081575f80fd5b5f806040838503121561240c575f80fd5b612415836123e9565b9150612423602084016123e9565b90509250929050565b5f6020828403121561243c575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611b2357611b23612443565b5f8161247857612478612443565b505f190190565b6001600160401b0381811683821601908082111561249f5761249f612443565b5092915050565b5f808335601e198436030181126124bb575f80fd5b8301803591506001600160401b038211156124d4575f80fd5b60200191503681900382131561219b575f80fd5b818382375f9101908152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f6001820161255357612553612443565b5060010190565b81810381811115611b2357611b23612443565b8581525f602086602084015260806040840152846080840152848660a08501375f60a08685010152601f1980601f870116840160a085820301606086015285518060a08301525f5b818110156125d15787810185015183820160c0015284016125b5565b505f60c0828401015260c083601f830116830101945050505050969550505050505056fea164736f6c6343000818000a","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000033":"0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x0000000000000000000000000000000000000000000000000000000000000097":"0x0000000000000000000000000000000000000000000000000000000000000064","0x0000000000000000000000000000000000000000000000000000000000000098":"0x000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9","0x0000000000000000000000000000000000000000000000000000000000000099":"0x0000000000000000000000009a676e781a523b5d0c0e43731313a708cb607508","0x000000000000000000000000000000000000000000000000000000000000009c":"0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000000000000000000000000000000000000000000a1":"0x00000000000000000000000068d4180000000000000000000000000000000000","0x35fc5993f6158720375840ee7e788ea393d23dd7e7b4b98143d0d76537902793":"0x0000000000000000000000000000000000000000000000000000000000000000","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x000000000000000000000000322813fd9a801c5507c9de605d63cea4f2ce6c44","0x386ca4caf6b5d029b6056a7ab8ca7941f9c6f68fcf59a75e75818295fb25dee7":"0x0000000000000000000000000000000000000000000000000000000000000001","0x519b983e2ba668682b54fa96c5e2c1964c3c7d3fcee5983542094edbf173fb79":"0x0000000000000000000000000000000000000000000000000000000000000001","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xf24c9b7a6e27fca79cc310b25760ddef32a28603":{"nonce":0,"balance":"0x0","code":"0x","storage":{}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":1,"balance":"0x21e19e0b6a140b55df8","code":"0x","storage":{}}},"best_block_number":0,"blocks":[{"header":{"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","miner":"0x0000000000000000000000000000000000000000","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","receiptsRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","difficulty":"0x0","number":"0x0","gasLimit":"0x1c9c380","gasUsed":"0x0","timestamp":"0x691f4a7e","extraData":"0x","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","baseFeePerGas":"0x3b9aca00","withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","blobGasUsed":"0x0","excessBlobGas":"0x0","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"transactions":[],"ommers":[]}],"transactions":[{"info":{"transaction_hash":"0xeb645b5f887de12932af905f38216be1261ab6e86449eed4358f627eff19b3af","transaction_index":0,"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","to":"0xf24c9b7a6e27fca79cc310b25760ddef32a28603","contract_address":null,"traces":[{"parent":null,"children":[],"idx":0,"trace":{"depth":0,"success":true,"caller":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","address":"0xf24c9b7a6e27fca79cc310b25760ddef32a28603","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0x","output":"0x","gas_used":0,"gas_refund_counter":0,"gas_limit":0,"status":"Stop","steps":[],"decoded":null},"logs":[],"ordering":[]}],"exit":"Stop","out":"0x","nonce":0,"gas_used":21000},"receipt":{"type":"0x2","status":"0x1","cumulativeGasUsed":"0x5208","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"},"block_hash":"0xa96a5f9cf080483d4ec9ee0e425805d232cdc0b77e8c07f8336838afff199cb6","block_number":0}],"historical_states":null} \ No newline at end of file diff --git a/crates/primitives/Cargo.toml b/crates/primitives/Cargo.toml index 15b819849..0f9de2fa0 100644 --- a/crates/primitives/Cargo.toml +++ b/crates/primitives/Cargo.toml @@ -19,14 +19,14 @@ alloy-rpc-types-engine.workspace = true alloy-rpc-types-eth.workspace = true # scroll -scroll-alloy-consensus.workspace = true -scroll-alloy-rpc-types-engine.workspace = true -reth-scroll-chainspec.workspace = true +dogeos-protocol-types.workspace = true +dogeos-reth-engine.workspace = true +dogeos-chainspec.workspace = true # reth reth-network-peers.workspace = true reth-primitives-traits.workspace = true -reth-scroll-primitives.workspace = true +dogeos-reth-primitives.workspace = true reth-chainspec.workspace = true reth-node-core.workspace = true @@ -41,16 +41,16 @@ default = ["std"] std = [ "alloy-primitives/std", "alloy-rpc-types-engine/std", - "scroll-alloy-consensus/std", + "dogeos-protocol-types/std", "derive_more/std", - "scroll-alloy-rpc-types-engine/std", + "dogeos-reth-engine/std", "alloy-eips/std", - "reth-scroll-primitives/std", + "dogeos-reth-primitives/std", "reth-primitives-traits/std", "alloy-consensus/std", "alloy-chains/std", "reth-chainspec/std", - "reth-scroll-chainspec/std", + "dogeos-chainspec/std", "reth-network-peers/std", "alloy-rpc-types-eth/std", ] @@ -58,11 +58,10 @@ arbitrary = [ "std", "dep:arbitrary", "alloy-primitives/arbitrary", - "scroll-alloy-consensus/arbitrary", + "dogeos-protocol-types/arbitrary", "alloy-eips/arbitrary", - "scroll-alloy-rpc-types-engine/arbitrary", - "reth-scroll-primitives/arbitrary", - "reth-scroll-primitives/std", + "dogeos-reth-primitives/std", + "dogeos-reth-primitives/arbitrary", "reth-primitives-traits/arbitrary", "alloy-consensus/arbitrary", "alloy-rpc-types-engine/arbitrary", @@ -77,8 +76,7 @@ serde = [ "alloy-primitives/serde", "alloy-rpc-types-engine/serde", "reth-primitives-traits/serde", - "reth-scroll-primitives/serde", - "scroll-alloy-consensus/serde", - "scroll-alloy-rpc-types-engine/serde", + "dogeos-reth-primitives/serde", + "dogeos-protocol-types/serde", "alloy-rpc-types-eth/serde", ] diff --git a/crates/primitives/src/attributes.rs b/crates/primitives/src/attributes.rs index c850f8c6c..79ed987c3 100644 --- a/crates/primitives/src/attributes.rs +++ b/crates/primitives/src/attributes.rs @@ -1,6 +1,6 @@ use crate::BatchInfo; -use scroll_alloy_rpc_types_engine::ScrollPayloadAttributes; +use dogeos_reth_engine::ScrollPayloadAttributes; /// The [`ScrollPayloadAttributes`] coupled with the batch information from which they originated. #[derive(Debug, Clone, Default, PartialEq, Eq)] diff --git a/crates/primitives/src/block.rs b/crates/primitives/src/block.rs index de5fe7b07..5919df540 100644 --- a/crates/primitives/src/block.rs +++ b/crates/primitives/src/block.rs @@ -9,8 +9,8 @@ use core::{ pin::Pin, task::{ready, Context, Poll}, }; -use reth_scroll_primitives::{ScrollBlock, ScrollTransactionSigned}; -use scroll_alloy_consensus::L1_MESSAGE_TRANSACTION_TYPE; +use dogeos_protocol_types::L1_MESSAGE_TRANSACTION_TYPE; +use dogeos_reth_primitives::{DogeosBlock, ScrollTransactionSigned}; use std::vec::Vec; /// The default block difficulty for a scroll block. @@ -81,8 +81,8 @@ impl From for BlockInfo { } } -impl From<&ScrollBlock> for BlockInfo { - fn from(value: &ScrollBlock) -> Self { +impl From<&DogeosBlock> for BlockInfo { + fn from(value: &DogeosBlock) -> Self { Self { number: value.number, hash: value.hash_slow() } } } @@ -195,8 +195,8 @@ pub struct L2BlockInfoWithL1Messages { pub l1_messages: Vec, } -impl From<&ScrollBlock> for L2BlockInfoWithL1Messages { - fn from(value: &ScrollBlock) -> Self { +impl From<&DogeosBlock> for L2BlockInfoWithL1Messages { + fn from(value: &DogeosBlock) -> Self { let block_number = value.number; let block_hash = value.hash_slow(); let l1_messages = value diff --git a/crates/primitives/src/chain.rs b/crates/primitives/src/chain.rs index 8deae40db..21358b588 100644 --- a/crates/primitives/src/chain.rs +++ b/crates/primitives/src/chain.rs @@ -1,7 +1,7 @@ use alloy_primitives::Signature; use alloy_rpc_types_engine::ForkchoiceUpdated; +use dogeos_reth_primitives::DogeosBlock; use reth_network_peers::PeerId; -use reth_scroll_primitives::ScrollBlock; use std::vec::Vec; /// A structure representing a chain import, which includes a vector of blocks, @@ -10,7 +10,7 @@ use std::vec::Vec; #[derive(Debug, Clone, PartialEq, Eq)] pub struct ChainImport { /// The blocks that are part of the chain import. - pub chain: Vec, + pub chain: Vec, /// The peer ID from which the blocks were received. pub peer_id: PeerId, /// The signature for the import of the chain tip. @@ -22,7 +22,7 @@ pub struct ChainImport { impl ChainImport { /// Creates a new `ChainImport` instance with the provided blocks, peer ID, and signature. pub const fn new( - blocks: Vec, + blocks: Vec, peer_id: PeerId, signature: Signature, result: ForkchoiceUpdated, diff --git a/crates/primitives/src/node/config.rs b/crates/primitives/src/node/config.rs index d0f09e201..d5a242f7e 100644 --- a/crates/primitives/src/node/config.rs +++ b/crates/primitives/src/node/config.rs @@ -1,8 +1,8 @@ use alloy_chains::NamedChain; use alloy_primitives::{address, Address}; +use dogeos_chainspec::{ChainConfig, ScrollChainConfig}; use reth_chainspec::EthChainSpec; use reth_node_core::primitives::BlockHeader; -use reth_scroll_chainspec::{ChainConfig, ScrollChainConfig}; /// The address of the Scroll Rollup contract on Mainnet. pub const MAINNET_ROLLUP_CONTRACT_ADDRESS: Address = diff --git a/crates/primitives/src/transaction.rs b/crates/primitives/src/transaction.rs index 2f899c0ef..dd7ffac67 100644 --- a/crates/primitives/src/transaction.rs +++ b/crates/primitives/src/transaction.rs @@ -1,5 +1,5 @@ use alloy_primitives::B256; -use scroll_alloy_consensus::TxL1Message; +use dogeos_protocol_types::TxL1Message; /// A L1 message envelope, containing extra information about the message. #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/crates/providers/Cargo.toml b/crates/providers/Cargo.toml index 6e349bab0..4ccba2d01 100644 --- a/crates/providers/Cargo.toml +++ b/crates/providers/Cargo.toml @@ -20,8 +20,8 @@ alloy-serde = { version = "1.0.37", default-features = false } alloy-transport.workspace = true # scroll -scroll-alloy-network.workspace = true -scroll-alloy-rpc-types-engine.workspace = true +dogeos-rpc-types.workspace = true +dogeos-reth-engine.workspace = true scroll-db.workspace = true # rollup-node diff --git a/crates/providers/src/lib.rs b/crates/providers/src/lib.rs index 644f93fca..cc687c6bb 100644 --- a/crates/providers/src/lib.rs +++ b/crates/providers/src/lib.rs @@ -2,7 +2,7 @@ //! node. use alloy_provider::RootProvider; -use scroll_alloy_network::Scroll; +use dogeos_rpc_types::Scroll; mod l1; pub use l1::{ diff --git a/crates/scroll-wire/Cargo.toml b/crates/scroll-wire/Cargo.toml index 569048009..37c0fd527 100644 --- a/crates/scroll-wire/Cargo.toml +++ b/crates/scroll-wire/Cargo.toml @@ -20,7 +20,7 @@ reth-network.workspace = true reth-network-api.workspace = true # scroll -reth-scroll-primitives = { workspace = true } +dogeos-reth-primitives = { workspace = true } rollup-node-signer.workspace = true # misc @@ -36,5 +36,5 @@ serde = [ "reth-eth-wire/serde", "reth-network/serde", "reth-network-api/serde", - "reth-scroll-primitives/serde", + "dogeos-reth-primitives/serde", ] diff --git a/crates/scroll-wire/src/protocol/event.rs b/crates/scroll-wire/src/protocol/event.rs index 458886d18..33617340d 100644 --- a/crates/scroll-wire/src/protocol/event.rs +++ b/crates/scroll-wire/src/protocol/event.rs @@ -21,7 +21,7 @@ pub enum ScrollWireEvent { /// The peer id the block was received from. peer_id: PeerId, /// The block that was received. - block: reth_scroll_primitives::ScrollBlock, + block: dogeos_reth_primitives::DogeosBlock, /// The signature of the block. signature: Signature, }, @@ -40,7 +40,7 @@ impl ScrollWireEvent { /// Creates a new [`ScrollWireEvent::NewBlock`] event. pub const fn new_block( peer_id: PeerId, - block: reth_scroll_primitives::ScrollBlock, + block: dogeos_reth_primitives::DogeosBlock, signature: Signature, ) -> Self { Self::NewBlock { peer_id, block, signature } diff --git a/crates/scroll-wire/src/protocol/proto.rs b/crates/scroll-wire/src/protocol/proto.rs index 610d1b42a..80d4e2a68 100644 --- a/crates/scroll-wire/src/protocol/proto.rs +++ b/crates/scroll-wire/src/protocol/proto.rs @@ -27,12 +27,12 @@ pub struct NewBlock { /// The signature from the block author. pub signature: Bytes, /// The block that is being announced. - pub block: reth_scroll_primitives::ScrollBlock, + pub block: dogeos_reth_primitives::DogeosBlock, } impl NewBlock { /// Returns a [`NewBlock`] instance with the provided signature and block. - pub fn new(signature: Signature, block: reth_scroll_primitives::ScrollBlock) -> Self { + pub fn new(signature: Signature, block: dogeos_reth_primitives::DogeosBlock) -> Self { Self { signature: Bytes::copy_from_slice(&signature.sig_as_bytes()), block } } } diff --git a/crates/sequencer/Cargo.toml b/crates/sequencer/Cargo.toml index 219dc75fd..5b99bb578 100644 --- a/crates/sequencer/Cargo.toml +++ b/crates/sequencer/Cargo.toml @@ -11,19 +11,20 @@ workspace = true [dependencies] # alloy +alloy-consensus.workspace = true alloy-eips.workspace = true +alloy-provider = { workspace = true, features = ["engine-api"] } alloy-primitives.workspace = true alloy-rpc-types-engine.workspace = true # scroll reth -reth-scroll-engine-primitives.workspace = true -reth-scroll-primitives.workspace = true +dogeos-reth-engine.workspace = true +dogeos-reth-primitives.workspace = true -# scroll-alloy -scroll-alloy-consensus.workspace = true -scroll-alloy-hardforks.workspace = true -scroll-alloy-provider.workspace = true -scroll-alloy-rpc-types-engine.workspace = true +# DogeOS protocol +dogeos-protocol-types.workspace = true +dogeos-hardforks.workspace = true +dogeos-rpc-types.workspace = true # rollup-node scroll-db = { workspace = true } @@ -42,23 +43,18 @@ eyre.workspace = true [dev-dependencies] # alloy -alloy-consensus.workspace = true alloy-primitives.workspace = true rollup-node-signer.workspace = true -# scroll-alloy -scroll-alloy-consensus.workspace = true - # reth reth-e2e-test-utils.workspace = true reth-node-core.workspace = true reth-tasks.workspace = true reth-tracing.workspace = true -# reth-scroll -reth-scroll-chainspec.workspace = true -reth-scroll-node = { workspace = true, features = ["test-utils"] } +dogeos-chainspec.workspace = true +dogeos-reth-evm.workspace = true # rollup-node rollup-node = { workspace = true, features = ["test-utils"] } diff --git a/crates/sequencer/src/lib.rs b/crates/sequencer/src/lib.rs index 286bdca0f..a3b428837 100644 --- a/crates/sequencer/src/lib.rs +++ b/crates/sequencer/src/lib.rs @@ -11,16 +11,15 @@ use std::{ }; use alloy_eips::eip2718::Encodable2718; +use alloy_primitives::U256; use alloy_rpc_types_engine::{ExecutionData, PayloadAttributes, PayloadId}; +use dogeos_hardforks::DogeosHardforks; +use dogeos_reth_engine::{BlockDataHint, ScrollPayloadAttributes}; +use dogeos_reth_primitives::{DogeosBlock, ScrollTransactionSigned}; use futures::{task::AtomicWaker, Stream}; -use reth_scroll_engine_primitives::try_into_block; -use reth_scroll_primitives::ScrollBlock; use rollup_node_primitives::{BlockInfo, DEFAULT_BLOCK_DIFFICULTY}; use rollup_node_providers::{L1MessageProvider, L1ProviderError}; -use scroll_alloy_hardforks::ScrollHardforks; -use scroll_alloy_provider::ScrollEngineApi; -use scroll_alloy_rpc_types_engine::{BlockDataHint, ScrollPayloadAttributes}; -use scroll_engine::Engine; +use scroll_engine::{Engine, ScrollEngineApi}; use tokio::time::Interval; mod config; @@ -57,7 +56,7 @@ pub struct Sequencer { impl Sequencer where P: L1MessageProvider + Unpin + Send + Sync + 'static, - CS: ScrollHardforks, + CS: DogeosHardforks, { /// Creates a new sequencer. pub fn new(provider: Arc

, config: SequencerConfig) -> Self { @@ -184,7 +183,7 @@ where &mut self, payload_id: PayloadId, engine: &mut Engine, - ) -> Result, SequencerError> { + ) -> Result, SequencerError> { let payload = engine.get_payload(payload_id).await?; if payload.transactions.is_empty() && !self.config.allow_empty_blocks { @@ -194,11 +193,16 @@ where tracing::info!(target: "rollup_node::sequencer", "Built payload with id {payload_id:?}, hash: {:#x}, number: {} containing {} transactions.", payload.block_hash, payload.block_number, payload.transactions.len()); let block_info = BlockInfo { hash: payload.block_hash, number: payload.block_number }; engine.update_fcs(Some(block_info), None, None).await?; - let block: ScrollBlock = try_into_block( - ExecutionData { payload: payload.into(), sidecar: Default::default() }, - self.config.chain_spec.clone(), - ) - .map_err(|_| SequencerError::PayloadError)?; + let expected_hash = payload.block_hash; + let ExecutionData { payload, sidecar } = + ExecutionData { payload: payload.into(), sidecar: Default::default() }; + let mut block: DogeosBlock = payload + .try_into_block_with_sidecar::(&sidecar) + .map_err(|_| SequencerError::PayloadError)?; + block.header.difficulty = U256::ONE; + if block.hash_slow() != expected_hash { + return Err(SequencerError::PayloadError) + } Ok(Some(block)) } } diff --git a/crates/sequencer/tests/e2e.rs b/crates/sequencer/tests/e2e.rs index da71aeb86..ec530c749 100644 --- a/crates/sequencer/tests/e2e.rs +++ b/crates/sequencer/tests/e2e.rs @@ -2,10 +2,11 @@ use alloy_consensus::{transaction::TxHashRef, BlockHeader}; use alloy_primitives::{hex, Address, U256}; +use dogeos_chainspec::DOGEOS_DEV; +use dogeos_protocol_types::{ScrollTransaction, TxL1Message}; +use dogeos_reth_evm::DEFAULT_BASE_FEE_OVERHEAD; use futures::stream::StreamExt; use reth_e2e_test_utils::transaction::TransactionTestContext; -use reth_scroll_chainspec::SCROLL_DEV; -use reth_scroll_node::test_utils::setup; use rollup_node::{ constants::SCROLL_GAS_LIMIT, test_utils::{default_test_scroll_rollup_node_config, setup_engine}, @@ -19,10 +20,8 @@ use rollup_node_sequencer::{ L1MessageInclusionMode, PayloadBuildingConfig, Sequencer, SequencerConfig, SequencerEvent, }; use rollup_node_watcher::L1Notification; -use scroll_alloy_consensus::{ScrollTransaction, TxL1Message}; -use scroll_alloy_provider::ScrollAuthApiEngineClient; use scroll_db::{test_utils::setup_test_db, DatabaseWriteOperations}; -use scroll_engine::{Engine, ForkchoiceState}; +use scroll_engine::{Engine, ForkchoiceState, ScrollAuthApiEngineClient}; use std::{io::Write, path::PathBuf, sync::Arc}; use tempfile::NamedTempFile; use tokio::{ @@ -34,8 +33,20 @@ use tokio::{ async fn skip_block_with_no_transactions() { reth_tracing::init_test_tracing(); + let chain_spec = DOGEOS_DEV.clone(); + // setup a test node - let (mut nodes, _tasks, _wallet) = setup(1, false).await.unwrap(); + let (mut nodes, _dbs, _wallet) = setup_engine( + default_test_scroll_rollup_node_config(), + 1, + chain_spec, + false, + false, + None, + None, + ) + .await + .unwrap(); let node = nodes.pop().unwrap(); // create a fork choice state @@ -88,8 +99,20 @@ async fn skip_block_with_no_transactions() { async fn can_build_blocks() { reth_tracing::init_test_tracing(); + let chain_spec = DOGEOS_DEV.clone(); + // setup a test node - let (mut nodes, _tasks, wallet) = setup(1, false).await.unwrap(); + let (mut nodes, _dbs, wallet) = setup_engine( + default_test_scroll_rollup_node_config(), + 1, + chain_spec, + false, + false, + None, + None, + ) + .await + .unwrap(); let node = nodes.pop().unwrap(); let wallet = Arc::new(Mutex::new(wallet)); @@ -131,7 +154,7 @@ async fn can_build_blocks() { // add a transaction to the pool let mut wallet_lock = wallet.lock().await; - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet_lock.chain_id, wallet_lock.inner.clone(), wallet_lock.inner_nonce, @@ -160,8 +183,11 @@ async fn can_build_blocks() { assert_eq!(block.header.number(), 1); assert_eq!(block.header.parent_hash, genesis_hash); - // check the base fee has been set for the block. - assert_eq!(block.header.base_fee_per_gas.unwrap(), 876960000); + // DogeOS default base-fee overhead. + assert_eq!( + block.header.base_fee_per_gas.unwrap(), + DEFAULT_BASE_FEE_OVERHEAD.saturating_to::() + ); // now lets add an L1 message to the database let wallet_lock = wallet.lock().await; @@ -207,7 +233,7 @@ async fn can_build_blocks() { async fn can_build_blocks_with_delayed_l1_messages() { reth_tracing::init_test_tracing(); - let chain_spec = SCROLL_DEV.clone(); + let chain_spec = DOGEOS_DEV.clone(); const L1_MESSAGE_DELAY: u64 = 2; // setup a test node @@ -284,7 +310,7 @@ async fn can_build_blocks_with_delayed_l1_messages() { // add a transaction to the pool let mut wallet_lock = wallet.lock().await; - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet_lock.chain_id, wallet_lock.inner.clone(), wallet_lock.inner_nonce, @@ -341,7 +367,7 @@ async fn can_build_blocks_with_delayed_l1_messages() { async fn can_build_blocks_with_finalized_l1_messages() { reth_tracing::init_test_tracing(); - let chain_spec = SCROLL_DEV.clone(); + let chain_spec = DOGEOS_DEV.clone(); // setup a test node let (mut nodes, _dbs, wallet) = setup_engine( default_test_scroll_rollup_node_config(), @@ -493,7 +519,7 @@ async fn can_sequence_blocks_with_private_key_file() -> eyre::Result<()> { let expected_signer = alloy_signer_local::PrivateKeySigner::from_slice(&expected_key_bytes)?; let expected_address = expected_signer.address(); - let chain_spec = (*SCROLL_DEV).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); let rollup_manager_args = ScrollRollupNodeConfig { test_args: TestArgs { test: false, // disable test mode to enable real signing @@ -534,10 +560,9 @@ async fn can_sequence_blocks_with_private_key_file() -> eyre::Result<()> { setup_engine(rollup_manager_args, 1, chain_spec, false, false, None, None).await?; let wallet = Arc::new(Mutex::new(wallet)); - let sequencer_rnm_handle = nodes[0].inner.add_ons_handle.rollup_manager_handle.clone(); + let sequencer_rnm_handle = nodes[0].rollup_manager_handle.clone(); let mut sequencer_events = sequencer_rnm_handle.get_event_listener().await?; - let sequencer_l1_watcher_tx = - nodes[0].inner.add_ons_handle.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); + let sequencer_l1_watcher_tx = nodes[0].rollup_manager_handle.l1_watcher_mock.clone().unwrap(); // Send a notification to set the L1 to synced sequencer_l1_watcher_tx.notification_tx.send(Arc::new(L1Notification::Synced)).await?; @@ -548,7 +573,7 @@ async fn can_sequence_blocks_with_private_key_file() -> eyre::Result<()> { // Generate and inject transaction let mut wallet_lock = wallet.lock().await; - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet_lock.chain_id, wallet_lock.inner.clone(), wallet_lock.inner_nonce, @@ -600,7 +625,7 @@ async fn can_sequence_blocks_with_hex_key_file_without_prefix() -> eyre::Result< alloy_signer_local::PrivateKeySigner::from_slice(&expected_key_bytes).unwrap(); let expected_address = expected_signer.address(); - let chain_spec = (*SCROLL_DEV).clone(); + let chain_spec = (*DOGEOS_DEV).clone(); let rollup_manager_args = ScrollRollupNodeConfig { test_args: TestArgs { test: false, // disable test mode to enable real signing @@ -641,10 +666,9 @@ async fn can_sequence_blocks_with_hex_key_file_without_prefix() -> eyre::Result< setup_engine(rollup_manager_args, 1, chain_spec, false, false, None, None).await?; let wallet = Arc::new(Mutex::new(wallet)); - let sequencer_rnm_handle = nodes[0].inner.add_ons_handle.rollup_manager_handle.clone(); + let sequencer_rnm_handle = nodes[0].rollup_manager_handle.clone(); let mut sequencer_events = sequencer_rnm_handle.get_event_listener().await?; - let sequencer_l1_watcher_tx = - nodes[0].inner.add_ons_handle.rollup_manager_handle.l1_watcher_mock.clone().unwrap(); + let sequencer_l1_watcher_tx = nodes[0].rollup_manager_handle.l1_watcher_mock.clone().unwrap(); // Send a notification to set the L1 to synced sequencer_l1_watcher_tx.notification_tx.send(Arc::new(L1Notification::Synced)).await?; @@ -655,7 +679,7 @@ async fn can_sequence_blocks_with_hex_key_file_without_prefix() -> eyre::Result< // Generate and inject transaction let mut wallet_lock = wallet.lock().await; - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet_lock.chain_id, wallet_lock.inner.clone(), wallet_lock.inner_nonce, @@ -693,7 +717,7 @@ async fn can_sequence_blocks_with_hex_key_file_without_prefix() -> eyre::Result< async fn can_build_blocks_and_exit_at_gas_limit() { reth_tracing::init_test_tracing(); - let chain_spec = SCROLL_DEV.clone(); + let chain_spec = DOGEOS_DEV.clone(); const MIN_TRANSACTION_GAS_COST: u64 = 21_000; const TRANSACTIONS_COUNT: usize = 2000; @@ -719,7 +743,7 @@ async fn can_build_blocks_and_exit_at_gas_limit() { // add transactions. let mut wallet_lock = wallet.lock().await; for _ in 0..TRANSACTIONS_COUNT { - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet_lock.chain_id, wallet_lock.inner.clone(), wallet_lock.inner_nonce, @@ -780,7 +804,7 @@ async fn can_build_blocks_and_exit_at_gas_limit() { async fn can_build_blocks_and_exit_at_time_limit() { reth_tracing::init_test_tracing(); - let chain_spec = SCROLL_DEV.clone(); + let chain_spec = DOGEOS_DEV.clone(); const MIN_TRANSACTION_GAS_COST: u64 = 21_000; const BLOCK_BUILDING_DURATION: Duration = Duration::from_secs(1); const TRANSACTIONS_COUNT: usize = 2000; @@ -807,7 +831,7 @@ async fn can_build_blocks_and_exit_at_time_limit() { // add transactions. let mut wallet_lock = wallet.lock().await; for _ in 0..TRANSACTIONS_COUNT { - let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + let raw_tx = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet_lock.chain_id, wallet_lock.inner.clone(), wallet_lock.inner_nonce, @@ -876,7 +900,7 @@ async fn should_limit_l1_message_cumulative_gas() { reth_tracing::init_test_tracing(); // setup a test node - let chain_spec = SCROLL_DEV.clone(); + let chain_spec = DOGEOS_DEV.clone(); let (mut nodes, _dbs, wallet) = setup_engine( default_test_scroll_rollup_node_config(), 1, @@ -1000,7 +1024,7 @@ async fn should_not_add_skipped_messages() { reth_tracing::init_test_tracing(); // setup a test node - let chain_spec = SCROLL_DEV.clone(); + let chain_spec = DOGEOS_DEV.clone(); let (mut nodes, _dbs, wallet) = setup_engine( default_test_scroll_rollup_node_config(), 1, diff --git a/crates/signer/Cargo.toml b/crates/signer/Cargo.toml index 1e60b79e8..164139e41 100644 --- a/crates/signer/Cargo.toml +++ b/crates/signer/Cargo.toml @@ -15,7 +15,7 @@ alloy-primitives.workspace = true alloy-signer.workspace = true # reth-scroll -reth-scroll-primitives = { workspace = true, features = ["std"] } +dogeos-reth-primitives = { workspace = true, features = ["std"] } # rollup-node rollup-node-primitives.workspace = true diff --git a/crates/signer/src/event.rs b/crates/signer/src/event.rs index 833244297..3d5f55ba4 100644 --- a/crates/signer/src/event.rs +++ b/crates/signer/src/event.rs @@ -1,5 +1,5 @@ use alloy_signer::Signature; -use reth_scroll_primitives::ScrollBlock; +use dogeos_reth_primitives::DogeosBlock; /// An enum representing the events that can be emitted by the signer. #[derive(Debug, Clone, PartialEq, Eq)] @@ -7,7 +7,7 @@ pub enum SignerEvent { /// A block has been signed by the signer. SignedBlock { /// The signed block. - block: ScrollBlock, + block: DogeosBlock, /// The signature of the block. signature: Signature, }, diff --git a/crates/signer/src/future.rs b/crates/signer/src/future.rs index 9858b7a77..c69b7cb0a 100644 --- a/crates/signer/src/future.rs +++ b/crates/signer/src/future.rs @@ -1,7 +1,7 @@ use super::{SignerError, SignerEvent}; use std::{future::Future, pin::Pin, sync::Arc}; -use reth_scroll_primitives::ScrollBlock; +use dogeos_reth_primitives::DogeosBlock; use rollup_node_primitives::sig_encode_hash; /// A type alias for a future that resolves to a `SignerEvent` or a `SignerError`. @@ -9,7 +9,7 @@ pub type SignerFuture = Pin, ) -> SignerFuture { Box::pin(async move { diff --git a/crates/signer/src/handle.rs b/crates/signer/src/handle.rs index 1143eab04..42164a80e 100644 --- a/crates/signer/src/handle.rs +++ b/crates/signer/src/handle.rs @@ -29,7 +29,7 @@ impl SignerHandle { /// Sends a request to sign a block. pub fn sign_block( &self, - block: reth_scroll_primitives::ScrollBlock, + block: dogeos_reth_primitives::DogeosBlock, ) -> Result<(), SignerError> { self.request_tx .send(SignerRequest::SignBlock(block)) diff --git a/crates/signer/src/lib.rs b/crates/signer/src/lib.rs index a3a28938b..33801d83f 100644 --- a/crates/signer/src/lib.rs +++ b/crates/signer/src/lib.rs @@ -134,7 +134,7 @@ impl std::fmt::Debug for Signer { mod tests { use super::*; use alloy_signer_local::PrivateKeySigner; - use reth_scroll_primitives::ScrollBlock; + use dogeos_reth_primitives::DogeosBlock; use rollup_node_primitives::sig_encode_hash; #[tokio::test] @@ -144,7 +144,7 @@ mod tests { let mut handle = Signer::spawn(Box::new(signer.clone())); // Test sending a request - let block = ScrollBlock::default(); + let block = DogeosBlock::default(); handle.sign_block(block.clone()).unwrap(); // Test receiving an event @@ -214,7 +214,7 @@ mod tests { let task = tokio::spawn(signer.run()); // Send a signing request through the handle - let block = ScrollBlock::default(); + let block = DogeosBlock::default(); handle.sign_block(block.clone()).unwrap(); // Drop the handle to simulate shutdown diff --git a/crates/signer/src/requests.rs b/crates/signer/src/requests.rs index 96593c66a..dfb6c975e 100644 --- a/crates/signer/src/requests.rs +++ b/crates/signer/src/requests.rs @@ -1,8 +1,8 @@ -use reth_scroll_primitives::ScrollBlock; +use dogeos_reth_primitives::DogeosBlock; /// An enum representing the requests that can be sent to the signer. #[derive(Debug)] pub enum SignerRequest { /// Request to sign a block. - SignBlock(ScrollBlock), + SignBlock(DogeosBlock), } diff --git a/crates/watcher/Cargo.toml b/crates/watcher/Cargo.toml index 8cd201884..2a5f39a6f 100644 --- a/crates/watcher/Cargo.toml +++ b/crates/watcher/Cargo.toml @@ -31,7 +31,7 @@ scroll-l1.workspace = true reth-tasks.workspace = true # scroll -scroll-alloy-consensus.workspace = true +dogeos-protocol-types.workspace = true # misc arbitrary = { workspace = true, optional = true } @@ -63,6 +63,7 @@ test-utils = [ "scroll-l1/test-utils", "dep:alloy-rpc-client", "rollup-node-providers/test-utils", + "reth-tasks/test-utils", ] arbitrary = [ "dep:arbitrary", @@ -70,7 +71,7 @@ arbitrary = [ "alloy-eips/arbitrary", "alloy-primitives/arbitrary", "alloy-rpc-types-eth/arbitrary", - "scroll-alloy-consensus/arbitrary", + "dogeos-protocol-types/arbitrary", "alloy-sol-types/arbitrary", "rollup-node-primitives/arbitrary", ] diff --git a/crates/watcher/src/lib.rs b/crates/watcher/src/lib.rs index e04dd9adf..f78be5f4b 100644 --- a/crates/watcher/src/lib.rs +++ b/crates/watcher/src/lib.rs @@ -21,13 +21,13 @@ use alloy_primitives::{ruint::UintTryTo, BlockNumber, B256}; use alloy_provider::{Network, Provider}; use alloy_rpc_types_eth::{BlockNumberOrTag, Filter, Log, TransactionTrait}; use alloy_sol_types::SolEvent; +use dogeos_protocol_types::TxL1Message; use error::L1WatcherResult; use rollup_node_primitives::{ BatchCommitData, BatchInfo, BlockInfo, BoundedVec, ConsensusUpdate, L1BlockStartupInfo, NodeConfig, }; use rollup_node_providers::SystemContractProvider; -use scroll_alloy_consensus::TxL1Message; use scroll_l1::abi::logs::{ CommitBatch, FinalizeBatch, QueueTransaction, RevertBatch_0, RevertBatch_1, }; diff --git a/crates/watcher/tests/logs.rs b/crates/watcher/tests/logs.rs index bb4c84334..361b75374 100644 --- a/crates/watcher/tests/logs.rs +++ b/crates/watcher/tests/logs.rs @@ -4,13 +4,13 @@ use alloy_rpc_types_eth::Log; use alloy_sol_types::SolEvent; use arbitrary::Arbitrary; +use dogeos_protocol_types::TxL1Message; use rollup_node_primitives::{L1BlockStartupInfo, NodeConfig}; use rollup_node_watcher::{ random, test_utils::{chain, chain_from, provider::MockProvider}, Block, L1Notification, L1Watcher, }; -use scroll_alloy_consensus::TxL1Message; use scroll_l1::abi::logs::{try_decode_log, QueueTransaction}; use std::sync::Arc; diff --git a/docker-compose/README.md b/docker-compose/README.md index 6364bcaf6..5122cb8b1 100644 --- a/docker-compose/README.md +++ b/docker-compose/README.md @@ -89,6 +89,19 @@ rm -rf volumes --- +## Follower Restart on Signer Rotation + +Follower nodes can opt in to `--consensus.exit-on-signer-rotation`. The node confirms a changed +authorized signer from L1, shuts down, and exits with code `70` so an external supervisor can +restart it and load the new signer. Configure a restart policy such as Docker Compose +`restart: unless-stopped`, Kubernetes, or systemd `Restart=on-failure` before enabling the flag. + +Do not enable this on sequencer nodes or combine it with +`--consensus.authorized-signer`; sequencer rotation remains a manual operation, and a pinned +signer would remain pinned after restart. + +--- + ## Troubleshooting - Make sure the ports (8545, 8546, 19090, 13000) are not used by other processes. @@ -134,4 +147,3 @@ The configuration priority is: - See `docker-compose/docker-compose.yml` for all available services and configuration options. - For detailed documentation, refer to the project book in `book/src/docker-operations.md`. - For advanced usage, refer to the official [Docker Compose documentation](https://docs.docker.com/compose/). - diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 3d2743bf1..b1fbcc01a 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -17,8 +17,10 @@ services: - scroll-network rollup-node: - image: scrolltech/rollup-node:v1.0.5 + image: dogeos69/rollup-node:v1.0.5 container_name: rollup-node + # Follower-only example for --consensus.exit-on-signer-rotation: + # restart: unless-stopped entrypoint: ["bash", "/launch_rollup_node.bash"] env_file: - .env diff --git a/docker-compose/launch_rollup_node.bash b/docker-compose/launch_rollup_node.bash index ac549125c..5ae45b17e 100644 --- a/docker-compose/launch_rollup_node.bash +++ b/docker-compose/launch_rollup_node.bash @@ -8,6 +8,10 @@ wait_for_l1_devnet() { done } +# Supervised follower example (do not use for a sequencer or with a pinned signer): +# exec rollup-node node --chain dogeos-chikyu --l1.url \ +# --consensus.exit-on-signer-rotation + if [ "${ENV:-}" = "dev" ]; then exec rollup-node node --chain dev --datadir=/l2reth --metrics=0.0.0.0:6060 --disable-discovery \ --http --http.addr=0.0.0.0 --http.port=8545 --http.corsdomain "*" --http.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ @@ -38,7 +42,7 @@ elif [ "${ENV:-}" = "sepolia" ]; then BLOB_S3_PARAMS="--blob.s3_url https://scroll-sepolia-blob-data.s3.us-west-2.amazonaws.com/" fi - exec rollup-node node --chain scroll-sepolia --datadir=/l2reth --engine.legacy-state-root --metrics=0.0.0.0:6060 --disable-discovery \ + exec rollup-node node --chain dogeos-chikyu --datadir=/l2reth --engine.legacy-state-root --metrics=0.0.0.0:6060 --disable-discovery \ --http --http.addr=0.0.0.0 --http.port=8545 --http.corsdomain "*" --http.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --log.stdout.format log-fmt -vvv $URL_PARAMS $BLOB_S3_PARAMS \ @@ -64,9 +68,9 @@ elif [ "${ENV:-}" = "mainnet" ]; then BLOB_S3_PARAMS="--blob.s3_url https://scroll-mainnet-blob-data.s3.us-west-2.amazonaws.com/" fi - exec rollup-node node --chain scroll-mainnet --datadir=/l2reth --engine.legacy-state-root --metrics=0.0.0.0:6060 --disable-discovery \ + exec rollup-node node --chain dogeos-mainnet --datadir=/l2reth --engine.legacy-state-root --metrics=0.0.0.0:6060 --disable-discovery \ --http --http.addr=0.0.0.0 --http.port=8545 --http.corsdomain "*" --http.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --log.stdout.format log-fmt -vvv $URL_PARAMS $BLOB_S3_PARAMS \ --trusted-peers "enode://c6ac91f43df3d63916ac1ae411cdd5ba249d55d48a7bec7f8cd5bb351a31aba437e5a69e8a1de74d73fdfeba8af1cfe9caf9846ecd3abf60d1ffdf4925b55b23@54.186.123.248:30303,enode://fdcc807b5d1353f3a1e98b90208ce6ef1b7d446136e51eaa8ad657b55518a2f8b37655e42375d61622e6ea18f3faf9d070c9bbdf012cf5484bcbad33b7a15fb1@44.227.91.206:30303,enode://6beb5a3efbb39be73d17630b6da48e94c0ce7ec665172111463cb470197b20c12faa1fa6f835b81c28571277d1017e65c4e426cc92a46141cf69118ecf28ac03@44.237.194.52:30303,enode://7cf893d444eb8e129dca0f6485b3df579911606e7c728be4fa55fcc5f155a37c3ce07d217ccec5447798bde465ac2bdba2cb8763d107e9f3257e787579e9f27e@52.35.203.107:30303,enode://c7b2d94e95da343db6e667a01cef90376a592f2d277fbcbf6e9c9186734ed8003d01389571bd10cdbab7a6e5adfa6f0c7b55644d0db24e0b9deb4ec80f842075@54.70.236.187:30303" -fi \ No newline at end of file +fi diff --git a/dprint.json b/dprint.json index dc615dbf4..7266d23c0 100644 --- a/dprint.json +++ b/dprint.json @@ -1,4 +1,7 @@ { + "excludes": [ + "Cargo.toml" + ], "toml": { "useTabs": false, "cargo.applyConventions": false, diff --git a/sequencer-migration/Dockerfile b/sequencer-migration/Dockerfile index 331fcc2db..0bff4f633 100644 --- a/sequencer-migration/Dockerfile +++ b/sequencer-migration/Dockerfile @@ -7,9 +7,8 @@ RUN apt-get update && apt-get install -y \ WORKDIR /migration COPY . . -RUN chmod +x migrate-sequencer.sh \ - revert-l2geth-to-block.sh \ - switch-to-l2geth.sh +RUN chmod +x switch-to-l2reth.sh \ + send-l1-messages.sh # Set default environment variables (can be overridden at runtime) ENV L2GETH_RPC_URL=http://host.docker.internal:8547 diff --git a/sequencer-migration/README.md b/sequencer-migration/README.md index f4b7e1226..84dc0f6f9 100644 --- a/sequencer-migration/README.md +++ b/sequencer-migration/README.md @@ -1,72 +1,69 @@ -# Scroll Sequencer Migration -This module contains documentation and scripts for Scroll's sequencer migration from `l2geth` to rollup node (RN) aka `l2reth`. +# Scroll Sequencer Migration -### Risks -We want to minimize risks and minimize service disruption. For this we need to consider following risks: +This module contains documentation and scripts for the **one-way** Testnet migration of sequencing +from `l2geth` to the rollup node (RN) aka `l2reth`. + +Under the Tsuki contract the transition is one-directional: geth has no Tsuki support and will not +receive it, the Testnet sequencer is the last geth node, and Mainnet never runs geth. After the +crossover, sequencing never returns to geth — there is no rollback or geth-recovery path. + +### Risks +We want to minimize risks and service disruption. For this we need to consider the following risks: - invalid L2 blocks produced -- L2 reorg (e.g. different blocks issued at same L2 block height) +- L2 reorg (e.g. different blocks issued at the same L2 block height) - L1 messages skipped/reverted - general service interruption -## Migration Procedure +## Migration Procedure (one-way) -To instill confidence we will do many repeated transitions from `l2geth` -> `l2reth` -> `l2geth` with the time that `l2reth` sequences increasing. +The high-level flow of the crossover is: +1. `l2geth` is sequencing currently while a lagging `l2reth` follows it. +2. Freeze `l2geth` sequencing. +3. Record the frozen final `l2geth` block height/hash. +4. Wait until `l2reth` has reached that exact frozen final head. +5. Take an authoritative `l2geth` database snapshot/backup and shut `l2geth` sequencing down. +6. Enable `l2reth` sequencing. +7. Qualify the `l2reth` follower/sequencer with geth retired. -The high-level flow of the transition will look like this: -1. `l2geth` is sequencing currently -2. Turn off `l2geth` sequencing -3. Get block height of `l2geth` -4. Wait until `l2reth` has same block height -5. Turn on `l2reth` sequencing -6. Wait until `l2reth` has sequenced until block X or for some time -7. Turn off `l2reth` sequencing -8. Wait until `l2geth` has same block height -9. Turn on `l2geth` sequencing +There is deliberately no step that re-enables `l2geth` sequencing or reverts `l2reth` to a prior +block: the last geth sequencer is the authoritative source only up to the frozen final head. ## Usage -Make sure the `L2RETH_RPC_URL` and `L2GETH_RPC_URL` env variables are properly configured. Simply run the script and follow the instructions. +Make sure the `L2RETH_RPC_URL` and `L2GETH_RPC_URL` env variables are properly configured, then run +the forward cutover script and follow the instructions. ```bash -./migrate-sequencer.sh -./revert-l2geth-to-block.sh -./switch-to-l2geth.sh +./switch-to-l2reth.sh -# make common functions available on bash +# make common functions available in bash source common-functions.sh -start_l2geth_mining get_block_info $L2GETH_RPC_URL [...] ``` ### Testing locally -To test locally run the test `docker_test_migrate_sequencer` and execute the `migrate-sequencer.sh` script. +Run the one-way handoff integration test `docker_test_migrate_sequencer`. It starts with `l2geth` +sequencing, freezes it, proves all nodes reach geth's frozen final head, then hands sequencing to +`l2reth` for the remainder and asserts all nodes agree. + ```bash -# this test runs for ~60 seconds and starts with l2geth sequencing and expects all nodes to reach the same block at block number 120. RUST_LOG=info,docker-compose=off cargo test --package tests --test migrate_sequencer -- docker_test_migrate_sequencer --exact --show-output source local.env -./migrate-sequencer.sh - -# if necessary, reset l2geth block height and start sequencing on l2geth. -./revert-l2geth-to-block.sh +./switch-to-l2reth.sh ``` -**Simulating failure case**: -- To simulate the case where `l2reth` produces invalid blocks we can adjust to `--builder.gaslimit=40000000` in `launch_rollup_node_sequencer.bash`. This will produce a block with a too big jump of the gas limit and `l2geth` will reject it. In a simulation we can then "revert" `l2geth` to its latest block and start sequencing on `l2geth` again. -- Continuing on the above case we can fabricate a L2 reorg by simply resetting to any previous block. For all `l2geth` nodes the reorg will be shallow (ie before the invalid `l2reth` blocks) and for `l2reth` it will be deeper (ie all `l2reth` produced blocks + reset to previous block). - ### Running with Docker ```bash docker run -it --rm sequencer-migration:latest -# then just use the scripts as before -./migrate-sequencer.sh +# then use the forward cutover script +./switch-to-l2reth.sh # or call any of the common functions -start_l2geth_mining get_block_info $L2GETH_RPC_URL [...] ``` -If running on Linux you might need to specify `-e L2GETH_RPC_URL=http://your-l2geth:8547 -e L2RETH_RPC_URL=http://your-l2reth:8545` as the default URLs might not work. \ No newline at end of file +If running on Linux you might need to specify `-e L2GETH_RPC_URL=http://your-l2geth:8547 -e L2RETH_RPC_URL=http://your-l2reth:8545` as the default URLs might not work. diff --git a/sequencer-migration/migrate-sequencer.sh b/sequencer-migration/migrate-sequencer.sh deleted file mode 100755 index 4d5e92e81..000000000 --- a/sequencer-migration/migrate-sequencer.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/bash - -# Sequencer Migration Script -# Migrates sequencing from l2geth -> l2reth -> l2geth -# Usage: ./migrate-sequencer.sh - -set -euo pipefail - -# Source common functions -source "$(dirname "$0")/common-functions.sh" - -# Global variables to track state -START_TIME=$(date +%s) -L2GETH_STOP_BLOCK="" -L2RETH_FINAL_BLOCK="" - -migrate_pre_flight_checks() { - perform_pre_flight_checks - - # Check if l2geth is mining - if ! is_l2geth_mining; then - log_error "L2GETH is not currently mining. Please start mining first." - exit 1 - fi - log_success "L2GETH is currently mining" -} - -print_summary() { - local end_time=$(date +%s) - local total_time=$((end_time - START_TIME)) - - log_info "=== MIGRATION SUMMARY ===" - log_info "Migration completed in ${total_time}s" - log_info "L2GETH stopped at block: #$L2GETH_STOP_BLOCK" - log_info "L2RETH final block: #$L2RETH_FINAL_BLOCK" - - local final_l2geth_info=$(get_latest_block_info "$L2GETH_RPC_URL") - local final_l2geth_block=$(echo "$final_l2geth_info" | awk '{print $1}') - local final_l2geth_hash=$(echo "$final_l2geth_info" | awk '{print $2}') - log_info "Final L2GETH block: #$final_l2geth_block (hash: $final_l2geth_hash)" - - log_success "Sequencer migration completed successfully!" -} - -main() { - # Check arguments - if [[ $# -ne 1 ]]; then - echo "Usage: $0 " - echo " blocks_to_produce: Number of blocks for L2RETH to produce during migration" - exit 1 - fi - - local blocks_to_produce="$1" - - # Validate blocks_to_produce is a positive integer - if ! [[ "$blocks_to_produce" =~ ^[1-9][0-9]*$ ]]; then - log_error "blocks_to_produce must be a positive integer, got: $blocks_to_produce" - exit 1 - fi - - log_info "Starting sequencer migration: L2GETH -> L2RETH -> L2GETH" - log_info "L2RETH will produce $blocks_to_produce blocks" - - check_env_vars - migrate_pre_flight_checks - - # Double check if user wants to proceed - read -p "Proceed with migration? (y/N): " confirm - if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then - log_warning "Migration aborted by user" - exit 0 - fi - - # Phase 1: Stop L2GETH sequencing - log_info "=== PHASE 1: STOPPING L2GETH SEQUENCING ===" - stop_l2geth_mining - - # Record where L2GETH stopped - local stop_info=$(get_latest_block_info "$L2GETH_RPC_URL") - L2GETH_STOP_BLOCK=$(echo "$stop_info" | awk '{print $1}') - local stop_hash=$(echo "$stop_info" | awk '{print $2}') - log_success "L2GETH sequencing stopped at block #$L2GETH_STOP_BLOCK (hash: $stop_hash)" - - # Phase 2: Wait for L2RETH to sync - log_info "=== PHASE 2: WAITING FOR L2RETH SYNC ===" - wait_for_block "L2RETH" "$L2RETH_RPC_URL" "$L2GETH_STOP_BLOCK" "$stop_hash" - - # Phase 3: Enable L2RETH sequencing and wait for blocks - log_info "=== PHASE 3: L2RETH SEQUENCING ($blocks_to_produce blocks) ===" - enable_l2reth_sequencing - - local target_block=$((L2GETH_STOP_BLOCK + blocks_to_produce)) - log_info "Waiting for L2RETH to produce $blocks_to_produce blocks (target: #$target_block)..." - - # Monitor block production - local current_block=$L2GETH_STOP_BLOCK - while [[ $current_block -lt $target_block ]]; do - sleep $POLL_INTERVAL - local new_block=$(get_block_number "$L2RETH_RPC_URL") - if [[ $new_block -gt $current_block ]]; then - local block_info=$(get_latest_block_info "$L2RETH_RPC_URL") - local block_hash=$(echo "$block_info" | awk '{print $2}') - log_success "L2RETH produced block #$new_block (hash: $block_hash)" - current_block=$new_block - fi - done - - # Phase 4: Stop L2RETH sequencing - log_info "=== PHASE 4: STOPPING L2RETH SEQUENCING ===" - disable_l2reth_sequencing - - # Record final L2RETH block - local final_info=$(get_latest_block_info "$L2RETH_RPC_URL") - L2RETH_FINAL_BLOCK=$(echo "$final_info" | awk '{print $1}') - local final_hash=$(echo "$final_info" | awk '{print $2}') - log_success "L2RETH sequencing stopped at block #$L2RETH_FINAL_BLOCK (hash: $final_hash)" - - # Phase 5: Wait for L2GETH to sync - log_info "=== PHASE 5: WAITING FOR L2GETH SYNC ===" - wait_for_block "L2GETH" "$L2GETH_RPC_URL" "$L2RETH_FINAL_BLOCK" "$final_hash" - - # Phase 6: Resume L2GETH sequencing - log_info "=== PHASE 6: RESUMING L2GETH SEQUENCING ===" - start_l2geth_mining - - # Wait for at least one new block to confirm sequencing resumed - local confirmation_target=$((L2RETH_FINAL_BLOCK + 1)) - if ! wait_for_block "L2GETH" "$L2GETH_RPC_URL" "$confirmation_target" ""; then - log_error "L2GETH failed to produce new block after resuming sequencing" - exit 1 - fi - log_success "L2GETH sequencing resumed successfully" - - print_summary -} - -# Run main function -main "$@" \ No newline at end of file diff --git a/sequencer-migration/revert-l2geth-to-block.sh b/sequencer-migration/revert-l2geth-to-block.sh deleted file mode 100755 index 57b46fba0..000000000 --- a/sequencer-migration/revert-l2geth-to-block.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/bash - -# L2GETH Block Revert Script -# Reverts l2geth to a specific block number using debug_setHead RPC -# Usage: ./revert-l2geth-to-block.sh - -set -euo pipefail - -# Source common functions -source "$(dirname "$0")/common-functions.sh" - -# Global variables to track state -START_TIME=$(date +%s) -TARGET_BLOCK="" -TARGET_HASH="" - -# Reset l2geth to a specific block using debug_setHead -reset_l2geth_to_block() { - local block_number="$1" - - log_info "Resetting l2geth to block #$block_number using debug_setHead..." - - # Convert block number to hex format for debug_setHead - local block_hex=$(printf "0x%x" "$block_number") - - if cast rpc debug_setHead --rpc-url "$L2GETH_RPC_URL" "$block_hex" >/dev/null 2>&1; then - log_success "L2GETH reset to block #$block_number" - return 0 - else - log_error "Failed to reset l2geth to block #$block_number" - return 1 - fi -} - - - -revert_pre_flight_checks() { - perform_pre_flight_checks - - # Get current l2geth block for validation - local l2geth_info=$(get_latest_block_info "$L2GETH_RPC_URL") - local current_l2geth_block=$(echo "$l2geth_info" | awk '{print $1}') - - # Validate target block exists and is reachable - if [[ $TARGET_BLOCK -gt $current_l2geth_block ]]; then - log_error "Target block #$TARGET_BLOCK is greater than current l2geth block #$current_l2geth_block" - log_error "Can only revert to an existing block" - exit 1 - fi - - # Get target block info to verify it exists - local target_info - if ! target_info=$(get_block_info "$L2GETH_RPC_URL" "$TARGET_BLOCK"); then - log_error "Target block #$TARGET_BLOCK not found in l2geth" - exit 1 - fi - - TARGET_HASH=$(echo "$target_info" | awk '{print $2}') - log_info "Target block #$TARGET_BLOCK exists (hash: $TARGET_HASH)" -} - -print_summary() { - local end_time=$(date +%s) - local total_time=$((end_time - START_TIME)) - - log_info "=== REVERT SUMMARY ===" - log_info "Revert completed in ${total_time}s" - log_info "Target block: #$TARGET_BLOCK (hash: $TARGET_HASH)" - - local final_l2geth_info=$(get_latest_block_info "$L2GETH_RPC_URL") - local final_l2geth_block=$(echo "$final_l2geth_info" | awk '{print $1}') - local final_l2geth_hash=$(echo "$final_l2geth_info" | awk '{print $2}') - log_info "Final L2GETH block: #$final_l2geth_block (hash: $final_l2geth_hash)" - - log_success "L2GETH revert completed successfully!" -} - -main() { - # Check arguments - if [[ $# -ne 1 ]]; then - echo "Usage: $0 " - echo " block_number: Block number to revert l2geth to" - exit 1 - fi - - TARGET_BLOCK="$1" - - # Validate target block is a non-negative integer - if ! [[ "$TARGET_BLOCK" =~ ^[0-9]+$ ]]; then - log_error "block_number must be a non-negative integer, got: $TARGET_BLOCK" - exit 1 - fi - - log_info "Starting l2geth revert to block #$TARGET_BLOCK" - - check_env_vars - revert_pre_flight_checks - - # Phase 1: Disable sequencing on both nodes - log_info "=== PHASE 1: DISABLING SEQUENCING ===" - - # Disable l2reth sequencing first (safety measure) - disable_l2reth_sequencing - - # Disable l2geth mining - stop_l2geth_mining - - # Phase 2: Show current state and get confirmation - log_info "=== PHASE 2: CONFIRMATION ===" - - local l2geth_info=$(get_latest_block_info "$L2GETH_RPC_URL") - local l2reth_info=$(get_latest_block_info "$L2RETH_RPC_URL") - - local current_l2geth_block=$(echo "$l2geth_info" | awk '{print $1}') - local current_l2geth_hash=$(echo "$l2geth_info" | awk '{print $2}') - local current_l2reth_block=$(echo "$l2reth_info" | awk '{print $1}') - local current_l2reth_hash=$(echo "$l2reth_info" | awk '{print $2}') - - log_info "Current L2GETH block: #$current_l2geth_block (hash: $current_l2geth_hash)" - log_info "Current L2RETH block: #$current_l2reth_block (hash: $current_l2reth_hash)" - log_warning "Will revert L2GETH to block #$TARGET_BLOCK (hash: $TARGET_HASH)" - - read -p "Continue with revert? (y/N): " confirm - if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then - log_warning "Revert aborted by user" - # Re-enable mining before exit - start_l2geth_mining - exit 0 - fi - - # Phase 3: Reset l2geth to target block - log_info "=== PHASE 3: RESETTING L2GETH ===" - reset_l2geth_to_block "$TARGET_BLOCK" - - # Verify the reset was successful - local reset_info=$(get_latest_block_info "$L2GETH_RPC_URL") - local reset_block=$(echo "$reset_info" | awk '{print $1}') - local reset_hash=$(echo "$reset_info" | awk '{print $2}') - - if [[ $reset_block -eq $TARGET_BLOCK ]]; then - log_success "L2GETH successfully reset to block #$reset_block (hash: $reset_hash)" - else - log_error "Reset verification failed: expected block #$TARGET_BLOCK, got #$reset_block" - exit 1 - fi - - # Phase 4: Re-enable l2geth sequencing - log_info "=== PHASE 4: ENABLING L2GETH SEQUENCING ===" - start_l2geth_mining - - # Phase 5: Wait for new block production - log_info "=== PHASE 5: MONITORING NEW BLOCK PRODUCTION ===" - local expected_next_block=$((TARGET_BLOCK + 1)) - if ! wait_for_block "L2GETH" "$L2GETH_RPC_URL" "$expected_next_block" ""; then - log_error "L2GETH failed to produce new block after reset" - exit 1 - fi - - print_summary -} - -# Run main function -main "$@" \ No newline at end of file diff --git a/sequencer-migration/switch-to-l2geth.sh b/sequencer-migration/switch-to-l2geth.sh deleted file mode 100755 index c279931b0..000000000 --- a/sequencer-migration/switch-to-l2geth.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -# Switch Sequencing to L2GETH Script -# Disables L2RETH sequencing and enables L2GETH sequencing -# Usage: ./switch-to-l2geth.sh - -set -euo pipefail - -# Source common functions -source "$(dirname "$0")/common-functions.sh" - -# Global variables to track state -START_TIME=$(date +%s) - -perform_sequencing_switch() { - log_info "=== SWITCHING SEQUENCING TO L2GETH ===" - - # Phase 1: Disable L2RETH sequencing - log_info "--- Phase 1: Disabling L2RETH sequencing ---" - disable_l2reth_sequencing - - # wait for l2geth to catch up with l2reth - log_info "-- Phase 1.5: Waiting for L2GETH to catch up with L2RETH ---" - wait_for_l2geth_to_catch_up_with_l2reth - - # Phase 2: Enable L2GETH sequencing - log_info "--- Phase 2: Enabling L2GETH sequencing ---" - start_l2geth_mining - - # Phase 3: Verify L2GETH is producing blocks - log_info "--- Phase 3: Verifying L2GETH block production ---" - - # Get current block and wait for next block - local current_block=$(get_block_number "$L2GETH_RPC_URL") - local target_block=$((current_block + 1)) - - log_info "Current L2GETH block: #$current_block, waiting for block #$target_block..." - - if wait_for_block "L2GETH" "$L2GETH_RPC_URL" "$target_block" ""; then - log_success "L2GETH is successfully producing blocks" - else - log_error "L2GETH failed to produce new blocks after sequencing was enabled" - exit 1 - fi - - log_info "Verifying L2RETH is following blocks..." - - if wait_for_l2reth_to_catch_up_with_l2geth; then - log_success "L2RETH is successfully following blocks" - else - log_error "L2RETH failed to follow new blocks after L2GETH sequencing was enabled" - exit 1 - fi -} - -main() { - log_info "Starting sequencer switch: L2RETH -> L2GETH" - - check_env_vars - perform_pre_flight_checks - - # Final confirmation - read -p "Proceed with switching sequencing to L2GETH? (y/N): " confirm - if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then - log_warning "Sequencing switch cancelled by user" - exit 0 - fi - - perform_sequencing_switch -} - -# Run main function -main "$@" \ No newline at end of file diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 5ad9dce6d..9b044779b 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -14,7 +14,7 @@ alloy-provider = { workspace = true, features = ["reqwest", "ws"] } alloy-rpc-types-eth = { workspace = true } alloy-signer-local = { workspace = true } alloy-sol-types = { workspace = true } -scroll-alloy-network = { workspace = true } +dogeos-rpc-types = { workspace = true } rollup-node-chain-orchestrator = { path = "../crates/chain-orchestrator", features = ["serde"] } tokio = { workspace = true, features = ["rt", "time", "process"] } eyre = { workspace = true } diff --git a/tests/docker-compose.test.yml b/tests/docker-compose.test.yml index 6976173cc..5498c24a1 100644 --- a/tests/docker-compose.test.yml +++ b/tests/docker-compose.test.yml @@ -24,6 +24,7 @@ services: entrypoint: ["bash", "/launch_rollup_node_sequencer.bash"] environment: - RUST_LOG=info + - LEGACY_GETH_HEADER_TRANSFORM=true ports: - "8545:8545" # JSON-RPC - "6060:6060" # Metrics @@ -44,6 +45,7 @@ services: entrypoint: ["bash", "/launch_rollup_node_follower.bash"] environment: - RUST_LOG=info + - LEGACY_GETH_HEADER_TRANSFORM=true ports: - "8546:8545" # JSON-RPC - "6061:6060" # Metrics diff --git a/tests/launch_rollup_node_follower.bash b/tests/launch_rollup_node_follower.bash index e5e513542..8ccd1082d 100644 --- a/tests/launch_rollup_node_follower.bash +++ b/tests/launch_rollup_node_follower.bash @@ -3,9 +3,16 @@ set -e export RUST_LOG=sqlx=off,scroll=trace,reth=info,rollup=trace,info +legacy_geth_header_transform_args=() +if [ "${LEGACY_GETH_HEADER_TRANSFORM:-}" = "true" ]; then + # Opt-in for docker-compose.test.yml: canonicalize signed l2geth extra_data headers. + legacy_geth_header_transform_args+=(--network.legacy-geth-header-transform true) +fi + exec rollup-node node --chain /l2reth/l2reth-genesis-e2e.json --datadir=/l2reth --metrics=0.0.0.0:6060 \ --disable-discovery \ --network.valid_signer "0xb674ff99cca262c99d3eab5b32796a99188543da" \ + "${legacy_geth_header_transform_args[@]}" \ --http --http.addr=0.0.0.0 --http.port=8545 --http.corsdomain "*" --http.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --log.stdout.format log-fmt -vvv \ diff --git a/tests/launch_rollup_node_sequencer.bash b/tests/launch_rollup_node_sequencer.bash index 9ef151704..a0e5e6291 100644 --- a/tests/launch_rollup_node_sequencer.bash +++ b/tests/launch_rollup_node_sequencer.bash @@ -10,9 +10,16 @@ echo -n "01c0d9156e199d89814d4b18e9eb64e25de3927f3f6d27b778177f3ff6b610ad" > /l2 export RUST_LOG=sqlx=off,scroll=trace,reth=info,rollup=trace,info +legacy_geth_header_transform_args=() +if [ "${LEGACY_GETH_HEADER_TRANSFORM:-}" = "true" ]; then + # Opt-in for docker-compose.test.yml: canonicalize signed l2geth extra_data headers. + legacy_geth_header_transform_args+=(--network.legacy-geth-header-transform true) +fi + exec rollup-node node --chain /l2reth/l2reth-genesis-e2e.json --datadir=/l2reth --metrics=0.0.0.0:6060 \ --disable-discovery \ --network.valid_signer "0xb674ff99cca262c99d3eab5b32796a99188543da" \ + "${legacy_geth_header_transform_args[@]}" \ --http --http.addr=0.0.0.0 --http.port=8545 --http.corsdomain "*" --http.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,miner,mev \ --rpc.rollup-node-admin \ diff --git a/tests/src/docker_compose.rs b/tests/src/docker_compose.rs index 8df1ec218..9596486fb 100644 --- a/tests/src/docker_compose.rs +++ b/tests/src/docker_compose.rs @@ -1,6 +1,6 @@ use alloy_provider::{Provider, ProviderBuilder}; +use dogeos_rpc_types::Scroll; use eyre::Result; -use scroll_alloy_network::Scroll; use std::{fs, ops::Deref, process::Command, time::Duration}; use tokio::{ io::{AsyncBufReadExt, BufReader}, @@ -196,7 +196,6 @@ impl DockerComposeEnv { /// Get a configured sequencer provider pub async fn get_rn_sequencer_provider(&self) -> Result { let provider = ProviderBuilder::<_, _, Scroll>::default() - .with_recommended_fillers() .connect(RN_SEQUENCER_RPC_URL) .await .map_err(|e| eyre::eyre!("Failed to connect to RN sequencer: {}", e))?; @@ -211,7 +210,6 @@ impl DockerComposeEnv { /// Get a configured follower provider pub async fn get_rn_follower_provider(&self) -> Result { let provider = ProviderBuilder::<_, _, Scroll>::default() - .with_recommended_fillers() .connect(RN_FOLLOWER_RPC_URL) .await .map_err(|e| eyre::eyre!("Failed to connect to RN follower: {}", e))?; @@ -226,7 +224,6 @@ impl DockerComposeEnv { /// Get a configured remote source provider pub async fn get_rn_remote_source_provider(&self) -> Result { let provider = ProviderBuilder::<_, _, Scroll>::default() - .with_recommended_fillers() .connect(RN_REMOTE_SOURCE_RPC_URL) .await .map_err(|e| eyre::eyre!("Failed to connect to RN remote source: {}", e))?; @@ -241,7 +238,6 @@ impl DockerComposeEnv { /// Get a configured l2geth sequencer provider pub async fn get_l2geth_sequencer_provider(&self) -> Result { let provider = ProviderBuilder::<_, _, Scroll>::default() - .with_recommended_fillers() .connect(L2GETH_SEQUENCER_RPC_URL) .await .map_err(|e| eyre::eyre!("Failed to connect to l2geth sequencer: {}", e))?; @@ -256,7 +252,6 @@ impl DockerComposeEnv { /// Get a configured l2geth follower provider pub async fn get_l2geth_follower_provider(&self) -> Result { let provider = ProviderBuilder::<_, _, Scroll>::default() - .with_recommended_fillers() .connect(L2GETH_FOLLOWER_RPC_URL) .await .map_err(|e| eyre::eyre!("Failed to connect to l2geth follower: {}", e))?; @@ -271,7 +266,6 @@ impl DockerComposeEnv { /// Get a configured l2geth skip signer check provider pub async fn get_l2geth_skipsignercheck_provider(&self) -> Result { let provider = ProviderBuilder::<_, _, Scroll>::default() - .with_recommended_fillers() .connect(L2GETH_SKIPSIGNERCHECK_RPC_URL) .await .map_err(|e| eyre::eyre!("Failed to connect to l2geth skip signer check: {}", e))?; @@ -288,11 +282,7 @@ impl DockerComposeEnv { /// Wait for L2 node to be ready async fn wait_for_l2_node_ready(provider_url: &str, max_retries: u32) -> Result<()> { for i in 0..max_retries { - match ProviderBuilder::<_, _, Scroll>::default() - .with_recommended_fillers() - .connect(provider_url) - .await - { + match ProviderBuilder::<_, _, Scroll>::default().connect(provider_url).await { Ok(provider) => match provider.get_chain_id().await { // TODO: assert chain ID and genesis hash matches expected values (hardcoded // constants) diff --git a/tests/src/utils.rs b/tests/src/utils.rs index 40c072e46..b455753ee 100644 --- a/tests/src/utils.rs +++ b/tests/src/utils.rs @@ -134,7 +134,7 @@ pub async fn wait_for_l1_message_queue_index_reached( nodes: &[&NamedProvider], expected_index: u64, ) -> Result<()> { - let timeout_duration = Duration::from_secs(60); + let timeout_duration = Duration::from_secs(120); let timeout_secs = timeout_duration.as_secs(); tracing::info!( @@ -198,7 +198,7 @@ pub async fn wait_for_l1_message_queue_index_reached( /// * `Ok(())` if all nodes reach the target block within the timeout /// * `Err` if timeout is reached or any provider call fails pub async fn wait_for_block(nodes: &[&NamedProvider], target_block: u64) -> Result<()> { - let timeout_duration = Duration::from_secs(60); + let timeout_duration = Duration::from_secs(120); let timeout_secs = timeout_duration.as_secs(); tracing::info!( @@ -372,7 +372,7 @@ pub fn create_wallet(chain_id: u64) -> Arc> { /// Generate a transfer transaction with the given wallet. pub async fn generate_tx(wallet: Arc>) -> Bytes { let mut wallet = wallet.lock().await; - let tx_fut = TransactionTestContext::transfer_tx_nonce_bytes( + let tx_fut = TransactionTestContext::transfer_tx_bytes_with_nonce( wallet.chain_id, wallet.inner.clone(), wallet.inner_nonce, diff --git a/tests/tests/heterogeneous_client_sync_and_sequencer_handoff.rs b/tests/tests/heterogeneous_client_sync_and_sequencer_handoff.rs index b5f67f379..e1ccb2595 100644 --- a/tests/tests/heterogeneous_client_sync_and_sequencer_handoff.rs +++ b/tests/tests/heterogeneous_client_sync_and_sequencer_handoff.rs @@ -2,11 +2,12 @@ use eyre::Result; use std::sync::{atomic::AtomicBool, Arc}; use tests::*; -/// Tests cross-client block propagation and synchronization between heterogeneous nodes. +/// Tests the one-way Testnet crossover of block production from `l2geth` to the rollup node (Reth). /// -/// This integration test validates that blocks can be successfully propagated between -/// different Ethereum client implementations (l2geth and rollup-node) in various -/// network topologies. The test exercises: +/// This integration test validates cross-client block propagation between heterogeneous nodes +/// (l2geth and rollup-node) up to and including the single, one-way sequencer handoff. It models +/// the approved Tsuki Testnet contract: after the crossover, sequencing never returns to geth and +/// there is no geth rollback or recovery path. The test exercises: /// /// 1. **Isolated Network Segments**: Initially runs l2geth nodes in isolation, verifying they can /// produce and sync blocks independently @@ -14,35 +15,22 @@ use tests::*; /// - l2geth_sequencer produces blocks, l2geth_follower syncs /// - Rollup nodes remain disconnected at block 0 /// -/// 2. **Cross-Client Synchronization**: Connects rollup nodes to the l2geth network, ensuring they -/// can catch up to the current chain state +/// 2. **Cross-Client Synchronization**: Connects rollup nodes to the l2geth network, ensuring the +/// lagging Reth nodes can catch up to the current chain state /// - Topology: `[rn_follower, rn_sequencer, l2geth_follower] -> l2geth_sequencer` /// - All nodes connect to l2geth_sequencer as the single source of truth /// - Rollup nodes sync from block 0 to current height /// -/// 3. **Sequencer Handoff**: Transitions block production from l2geth to rollup-node, testing that -/// all nodes stay synchronized during the transition +/// 3. **One-Way Sequencer Handoff**: Freezes l2geth sequencing at its final head, proves the Reth +/// nodes have reached that frozen head, and transitions block production to the rollup node. +/// Production never returns to l2geth. /// - Topology remains: `[rn_follower, rn_sequencer, l2geth_follower] -> l2geth_sequencer` -/// - Block production switches from l2geth_sequencer to rn_sequencer -/// - All nodes receive new blocks from rn_sequencer via l2geth_sequencer relay +/// - l2geth sequencing is frozen; all nodes converge on the frozen final head +/// - Block production switches from l2geth_sequencer to rn_sequencer for the remainder +/// - A rollup follower is restarted mid-test to verify Reth state recovery /// -/// 4. **Network Partition Recovery**: Disconnects l2geth nodes, continues production on rollup -/// nodes, then reconnects to verify successful resynchronization -/// - Initial partition: `rn_follower -> rn_sequencer` (isolated rollup network) -/// - l2geth nodes disconnected, fall behind in block height -/// - Reconnection topology: `[l2geth_follower, l2geth_sequencer] -> rn_sequencer` -/// - l2geth nodes catch up by syncing from rn_sequencer -/// -/// 5. **Bidirectional Compatibility**: Returns block production to l2geth after rollup nodes have -/// extended the chain, ensuring backward compatibility -/// - Final topology: `[rn_follower, l2geth_follower, l2geth_sequencer] -> rn_sequencer` -/// - Block production returns to l2geth_sequencer -/// - Validates that l2geth can continue the chain after rollup node blocks -/// -/// The test validates that both client implementations maintain consensus despite -/// network topology changes, sequencer transitions, and temporary network partitions. -/// Each topology change tests different aspects of peer discovery, block gossip, -/// and chain synchronization across heterogeneous client implementations. +/// The test validates that both client implementations maintain consensus through the cross-client +/// sync and the one-way sequencer handoff. #[tokio::test] async fn docker_test_heterogeneous_client_sync_and_sequencer_handoff() -> Result<()> { reth_tracing::init_test_tracing(); @@ -114,13 +102,14 @@ async fn docker_test_heterogeneous_client_sync_and_sequencer_handoff() -> Result let target_block = latest_block + 10; utils::wait_for_block(&nodes, target_block).await?; + // Freeze l2geth sequencing at its final head and prove the Reth nodes reached it. utils::miner_stop(&l2geth_sequencer).await?; let latest_block = l2geth_sequencer.get_block_number().await?; utils::wait_for_block(&nodes, latest_block).await?; utils::assert_blocks_match(&nodes, latest_block).await?; - tracing::info!("✅ All nodes reached block {}", latest_block); + tracing::info!("✅ All nodes reached geth's frozen final block {}", latest_block); - // Enable sequencing on RN sequencer + // One-way handoff: enable sequencing on the Reth sequencer. Production never returns to geth. tracing::info!("Enabling sequencing on RN sequencer"); utils::enable_automatic_sequencing(&rn_sequencer).await?; let target_block = latest_block + 10; @@ -144,83 +133,11 @@ async fn docker_test_heterogeneous_client_sync_and_sequencer_handoff() -> Result utils::wait_for_block(&nodes, target_block).await?; - utils::disable_automatic_sequencing(&rn_sequencer).await?; + // Reth is now the sole sequencer; confirm the full heterogeneous network agrees on its chain. let latest_block = rn_sequencer.get_block_number().await?; utils::wait_for_block(&nodes, latest_block).await?; utils::assert_blocks_match(&nodes, latest_block).await?; - tracing::info!("✅ All nodes reached block {}", latest_block); - - // Disconnect l2geth follower from l2geth sequencer - // topology: - // rn_follower -> rn_sequencer - utils::admin_remove_peer(&rn_follower, &env.l2geth_sequencer_enode()?).await?; - utils::admin_remove_peer(&rn_sequencer, &env.l2geth_sequencer_enode()?).await?; - utils::admin_remove_peer(&l2geth_follower, &env.l2geth_sequencer_enode()?).await?; - utils::admin_add_peer(&rn_follower, &env.rn_sequencer_enode()?).await?; - - // Continue sequencing on RN sequencer for at least 10 blocks - utils::enable_automatic_sequencing(&rn_sequencer).await?; - let target_block = latest_block + 10; - utils::wait_for_block(&rn_nodes, target_block).await?; - - // Make sure l2geth nodes are still at the old block -> they need to sync once reconnected - assert!( - l2geth_sequencer.get_block_number().await? <= target_block + 1, - "l2geth sequencer should be at most at block {}, but is at {}", - target_block + 1, - l2geth_sequencer.get_block_number().await? - ); - assert!( - l2geth_follower.get_block_number().await? <= target_block + 1, - "l2geth follower should be at most at block {}, but is at {}", - target_block + 1, - l2geth_follower.get_block_number().await? - ); - - // restart RN sequencer to test it can recover its state after a restart - tracing::info!("Restarting RN sequencer"); - utils::disable_automatic_sequencing(&rn_sequencer).await?; - let latest_block_before_restart = rn_sequencer.get_block_number().await?; - let chain_status_before_restart = utils::rollup_node_status(&rn_sequencer).await?; - env.stop_container(&rn_sequencer).await?; - env.start_container(&rn_sequencer).await?; - utils::assert_latest_block(&[&rn_sequencer], latest_block_before_restart).await?; - let chain_status_after_restart = utils::rollup_node_status(&rn_sequencer).await?; - assert!( - chain_status_after_restart.l2 == chain_status_before_restart.l2, - "L2 Chain status after restart does not match the one before restart {:?} != {:?}", - chain_status_after_restart.l2, - chain_status_before_restart.l2 - ); - utils::admin_add_peer(&rn_follower, &env.rn_sequencer_enode()?).await?; - utils::enable_automatic_sequencing(&rn_sequencer).await?; - - // Reconnect l2geth follower to l2geth sequencer and let them sync - // topology: - // rn_follower -> rn_sequencer - // l2geth_follower -> rn_sequencer - // l2geth_sequencer -> rn_sequencer - utils::admin_add_peer(&l2geth_follower, &env.rn_sequencer_enode()?).await?; - utils::admin_add_peer(&l2geth_sequencer, &env.rn_sequencer_enode()?).await?; - - // Wait for all nodes to reach the same block again - let target_block = target_block + 10; - utils::wait_for_block(&nodes, target_block).await?; - tracing::info!("✅ l2geth nodes synced to block {}", target_block); - - // Disable sequencing on RN sequencer - utils::disable_automatic_sequencing(&rn_sequencer).await?; - let latest_block = rn_sequencer.get_block_number().await?; - tracing::info!("Switched RN sequencing off at block {}", latest_block); - utils::wait_for_block(&nodes, latest_block).await?; - utils::assert_blocks_match(&nodes, latest_block).await?; - - // start sequencing on l2geth sequencer again and make sure all nodes reach the same block in - // the end - utils::miner_start(&l2geth_sequencer).await?; - let target_block = latest_block + 20; - utils::wait_for_block(&nodes, target_block).await?; - assert_blocks_match(&nodes, target_block).await?; + tracing::info!("✅ All nodes agree on the Reth-sequenced chain at block {}", latest_block); utils::stop_continuous_tx_sender(stop.clone(), tx_sender).await?; utils::stop_continuous_l1_message_sender(stop, l1_message_sender).await?; diff --git a/tests/tests/migrate_sequencer.rs b/tests/tests/migrate_sequencer.rs index 8788363af..e05b57aba 100644 --- a/tests/tests/migrate_sequencer.rs +++ b/tests/tests/migrate_sequencer.rs @@ -1,15 +1,19 @@ use eyre::Result; -use std::{ - sync::{atomic::AtomicBool, Arc}, - time::Duration, -}; +use std::sync::{atomic::AtomicBool, Arc}; use tests::*; +/// One-way Testnet crossover: sequencing transitions from `l2geth` to the rollup node (Reth) once +/// and never returns. +/// +/// This models the approved Tsuki Testnet contract: a lagging Reth node syncs from the last geth +/// sequencer, geth sequencing is frozen, Reth is proven to have reached geth's frozen final head, +/// and only then does Reth begin sequencing. There is no geth rollback or recovery path — geth is +/// retired after the cutover. #[tokio::test] async fn docker_test_migrate_sequencer() -> Result<()> { reth_tracing::init_test_tracing(); - tracing::info!("=== STARTING docker_test_migrate_sequencer ==="); + tracing::info!("=== STARTING docker_test_migrate_sequencer (one-way geth -> Reth) ==="); let env = DockerComposeEnv::new("docker_test_migrate_sequencer").await?; let rn_sequencer = env.get_rn_sequencer_provider().await?; @@ -19,7 +23,8 @@ async fn docker_test_migrate_sequencer() -> Result<()> { let nodes = [&rn_sequencer, &rn_follower, &l2geth_sequencer, &l2geth_follower]; - // Connect all nodes to each other. + // Connect all nodes so the rollup nodes can sync from the geth sequencer during the crossover + // and follow the Reth sequencer afterwards. // topology: // l2geth_follower -> l2geth_sequencer // l2geth_follower -> rn_sequencer @@ -47,50 +52,36 @@ async fn docker_test_migrate_sequencer() -> Result<()> { tracing::info!("🔄 Started continuous L1 message and L2 transaction sender for entire test"); - let enable_l2geth_sequencing = async || -> Result<()> { - utils::disable_automatic_sequencing(&rn_sequencer).await?; - let latest_block = rn_sequencer.get_block_number().await?; - utils::wait_for_block(&nodes, latest_block).await?; + // Phase 1: geth is the sequencer. Ensure Reth is a passive follower during this phase. + utils::disable_automatic_sequencing(&rn_sequencer).await?; + utils::miner_start(&l2geth_sequencer).await?; + utils::wait_for_block(&nodes, 20).await?; - tracing::info!("Enabling sequencing on l2geth sequencer"); - utils::miner_start(&l2geth_sequencer).await?; + // Phase 2: freeze geth sequencing at its final head. + tracing::info!("Freezing geth sequencing"); + utils::miner_stop(&l2geth_sequencer).await?; + let frozen_final_block = l2geth_sequencer.get_block_number().await?; - Ok(()) - }; + // Phase 3: prove the lagging Reth reached geth's frozen final head/hash before it sequences. + utils::wait_for_block(&nodes, frozen_final_block).await?; + utils::assert_blocks_match(&nodes, frozen_final_block).await?; + tracing::info!("✅ Reth reached geth's frozen final block {}", frozen_final_block); - let enable_rn_sequencing = async || -> Result<()> { - utils::miner_stop(&l2geth_sequencer).await?; - let latest_block = l2geth_sequencer.get_block_number().await?; - utils::wait_for_block(&nodes, latest_block).await?; - - tracing::info!("Enabling sequencing on RN sequencer"); - utils::enable_automatic_sequencing(&rn_sequencer).await?; - - Ok(()) - }; - - // Alternate sequencing between l2geth and rn sequencer every 5 seconds. With a block time of - // 500ms we should produce about 10 blocks each handoff. - let latest_block = 0u64; - loop { - enable_l2geth_sequencing().await?; - tokio::time::sleep(Duration::from_secs(5)).await; - enable_rn_sequencing().await?; - tokio::time::sleep(Duration::from_secs(5)).await; - - let latest_block = rn_sequencer.get_block_number().await?; - if latest_block >= 120 { - break; - } - } + // Phase 4: hand sequencing to Reth. Sequencing never returns to geth. + tracing::info!("Enabling sequencing on the Reth sequencer"); + utils::enable_automatic_sequencing(&rn_sequencer).await?; + let target_block = frozen_final_block + 20; + utils::wait_for_block(&nodes, target_block).await?; + let latest_block = rn_sequencer.get_block_number().await?; utils::wait_for_block(&nodes, latest_block).await?; utils::assert_blocks_match(&nodes, latest_block).await?; + tracing::info!("✅ All nodes agree on the Reth-sequenced chain at block {}", latest_block); utils::stop_continuous_tx_sender(stop.clone(), tx_sender).await?; utils::stop_continuous_l1_message_sender(stop, l1_message_sender).await?; - // Make sure l1 message queue is processed on all l2geth nodes + // Make sure the L1 message queue is processed on all l2geth nodes. let q = utils::get_l1_message_index_at_finalized().await?; utils::wait_for_l1_message_queue_index_reached(&[&l2geth_sequencer, &l2geth_follower], q) .await?;