From 412643fbac03c8327ecdab2e9108db1fde00ec07 Mon Sep 17 00:00:00 2001 From: Solar Mithril Date: Wed, 10 Jun 2026 23:24:07 +0400 Subject: [PATCH 1/5] Add arc chain support: compile-time chain selection + arc block building rules - Unify reth git deps with arc-node (tag v1.11.3, same commit as previous rev pin) - New rbuilder 'arc' feature pulling arc-evm/arc-execution-config/arc-precompiles - chain module: cfg-switched ChainSpec/EvmConfig/DbNodeTypes/chain parsing - ArcCachedEvmFactory (no precompile cache: arc precompiles are stateful) - arc_support: ProtocolConfig gas limit, EIP-2935-only pre-block calls, post-block SystemAccounting gas values write + extra_data base fee encoding - finalize: chain-specific requests/extra_data handling asd Co-Authored-By: Claude Fable 5 --- Cargo.lock | 466 +++++++++++++----- Cargo.toml | 56 ++- crates/rbuilder-primitives/src/built_block.rs | 9 +- crates/rbuilder/Cargo.toml | 9 + .../build_block/landed_block_from_db.rs | 8 +- crates/rbuilder/src/backtest/execute.rs | 2 +- .../rbuilder/src/backtest/redistribute/mod.rs | 2 +- .../resim_landed_block.rs | 2 +- crates/rbuilder/src/bin/reth-db-monitor.rs | 6 +- crates/rbuilder/src/building/arc_support.rs | 275 +++++++++++ crates/rbuilder/src/building/evm.rs | 80 +++ crates/rbuilder/src/building/mod.rs | 136 +++-- crates/rbuilder/src/building/payout_tx.rs | 5 +- .../src/building/testing/test_chain_state.rs | 11 +- crates/rbuilder/src/chain.rs | 137 +++++ crates/rbuilder/src/lib.rs | 1 + .../rbuilder/src/live_builder/base_config.rs | 13 +- .../live_builder/block_output/relay_submit.rs | 4 +- crates/rbuilder/src/live_builder/config.rs | 9 +- crates/rbuilder/src/live_builder/mod.rs | 2 +- crates/rbuilder/src/utils/mod.rs | 3 +- 21 files changed, 1002 insertions(+), 234 deletions(-) create mode 100644 crates/rbuilder/src/building/arc_support.rs create mode 100644 crates/rbuilder/src/chain.rs diff --git a/Cargo.lock b/Cargo.lock index e193e0529..c00248710 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1093,6 +1093,89 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arc-evm" +version = "0.0.1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives 1.6.0", + "alloy-rpc-types-engine", + "alloy-sol-types", + "arc-execution-config", + "arc-precompiles", + "reth-chainspec", + "reth-ethereum", + "reth-ethereum-primitives", + "reth-evm", + "reth-node-api", + "reth-primitives-traits", + "revm", + "revm-context-interface", + "revm-interpreter", + "revm-primitives", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "arc-execution-config" +version = "0.0.1" +dependencies = [ + "alloy-eips", + "alloy-evm", + "alloy-genesis", + "alloy-primitives 1.6.0", + "alloy-serde", + "alloy-sol-types", + "arc-shared", + "eyre", + "itertools 0.14.0", + "once_cell", + "reth-chainspec", + "reth-cli", + "reth-cli-commands", + "reth-ethereum-forks", + "reth-ethereum-primitives", + "reth-evm", + "reth-network-peers", + "reth-node-core", + "reth-primitives-traits", + "revm", + "revm-primitives", + "serde", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "arc-precompiles" +version = "0.0.1" +dependencies = [ + "alloy-evm", + "alloy-primitives 1.6.0", + "alloy-sol-types", + "arc-execution-config", + "reth-ethereum", + "reth-evm", + "revm", + "revm-context-interface", + "revm-interpreter", + "revm-primitives", + "serde", + "serde_json", + "slh-dsa", + "thiserror 2.0.17", +] + +[[package]] +name = "arc-shared" +version = "0.0.1" +dependencies = [ + "metrics", +] + [[package]] name = "argminmax" version = "0.6.3" @@ -2590,6 +2673,12 @@ dependencies = [ "cc", ] +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + [[package]] name = "cobs" version = "0.3.0" @@ -2608,7 +2697,7 @@ dependencies = [ "bs58 0.5.1", "coins-core", "digest 0.10.7", - "hmac", + "hmac 0.12.1", "k256 0.13.4", "serde", "sha2 0.10.9", @@ -2623,7 +2712,7 @@ checksum = "74b169b26623ff17e9db37a539fe4f15342080df39f129ef7631df7683d6d9d4" dependencies = [ "bitvec", "coins-bip32", - "hmac", + "hmac 0.12.1", "once_cell", "pbkdf2 0.12.2", "rand 0.8.5", @@ -2760,6 +2849,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const-str" version = "0.4.3" @@ -3140,6 +3235,15 @@ dependencies = [ "cipher", ] +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -3325,7 +3429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] @@ -3351,7 +3455,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ - "const-oid", + "const-oid 0.9.6", "zeroize", ] @@ -3361,11 +3465,21 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid", + "const-oid 0.9.6", "pem-rfc7468", "zeroize", ] +[[package]] +name = "der" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" +dependencies = [ + "const-oid 0.10.2", + "zeroize", +] + [[package]] name = "deranged" version = "0.5.5" @@ -3524,7 +3638,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid", + "const-oid 0.9.6", "crypto-common 0.1.7", "subtle", ] @@ -3537,6 +3651,7 @@ checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "crypto-common 0.2.2", + "ctutils", ] [[package]] @@ -5341,7 +5456,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac", + "hmac 0.12.1", ] [[package]] @@ -5353,6 +5468,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + [[package]] name = "home" version = "0.5.12" @@ -8400,7 +8524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", - "hmac", + "hmac 0.12.1", "password-hash", "sha2 0.10.9", ] @@ -8412,7 +8536,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac", + "hmac 0.12.1", ] [[package]] @@ -8656,6 +8780,16 @@ dependencies = [ "spki 0.7.3", ] +[[package]] +name = "pkcs8" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +dependencies = [ + "der 0.8.0", + "spki 0.8.0", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -9633,6 +9767,12 @@ dependencies = [ "serde", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_distr" version = "0.4.3" @@ -9860,6 +10000,9 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-signer-local", "alloy-trie", + "arc-evm", + "arc-execution-config", + "arc-precompiles", "assert_matches", "async-trait", "beacon-api-client", @@ -9909,6 +10052,7 @@ dependencies = [ "reqwest 0.12.24", "reth", "reth-chainspec", + "reth-cli", "reth-db", "reth-db-common", "reth-errors", @@ -10399,7 +10543,7 @@ checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "reth" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "alloy-rpc-types", @@ -10439,7 +10583,7 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10463,7 +10607,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10495,7 +10639,7 @@ dependencies = [ [[package]] name = "reth-chainspec" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-chains", "alloy-consensus", @@ -10515,7 +10659,7 @@ dependencies = [ [[package]] name = "reth-cli" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-genesis", "clap", @@ -10529,7 +10673,7 @@ dependencies = [ [[package]] name = "reth-cli-commands" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-chains", "alloy-consensus", @@ -10609,7 +10753,7 @@ dependencies = [ [[package]] name = "reth-cli-runner" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "reth-tasks", "tokio", @@ -10619,7 +10763,7 @@ dependencies = [ [[package]] name = "reth-cli-util" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -10637,7 +10781,7 @@ dependencies = [ [[package]] name = "reth-codecs" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10657,7 +10801,7 @@ dependencies = [ [[package]] name = "reth-codecs-derive" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "proc-macro2 1.0.103", "quote 1.0.42", @@ -10667,7 +10811,7 @@ dependencies = [ [[package]] name = "reth-config" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "eyre", "humantime-serde", @@ -10683,7 +10827,7 @@ dependencies = [ [[package]] name = "reth-consensus" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -10696,7 +10840,7 @@ dependencies = [ [[package]] name = "reth-consensus-common" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10708,7 +10852,7 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10734,7 +10878,7 @@ dependencies = [ [[package]] name = "reth-db" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "derive_more 2.1.0", @@ -10761,7 +10905,7 @@ dependencies = [ [[package]] name = "reth-db-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -10790,7 +10934,7 @@ dependencies = [ [[package]] name = "reth-db-common" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -10820,7 +10964,7 @@ dependencies = [ [[package]] name = "reth-db-models" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -10835,7 +10979,7 @@ dependencies = [ [[package]] name = "reth-discv4" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "alloy-rlp", @@ -10860,7 +11004,7 @@ dependencies = [ [[package]] name = "reth-discv5" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "alloy-rlp", @@ -10884,7 +11028,7 @@ dependencies = [ [[package]] name = "reth-dns-discovery" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "dashmap 6.1.0", @@ -10908,7 +11052,7 @@ dependencies = [ [[package]] name = "reth-downloaders" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10939,7 +11083,7 @@ dependencies = [ [[package]] name = "reth-ecies" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "aes", "alloy-primitives 1.6.0", @@ -10951,7 +11095,7 @@ dependencies = [ "ctr", "digest 0.10.7", "futures", - "hmac", + "hmac 0.12.1", "pin-project", "rand 0.8.5", "reth-network-peers", @@ -10967,7 +11111,7 @@ dependencies = [ [[package]] name = "reth-engine-local" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -10990,7 +11134,7 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11015,7 +11159,7 @@ dependencies = [ [[package]] name = "reth-engine-service" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "futures", "pin-project", @@ -11037,7 +11181,7 @@ dependencies = [ [[package]] name = "reth-engine-tree" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eip7928", @@ -11089,7 +11233,7 @@ dependencies = [ [[package]] name = "reth-engine-util" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -11117,7 +11261,7 @@ dependencies = [ [[package]] name = "reth-era" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11132,7 +11276,7 @@ dependencies = [ [[package]] name = "reth-era-downloader" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "bytes", @@ -11148,7 +11292,7 @@ dependencies = [ [[package]] name = "reth-era-utils" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -11170,7 +11314,7 @@ dependencies = [ [[package]] name = "reth-errors" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "reth-consensus", "reth-execution-errors", @@ -11181,7 +11325,7 @@ dependencies = [ [[package]] name = "reth-eth-wire" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-chains", "alloy-primitives 1.6.0", @@ -11209,7 +11353,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-chains", "alloy-consensus", @@ -11227,10 +11371,35 @@ dependencies = [ "thiserror 2.0.17", ] +[[package]] +name = "reth-ethereum" +version = "1.11.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +dependencies = [ + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "reth-chainspec", + "reth-codecs", + "reth-consensus", + "reth-consensus-common", + "reth-db", + "reth-ethereum-consensus", + "reth-ethereum-primitives", + "reth-evm", + "reth-evm-ethereum", + "reth-node-api", + "reth-node-core", + "reth-primitives-traits", + "reth-provider", + "reth-revm", + "reth-storage-api", + "reth-tasks", +] + [[package]] name = "reth-ethereum-cli" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "clap", "eyre", @@ -11253,7 +11422,7 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11269,7 +11438,7 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -11287,7 +11456,7 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eip2124", "alloy-hardforks 0.4.7", @@ -11300,7 +11469,7 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11329,7 +11498,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11349,7 +11518,7 @@ dependencies = [ [[package]] name = "reth-etl" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "rayon", "reth-db-api", @@ -11359,7 +11528,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11383,7 +11552,7 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11404,7 +11573,7 @@ dependencies = [ [[package]] name = "reth-execution-errors" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-evm", "alloy-primitives 1.6.0", @@ -11417,7 +11586,7 @@ dependencies = [ [[package]] name = "reth-execution-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11435,7 +11604,7 @@ dependencies = [ [[package]] name = "reth-exex" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11473,7 +11642,7 @@ dependencies = [ [[package]] name = "reth-exex-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -11487,7 +11656,7 @@ dependencies = [ [[package]] name = "reth-fs-util" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "serde", "serde_json", @@ -11497,7 +11666,7 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -11525,7 +11694,7 @@ dependencies = [ [[package]] name = "reth-ipc" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "bytes", "futures", @@ -11545,7 +11714,7 @@ dependencies = [ [[package]] name = "reth-libmdbx" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "bitflags 2.13.0", "byteorder", @@ -11561,7 +11730,7 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "bindgen", "cc", @@ -11570,7 +11739,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "futures", "metrics", @@ -11582,7 +11751,7 @@ dependencies = [ [[package]] name = "reth-net-banlist" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "ipnet", @@ -11591,7 +11760,7 @@ dependencies = [ [[package]] name = "reth-net-nat" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "futures-util", "if-addrs", @@ -11605,7 +11774,7 @@ dependencies = [ [[package]] name = "reth-network" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11661,7 +11830,7 @@ dependencies = [ [[package]] name = "reth-network-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -11686,7 +11855,7 @@ dependencies = [ [[package]] name = "reth-network-p2p" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11708,7 +11877,7 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "alloy-rlp", @@ -11723,7 +11892,7 @@ dependencies = [ [[package]] name = "reth-network-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -11737,7 +11906,7 @@ dependencies = [ [[package]] name = "reth-nippy-jar" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "anyhow", "bincode", @@ -11754,7 +11923,7 @@ dependencies = [ [[package]] name = "reth-node-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -11778,7 +11947,7 @@ dependencies = [ [[package]] name = "reth-node-builder" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11847,7 +12016,7 @@ dependencies = [ [[package]] name = "reth-node-core" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11902,7 +12071,7 @@ dependencies = [ [[package]] name = "reth-node-ethereum" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-network", @@ -11940,7 +12109,7 @@ dependencies = [ [[package]] name = "reth-node-ethstats" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -11964,7 +12133,7 @@ dependencies = [ [[package]] name = "reth-node-events" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11988,7 +12157,7 @@ dependencies = [ [[package]] name = "reth-node-metrics" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "bytes", "eyre", @@ -12012,7 +12181,7 @@ dependencies = [ [[package]] name = "reth-node-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "reth-chainspec", "reth-db-api", @@ -12024,7 +12193,7 @@ dependencies = [ [[package]] name = "reth-payload-builder" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -12045,7 +12214,7 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "pin-project", "reth-payload-primitives", @@ -12057,7 +12226,7 @@ dependencies = [ [[package]] name = "reth-payload-primitives" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12080,7 +12249,7 @@ dependencies = [ [[package]] name = "reth-payload-validator" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -12090,7 +12259,7 @@ dependencies = [ [[package]] name = "reth-primitives" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12108,7 +12277,7 @@ dependencies = [ [[package]] name = "reth-primitives-traits" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12142,7 +12311,7 @@ dependencies = [ [[package]] name = "reth-provider" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12186,7 +12355,7 @@ dependencies = [ [[package]] name = "reth-prune" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12215,7 +12384,7 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "arbitrary", @@ -12250,7 +12419,7 @@ dependencies = [ [[package]] name = "reth-revm" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "reth-primitives-traits", @@ -12263,7 +12432,7 @@ dependencies = [ [[package]] name = "reth-rpc" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -12340,7 +12509,7 @@ dependencies = [ [[package]] name = "reth-rpc-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eip7928", "alloy-eips", @@ -12370,7 +12539,7 @@ dependencies = [ [[package]] name = "reth-rpc-builder" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-network", "alloy-provider", @@ -12411,7 +12580,7 @@ dependencies = [ [[package]] name = "reth-rpc-convert" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-evm", @@ -12432,7 +12601,7 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -12462,7 +12631,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -12506,7 +12675,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12554,7 +12723,7 @@ dependencies = [ [[package]] name = "reth-rpc-layer" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-rpc-types-engine", "http 1.4.0", @@ -12568,7 +12737,7 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -12584,7 +12753,7 @@ dependencies = [ [[package]] name = "reth-stages" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12630,7 +12799,7 @@ dependencies = [ [[package]] name = "reth-stages-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -12657,7 +12826,7 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "arbitrary", @@ -12671,7 +12840,7 @@ dependencies = [ [[package]] name = "reth-static-file" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "parking_lot", @@ -12691,7 +12860,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "clap", @@ -12706,7 +12875,7 @@ dependencies = [ [[package]] name = "reth-storage-api" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12730,7 +12899,7 @@ dependencies = [ [[package]] name = "reth-storage-errors" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-eips", "alloy-primitives 1.6.0", @@ -12747,7 +12916,7 @@ dependencies = [ [[package]] name = "reth-tasks" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "auto_impl", "dyn-clone", @@ -12765,7 +12934,7 @@ dependencies = [ [[package]] name = "reth-tokio-util" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "tokio", "tokio-stream", @@ -12775,7 +12944,7 @@ dependencies = [ [[package]] name = "reth-tracing" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "clap", "eyre", @@ -12792,7 +12961,7 @@ dependencies = [ [[package]] name = "reth-tracing-otlp" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "clap", "eyre", @@ -12810,7 +12979,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12853,7 +13022,7 @@ dependencies = [ [[package]] name = "reth-trie" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -12879,7 +13048,7 @@ dependencies = [ [[package]] name = "reth-trie-common" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-consensus", "alloy-primitives 1.6.0", @@ -12906,7 +13075,7 @@ dependencies = [ [[package]] name = "reth-trie-db" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "metrics", @@ -12926,7 +13095,7 @@ dependencies = [ [[package]] name = "reth-trie-parallel" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "alloy-rlp", @@ -12951,7 +13120,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "alloy-primitives 1.6.0", "alloy-rlp", @@ -12970,7 +13139,7 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" version = "1.11.3" -source = "git+https://github.com/paradigmxyz/reth?rev=d6324d63e27ef6b7c49cdc9b1977c1b808234c7b#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "zstd 0.13.3", ] @@ -13193,7 +13362,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint 0.4.9", - "hmac", + "hmac 0.12.1", "zeroize", ] @@ -13203,7 +13372,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] @@ -13320,7 +13489,7 @@ version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" dependencies = [ - "const-oid", + "const-oid 0.9.6", "digest 0.10.7", "num-bigint-dig", "num-integer", @@ -14162,6 +14331,17 @@ dependencies = [ "sha2-asm", ] +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + [[package]] name = "sha2-asm" version = "0.6.4" @@ -14281,6 +14461,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "signature" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -14339,6 +14528,25 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +[[package]] +name = "slh-dsa" +version = "0.2.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "371c02fe34044d8866ddf7cb0e8204a87ef31a39f0408bed41c4253ea9dd61ed" +dependencies = [ + "const-oid 0.10.2", + "digest 0.11.3", + "hmac 0.13.0", + "hybrid-array", + "pkcs8 0.11.0", + "rand_core 0.10.1", + "sha2 0.11.0", + "sha3 0.11.0", + "signature 3.0.0", + "typenum", + "zerocopy", +] + [[package]] name = "small_btree" version = "0.1.0" @@ -14471,6 +14679,16 @@ dependencies = [ "der 0.7.10", ] +[[package]] +name = "spki" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" +dependencies = [ + "base64ct", + "der 0.8.0", +] + [[package]] name = "sqlformat" version = "0.2.6" @@ -14610,7 +14828,7 @@ dependencies = [ "generic-array", "hex", "hkdf", - "hmac", + "hmac 0.12.1", "itoa", "log", "md-5", @@ -14653,7 +14871,7 @@ dependencies = [ "futures-util", "hex", "hkdf", - "hmac", + "hmac 0.12.1", "home", "itoa", "log", @@ -16059,9 +16277,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" @@ -17565,7 +17783,7 @@ dependencies = [ "crc32fast", "crossbeam-utils", "flate2", - "hmac", + "hmac 0.12.1", "pbkdf2 0.11.0", "sha1", "time", diff --git a/Cargo.toml b/Cargo.toml index 0c9d92bba..86d62e319 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,7 +72,7 @@ incremental = false [workspace.dependencies] # default-features minus "rocksdb": we only read reth datadirs via MDBX + static files. # ("reth-revm/portable" from reth's default set is re-enabled on the reth-revm dep below.) -reth = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b", default-features = false, features = [ +reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3", default-features = false, features = [ "jemalloc", "otlp", "otlp-logs", @@ -81,30 +81,31 @@ reth = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49 "asm-keccak", "min-debug-logs", ] } -reth-cli-util = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-db-common = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-errors = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-trie = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-trie-parallel = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b", features = [ +reth-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-cli-util = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-db-common = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-trie = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-trie-parallel = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3", features = [ "test-utils", ] } -reth-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-evm = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-revm = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b", features = ["portable"] } -reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-trie-db = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" } +reth-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-revm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3", features = ["portable"] } +reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-trie-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } # compatible with reth v1.11.3 (d6324d63e27ef6b7c49cdc9b1977c1b808234c7b) dependencies revm = { version = "34.0.0", features = [ @@ -184,6 +185,15 @@ uuid = { version = "1.6.1", features = ["serde", "v5", "v4"] } criterion = "0.5.1" proptest = "1.5" +# Arc chain support (path deps into the arc-node checkout, pinned to the same reth tag) +arc-evm = { path = "../../arc-node/crates/evm" } +arc-execution-config = { path = "../../arc-node/crates/execution-config" } +arc-precompiles = { path = "../../arc-node/crates/precompiles" } +arc-evm-node = { path = "../../arc-node/crates/evm-node" } +arc-execution-payload = { path = "../../arc-node/crates/execution-payload" } +arc-execution-txpool = { path = "../../arc-node/crates/execution-txpool" } +arc-shared = { path = "../../arc-node/crates/shared" } + eth-sparse-mpt = { path = "crates/eth-sparse-mpt" } bid-scraper = { path = "crates/bid-scraper" } rbuilder = { path = "crates/rbuilder" } diff --git a/crates/rbuilder-primitives/src/built_block.rs b/crates/rbuilder-primitives/src/built_block.rs index 5bcf8390f..430ad025d 100644 --- a/crates/rbuilder-primitives/src/built_block.rs +++ b/crates/rbuilder-primitives/src/built_block.rs @@ -20,7 +20,7 @@ use alloy_rpc_types_engine::{ BlobsBundleV1, BlobsBundleV2, ExecutionPayload, ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3, }; -use reth_chainspec::{ChainSpec, EthereumHardforks}; +use reth_chainspec::EthereumHardforks; use reth_primitives::SealedBlock; use std::sync::Arc; @@ -35,7 +35,10 @@ pub struct SignedBuiltBlock { impl SignedBuiltBlock { /// Convert the signed block into [`SubmitBlockRequest`](`alloy_rpc_types_beacon::relay::SubmitBlockRequest`). - pub fn into_request(self, chain_spec: &ChainSpec) -> eyre::Result { + pub fn into_request( + self, + chain_spec: &impl EthereumHardforks, + ) -> eyre::Result { match self.execution_payload { ExecutionPayload::V1(_v1) => { eyre::bail!("v1 payloads are not supported"); @@ -153,7 +156,7 @@ fn marshall_txs_blobs_sidecars_v2( /// Utility function to convert built block to execution payload. pub fn block_to_execution_payload( - chain_spec: &ChainSpec, + chain_spec: &impl EthereumHardforks, attrs: &PayloadAttributesData, sealed_block: &SealedBlock, ) -> ExecutionPayload { diff --git a/crates/rbuilder/Cargo.toml b/crates/rbuilder/Cargo.toml index 270abb02f..f56fb179c 100644 --- a/crates/rbuilder/Cargo.toml +++ b/crates/rbuilder/Cargo.toml @@ -41,6 +41,12 @@ reth-evm-ethereum.workspace = true revm.workspace = true reth-node-ethereum.workspace = true +# Arc chain support (enabled with the `arc` feature) +arc-evm = { workspace = true, optional = true } +arc-execution-config = { workspace = true, optional = true } +arc-precompiles = { workspace = true, optional = true } +reth-cli = { workspace = true, optional = true } + alloy-primitives.workspace = true alloy-rlp.workspace = true alloy-chains.workspace = true @@ -149,6 +155,9 @@ assert_matches = "1.5.0" criterion = { workspace = true, features = ["html_reports", "async_tokio"] } [features] +# Build blocks for the Arc chain (arc-node) instead of Ethereum mainnet. +# Swaps ChainSpec/EvmConfig/EvmFactory for the Arc implementations at compile time. +arc = ["dep:arc-evm", "dep:arc-execution-config", "dep:arc-precompiles", "dep:reth-cli"] # TODO: remove? optimism = [] redact-sensitive = [] diff --git a/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs b/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs index 60e02c015..2261ba537 100644 --- a/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs +++ b/crates/rbuilder/src/backtest/build_block/landed_block_from_db.rs @@ -12,7 +12,7 @@ use rbuilder_config::load_toml_config; use rbuilder_primitives::OrderId; use reth_db::DatabaseEnv; use reth_node_api::NodeTypesWithDBAdapter; -use reth_node_ethereum::EthereumNode; +use crate::chain::DbNodeTypes; use tokio_util::sync::CancellationToken; use crate::{ @@ -105,7 +105,7 @@ impl LandedBlockFromDBOrdersSource { impl OrdersSource< ConfigType, - ProviderFactoryReopener>>, + ProviderFactoryReopener>>, > for LandedBlockFromDBOrdersSource { fn available_orders(&self) -> Vec { @@ -118,7 +118,7 @@ impl fn create_provider_factory( &self, - ) -> eyre::Result>>> + ) -> eyre::Result>>> { self.config.base_config().create_reth_provider_factory(true) } @@ -145,7 +145,7 @@ impl fn print_custom_stats( &self, - provider: ProviderFactoryReopener>>, + provider: ProviderFactoryReopener>>, ) -> eyre::Result<()> { if self.sim_landed_block { let tx_sim_results = sim_historical_block( diff --git a/crates/rbuilder/src/backtest/execute.rs b/crates/rbuilder/src/backtest/execute.rs index 4114e69ea..96bfaccca 100644 --- a/crates/rbuilder/src/backtest/execute.rs +++ b/crates/rbuilder/src/backtest/execute.rs @@ -11,7 +11,7 @@ use crate::{ use alloy_eips::BlockNumHash; use alloy_primitives::U256; use rbuilder_primitives::{Order, OrderId, SimulatedOrder}; -use reth_chainspec::ChainSpec; +use crate::chain::ChainSpec; use serde::{Deserialize, Serialize}; use std::sync::Arc; diff --git a/crates/rbuilder/src/backtest/redistribute/mod.rs b/crates/rbuilder/src/backtest/redistribute/mod.rs index d7b892ce2..09987fd24 100644 --- a/crates/rbuilder/src/backtest/redistribute/mod.rs +++ b/crates/rbuilder/src/backtest/redistribute/mod.rs @@ -23,7 +23,7 @@ use alloy_primitives::{utils::format_ether, Address, B256, I256, U256}; use itertools::Itertools; use rayon::prelude::*; use rbuilder_primitives::{Order, OrderId}; -use reth_chainspec::ChainSpec; +use crate::chain::ChainSpec; use serde::{Deserialize, Serialize}; use std::{ cmp::{max, min}, diff --git a/crates/rbuilder/src/backtest/restore_landed_orders/resim_landed_block.rs b/crates/rbuilder/src/backtest/restore_landed_orders/resim_landed_block.rs index eb186a9a1..0712fcc05 100644 --- a/crates/rbuilder/src/backtest/restore_landed_orders/resim_landed_block.rs +++ b/crates/rbuilder/src/backtest/restore_landed_orders/resim_landed_block.rs @@ -15,7 +15,7 @@ use ahash::{HashMap, HashSet}; use alloy_primitives::{TxHash, B256, I256}; use eyre::Context; use rbuilder_primitives::evm_inspector::SlotKey; -use reth_chainspec::ChainSpec; +use crate::chain::ChainSpec; use reth_primitives::{Receipt, Recovered, TransactionSigned}; use std::sync::Arc; diff --git a/crates/rbuilder/src/bin/reth-db-monitor.rs b/crates/rbuilder/src/bin/reth-db-monitor.rs index 493012d7c..f366638b8 100644 --- a/crates/rbuilder/src/bin/reth-db-monitor.rs +++ b/crates/rbuilder/src/bin/reth-db-monitor.rs @@ -18,10 +18,9 @@ use rbuilder::{ provider::StateProviderFactory, utils::ProviderFactoryReopener, }; -use reth::chainspec::chain_value_parser; use reth_db::DatabaseEnv; use reth_node_api::NodeTypesWithDBAdapter; -use reth_node_ethereum::EthereumNode; +use rbuilder::chain::DbNodeTypes as EthereumNode; use serde::Deserialize; use std::{fs, path::PathBuf, sync::Arc, time::Duration}; use tokio::time; @@ -148,7 +147,8 @@ fn create_provider_from_reth_path( reth_path: PathBuf, chain: &str, ) -> eyre::Result>>> { - let chain_spec = chain_value_parser(chain).context("Failed to parse chain name")?; + let chain_spec = + rbuilder::chain::parse_chain_spec(chain).context("Failed to parse chain name")?; // We don't need root hash computation for monitoring, so we pass None let provider = create_provider_factory( diff --git a/crates/rbuilder/src/building/arc_support.rs b/crates/rbuilder/src/building/arc_support.rs new file mode 100644 index 000000000..914a604a6 --- /dev/null +++ b/crates/rbuilder/src/building/arc_support.rs @@ -0,0 +1,275 @@ +//! Arc-specific block building rules. +//! +//! Mirrors what `ArcBlockExecutor`/`ArcBlockAssembler` (arc-node) do around +//! transaction execution so that blocks built by rbuilder are byte-identical +//! to blocks built by the arc-node payload builder: +//! +//! * pre-block (Zero5+): EIP-2935 blockhashes system call. +//! (arc does NOT do the EIP-4788 beacon root call — there is no beacon chain) +//! * post-block: read fee params from the ProtocolConfig contract, compute the +//! next block base fee (EMA-smoothed, ADR-0004), persist the gas values into +//! the SystemAccounting contract storage (a real state write that is part of +//! the block state root) and encode the next base fee into the header +//! `extra_data`. +//! * the block gas limit is dictated by ProtocolConfig (ADR-0003), not by the +//! EIP-1559 gradual gas limit adjustment. + +use crate::{ + building::{BlockBuildingContext, BlockState}, + chain, +}; +use alloy_evm::Database; +use alloy_primitives::Bytes; +use arc_execution_config::{ + chainspec::{BaseFeeConfigProvider as _, BlockGasLimitProvider as _}, + gas_fee::{ + arc_calc_next_block_base_fee, determine_ema_parent_gas_used, encode_base_fee_to_bytes, + }, + hardforks::{is_arc_fork_active, ArcHardfork}, + protocol_config, +}; +use arc_precompiles::system_accounting::{self, GasValues}; +use reth_errors::ProviderError; +use reth_evm::ConfigureEvm as _; +use revm::database::states::bundle_state::BundleRetention; +use std::sync::Arc; +use tracing::warn; + +/// Computes the gas limit the next block must use, exactly as the arc-node +/// payload builder does (`ArcEvmConfig::builder_for_next_block`): query the +/// ProtocolConfig contract on top of the parent state and clamp to the +/// chainspec bounds. +/// +/// `db` must be a database view of the parent block state. +pub fn expected_block_gas_limit( + chain_spec: Arc, + db: DB, + parent_header: &alloy_consensus::Header, + evm_env: reth_evm::EvmEnv, +) -> u64 +where + DB: Database + revm::DatabaseCommit, +{ + let next_block_number = parent_header.number.saturating_add(1); + let gas_limit_config = chain_spec.block_gas_limit_config(next_block_number); + + let evm_config = chain::evm_config(chain_spec); + let mut evm = evm_config.evm_with_env(db, evm_env); + let fee_params = protocol_config::retrieve_fee_params(&mut evm) + .inspect_err(|err| { + warn!(?err, "Failed to get fee params from ProtocolConfig, using default gas limit") + }) + .ok(); + protocol_config::expected_gas_limit(fee_params.as_ref(), &gas_limit_config) +} + +/// Arc pre-block system calls. Mirrors `ArcBlockExecutor::apply_pre_execution_changes`, +/// minus the validations that do not apply to the builder (we set the gas limit +/// and the beneficiary ourselves). +pub fn pre_block_calls( + ctx: &BlockBuildingContext, + state: &mut BlockState, +) -> eyre::Result<()> +where + DB: Database, +{ + if !is_arc_fork_active( + ctx.chain_spec.as_ref(), + ArcHardfork::Zero5, + ctx.block(), + ctx.attributes.timestamp, + ) { + return Ok(()); + } + + let mut db = state.new_db_ref(); + let mut system_caller = alloy_evm::block::system_calls::SystemCaller::new(ctx.chain_spec.clone()); + let mut evm = + chain::evm_config(ctx.chain_spec.clone()).evm_with_env(db.as_mut(), ctx.evm_env.clone()); + // EIP-2935: persist parent block hash in the history storage contract. + // (internally gated on Prague activation, no-op at genesis) + system_caller.apply_blockhashes_contract_call(ctx.attributes.parent, &mut evm)?; + drop(evm); + db.as_mut().merge_transitions(BundleRetention::Reverts); + Ok(()) +} + +/// Result of the Arc post-block step. +pub struct ArcPostBlock { + /// `extra_data` for the block header: the encoded next-block base fee. + pub extra_data: Bytes, +} + +/// Arc post-block step. Mirrors `ArcBlockExecutor::finish` + the extra_data +/// part of `ArcBlockAssembler::assemble_block`: +/// 1. read fee params from ProtocolConfig, +/// 2. compute the gas values / next base fee for this block, +/// 3. persist them into SystemAccounting storage (state write!), +/// 4. return the encoded next base fee for the header `extra_data`. +/// +/// Must be called after all transactions (including the payout tx) are +/// committed, with `gas_used` being the total gas used by the block. +/// The caller is responsible for `merge_transitions` afterwards. +pub fn post_block_call( + db: &mut revm::database::State, + ctx: &BlockBuildingContext, + gas_used: u64, +) -> eyre::Result +where + DB2: Database, +{ + let chain_spec = ctx.chain_spec.as_ref(); + let block_number = ctx.block(); + let timestamp = ctx.attributes.timestamp; + + let mut evm = + chain::evm_config(ctx.chain_spec.clone()).evm_with_env(db, ctx.evm_env.clone()); + + let fee_params = protocol_config::retrieve_fee_params(&mut evm) + .inspect_err(|err| { + warn!( + ?err, + block_number, "Failed to retrieve fee params from ProtocolConfig" + ) + }) + .ok(); + + let zero5 = is_arc_fork_active(chain_spec, ArcHardfork::Zero5, block_number, timestamp); + + let gas_values = if zero5 { + compute_gas_values(ctx, &mut evm, gas_used, fee_params) + .map_err(|err| eyre::eyre!("Failed to compute Arc gas values: {err}"))? + } else { + compute_gas_values_legacy(ctx, &mut evm, gas_used, fee_params) + .map_err(|err| eyre::eyre!("Failed to compute Arc gas values (legacy): {err}"))? + }; + + let extra_data = if zero5 && gas_values.nextBaseFee != 0 { + encode_base_fee_to_bytes(gas_values.nextBaseFee) + } else { + // Matches ArcBlockAssembler: extra_data stays empty when there is no + // next base fee to encode (pre-Zero5 / SystemAccounting unavailable). + Bytes::default() + }; + + // Persist the gas values into SystemAccounting storage. This is a state + // write and commits into the EVM db (part of the block's state root). + system_accounting::store_gas_values(block_number, gas_values, &mut evm) + .map_err(|err| eyre::eyre!("Failed to store Arc gas values: {err}"))?; + + Ok(ArcPostBlock { extra_data }) +} + +/// Mirrors `ArcBlockExecutor::compute_gas_values` (ADR-0004, Zero5+). +fn compute_gas_values( + ctx: &BlockBuildingContext, + evm: &mut E, + gas_used: u64, + fee_params: Option, +) -> eyre::Result +where + E: alloy_evm::Evm, + E::DB: revm::DatabaseCommit, +{ + let chain_spec = ctx.chain_spec.as_ref(); + let block_number = ctx.block(); + + if fee_params.is_none() { + warn!( + block_number, + "ProtocolConfig unavailable post-Zero5; computing next_base_fee with chainspec defaults" + ); + } + + let base_fee_config = chain_spec.base_fee_config( + block_number + .checked_add(1) + .ok_or_else(|| eyre::eyre!("block number overflow"))?, + ); + let calc = base_fee_config.resolve_calc_params(fee_params.as_ref()); + + let parent_block_number = block_number.saturating_sub(1); + let parent_gas_values = system_accounting::retrieve_gas_values(parent_block_number, evm) + .map_err(|err| eyre::eyre!("Failed to retrieve parent gas values: {err}"))?; + + let smoothed_gas_used = + determine_ema_parent_gas_used(parent_gas_values.gasUsedSmoothed, gas_used, calc.alpha) + .unwrap_or(gas_used); + + let raw_next_base_fee = arc_calc_next_block_base_fee( + smoothed_gas_used, + gas_limit(ctx), + base_fee(ctx), + calc.k_rate, + calc.inverse_elasticity_multiplier, + ); + + let clamped = match fee_params.as_ref() { + Some(fp) => protocol_config::determine_bounded_base_fee(fp, raw_next_base_fee), + None => raw_next_base_fee, + }; + let next_base_fee = base_fee_config.clamp_absolute(clamped); + + Ok(GasValues { + gasUsed: gas_used, + gasUsedSmoothed: smoothed_gas_used, + nextBaseFee: next_base_fee, + }) +} + +/// Mirrors `ArcBlockExecutor::compute_gas_values_legacy` (pre-Zero5). +fn compute_gas_values_legacy( + ctx: &BlockBuildingContext, + evm: &mut E, + gas_used: u64, + fee_params: Option, +) -> eyre::Result +where + E: alloy_evm::Evm, + E::DB: revm::DatabaseCommit, +{ + let Some(fee_params) = fee_params else { + return Ok(GasValues { + gasUsed: gas_used, + gasUsedSmoothed: gas_used, + nextBaseFee: 0, + }); + }; + + let block_number = ctx.block(); + let parent_block_number = block_number.saturating_sub(1); + let parent_gas_values = system_accounting::retrieve_gas_values(parent_block_number, evm) + .map_err(|err| eyre::eyre!("Failed to retrieve parent gas values: {err}"))?; + + let calculated_smoothed_gas_used = determine_ema_parent_gas_used( + parent_gas_values.gasUsedSmoothed, + gas_used, + fee_params.alpha, + ); + + let mut next_base_fee: u64 = 0; + if let Some(smoothed_gas_used) = calculated_smoothed_gas_used { + let raw = arc_calc_next_block_base_fee( + smoothed_gas_used, + gas_limit(ctx), + base_fee(ctx), + fee_params.kRate, + fee_params.inverseElasticityMultiplier, + ); + next_base_fee = protocol_config::determine_bounded_base_fee(&fee_params, raw); + } + + Ok(GasValues { + gasUsed: gas_used, + gasUsedSmoothed: calculated_smoothed_gas_used.unwrap_or(gas_used), + nextBaseFee: next_base_fee, + }) +} + +fn gas_limit(ctx: &BlockBuildingContext) -> u64 { + ctx.evm_env.block_env.gas_limit +} + +fn base_fee(ctx: &BlockBuildingContext) -> u64 { + ctx.evm_env.block_env.basefee +} diff --git a/crates/rbuilder/src/building/evm.rs b/crates/rbuilder/src/building/evm.rs index 464905c62..c7a9cab6b 100644 --- a/crates/rbuilder/src/building/evm.rs +++ b/crates/rbuilder/src/building/evm.rs @@ -60,6 +60,28 @@ pub trait EvmFactory { I: Inspector, EthInterpreter>; } +/// EVM factory used by the block building code for the chain this binary was +/// compiled for. See [`crate::chain`]. +#[cfg(not(feature = "arc"))] +pub type ChainCachedEvmFactory = EthCachedEvmFactory; +#[cfg(feature = "arc")] +pub type ChainCachedEvmFactory = arc_factory::ArcCachedEvmFactory; + +/// Creates the chain-appropriate EVM factory for the building code. +pub fn create_chain_evm_factory( + chain_spec: &std::sync::Arc, +) -> ChainCachedEvmFactory { + #[cfg(not(feature = "arc"))] + { + let _ = chain_spec; + EthCachedEvmFactory::default() + } + #[cfg(feature = "arc")] + { + arc_factory::ArcCachedEvmFactory::new(chain_spec.clone()) + } +} + #[derive(Debug, Clone, Default)] pub struct EthCachedEvmFactory { evm_factory: EthEvmFactory, @@ -114,3 +136,61 @@ impl EvmFactory for EthCachedEvmFactory { ) } } + +#[cfg(feature = "arc")] +mod arc_factory { + use super::{Database, EthEvmContext, EvmEnv, EvmFactory, RethEvmFactory}; + use crate::chain::ChainSpec; + use arc_evm::ArcEvmFactory; + use revm::{ + inspector::NoOpInspector, interpreter::interpreter::EthInterpreter, Inspector, + }; + use std::sync::Arc; + + /// EVM factory for Arc. + /// + /// Unlike [`super::EthCachedEvmFactory`] this does NOT cache precompile + /// calls: several Arc precompiles (NativeCoinControl, SystemAccounting) + /// read contract storage, so caching results keyed only by input would + /// return stale data. + #[derive(Debug, Clone)] + pub struct ArcCachedEvmFactory { + evm_factory: ArcEvmFactory, + } + + impl ArcCachedEvmFactory { + pub fn new(chain_spec: Arc) -> Self { + Self { + evm_factory: ArcEvmFactory::new(chain_spec), + } + } + } + + impl EvmFactory for ArcCachedEvmFactory { + type Evm + = ::Evm + where + DB: Database, + I: Inspector>; + + fn create_evm(&self, db: DB, env: EvmEnv) -> Self::Evm + where + DB: Database, + { + self.evm_factory.create_evm(db, env) + } + + fn create_evm_with_inspector( + &self, + db: DB, + env: EvmEnv, + inspector: I, + ) -> Self::Evm + where + DB: Database, + I: Inspector, EthInterpreter>, + { + self.evm_factory.create_evm_with_inspector(db, env, inspector) + } + } +} diff --git a/crates/rbuilder/src/building/mod.rs b/crates/rbuilder/src/building/mod.rs index 84d2c59a7..58455207a 100644 --- a/crates/rbuilder/src/building/mod.rs +++ b/crates/rbuilder/src/building/mod.rs @@ -21,21 +21,22 @@ use crate::{ }; use alloy_consensus::{constants::KECCAK_EMPTY, Header, EMPTY_OMMER_ROOT_HASH}; use alloy_eips::{ - eip1559::{calculate_block_gas_limit, ETHEREUM_BLOCK_GAS_LIMIT_30M}, eip4895::Withdrawals, eip7594::BlobTransactionSidecarVariant, eip7685::Requests, eip7840::BlobParams, merge::BEACON_NONCE, }; -use alloy_evm::{block::system_calls::SystemCaller, env::EvmEnv, eth::eip6110, Database}; +#[cfg(not(feature = "arc"))] +use alloy_evm::{block::system_calls::SystemCaller, eth::eip6110}; +use alloy_evm::{env::EvmEnv, Database}; use alloy_primitives::{Address, BlockNumber, Bytes, B256, I256, U256}; use alloy_rlp::Encodable as _; use alloy_rpc_types_beacon::events::PayloadAttributesEvent; use cached_reads::SharedCachedReads; use derive_more::Deref; use eth_sparse_mpt::SparseTrieLocalCache; -use evm::EthCachedEvmFactory; +use evm::{create_chain_evm_factory, ChainCachedEvmFactory}; use jsonrpsee::core::Serialize; use parking_lot::Mutex; use rbuilder_primitives::{ @@ -46,10 +47,11 @@ use reth::{ payload::PayloadId, primitives::{Block, SealedBlock}, }; -use reth_chainspec::{ChainSpec, EthChainSpec, EthereumHardforks}; +use crate::chain::ChainSpec; +use reth_chainspec::{EthChainSpec, EthereumHardforks}; use reth_errors::{BlockExecutionError, BlockValidationError, ProviderError}; use reth_evm::{ConfigureEvm, NextBlockEnvAttributes}; -use reth_evm_ethereum::{revm_spec_by_timestamp_and_block_number, EthEvmConfig}; +use reth_evm_ethereum::revm_spec_by_timestamp_and_block_number; use reth_node_api::{EngineApiMessageVersion, PayloadBuilderAttributes}; use reth_payload_builder::EthPayloadBuilderAttributes; use reth_primitives::BlockBody; @@ -73,6 +75,8 @@ use time::OffsetDateTime; use tracing::{error, trace}; use tx_sim_cache::TxExecutionCache; +#[cfg(feature = "arc")] +pub mod arc_support; pub mod bid_adjustments; pub mod block_orders; pub mod builders; @@ -104,7 +108,7 @@ const BLOCK_HEADER_RLP_OVERHEAD: usize = 1024; #[derive(Debug, Clone)] pub struct BlockBuildingContext { - pub evm_factory: EthCachedEvmFactory, + pub evm_factory: ChainCachedEvmFactory, pub evm_env: EvmEnv, pub attributes: EthPayloadBuilderAttributes, pub chain_spec: Arc, @@ -157,14 +161,9 @@ impl BlockBuildingContext { EngineApiMessageVersion::default() as u8, ) .expect("PayloadBuilderAttributes::try_new"); - let eth_evm_config = EthEvmConfig::new(chain_spec.clone()); - let gas_limit = calculate_block_gas_limit( - parent.gas_limit, - // This is only for tests, prefer_gas_limit should always be Some since - // the protocol does NOT cap the block to ETHEREUM_BLOCK_GAS_LIMIT. - prefer_gas_limit.unwrap_or(ETHEREUM_BLOCK_GAS_LIMIT_30M), - ); - let mut evm_env = eth_evm_config + let evm_config = crate::chain::evm_config(chain_spec.clone()); + let gas_limit = crate::chain::next_block_gas_limit(parent.gas_limit, prefer_gas_limit); + let mut evm_env = evm_config .next_evm_env( parent, &NextBlockEnvAttributes { @@ -208,7 +207,7 @@ impl BlockBuildingContext { Self::max_blob_gas_per_block_at(&chain_spec, attributes.timestamp()); let block_number = evm_env.block_env.number.try_into().ok()?; Some(BlockBuildingContext { - evm_factory: EthCachedEvmFactory::default(), + evm_factory: create_chain_evm_factory(&chain_spec), evm_env, attributes, chain_spec, @@ -254,8 +253,8 @@ impl BlockBuildingContext { mev_blocker_price: U256, ) -> BlockBuildingContext { let block_number = onchain_block.header.number; - let eth_evm_config = EthEvmConfig::new(chain_spec.clone()); - let mut evm_env = eth_evm_config + let evm_config = crate::chain::evm_config(chain_spec.clone()); + let mut evm_env = evm_config .evm_env(&onchain_block.header) .expect("evm env config"); evm_env.block_env.beneficiary = beneficiary; @@ -290,7 +289,7 @@ impl BlockBuildingContext { let max_blob_gas_per_block = Self::max_blob_gas_per_block_at(&chain_spec, attributes.timestamp()); BlockBuildingContext { - evm_factory: EthCachedEvmFactory::default(), + evm_factory: create_chain_evm_factory(&chain_spec), evm_env, attributes, chain_spec, @@ -321,7 +320,7 @@ impl BlockBuildingContext { onchain_block.header.base_fee_per_gas = Some(0); BlockBuildingContext::from_onchain_block( onchain_block, - reth_chainspec::MAINNET.clone(), + crate::chain::chain_spec_for_testing(), Default::default(), Default::default(), Default::default(), @@ -902,42 +901,62 @@ impl( &self, state: &mut BlockState, ctx: &BlockBuildingContext, finalize_revert_state: &mut FinalizeRevertStateCurrentIteration, - ) -> Result<(Option, Option), FinalizeError> + ) -> Result<(Option, Option, Bytes), FinalizeError> where DB: Database, { let mut db = state.new_db_ref(); // Apply and gather execution requests - let requests = if ctx - .chain_spec - .is_prague_active_at_timestamp(ctx.attributes.timestamp()) - { - // Collect all EIP-6110 deposits - let deposit_requests = eip6110::parse_deposits_from_receipts( - &ctx.chain_spec, - self.executed_tx_infos.iter().map(|info| &info.receipt), - ) - .map_err(BlockExecutionError::Validation)?; + #[cfg(not(feature = "arc"))] + let (requests, extra_data) = { + let requests = if ctx + .chain_spec + .is_prague_active_at_timestamp(ctx.attributes.timestamp()) + { + // Collect all EIP-6110 deposits + let deposit_requests = eip6110::parse_deposits_from_receipts( + &ctx.chain_spec, + self.executed_tx_infos.iter().map(|info| &info.receipt), + ) + .map_err(BlockExecutionError::Validation)?; - let mut requests = Requests::default(); - if !deposit_requests.is_empty() { - requests.push_request_with_type(eip6110::DEPOSIT_REQUEST_TYPE, deposit_requests); - } + let mut requests = Requests::default(); + if !deposit_requests.is_empty() { + requests + .push_request_with_type(eip6110::DEPOSIT_REQUEST_TYPE, deposit_requests); + } - let mut system_caller = SystemCaller::new(ctx.chain_spec.clone()); - let mut evm = EthEvmConfig::new(ctx.chain_spec.clone()) - .evm_with_env(db.as_mut(), ctx.evm_env.clone()); - requests.extend(system_caller.apply_post_execution_changes(&mut evm)?); - Some(requests) - } else { - None + let mut system_caller = SystemCaller::new(ctx.chain_spec.clone()); + let mut evm = crate::chain::evm_config(ctx.chain_spec.clone()) + .evm_with_env(db.as_mut(), ctx.evm_env.clone()); + requests.extend(system_caller.apply_post_execution_changes(&mut evm)?); + Some(requests) + } else { + None + }; + (requests, Bytes::from(ctx.extra_data.clone())) + }; + + // Arc has no execution requests (no deposit contract, no EIP-7002/7251 + // system calls), but requires the post-block gas accounting step: + // persist gas values into SystemAccounting and encode the next block's + // base fee into the header extra_data. + #[cfg(feature = "arc")] + let (requests, extra_data) = { + let post_block = + arc_support::post_block_call(db.as_mut(), ctx, self.space_state.gas_used())?; + let requests = ctx + .chain_spec + .is_prague_active_at_timestamp(ctx.attributes.timestamp()) + .then(Requests::default); + (requests, post_block.extra_data) }; // Apply withdrawals @@ -968,7 +987,7 @@ impl Result, secp256k1::Error> { let tx = Transaction::Eip1559(TxEip1559 { - chain_id: chain_spec.chain.id(), + chain_id: chain_spec.chain_id(), nonce, gas_limit, max_fee_per_gas: basefee as u128, diff --git a/crates/rbuilder/src/building/testing/test_chain_state.rs b/crates/rbuilder/src/building/testing/test_chain_state.rs index 81e096d37..6a362c7c8 100644 --- a/crates/rbuilder/src/building/testing/test_chain_state.rs +++ b/crates/rbuilder/src/building/testing/test_chain_state.rs @@ -20,7 +20,8 @@ use reth::{ providers::ProviderFactory, rpc::types::{engine::PayloadAttributes, Withdrawal}, }; -use reth_chainspec::{ChainSpec, EthereumHardfork, MAINNET}; +use crate::chain::ChainSpec; +use reth_chainspec::{EthChainSpec as _, EthereumHardfork, MAINNET}; use reth_db::{cursor::DbCursorRW, tables, transaction::DbTxMut}; use reth_errors::ProviderResult; use reth_primitives::{Recovered, TransactionSigned}; @@ -119,7 +120,9 @@ impl TestChainState { let blocklisted_address = Signer::random(); let builder = Signer::random(); let fee_recipient = Signer::random(); - let chain_spec = MAINNET.clone(); + let chain_spec = std::sync::Arc::new(crate::chain::chain_spec_from_inner( + MAINNET.as_ref().clone(), + )); let test_accounts = vec![ Signer::random(), Signer::random(), @@ -134,7 +137,7 @@ impl TestChainState { let mut contracts = extra_contracts; contracts.push(test_contracts.mev_test(mev_test_address)); - let genesis_header = chain_spec.sealed_genesis_header(); + let genesis_header = crate::chain::inner_chain_spec(&chain_spec).sealed_genesis_header(); let provider_factory = create_test_provider_factory(); { let provider = provider_factory.provider_rw()?; @@ -240,7 +243,7 @@ impl TestChainState { // returns signed transaction pub fn sign_tx(&self, args: TxArgs) -> eyre::Result> { let tx = TxEip1559 { - chain_id: self.chain_spec.chain.id(), + chain_id: self.chain_spec.chain_id(), nonce: args.nonce, gas_limit: args.gas_limit, max_fee_per_gas: args.max_fee_per_gas, diff --git a/crates/rbuilder/src/chain.rs b/crates/rbuilder/src/chain.rs new file mode 100644 index 000000000..45f5bdafa --- /dev/null +++ b/crates/rbuilder/src/chain.rs @@ -0,0 +1,137 @@ +//! Compile-time chain selection. +//! +//! rbuilder builds blocks for exactly one chain per binary. By default that is +//! Ethereum; enabling the `arc` cargo feature switches the chain-coupled types +//! (chain spec, EVM configuration, EVM factory) and the chain-specific block +//! building rules to the Arc implementations from arc-node. +//! +//! Code should import [`ChainSpec`]/[`EvmConfig`] from this module instead of +//! naming `reth_chainspec::ChainSpec`/`EthEvmConfig` directly. + +use std::sync::Arc; + +#[cfg(not(feature = "arc"))] +mod eth { + use std::sync::Arc; + + pub use reth_chainspec::ChainSpec; + pub use reth_evm_ethereum::EthEvmConfig as EvmConfig; + + /// Node types used to open a reth database directly (backtest, db tools). + pub use reth_node_ethereum::EthereumNode as DbNodeTypes; + + pub fn evm_config(chain_spec: Arc) -> EvmConfig { + EvmConfig::new(chain_spec) + } + + /// Wraps a raw reth `ChainSpec` into the chain spec type of this binary. + pub fn chain_spec_from_inner(inner: reth_chainspec::ChainSpec) -> ChainSpec { + inner + } + + /// Access the raw reth `ChainSpec` underneath. + pub fn inner_chain_spec(spec: &ChainSpec) -> &reth_chainspec::ChainSpec { + spec + } + + /// Parses a chain name or a path to a genesis file. + pub fn parse_chain_spec(value: &str) -> eyre::Result> { + reth::chainspec::chain_value_parser(value).map_err(|e| eyre::eyre!(e)) + } + + /// Chain spec used for tests/dummies where any chain spec works. + pub fn chain_spec_for_testing() -> Arc { + reth_chainspec::MAINNET.clone() + } + + /// Gas limit for the new block. + /// On Ethereum the protocol moves the gas limit towards the target by a + /// bounded step each block. + pub fn next_block_gas_limit(parent_gas_limit: u64, target: Option) -> u64 { + alloy_eips::eip1559::calculate_block_gas_limit( + parent_gas_limit, + // This is only for tests, target should always be Some since + // the protocol does NOT cap the block to ETHEREUM_BLOCK_GAS_LIMIT. + target.unwrap_or(alloy_eips::eip1559::ETHEREUM_BLOCK_GAS_LIMIT_30M), + ) + } +} + +#[cfg(feature = "arc")] +mod arc { + use std::sync::Arc; + + use reth_cli::chainspec::ChainSpecParser as _; + + pub use arc_evm::ArcEvmConfig as EvmConfig; + pub use arc_execution_config::chainspec::ArcChainSpec as ChainSpec; + + pub fn evm_config(chain_spec: Arc) -> EvmConfig { + EvmConfig::new(reth_evm_ethereum::EthEvmConfig::new_with_evm_factory( + chain_spec.clone(), + arc_evm::ArcEvmFactory::new(chain_spec), + )) + } + + /// Node types used to open an arc-node reth database directly + /// (backtest, db tools). Minimal stand-in for arc-node's `ArcNode` so the + /// rbuilder lib does not have to depend on the full arc node crate. + #[derive(Debug, Clone, Copy, Default)] + pub struct DbNodeTypes; + + impl reth_node_api::NodeTypes for DbNodeTypes { + type Primitives = reth::primitives::EthPrimitives; + type ChainSpec = ChainSpec; + type Storage = reth_provider::EthStorage; + type Payload = reth_node_ethereum::EthEngineTypes; + } + + /// Wraps a raw reth `ChainSpec` into the chain spec type of this binary. + pub fn chain_spec_from_inner(inner: reth_chainspec::ChainSpec) -> ChainSpec { + ChainSpec::new(inner) + } + + /// Access the raw reth `ChainSpec` underneath. + pub fn inner_chain_spec(spec: &ChainSpec) -> &reth_chainspec::ChainSpec { + &spec.inner + } + + /// Parses an arc chain name ("arc-localdev", "arc-devnet", "arc-testnet", + /// "arc-mainnet") or a path to a genesis file. + pub fn parse_chain_spec(value: &str) -> eyre::Result> { + arc_execution_config::chainspec::ArcChainSpecParser::parse(value) + .map_err(|e| eyre::eyre!(e)) + } + + /// Chain spec used for tests/dummies where any chain spec works. + pub fn chain_spec_for_testing() -> Arc { + arc_execution_config::chainspec::LOCAL_DEV.clone() + } + + /// Gas limit for the new block. + /// On Arc the gas limit is set exactly to the value dictated by the + /// on-chain ProtocolConfig contract (ADR-0003); there is no gradual + /// movement towards a target. The caller provides that value (computed + /// with [`crate::building::arc_support::expected_block_gas_limit`]); when + /// absent we keep the parent's gas limit. + pub fn next_block_gas_limit(parent_gas_limit: u64, target: Option) -> u64 { + target.unwrap_or(parent_gas_limit) + } +} + +#[cfg(not(feature = "arc"))] +pub use eth::*; + +#[cfg(feature = "arc")] +pub use arc::*; + +/// True when this binary builds blocks for Arc. +pub const fn is_arc() -> bool { + cfg!(feature = "arc") +} + +/// Creates the chain-appropriate EVM config. Re-exported helper so call sites +/// can stay chain-agnostic. +pub fn evm_config_for(chain_spec: &Arc) -> EvmConfig { + evm_config(chain_spec.clone()) +} diff --git a/crates/rbuilder/src/lib.rs b/crates/rbuilder/src/lib.rs index 02708706f..98680e204 100644 --- a/crates/rbuilder/src/lib.rs +++ b/crates/rbuilder/src/lib.rs @@ -1,6 +1,7 @@ pub mod backtest; pub mod beacon_api_client; pub mod building; +pub mod chain; pub mod integration; pub mod live_builder; pub mod mev_boost; diff --git a/crates/rbuilder/src/live_builder/base_config.rs b/crates/rbuilder/src/live_builder/base_config.rs index 38a70cc1c..793708f81 100644 --- a/crates/rbuilder/src/live_builder/base_config.rs +++ b/crates/rbuilder/src/live_builder/base_config.rs @@ -26,11 +26,10 @@ use eth_sparse_mpt::{ETHSpareMPTVersion, RootHashThreadPool}; use eyre::Context; use jsonrpsee::RpcModule; use rbuilder_config::{EnvOrValue, LoggerConfig, OtlpConfig, TracingConfig}; -use reth::chainspec::chain_value_parser; -use reth_chainspec::ChainSpec; +use crate::chain::ChainSpec; use reth_db::DatabaseEnv; use reth_node_api::NodeTypesWithDBAdapter; -use reth_node_ethereum::EthereumNode; +use crate::chain::DbNodeTypes; use reth_primitives::StaticFileSegment; use reth_provider::StaticFileProviderFactory; use serde::{Deserialize, Deserializer}; @@ -284,7 +283,7 @@ impl BaseConfig { } pub fn chain_spec(&self) -> eyre::Result> { - chain_value_parser(&self.chain) + crate::chain::parse_chain_spec(&self.chain) } /// Open reth db and DB should be opened once per process but it can be cloned and moved to different threads. @@ -292,7 +291,7 @@ impl BaseConfig { pub fn create_reth_provider_factory( &self, skip_root_hash: bool, - ) -> eyre::Result>>> + ) -> eyre::Result>>> { create_provider_factory( self.reth_datadir.as_deref(), @@ -560,7 +559,7 @@ pub fn create_provider_factory( chain_spec: Arc, rw: bool, root_hash_config: Option, -) -> eyre::Result>>> { +) -> eyre::Result>>> { // shellexpand the reth datadir let reth_datadir = if let Some(reth_datadir) = reth_datadir { let reth_datadir = reth_datadir @@ -686,7 +685,7 @@ mod test { // before `create_provider_factory` reopens the same paths below. { let db = Arc::new(init_db(data_dir.db(), Default::default()).unwrap()); - let provider_factory = ProviderFactory::>::new( + let provider_factory = ProviderFactory::>::new( db, SEPOLIA.clone(), StaticFileProvider::read_write(data_dir.static_files().as_path()).unwrap(), diff --git a/crates/rbuilder/src/live_builder/block_output/relay_submit.rs b/crates/rbuilder/src/live_builder/block_output/relay_submit.rs index 5937f17bf..96a4ebc8c 100644 --- a/crates/rbuilder/src/live_builder/block_output/relay_submit.rs +++ b/crates/rbuilder/src/live_builder/block_output/relay_submit.rs @@ -30,7 +30,7 @@ use rbuilder_primitives::{ SubmitHeaderRequestWithMetadata, ValidatorSlotData, }, }; -use reth_chainspec::ChainSpec; +use crate::chain::ChainSpec; use std::sync::Arc; use time::OffsetDateTime; use tokio::{sync::Notify, time::Instant}; @@ -259,7 +259,7 @@ async fn run_submit_to_relays_job( inc_initiated_submissions(); let execution_payload = block_to_execution_payload( - &config.chain_spec, + config.chain_spec.as_ref(), &slot_data.payload_attributes_event.data, &block.sealed_block, ); diff --git a/crates/rbuilder/src/live_builder/config.rs b/crates/rbuilder/src/live_builder/config.rs index 62c1a4b8b..3e7eeb2b0 100644 --- a/crates/rbuilder/src/live_builder/config.rs +++ b/crates/rbuilder/src/live_builder/config.rs @@ -61,10 +61,11 @@ use eyre::Context; use lazy_static::lazy_static; use rbuilder_config::EnvOrValue; use rbuilder_primitives::mev_boost::{MevBoostRelayID, RelayMode}; -use reth_chainspec::{Chain, ChainSpec, NamedChain}; +use crate::chain::ChainSpec; +use reth_chainspec::{Chain, EthChainSpec as _, NamedChain}; use reth_db::DatabaseEnv; use reth_node_api::NodeTypesWithDBAdapter; -use reth_node_ethereum::EthereumNode; +use crate::chain::DbNodeTypes; use reth_primitives::StaticFileSegment; use reth_provider::StaticFileProviderFactory; use serde::Deserialize; @@ -415,7 +416,7 @@ impl L1Config { Option>, )> { let signing_domain = get_signing_domain( - chain_spec.chain, + chain_spec.chain(), self.beacon_clients()?, self.genesis_fork_version.clone(), )?; @@ -764,7 +765,7 @@ pub fn create_provider_factory( reth_static_files_path: Option<&Path>, chain_spec: Arc, root_hash_config: Option, -) -> eyre::Result>>> { +) -> eyre::Result>>> { let reth_db_path = match (reth_db_path, reth_datadir) { (Some(reth_db_path), _) => PathBuf::from(reth_db_path), (None, Some(reth_datadir)) => reth_datadir.join("db"), diff --git a/crates/rbuilder/src/live_builder/mod.rs b/crates/rbuilder/src/live_builder/mod.rs index f18e9fac7..756fc4257 100644 --- a/crates/rbuilder/src/live_builder/mod.rs +++ b/crates/rbuilder/src/live_builder/mod.rs @@ -45,7 +45,7 @@ use reth::transaction_pool::{ BlobStore, EthPooledTransaction, Pool, TransactionListenerKind, TransactionOrdering, TransactionPool, TransactionValidator, }; -use reth_chainspec::ChainSpec; +use crate::chain::ChainSpec; use reth_primitives::{Recovered, TransactionSigned}; use std::{ cmp::min, diff --git a/crates/rbuilder/src/utils/mod.rs b/crates/rbuilder/src/utils/mod.rs index 3cd7e6873..4bb890a37 100644 --- a/crates/rbuilder/src/utils/mod.rs +++ b/crates/rbuilder/src/utils/mod.rs @@ -10,7 +10,8 @@ use rbuilder_primitives::{ serialize::{RawTx, TxEncoding}, TransactionSignedEcRecoveredWithBlobs, }; -use reth_chainspec::ChainSpec; +use crate::chain::ChainSpec; +use reth_chainspec::EthChainSpec as _; use reth_evm_ethereum::revm_spec_by_timestamp_and_block_number; use revm::context::CfgEnv; use time::{format_description::well_known::Rfc3339, OffsetDateTime}; From b7326c205c2e050bb363d6a4df401a78468907eb Mon Sep 17 00:00:00 2001 From: Solar Mithril Date: Wed, 10 Jun 2026 23:33:19 +0400 Subject: [PATCH 2/5] Generalize block sink and slot source for engine-driven chains - UnfinishedBlockBuildingSink(Factory) traits; MEV-Boost pipeline implements them - SlotSource enum: MevBoost generator or external channel (engine API driver) - EnginePayloadSink: finalizes best blocks into EthBuiltPayload via a watch-cell registry keyed by engine PayloadId (for engine_getPayload) - TimingsConfig::arc() for sub-second engine-driven slots - StateProviderFactory now requires Debug (needed for boxed sink factories) Co-Authored-By: Claude Fable 5 --- Cargo.lock | 1 + Cargo.toml | 1 + crates/rbuilder/Cargo.toml | 1 + crates/rbuilder/src/building/builders/mod.rs | 6 +- .../block_building_result_assembler.rs | 6 +- .../rbuilder/src/live_builder/base_config.rs | 8 +- .../block_output/engine_payload_sink.rs | 179 ++++++++++++++++++ .../src/live_builder/block_output/mod.rs | 27 +++ .../unfinished_block_processing.rs | 25 +++ .../rbuilder/src/live_builder/building/mod.rs | 6 +- crates/rbuilder/src/live_builder/config.rs | 6 +- crates/rbuilder/src/live_builder/mod.rs | 24 ++- .../src/live_builder/payload_events/mod.rs | 20 ++ crates/rbuilder/src/provider/mod.rs | 2 +- crates/rbuilder/src/provider/reth_prov.rs | 7 + ..._provider_factory_from_provider_factory.rs | 7 + crates/rbuilder/src/utils/mod.rs | 1 + 17 files changed, 305 insertions(+), 22 deletions(-) create mode 100644 crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs diff --git a/Cargo.lock b/Cargo.lock index c00248710..cdac0d255 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10056,6 +10056,7 @@ dependencies = [ "reth-db", "reth-db-common", "reth-errors", + "reth-ethereum-engine-primitives", "reth-evm", "reth-evm-ethereum", "reth-node-api", diff --git a/Cargo.toml b/Cargo.toml index 86d62e319..13305149a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -89,6 +89,7 @@ reth-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-ethereum-engine-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-trie = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-trie-parallel = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } diff --git a/crates/rbuilder/Cargo.toml b/crates/rbuilder/Cargo.toml index f56fb179c..cbe245158 100644 --- a/crates/rbuilder/Cargo.toml +++ b/crates/rbuilder/Cargo.toml @@ -40,6 +40,7 @@ reth-evm.workspace = true reth-evm-ethereum.workspace = true revm.workspace = true reth-node-ethereum.workspace = true +reth-ethereum-engine-primitives.workspace = true # Arc chain support (enabled with the `arc` feature) arc-evm = { workspace = true, optional = true } diff --git a/crates/rbuilder/src/building/builders/mod.rs b/crates/rbuilder/src/building/builders/mod.rs index 8ae305f0a..f31f0ef1e 100644 --- a/crates/rbuilder/src/building/builders/mod.rs +++ b/crates/rbuilder/src/building/builders/mod.rs @@ -11,7 +11,7 @@ use crate::{ BlockBuildingContext, BuiltBlockTrace, SimulatedOrderSink, }, live_builder::{ - block_output::unfinished_block_processing::UnfinishedBuiltBlocksInput, + block_output::UnfinishedBlockBuildingSink, building::built_block_cache::BuiltBlockCache, payload_events::InternalPayloadId, simulation::SimulatedOrderCommand, }, @@ -95,7 +95,7 @@ pub struct LiveBuilderInput

{ pub provider: P, pub ctx: BlockBuildingContext, pub input: broadcast::Receiver, - pub sink: UnfinishedBuiltBlocksInput, + pub sink: Arc, pub builder_name: String, pub cancel: CancellationToken, pub built_block_cache: Arc, @@ -271,7 +271,7 @@ pub struct BlockBuildingAlgorithmInput

{ pub ctx: BlockBuildingContext, pub input: broadcast::Receiver, /// output for the blocks - pub sink: UnfinishedBuiltBlocksInput, + pub sink: Arc, /// A cache common to several builders so they can optimize their work looking at other builders blocks. pub built_block_cache: Arc, pub cancel: CancellationToken, diff --git a/crates/rbuilder/src/building/builders/parallel_builder/block_building_result_assembler.rs b/crates/rbuilder/src/building/builders/parallel_builder/block_building_result_assembler.rs index 228991e0d..27a071fb5 100644 --- a/crates/rbuilder/src/building/builders/parallel_builder/block_building_result_assembler.rs +++ b/crates/rbuilder/src/building/builders/parallel_builder/block_building_result_assembler.rs @@ -23,7 +23,7 @@ use crate::{ }, BlockBuildingContext, ThreadBlockBuildingContext, }, - live_builder::block_output::unfinished_block_processing::UnfinishedBuiltBlocksInput, + live_builder::block_output::UnfinishedBlockBuildingSink, telemetry::mark_builder_considers_order, utils::elapsed_ms, }; @@ -37,7 +37,7 @@ pub struct BlockBuildingResultAssembler { cancellation_token: CancellationToken, discard_txs: bool, builder_name: String, - sink: Option, + sink: Option>, best_results: Arc, run_id: u64, last_version: Option, @@ -62,7 +62,7 @@ impl BlockBuildingResultAssembler { ctx: BlockBuildingContext, cancellation_token: CancellationToken, builder_name: String, - sink: Option, + sink: Option>, built_block_id_source: Arc, max_order_execution_duration_warning: Option, ) -> Self { diff --git a/crates/rbuilder/src/live_builder/base_config.rs b/crates/rbuilder/src/live_builder/base_config.rs index 793708f81..a1c865284 100644 --- a/crates/rbuilder/src/live_builder/base_config.rs +++ b/crates/rbuilder/src/live_builder/base_config.rs @@ -50,8 +50,8 @@ use super::{ BlockListProvider, HttpBlockListProvider, NullBlockListProvider, StaticFileBlockListProvider, }, - block_output::unfinished_block_processing::UnfinishedBuiltBlocksInputFactory, - payload_events::MevBoostSlotDataGenerator, + block_output::UnfinishedBlockBuildingSinkFactory, + payload_events::SlotSource, }; /// Base config to be used by all builders. @@ -220,8 +220,8 @@ impl BaseConfig { &self, cancellation_token: tokio_util::sync::CancellationToken, global_abort: tokio_util::sync::CancellationToken, - unfinished_built_blocks_input_factory: UnfinishedBuiltBlocksInputFactory

, - slot_source: MevBoostSlotDataGenerator, + unfinished_built_blocks_input_factory: Box, + slot_source: SlotSource, provider: P, blocklist_provider: Arc, ) -> eyre::Result> diff --git a/crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs b/crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs new file mode 100644 index 000000000..5b6cf7c8f --- /dev/null +++ b/crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs @@ -0,0 +1,179 @@ +//! Block sink that finalizes blocks and hands them to an engine-API payload +//! job instead of submitting them to MEV-Boost relays. +//! +//! Used for chains where the proposer requests the payload from its own node +//! via `engine_forkchoiceUpdated`/`engine_getPayload` (Arc: Malachite BFT +//! consensus drives the engine API). There is no bidding: every block that +//! improves on the current best (by true block value) is finalized immediately +//! and published, and `engine_getPayload` returns the latest published block. +//! +//! The [`crate::live_builder::payload_events::MevBoostSlotData::payload_id`] +//! (`InternalPayloadId`, u64) must be the big-endian representation of the +//! engine API `PayloadId` so the bridge driving the engine API can find the +//! payload for a job (see [`EnginePayloadRegistry`]). + +use super::{ + bidding_service_interface::CompetitionBidContext, UnfinishedBlockBuildingSink, + UnfinishedBlockBuildingSinkFactory, +}; +use crate::{ + building::{ + builders::block_building_helper::BiddableUnfinishedBlock, ThreadBlockBuildingContext, + }, + live_builder::{ + building::built_block_cache::BuiltBlockCache, + payload_events::{InternalPayloadId, MevBoostSlotData}, + }, +}; +use ahash::HashMap; +use alloy_eips::eip7685::Requests; +use alloy_primitives::{I256, U256}; +use parking_lot::Mutex; +use reth::payload::PayloadId; +use reth_ethereum_engine_primitives::EthBuiltPayload; +use std::sync::Arc; +use tokio::sync::watch; +use tokio_util::sync::CancellationToken; +use tracing::{error, info, trace}; + +/// Glue between the engine-API payload jobs and the per-slot block sinks. +/// +/// The engine bridge registers a cell when a payload job starts; the sink +/// publishes every new best finalized block into the cell; `engine_getPayload` +/// resolution reads (or awaits) the latest value. +#[derive(Debug, Default)] +pub struct EnginePayloadRegistry { + cells: Mutex>>>, +} + +impl EnginePayloadRegistry { + /// Registers a payload job. Returns the receiver the engine bridge awaits on. + pub fn register( + &self, + payload_id: InternalPayloadId, + ) -> watch::Receiver> { + let (sender, receiver) = watch::channel(None); + self.cells.lock().insert(payload_id, sender); + receiver + } + + /// Removes a finished payload job. + pub fn unregister(&self, payload_id: InternalPayloadId) { + self.cells.lock().remove(&payload_id); + } + + fn publish(&self, payload_id: InternalPayloadId, payload: EthBuiltPayload) { + if let Some(sender) = self.cells.lock().get(&payload_id) { + sender.send_replace(Some(payload)); + } else { + trace!(payload_id, "No engine payload cell for built block (job already resolved?)"); + } + } +} + +/// [`UnfinishedBlockBuildingSinkFactory`] for the engine-API flow. +#[derive(Debug)] +pub struct EnginePayloadSinkFactory { + registry: Arc, +} + +impl EnginePayloadSinkFactory { + pub fn new(registry: Arc) -> Self { + Self { registry } + } +} + +impl UnfinishedBlockBuildingSinkFactory for EnginePayloadSinkFactory { + fn create_sink( + &mut self, + slot_data: MevBoostSlotData, + _built_block_cache: Arc, + cancel: CancellationToken, + ) -> Arc { + Arc::new(EnginePayloadSink { + registry: self.registry.clone(), + internal_payload_id: slot_data.payload_id, + payload_id: PayloadId::new(slot_data.payload_id.to_be_bytes()), + state: Mutex::new(EnginePayloadSinkState { + best_value: None, + local_ctx: ThreadBlockBuildingContext::default(), + }), + cancel, + }) + } +} + +struct EnginePayloadSinkState { + best_value: Option, + local_ctx: ThreadBlockBuildingContext, +} + +/// Per-slot sink: keeps the best block (by true block value), finalizes it and +/// publishes it to the registry cell. +struct EnginePayloadSink { + registry: Arc, + internal_payload_id: InternalPayloadId, + payload_id: PayloadId, + state: Mutex, + cancel: CancellationToken, +} + +impl std::fmt::Debug for EnginePayloadSink { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("EnginePayloadSink") + .field("payload_id", &self.payload_id) + .finish_non_exhaustive() + } +} + +impl UnfinishedBlockBuildingSink for EnginePayloadSink { + fn new_block(&self, block: BiddableUnfinishedBlock) { + if self.cancel.is_cancelled() { + return; + } + // The lock serializes finalization between the building algorithm + // threads; best_value is only updated after a successful finalize. + let mut state = self.state.lock(); + let true_block_value = block.true_block_value; + if state + .best_value + .is_some_and(|best| true_block_value <= best) + { + return; + } + let builder_name = block.block().builder_name().to_string(); + let mut helper = block.into_building_helper(); + let result = match helper.finalize_block( + &mut state.local_ctx, + true_block_value, + I256::ZERO, + CompetitionBidContext::no_competition_bid(), + ) { + Ok(result) => result, + Err(err) => { + if err.is_critical() { + error!(?err, "Failed to finalize block for engine payload"); + } + return; + } + }; + state.best_value = Some(true_block_value); + drop(state); + + let block = result.block; + let payload: EthBuiltPayload = EthBuiltPayload::new( + self.payload_id, + Arc::new(block.sealed_block), + true_block_value, + Some(Requests::new(block.execution_requests)), + ); + info!( + payload_id = %self.payload_id, + block = payload.block().number, + builder_name, + true_block_value = %true_block_value, + "Publishing new best engine payload" + ); + self.registry.publish(self.internal_payload_id, payload); + } +} diff --git a/crates/rbuilder/src/live_builder/block_output/mod.rs b/crates/rbuilder/src/live_builder/block_output/mod.rs index 39d312ae5..9713ef915 100644 --- a/crates/rbuilder/src/live_builder/block_output/mod.rs +++ b/crates/rbuilder/src/live_builder/block_output/mod.rs @@ -1,5 +1,32 @@ pub mod best_block_from_algorithms; +pub mod engine_payload_sink; pub mod bidding_service_interface; pub mod relay_submit; pub mod true_value_bidding_service; pub mod unfinished_block_processing; + +use crate::{ + building::builders::block_building_helper::BiddableUnfinishedBlock, + live_builder::{building::built_block_cache::BuiltBlockCache, payload_events::MevBoostSlotData}, +}; +use std::sync::Arc; +use tokio_util::sync::CancellationToken; + +/// Per-slot destination for the (unfinished) blocks produced by the building +/// algorithms. The default implementation is the MEV-Boost pipeline +/// ([`unfinished_block_processing::UnfinishedBuiltBlocksInput`]); for +/// engine-API driven chains (Arc) blocks are finalized and handed to the +/// payload job instead. +pub trait UnfinishedBlockBuildingSink: std::fmt::Debug + Send + Sync { + fn new_block(&self, block: BiddableUnfinishedBlock); +} + +/// Creates an [`UnfinishedBlockBuildingSink`] for each building slot. +pub trait UnfinishedBlockBuildingSinkFactory: std::fmt::Debug + Send + Sync { + fn create_sink( + &mut self, + slot_data: MevBoostSlotData, + built_block_cache: Arc, + cancel: CancellationToken, + ) -> Arc; +} diff --git a/crates/rbuilder/src/live_builder/block_output/unfinished_block_processing.rs b/crates/rbuilder/src/live_builder/block_output/unfinished_block_processing.rs index 7fe3ba2fc..a03e22fb5 100644 --- a/crates/rbuilder/src/live_builder/block_output/unfinished_block_processing.rs +++ b/crates/rbuilder/src/live_builder/block_output/unfinished_block_processing.rs @@ -52,6 +52,7 @@ use crate::{ use super::{ best_block_from_algorithms::BestBlockFromAlgorithms, + UnfinishedBlockBuildingSink, UnfinishedBlockBuildingSinkFactory, bidding_service_interface::{ BiddingService, BlockSealInterfaceForSlotBidder, BuiltBlockDescriptorForSlotBidder, SlotBidder, SlotBidderSealBidCommand, @@ -694,3 +695,27 @@ fn create_logging_span(block_helper: &dyn BlockBuildingHelper) -> tracing::Span true_block_value ) } + +impl UnfinishedBlockBuildingSink for UnfinishedBuiltBlocksInput { + fn new_block(&self, block: BiddableUnfinishedBlock) { + UnfinishedBuiltBlocksInput::new_block(self, block) + } +} + +impl UnfinishedBlockBuildingSinkFactory + for UnfinishedBuiltBlocksInputFactory

+{ + fn create_sink( + &mut self, + slot_data: MevBoostSlotData, + built_block_cache: Arc, + cancel: CancellationToken, + ) -> Arc { + Arc::new(UnfinishedBuiltBlocksInputFactory::create_sink( + self, + slot_data, + built_block_cache, + cancel, + )) + } +} diff --git a/crates/rbuilder/src/live_builder/building/mod.rs b/crates/rbuilder/src/live_builder/building/mod.rs index 647aa09ed..96c8f2f4c 100644 --- a/crates/rbuilder/src/live_builder/building/mod.rs +++ b/crates/rbuilder/src/live_builder/building/mod.rs @@ -34,7 +34,7 @@ const CHECK_LAST_BLOCK_INTERVAL: Duration = Duration::from_millis(100); const SIMULATED_ORDERS_CHANNEL_CAPACITY: usize = 10_000; use super::{ - block_output::unfinished_block_processing::UnfinishedBuiltBlocksInputFactory, + block_output::UnfinishedBlockBuildingSinkFactory, order_input::{ self, order_replacement_manager::OrderReplacementManager, orderpool::OrdersForBlock, }, @@ -47,7 +47,7 @@ use super::{ pub struct BlockBuildingPool

{ provider: P, builders: Vec>>, - sink_factory: UnfinishedBuiltBlocksInputFactory

, + sink_factory: Box, orderpool_subscriber: order_input::OrderPoolSubscriber, order_simulation_pool: OrderSimulationPool

, run_sparse_trie_prefetcher: bool, @@ -64,7 +64,7 @@ where pub fn new( provider: P, builders: Vec>>, - sink_factory: UnfinishedBuiltBlocksInputFactory

, + sink_factory: Box, orderpool_subscriber: order_input::OrderPoolSubscriber, order_simulation_pool: OrderSimulationPool

, run_sparse_trie_prefetcher: bool, diff --git a/crates/rbuilder/src/live_builder/config.rs b/crates/rbuilder/src/live_builder/config.rs index 3e7eeb2b0..5081c38a5 100644 --- a/crates/rbuilder/src/live_builder/config.rs +++ b/crates/rbuilder/src/live_builder/config.rs @@ -1196,7 +1196,7 @@ pub async fn create_builder_from_sink

( abort_token: CancellationToken, ) -> eyre::Result> where - P: StateProviderFactory, + P: StateProviderFactory + Clone + 'static, { let blocklist_provider = base_config .blocklist_provider(cancellation_token.clone()) @@ -1214,8 +1214,8 @@ where .create_builder_with_provider_factory( cancellation_token, abort_token, - sink_factory, - payload_event, + Box::new(sink_factory), + crate::live_builder::payload_events::SlotSource::MevBoost(payload_event), provider, blocklist_provider, ) diff --git a/crates/rbuilder/src/live_builder/mod.rs b/crates/rbuilder/src/live_builder/mod.rs index 756fc4257..dc2f2e9aa 100644 --- a/crates/rbuilder/src/live_builder/mod.rs +++ b/crates/rbuilder/src/live_builder/mod.rs @@ -33,13 +33,13 @@ use crate::{ use alloy_consensus::Header; use alloy_primitives::{BlockHash, B256}; use block_list_provider::BlockListProvider; -use block_output::unfinished_block_processing::UnfinishedBuiltBlocksInputFactory; +use block_output::UnfinishedBlockBuildingSinkFactory; use building::BlockBuildingPool; use eyre::Context; use futures::{stream::FuturesUnordered, StreamExt}; use jsonrpsee::RpcModule; use order_input::{mempool_txs_detector::MempoolTxsDetector, ReplaceableOrderPoolCommand}; -use payload_events::{InternalPayloadId, MevBoostSlotDataGenerator}; +use payload_events::{InternalPayloadId, SlotSource}; use rbuilder_primitives::{MempoolTx, Order, TransactionSignedEcRecoveredWithBlobs}; use reth::transaction_pool::{ BlobStore, EthPooledTransaction, Pool, TransactionListenerKind, TransactionOrdering, @@ -93,6 +93,18 @@ impl TimingsConfig { get_block_header_period: time::Duration::milliseconds(25), } } + + /// Configuration for Arc: sub-second blocks driven by the engine API. + /// The building job is cancelled anyway when the parent block changes, + /// so the proposal duration only caps how long we keep improving a + /// payload that consensus has not picked up yet. + pub fn arc() -> Self { + Self { + slot_proposal_duration: Duration::from_secs(2), + block_header_deadline_delta: time::Duration::milliseconds(-25), + get_block_header_period: time::Duration::milliseconds(10), + } + } } /// Max headers sent to the cleaning task before the main loop blocks. @@ -112,7 +124,7 @@ where pub error_storage_path: Option, pub simulation_threads: usize, pub order_input_config: OrderInputConfig, - pub blocks_source: MevBoostSlotDataGenerator, + pub blocks_source: SlotSource, pub run_sparse_trie_prefetcher: bool, pub chain_chain_spec: Arc, @@ -133,7 +145,7 @@ where /// We should try to wait for these tasks to finish before shutting down to avoid data corruption. pub critical_tasks_join_handles: Vec>, - pub unfinished_built_blocks_input_factory: UnfinishedBuiltBlocksInputFactory

, + pub unfinished_built_blocks_input_factory: Box, pub builders: Vec>>, pub extra_rpc: RpcModule<()>, @@ -433,7 +445,9 @@ where // used in the optimism context. If further customisation is required in the future // this should be improved on. fn timings(&self) -> TimingsConfig { - if cfg!(feature = "optimism") { + if cfg!(feature = "arc") { + TimingsConfig::arc() + } else if cfg!(feature = "optimism") { TimingsConfig::optimism() } else { TimingsConfig::ethereum() diff --git a/crates/rbuilder/src/live_builder/payload_events/mod.rs b/crates/rbuilder/src/live_builder/payload_events/mod.rs index 311d8009d..100fe18df 100644 --- a/crates/rbuilder/src/live_builder/payload_events/mod.rs +++ b/crates/rbuilder/src/live_builder/payload_events/mod.rs @@ -325,3 +325,23 @@ fn report_slot_withdrawals_to_fee_recipients(data: &MevBoostSlotData) { ); } } + +/// Source of building slots for the [`crate::live_builder::LiveBuilder`]. +#[derive(Debug)] +pub enum SlotSource { + /// Slots derived from CL payload_attributes events + MEV-Boost relay + /// registrations (Ethereum L1 flow). + MevBoost(MevBoostSlotDataGenerator), + /// Slots pushed by an external driver, e.g. engine API payload jobs (Arc: + /// Malachite consensus triggers engine_forkchoiceUpdated with attributes). + Channel(mpsc::UnboundedReceiver), +} + +impl SlotSource { + pub fn recv_slot_channel(self) -> mpsc::UnboundedReceiver { + match self { + SlotSource::MevBoost(generator) => generator.recv_slot_channel(), + SlotSource::Channel(receiver) => receiver, + } + } +} diff --git a/crates/rbuilder/src/provider/mod.rs b/crates/rbuilder/src/provider/mod.rs index 1e177404e..bf7401d97 100644 --- a/crates/rbuilder/src/provider/mod.rs +++ b/crates/rbuilder/src/provider/mod.rs @@ -186,7 +186,7 @@ impl StateProvider for SyncStateProvider { /// Main trait to interact with the chain data. /// Allows to create different backends for chain data access without implementing lots of interfaces as would happen with reth_provider::StateProviderFactory /// since it only asks for what we really use. -pub trait StateProviderFactory: Send + Sync { +pub trait StateProviderFactory: Send + Sync + std::fmt::Debug { fn latest(&self) -> ProviderResult; fn history_by_block_number(&self, block: BlockNumber) -> ProviderResult; diff --git a/crates/rbuilder/src/provider/reth_prov.rs b/crates/rbuilder/src/provider/reth_prov.rs index cf1fdce94..39f122357 100644 --- a/crates/rbuilder/src/provider/reth_prov.rs +++ b/crates/rbuilder/src/provider/reth_prov.rs @@ -18,6 +18,13 @@ pub struct StateProviderFactoryFromRethProvider

{ root_hash_context: RootHashContext, } +impl

std::fmt::Debug for StateProviderFactoryFromRethProvider

{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("StateProviderFactoryFromRethProvider") + .finish_non_exhaustive() + } +} + impl

StateProviderFactoryFromRethProvider

{ pub fn new(provider: P, root_hash_context: RootHashContext) -> Self { Self { diff --git a/crates/rbuilder/src/provider/state_provider_factory_from_provider_factory.rs b/crates/rbuilder/src/provider/state_provider_factory_from_provider_factory.rs index 3b2c7513a..20eb2cc9c 100644 --- a/crates/rbuilder/src/provider/state_provider_factory_from_provider_factory.rs +++ b/crates/rbuilder/src/provider/state_provider_factory_from_provider_factory.rs @@ -23,6 +23,13 @@ pub struct StateProviderFactoryFromProviderFactory { root_hash_context: Option, } +impl std::fmt::Debug for StateProviderFactoryFromProviderFactory { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("StateProviderFactoryFromProviderFactory") + .finish_non_exhaustive() + } +} + impl StateProviderFactoryFromProviderFactory { /// root_hash_config None -> no roothash (MockRootHasher) pub fn new(provider: ProviderFactory, root_hash_context: Option) -> Self { diff --git a/crates/rbuilder/src/utils/mod.rs b/crates/rbuilder/src/utils/mod.rs index 4bb890a37..b13cfdde0 100644 --- a/crates/rbuilder/src/utils/mod.rs +++ b/crates/rbuilder/src/utils/mod.rs @@ -11,6 +11,7 @@ use rbuilder_primitives::{ TransactionSignedEcRecoveredWithBlobs, }; use crate::chain::ChainSpec; +#[allow(unused_imports)] use reth_chainspec::EthChainSpec as _; use reth_evm_ethereum::revm_spec_by_timestamp_and_block_number; use revm::context::CfgEnv; From 57aad36c43a5c58e7522659979388d33f05f493b Mon Sep 17 00:00:00 2001 From: Solar Mithril Date: Wed, 10 Jun 2026 23:47:20 +0400 Subject: [PATCH 3/5] Add arc-rbuilder: rbuilder in-process with an arc-node execution node New binary launching ArcNode with the payload service wrapped by RbuilderPayloadServiceBuilder: - engine FCU payload jobs are forwarded to rbuilder as building slots (ProtocolConfig gas limit computed on parent state) - engine_getPayload resolves with rbuilder's best finalized block, falling back to the stock Arc payload builder for liveness - rbuilder consumes the node's txpool and provider directly (no relays, no bidding) - docs/ARC.md + example config Co-Authored-By: Claude Fable 5 --- Cargo.lock | 2422 ++++++++++++++++--- Cargo.toml | 5 + crates/arc-rbuilder/Cargo.toml | 56 + crates/arc-rbuilder/config-arc-example.toml | 53 + crates/arc-rbuilder/src/main.rs | 261 ++ crates/arc-rbuilder/src/payload_service.rs | 362 +++ crates/rbuilder/src/live_builder/config.rs | 2 +- docs/ARC.md | 68 + 8 files changed, 2926 insertions(+), 303 deletions(-) create mode 100644 crates/arc-rbuilder/Cargo.toml create mode 100644 crates/arc-rbuilder/config-arc-example.toml create mode 100644 crates/arc-rbuilder/src/main.rs create mode 100644 crates/arc-rbuilder/src/payload_service.rs create mode 100644 docs/ARC.md diff --git a/Cargo.lock b/Cargo.lock index cdac0d255..4777f139e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "advisory-lock" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6caee7d48f930f9ad3fc9546f8cbf843365da0c5b0ca4eee1d1ac3dd12d8f93" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "aead" version = "0.5.2" @@ -1093,6 +1103,45 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arc-consensus-types" +version = "0.0.1" +dependencies = [ + "alloy-consensus", + "alloy-primitives 1.6.0", + "alloy-rlp", + "alloy-rpc-types-engine", + "arc-malachitebft-app", + "arc-malachitebft-app-channel", + "arc-malachitebft-codec", + "arc-malachitebft-core-consensus", + "arc-malachitebft-core-types", + "arc-malachitebft-proto", + "arc-malachitebft-signing", + "arc-malachitebft-signing-ed25519", + "arc-malachitebft-sync", + "arc-shared", + "async-trait", + "bytes", + "bytesize", + "config", + "ethereum_ssz 0.9.1", + "ethereum_ssz_derive 0.9.1", + "eyre", + "humantime-serde", + "prost 0.13.5", + "prost-build", + "protox", + "rand 0.8.5", + "serde", + "serde_with", + "sha3 0.10.8", + "signature 2.2.0", + "thiserror 2.0.17", + "tracing", + "url", +] + [[package]] name = "arc-evm" version = "0.0.1" @@ -1119,6 +1168,58 @@ dependencies = [ "tracing", ] +[[package]] +name = "arc-evm-node" +version = "0.0.1" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives 1.6.0", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "arc-consensus-types", + "arc-evm", + "arc-execution-config", + "arc-execution-payload", + "arc-execution-txpool", + "arc-execution-validation", + "arc-version", + "async-trait", + "backon", + "eyre", + "jsonrpsee 0.26.0", + "reqwest 0.12.24", + "reth-chainspec", + "reth-engine-primitives", + "reth-ethereum", + "reth-ethereum-engine-primitives", + "reth-ethereum-payload-builder", + "reth-ethereum-primitives", + "reth-evm", + "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-rpc", + "reth-rpc-api", + "reth-rpc-builder", + "reth-rpc-eth-api", + "reth-rpc-eth-types", + "reth-rpc-server-types", + "reth-tracing", + "reth-transaction-pool", + "revm", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.17", + "tokio", + "tower 0.5.2", + "tracing", +] + [[package]] name = "arc-execution-config" version = "0.0.1" @@ -1150,144 +1251,566 @@ dependencies = [ ] [[package]] -name = "arc-precompiles" +name = "arc-execution-payload" version = "0.0.1" dependencies = [ - "alloy-evm", + "alloy-consensus", "alloy-primitives 1.6.0", - "alloy-sol-types", - "arc-execution-config", + "alloy-rlp", + "arc-execution-txpool", + "eyre", + "metrics", + "reth-basic-payload-builder", + "reth-chainspec", + "reth-consensus-common", + "reth-errors", "reth-ethereum", + "reth-ethereum-engine-primitives", + "reth-ethereum-payload-builder", + "reth-ethereum-primitives", "reth-evm", + "reth-node-api", + "reth-node-builder", + "reth-payload-builder", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-revm", + "reth-storage-api", + "reth-transaction-pool", "revm", - "revm-context-interface", - "revm-interpreter", - "revm-primitives", - "serde", - "serde_json", - "slh-dsa", - "thiserror 2.0.17", + "tracing", ] [[package]] -name = "arc-shared" +name = "arc-execution-txpool" version = "0.0.1" dependencies = [ + "alloy-primitives 1.6.0", + "arc-execution-config", + "arc-execution-validation", + "arc-precompiles", + "arc-shared", + "eyre", "metrics", + "parking_lot", + "reth-chainspec", + "reth-ethereum", + "reth-ethereum-primitives", + "reth-evm", + "reth-node-api", + "reth-node-builder", + "reth-primitives-traits", + "reth-provider", + "reth-storage-api", + "reth-tracing", + "reth-transaction-pool", + "schnellru", + "thiserror 2.0.17", + "tracing", ] [[package]] -name = "argminmax" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f13d10a41ac8d2ec79ee34178d61e6f47a29c2edfe7ef1721c7383b0359e65" +name = "arc-execution-validation" +version = "0.0.1" dependencies = [ - "num-traits", + "alloy-eips", + "alloy-primitives 1.6.0", + "arc-execution-config", + "reth-chainspec", + "reth-consensus", + "reth-consensus-common", + "reth-ethereum", + "reth-ethereum-primitives", + "reth-primitives-traits", + "reth-storage-api", + "thiserror 2.0.17", + "tracing", ] [[package]] -name = "ark-bls12-381" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df4dcc01ff89867cd86b0da835f23c3f02738353aaee7dde7495af71363b8d5" +name = "arc-malachitebft-app" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", + "arc-malachitebft-codec", + "arc-malachitebft-config", + "arc-malachitebft-core-consensus", + "arc-malachitebft-core-types", + "arc-malachitebft-engine", + "arc-malachitebft-metrics", + "arc-malachitebft-network", + "arc-malachitebft-peer", + "arc-malachitebft-signing", + "arc-malachitebft-sync", + "arc-malachitebft-wal", + "async-trait", + "derive-where", + "eyre", + "libp2p", + "libp2p-identity", + "ractor", + "rand 0.8.5", + "serde", + "tokio", + "tracing", ] [[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +name = "arc-malachitebft-app-channel" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-r1cs-std", - "ark-std 0.5.0", + "arc-malachitebft-app", + "arc-malachitebft-config", + "arc-malachitebft-engine", + "arc-malachitebft-signing", + "bytes", + "derive-where", + "eyre", + "ractor", + "thiserror 2.0.17", + "tokio", + "tracing", ] [[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +name = "arc-malachitebft-codec" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.5", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", + "bytes", ] [[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +name = "arc-malachitebft-config" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", + "arc-malachitebft-core-types", + "bytesize", + "config", + "humantime-serde", + "multiaddr 0.18.2", + "serde", + "tracing", ] [[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +name = "arc-malachitebft-core-consensus" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", + "arc-malachitebft-core-driver", + "arc-malachitebft-core-types", + "arc-malachitebft-core-votekeeper", + "arc-malachitebft-metrics", + "arc-malachitebft-peer", + "async-recursion", + "derive-where", + "futures", + "genawaiter", + "multiaddr 0.18.2", + "thiserror 2.0.17", + "tokio", + "tracing", ] [[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +name = "arc-malachitebft-core-driver" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - + "arc-malachitebft-core-state-machine", + "arc-malachitebft-core-types", + "arc-malachitebft-core-votekeeper", + "derive-where", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "arc-malachitebft-core-state-machine" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-core-types", + "derive-where", + "displaydoc", +] + +[[package]] +name = "arc-malachitebft-core-types" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-peer", + "async-trait", + "bytes", + "derive-where", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "arc-malachitebft-core-votekeeper" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-core-types", + "derive-where", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "arc-malachitebft-discovery" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-metrics", + "either", + "eyre", + "libp2p", + "rand 0.8.5", + "serde", + "tokio", + "tracing", +] + +[[package]] +name = "arc-malachitebft-engine" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-codec", + "arc-malachitebft-config", + "arc-malachitebft-core-consensus", + "arc-malachitebft-core-driver", + "arc-malachitebft-core-state-machine", + "arc-malachitebft-core-types", + "arc-malachitebft-core-votekeeper", + "arc-malachitebft-metrics", + "arc-malachitebft-network", + "arc-malachitebft-signing", + "arc-malachitebft-sync", + "arc-malachitebft-wal", + "async-recursion", + "async-trait", + "byteorder", + "bytes", + "bytesize", + "derive-where", + "eyre", + "hex", + "itertools 0.14.0", + "libp2p", + "ractor", + "rand 0.8.5", + "tokio", + "tracing", +] + +[[package]] +name = "arc-malachitebft-metrics" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-core-state-machine", + "prometheus-client", +] + +[[package]] +name = "arc-malachitebft-network" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-discovery", + "arc-malachitebft-metrics", + "arc-malachitebft-peer", + "arc-malachitebft-sync", + "async-trait", + "asynchronous-codec", + "bytes", + "either", + "eyre", + "futures", + "hex", + "itertools 0.14.0", + "libp2p", + "libp2p-gossipsub", + "libp2p-scatter", + "libp2p-stream", + "seahash", + "serde", + "thiserror 2.0.17", + "tokio", + "tracing", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "arc-malachitebft-peer" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "bs58 0.5.1", + "multihash 0.19.5", + "thiserror 2.0.17", +] + +[[package]] +name = "arc-malachitebft-proto" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "prost 0.13.5", + "prost-types", + "thiserror 2.0.17", +] + +[[package]] +name = "arc-malachitebft-signing" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-core-types", + "async-trait", + "signature 2.2.0", +] + +[[package]] +name = "arc-malachitebft-signing-ed25519" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-core-types", + "base64 0.22.1", + "ed25519-consensus", + "rand 0.8.5", + "serde", + "signature 2.2.0", +] + +[[package]] +name = "arc-malachitebft-sync" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "arc-malachitebft-core-types", + "arc-malachitebft-metrics", + "arc-malachitebft-peer", + "async-trait", + "bytes", + "dashmap 6.1.0", + "derive-where", + "displaydoc", + "eyre", + "genawaiter", + "libp2p", + "rand 0.8.5", + "serde", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "arc-malachitebft-wal" +version = "0.7.0-pre" +source = "git+https://github.com/circlefin/malachite.git?rev=0422137f#0422137fb7fc60673c3769d6a5bd0a4c8f57317d" +dependencies = [ + "advisory-lock", + "bytes", + "cfg-if", + "crc32fast", +] + +[[package]] +name = "arc-precompiles" +version = "0.0.1" +dependencies = [ + "alloy-evm", + "alloy-primitives 1.6.0", + "alloy-sol-types", + "arc-execution-config", + "reth-ethereum", + "reth-evm", + "revm", + "revm-context-interface", + "revm-interpreter", + "revm-primitives", + "serde", + "serde_json", + "slh-dsa", + "thiserror 2.0.17", +] + +[[package]] +name = "arc-rbuilder" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-primitives 1.6.0", + "alloy-rpc-types-beacon", + "alloy-rpc-types-engine", + "arc-evm", + "arc-evm-node", + "arc-execution-config", + "arc-execution-payload", + "arc-execution-txpool", + "arc-execution-validation", + "clap", + "eyre", + "futures", + "rbuilder", + "rbuilder-config", + "reth", + "reth-basic-payload-builder", + "reth-chainspec", + "reth-cli-util", + "reth-ethereum-engine-primitives", + "reth-evm", + "reth-node-api", + "reth-node-builder", + "reth-node-ethereum", + "reth-payload-builder", + "reth-provider", + "reth-revm", + "reth-transaction-pool", + "revm", + "tikv-jemallocator", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "arc-shared" +version = "0.0.1" +dependencies = [ + "metrics", +] + +[[package]] +name = "arc-version" +version = "0.0.1" +dependencies = [ + "chrono", + "dotenvy", + "vergen-git2", +] + +[[package]] +name = "argminmax" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f13d10a41ac8d2ec79ee34178d61e6f47a29c2edfe7ef1721c7383b0359e65" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ark-bls12-381" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df4dcc01ff89867cd86b0da835f23c3f02738353aaee7dde7495af71363b8d5" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -1539,6 +2062,45 @@ dependencies = [ "zstd 0.12.4", ] +[[package]] +name = "asn1-rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.17", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2 1.0.103", + "quote 1.0.42", + "syn 2.0.117", + "synstructure 0.13.2", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2 1.0.103", + "quote 1.0.42", + "syn 2.0.117", +] + [[package]] name = "asn1_der" version = "0.7.6" @@ -1558,8 +2120,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] @@ -1575,13 +2149,42 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg 1.5.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.1", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + [[package]] name = "async-lock" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2 1.0.103", + "quote 1.0.42", + "syn 2.0.117", ] [[package]] @@ -1590,7 +2193,7 @@ version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e6fa871e4334a622afd6bb2f611635e8083a6f5e2936c0f90f37c7ef9856298" dependencies = [ - "async-channel", + "async-channel 1.9.0", "futures-lite 1.13.0", "http-types", "log", @@ -1642,6 +2245,19 @@ dependencies = [ "rustc_version 0.4.1", ] +[[package]] +name = "asynchronous-codec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + [[package]] name = "atoi" version = "2.0.0" @@ -1657,6 +2273,18 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "attohttpc" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" +dependencies = [ + "base64 0.22.1", + "http 1.4.0", + "log", + "url", +] + [[package]] name = "aurora-engine-modexp" version = "1.2.0" @@ -2006,6 +2634,15 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -2201,6 +2838,29 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "bon" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97493a391b4b18ee918675fb8663e53646fd09321c58b46afa04e8ce2499c869" +dependencies = [ + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2af3eac944c12cdf4423eab70d310da0a8e5851a18ffb192c0a5e3f7ae1663" +dependencies = [ + "darling 0.20.11", + "ident_case", + "proc-macro2 1.0.103", + "quote 1.0.42", + "syn 2.0.117", +] + [[package]] name = "borsh" version = "1.6.0" @@ -2363,6 +3023,15 @@ dependencies = [ "serde", ] +[[package]] +name = "bytesize" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" +dependencies = [ + "serde_core", +] + [[package]] name = "bzip2" version = "0.4.4" @@ -2447,6 +3116,15 @@ dependencies = [ "rustversion", ] +[[package]] +name = "cbor4ii" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "472931dd4dfcc785075b09be910147f9c6258883fc4591d0dac6116392b2daa6" +dependencies = [ + "serde", +] + [[package]] name = "cc" version = "1.2.63" @@ -2496,11 +3174,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + [[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", @@ -2545,6 +3247,7 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common 0.1.7", "inout", + "zeroize", ] [[package]] @@ -2763,7 +3466,7 @@ checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" dependencies = [ "crossterm", "unicode-segmentation", - "unicode-width", + "unicode-width 0.2.0", ] [[package]] @@ -2818,6 +3521,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "config" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" +dependencies = [ + "nom", + "pathdiff", + "serde", + "toml 0.8.23", +] + [[package]] name = "console" version = "0.15.11" @@ -2827,7 +3542,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width", + "unicode-width 0.2.0", "windows-sys 0.59.0", ] @@ -3271,6 +3986,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + [[package]] name = "darling" version = "0.20.11" @@ -3480,6 +4208,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + [[package]] name = "deranged" version = "0.5.5" @@ -3851,6 +4593,21 @@ dependencies = [ "signature 2.2.0", ] +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "thiserror 1.0.69", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "2.2.0" @@ -3925,6 +4682,7 @@ dependencies = [ "ff 0.13.1", "generic-array", "group 0.13.0", + "pem-rfc7468", "pkcs8 0.10.2", "rand_core 0.6.4", "sec1 0.7.3", @@ -4367,6 +5125,27 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + [[package]] name = "evmap" version = "11.0.0" @@ -4700,6 +5479,16 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-bounded" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91f328e7fb845fc832912fb6a34f40cf6d1888c92f974d1893a54e97b5ff542e" +dependencies = [ + "futures-timer", + "futures-util", +] + [[package]] name = "futures-buffered" version = "0.2.12" @@ -4769,6 +5558,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -4869,6 +5659,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "futures-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" +dependencies = [ + "futures-io", + "rustls 0.23.35", + "rustls-pki-types", +] + [[package]] name = "futures-sink" version = "0.3.31" @@ -4945,6 +5746,21 @@ dependencies = [ "byteorder", ] +[[package]] +name = "genawaiter" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86bd0361bcbde39b13475e6e36cb24c329964aa2611be285289d1e4b751c1a0" +dependencies = [ + "genawaiter-macro", +] + +[[package]] +name = "genawaiter-macro" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" + [[package]] name = "generator" version = "0.8.7" @@ -4976,7 +5792,7 @@ version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" dependencies = [ - "unicode-width", + "unicode-width 0.2.0", ] [[package]] @@ -5315,6 +6131,15 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "hdrhistogram" version = "7.5.4" @@ -5375,6 +6200,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex-conservative" @@ -5391,6 +6219,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "hex_fmt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" + [[package]] name = "hickory-proto" version = "0.25.2" @@ -5410,6 +6244,7 @@ dependencies = [ "rand 0.9.2", "ring", "serde", + "socket2 0.5.10", "thiserror 2.0.17", "tinyvec", "tokio", @@ -5568,7 +6403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" dependencies = [ "anyhow", - "async-channel", + "async-channel 1.9.0", "base64 0.13.1", "futures-lite 1.13.0", "infer", @@ -6117,10 +6952,64 @@ dependencies = [ name = "if-addrs" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf39cc0423ee66021dc5eccface85580e4a001e0c5288bae8bea7ecb69225e90" +checksum = "bf39cc0423ee66021dc5eccface85580e4a001e0c5288bae8bea7ecb69225e90" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "if-addrs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a05c691e1fae256cf7013d99dad472dc52d5543322761f83ec8d47eab40d2b" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "if-watch" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71c02a5161c313f0cbdbadc511611893584a10a7b6153cb554bdf83ddce99ec2" +dependencies = [ + "async-io", + "core-foundation 0.9.4", + "fnv", + "futures", + "if-addrs 0.15.0", + "ipnet", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "rtnetlink", + "system-configuration 0.7.0", + "tokio", + "windows 0.62.2", +] + +[[package]] +name = "igd-next" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" dependencies = [ - "libc", - "windows-sys 0.59.0", + "async-trait", + "attohttpc", + "bytes", + "futures", + "http 1.4.0", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "log", + "rand 0.9.2", + "tokio", + "url", + "xmltree", ] [[package]] @@ -6219,7 +7108,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width", + "unicode-width 0.2.0", "web-time", ] @@ -6769,319 +7658,747 @@ dependencies = [ ] [[package]] -name = "jsonrpsee-types" -version = "0.26.0" +name = "jsonrpsee-types" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" +dependencies = [ + "http 1.4.0", + "serde", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9437dd0e8728897d0aa5a0075b8710266300e55ced07101ca0930fac4a611384" +dependencies = [ + "jsonrpsee-client-transport 0.20.4", + "jsonrpsee-core 0.20.4", + "jsonrpsee-types 0.20.4", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7902885de4779f711a95d82c8da2d7e5f9f3a7c7cfa44d51c067fd1c29d72a3c" +dependencies = [ + "jsonrpsee-client-transport 0.26.0", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", + "tower 0.5.2", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d06eeabbb55f0af8405288390a358ebcceb6e79e1390741e6f152309c4d6076" +dependencies = [ + "http 0.2.12", + "jsonrpsee-client-transport 0.20.4", + "jsonrpsee-core 0.20.4", + "jsonrpsee-types 0.20.4", + "url", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6fceceeb05301cc4c065ab3bd2fa990d41ff4eb44e4ca1b30fa99c057c3e79" +dependencies = [ + "http 1.4.0", + "jsonrpsee-client-transport 0.26.0", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", + "tower 0.5.2", + "url", +] + +[[package]] +name = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64 0.22.1", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.9", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", + "serdect", + "sha2 0.10.9", + "signature 2.2.0", +] + +[[package]] +name = "kasuari" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b" +dependencies = [ + "hashbrown 0.16.1", + "portable-atomic", + "thiserror 2.0.17", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[package]] +name = "keccak" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", +] + +[[package]] +name = "keccak-asm" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "kqueue" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "left-right" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0c21e4c8ff95f487fb34e6f9182875f42c84cef966d29216bf115d9bba835a" +dependencies = [ + "crossbeam-utils", + "loom", + "slab", +] + +[[package]] +name = "lexical" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6" +dependencies = [ + "lexical-core", +] + +[[package]] +name = "lexical-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" +checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" dependencies = [ - "http 1.4.0", - "serde", - "serde_json", - "thiserror 2.0.17", + "lexical-util", + "lexical-write-integer", + "static_assertions", ] [[package]] -name = "jsonrpsee-wasm-client" -version = "0.20.4" +name = "lexical-write-integer" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9437dd0e8728897d0aa5a0075b8710266300e55ced07101ca0930fac4a611384" +checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" dependencies = [ - "jsonrpsee-client-transport 0.20.4", - "jsonrpsee-core 0.20.4", - "jsonrpsee-types 0.20.4", + "lexical-util", + "static_assertions", ] [[package]] -name = "jsonrpsee-wasm-client" -version = "0.26.0" +name = "libc" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7902885de4779f711a95d82c8da2d7e5f9f3a7c7cfa44d51c067fd1c29d72a3c" -dependencies = [ - "jsonrpsee-client-transport 0.26.0", - "jsonrpsee-core 0.26.0", - "jsonrpsee-types 0.26.0", - "tower 0.5.2", -] +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] -name = "jsonrpsee-ws-client" -version = "0.20.4" +name = "libgit2-sys" +version = "0.18.2+1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d06eeabbb55f0af8405288390a358ebcceb6e79e1390741e6f152309c4d6076" +checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" dependencies = [ - "http 0.2.12", - "jsonrpsee-client-transport 0.20.4", - "jsonrpsee-core 0.20.4", - "jsonrpsee-types 0.20.4", - "url", + "cc", + "libc", + "libz-sys", + "pkg-config", ] [[package]] -name = "jsonrpsee-ws-client" -version = "0.26.0" +name = "libloading" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6fceceeb05301cc4c065ab3bd2fa990d41ff4eb44e4ca1b30fa99c057c3e79" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ - "http 1.4.0", - "jsonrpsee-client-transport 0.26.0", - "jsonrpsee-core 0.26.0", - "jsonrpsee-types 0.26.0", - "tower 0.5.2", - "url", + "cfg-if", + "windows-link 0.2.1", ] [[package]] -name = "jsonwebtoken" -version = "9.3.1" +name = "libm" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libp2p" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce71348bf5838e46449ae240631117b487073d5f347c06d434caddcb91dceb5a" dependencies = [ - "base64 0.22.1", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", + "bytes", + "either", + "futures", + "futures-timer", + "getrandom 0.2.16", + "libp2p-allow-block-list", + "libp2p-connection-limits", + "libp2p-core", + "libp2p-dns", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-noise", + "libp2p-ping", + "libp2p-quic", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-upnp", + "libp2p-yamux", + "multiaddr 0.18.2", + "pin-project", + "rw-stream-sink", + "thiserror 2.0.17", ] [[package]] -name = "k256" -version = "0.11.6" +name = "libp2p-allow-block-list" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +checksum = "d16ccf824ee859ca83df301e1c0205270206223fd4b1f2e512a693e1912a8f4a" dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.9", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", ] [[package]] -name = "k256" -version = "0.13.4" +name = "libp2p-connection-limits" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +checksum = "a18b8b607cf3bfa2f8c57db9c7d8569a315d5cc0a282e6bfd5ebfc0a9840b2a0" dependencies = [ - "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "once_cell", - "serdect", - "sha2 0.10.9", - "signature 2.2.0", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", ] [[package]] -name = "kasuari" -version = "0.4.11" +name = "libp2p-core" +version = "0.43.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b" +checksum = "249128cd37a2199aff30a7675dffa51caf073b51aa612d2f544b19932b9aebca" dependencies = [ - "hashbrown 0.16.1", - "portable-atomic", + "either", + "fnv", + "futures", + "futures-timer", + "libp2p-identity", + "multiaddr 0.18.2", + "multihash 0.19.5", + "multistream-select", + "parking_lot", + "pin-project", + "quick-protobuf", + "rand 0.8.5", + "rw-stream-sink", "thiserror 2.0.17", + "tracing", + "unsigned-varint 0.8.0", + "web-time", ] [[package]] -name = "keccak" -version = "0.1.5" +name = "libp2p-dns" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "0b770c1c8476736ca98c578cba4b505104ff8e842c2876b528925f9766379f9a" dependencies = [ - "cpufeatures 0.2.17", + "async-trait", + "futures", + "hickory-resolver", + "libp2p-core", + "libp2p-identity", + "parking_lot", + "smallvec", + "tracing", ] [[package]] -name = "keccak" -version = "0.2.0" +name = "libp2p-gossipsub" +version = "0.49.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +checksum = "a538e571cd38f504f761c61b8f79127489ea7a7d6f05c41ca15d31ffb5726326" dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", + "async-channel 2.5.0", + "asynchronous-codec", + "base64 0.22.1", + "byteorder", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "getrandom 0.2.16", + "hashlink 0.9.1", + "hex_fmt", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "prometheus-client", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "regex", + "serde", + "sha2 0.10.9", + "tracing", + "web-time", ] [[package]] -name = "keccak-asm" -version = "0.1.8" +name = "libp2p-identify" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" +checksum = "8ab792a8b68fdef443a62155b01970c81c3aadab5e659621b063ef252a8e65e8" dependencies = [ - "digest 0.10.7", - "sha3-asm", + "asynchronous-codec", + "either", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "smallvec", + "thiserror 2.0.17", + "tracing", ] [[package]] -name = "kqueue" -version = "1.1.1" +name = "libp2p-identity" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "9525f3831544f7ae497bde79adf114ef127b0fbbb97edbbf692a80408636421c" dependencies = [ - "kqueue-sys", - "libc", + "asn1_der", + "bs58 0.5.1", + "ed25519-dalek", + "hkdf", + "k256 0.13.4", + "multihash 0.19.5", + "p256", + "prost 0.14.1", + "rand 0.8.5", + "sec1 0.7.3", + "serde", + "sha2 0.10.9", + "thiserror 2.0.17", + "tracing", + "zeroize", ] [[package]] -name = "kqueue-sys" -version = "1.0.4" +name = "libp2p-kad" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "13d3fd632a5872ec804d37e7413ceea20588f69d027a0fa3c46f82574f4dee60" dependencies = [ - "bitflags 1.3.2", - "libc", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "serde", + "sha2 0.10.9", + "smallvec", + "thiserror 2.0.17", + "tracing", + "uint 0.10.0", + "web-time", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "libp2p-mdns" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "c66872d0f1ffcded2788683f76931be1c52e27f343edb93bc6d0bcd8887be443" dependencies = [ - "spin 0.9.8", + "futures", + "hickory-proto", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "smallvec", + "socket2 0.5.10", + "tokio", + "tracing", ] [[package]] -name = "leb128fmt" -version = "0.1.0" +name = "libp2p-metrics" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +checksum = "805a555148522cb3414493a5153451910cb1a146c53ffbf4385708349baf62b7" +dependencies = [ + "futures", + "libp2p-core", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-ping", + "libp2p-swarm", + "pin-project", + "prometheus-client", + "web-time", +] [[package]] -name = "left-right" -version = "0.11.7" +name = "libp2p-noise" +version = "0.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0c21e4c8ff95f487fb34e6f9182875f42c84cef966d29216bf115d9bba835a" +checksum = "bc73eacbe6462a0eb92a6527cac6e63f02026e5407f8831bde8293f19217bfbf" dependencies = [ - "crossbeam-utils", - "loom", - "slab", + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core", + "libp2p-identity", + "multiaddr 0.18.2", + "multihash 0.19.5", + "quick-protobuf", + "rand 0.8.5", + "snow", + "static_assertions", + "thiserror 2.0.17", + "tracing", + "x25519-dalek", + "zeroize", ] [[package]] -name = "lexical" -version = "6.1.1" +name = "libp2p-ping" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6" +checksum = "74bb7fcdfd9fead4144a3859da0b49576f171a8c8c7c0bfc7c541921d25e60d3" dependencies = [ - "lexical-core", + "futures", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "tracing", + "web-time", ] [[package]] -name = "lexical-core" -version = "0.8.5" +name = "libp2p-quic" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +checksum = "8dc448b2de9f4745784e3751fe8bc6c473d01b8317edd5ababcb0dec803d843f" dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-tls", + "quinn", + "rand 0.8.5", + "ring", + "rustls 0.23.35", + "socket2 0.5.10", + "thiserror 2.0.17", + "tokio", + "tracing", ] [[package]] -name = "lexical-parse-float" -version = "0.8.5" +name = "libp2p-request-response" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +checksum = "a9f1cca83488b90102abac7b67d5c36fc65bc02ed47620228af7ed002e6a1478" dependencies = [ - "lexical-parse-integer", - "lexical-util", - "static_assertions", + "async-trait", + "cbor4ii", + "futures", + "futures-bounded", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "serde", + "smallvec", + "tracing", ] [[package]] -name = "lexical-parse-integer" -version = "0.8.6" +name = "libp2p-scatter" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +checksum = "ea402c419f99e6013d5b12f97c5a1a1abe4aca285844b01b0ed96deab11f0b6e" dependencies = [ - "lexical-util", - "static_assertions", + "bytes", + "fnv", + "futures", + "libp2p", + "prometheus-client", + "tracing", + "unsigned-varint 0.8.0", ] [[package]] -name = "lexical-util" -version = "0.8.5" +name = "libp2p-stream" +version = "0.4.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +checksum = "1d6bd8025c80205ec2810cfb28b02f362ab48a01bee32c50ab5f12761e033464" dependencies = [ - "static_assertions", + "futures", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "tracing", ] [[package]] -name = "lexical-write-float" -version = "0.8.5" +name = "libp2p-swarm" +version = "0.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +checksum = "ce88c6c4bf746c8482480345ea3edfd08301f49e026889d1cbccfa1808a9ed9e" dependencies = [ - "lexical-util", - "lexical-write-integer", - "static_assertions", + "either", + "fnv", + "futures", + "futures-timer", + "hashlink 0.10.0", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm-derive", + "multistream-select", + "rand 0.8.5", + "smallvec", + "tokio", + "tracing", + "web-time", ] [[package]] -name = "lexical-write-integer" -version = "0.8.5" +name = "libp2p-swarm-derive" +version = "0.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +checksum = "dd297cf53f0cb3dee4d2620bb319ae47ef27c702684309f682bdb7e55a18ae9c" dependencies = [ - "lexical-util", - "static_assertions", + "heck 0.5.0", + "quote 1.0.42", + "syn 2.0.117", ] [[package]] -name = "libc" -version = "0.2.178" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" - -[[package]] -name = "libgit2-sys" -version = "0.18.2+1.9.1" +name = "libp2p-tcp" +version = "0.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +checksum = "fb6585b9309699f58704ec9ab0bb102eca7a3777170fa91a8678d73ca9cafa93" dependencies = [ - "cc", + "futures", + "futures-timer", + "if-watch", "libc", - "libz-sys", - "pkg-config", + "libp2p-core", + "socket2 0.6.1", + "tokio", + "tracing", ] [[package]] -name = "libloading" -version = "0.8.9" +name = "libp2p-tls" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "96ff65a82e35375cbc31ebb99cacbbf28cb6c4fefe26bf13756ddcf708d40080" dependencies = [ - "cfg-if", - "windows-link 0.2.1", + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "rcgen", + "ring", + "rustls 0.23.35", + "rustls-webpki 0.103.8", + "thiserror 2.0.17", + "x509-parser", + "yasna", ] [[package]] -name = "libm" -version = "0.2.15" +name = "libp2p-upnp" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "4757e65fe69399c1a243bbb90ec1ae5a2114b907467bf09f3575e899815bb8d3" +dependencies = [ + "futures", + "futures-timer", + "igd-next", + "libp2p-core", + "libp2p-swarm", + "tokio", + "tracing", +] [[package]] -name = "libp2p-identity" -version = "0.2.12" +name = "libp2p-yamux" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" +checksum = "f15df094914eb4af272acf9adaa9e287baa269943f32ea348ba29cfb9bfc60d8" dependencies = [ - "asn1_der", - "bs58 0.5.1", - "ed25519-dalek", - "hkdf", - "k256 0.13.4", - "multihash 0.19.3", - "quick-protobuf", - "sha2 0.10.9", + "either", + "futures", + "libp2p-core", "thiserror 2.0.17", "tracing", - "zeroize", + "yamux 0.12.1", + "yamux 0.13.10", ] [[package]] @@ -7188,6 +8505,40 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "logos" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff472f899b4ec2d99161c51f60ff7075eeb3097069a36050d8037a6325eb8154" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "192a3a2b90b0c05b27a0b2c43eecdb7c415e29243acc3f89cc8247a5b693045c" +dependencies = [ + "beef", + "fnv", + "lazy_static", + "proc-macro2 1.0.103", + "quote 1.0.42", + "regex-syntax 0.8.8", + "rustc_version 0.4.1", + "syn 2.0.117", +] + +[[package]] +name = "logos-derive" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "605d9697bcd5ef3a42d38efc51541aa3d6a4a25f7ab6d1ed0da5ac632a26b470" +dependencies = [ + "logos-codegen", +] + [[package]] name = "loom" version = "0.7.2" @@ -7519,6 +8870,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "cfg-if", + "miette-derive", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2 1.0.103", + "quote 1.0.42", + "syn 2.0.117", +] + [[package]] name = "mime" version = "0.3.17" @@ -7682,7 +9055,7 @@ dependencies = [ "data-encoding", "libp2p-identity", "multibase", - "multihash 0.19.3", + "multihash 0.19.5", "percent-encoding", "serde", "static_assertions", @@ -7717,11 +9090,11 @@ dependencies = [ [[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", + "serde", "unsigned-varint 0.8.0", ] @@ -7745,6 +9118,20 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +[[package]] +name = "multistream-select" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint 0.7.2", +] + [[package]] name = "multiversion" version = "0.7.4" @@ -7793,6 +9180,54 @@ dependencies = [ "tempfile", ] +[[package]] +name = "netlink-packet-core" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" +dependencies = [ + "paste", +] + +[[package]] +name = "netlink-packet-route" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445" +dependencies = [ + "bitflags 2.13.0", + "libc", + "log", + "netlink-packet-core", +] + +[[package]] +name = "netlink-proto" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror 2.0.17", +] + +[[package]] +name = "netlink-sys" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" +dependencies = [ + "bytes", + "futures-util", + "libc", + "log", + "tokio", +] + [[package]] name = "never-say-never" version = "6.6.666" @@ -7805,12 +9240,30 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "no-std-compat" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nom" version = "7.1.3" @@ -8056,6 +9509,15 @@ dependencies = [ "objc2-core-foundation", ] +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -8517,6 +9979,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "pbkdf2" version = "0.11.0" @@ -9091,6 +10559,20 @@ dependencies = [ "version_check 0.9.5", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "polonius-the-crab" version = "0.5.0" @@ -9101,6 +10583,17 @@ dependencies = [ "never-say-never", ] +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + [[package]] name = "polyval" version = "0.6.2" @@ -9363,6 +10856,29 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "prometheus-client" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf41c1a7c32ed72abe5082fb19505b969095c12da9f5732a4bc9878757fd087c" +dependencies = [ + "dtoa", + "itoa", + "parking_lot", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" +dependencies = [ + "proc-macro2 1.0.103", + "quote 1.0.42", + "syn 2.0.117", +] + [[package]] name = "proptest" version = "1.9.0" @@ -9480,6 +10996,18 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "prost-reflect" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37587d5a8a1b3dc9863403d084fc2254b91ab75a702207098837950767e2260b" +dependencies = [ + "logos", + "miette", + "prost 0.13.5", + "prost-types", +] + [[package]] name = "prost-types" version = "0.13.5" @@ -9495,6 +11023,33 @@ version = "2.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" +[[package]] +name = "protox" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "424c2bd294b69c49b949f3619362bc3c5d28298cd1163b6d1a62df37c16461aa" +dependencies = [ + "bytes", + "miette", + "prost 0.13.5", + "prost-reflect", + "prost-types", + "protox-parse", + "thiserror 2.0.17", +] + +[[package]] +name = "protox-parse" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57927f9dbeeffcce7192404deee6157a640cbb3fe8ac11eabbe571565949ab75" +dependencies = [ + "logos", + "miette", + "prost-types", + "thiserror 2.0.17", +] + [[package]] name = "quanta" version = "0.12.6" @@ -9525,6 +11080,19 @@ dependencies = [ "byteorder", ] +[[package]] +name = "quick-protobuf-codec" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" +dependencies = [ + "asynchronous-codec", + "bytes", + "quick-protobuf", + "thiserror 1.0.69", + "unsigned-varint 0.8.0", +] + [[package]] name = "quick_cache" version = "0.6.18" @@ -9545,6 +11113,7 @@ checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", + "futures-io", "pin-project-lite", "quinn-proto", "quinn-udp", @@ -9623,6 +11192,27 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "ractor" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12c86deb2af198b10a04c4fb3fba73baf3bb300df765a29272f0e5583da7510" +dependencies = [ + "async-trait", + "bon", + "dashmap 6.1.0", + "futures", + "js-sys", + "once_cell", + "strum 0.28.0", + "tokio", + "tokio_with_wasm", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", +] + [[package]] name = "radium" version = "0.7.0" @@ -9914,7 +11504,7 @@ dependencies = [ "thiserror 2.0.17", "unicode-segmentation", "unicode-truncate", - "unicode-width", + "unicode-width 0.2.0", ] [[package]] @@ -9946,7 +11536,7 @@ dependencies = [ "strum 0.28.0", "time", "unicode-segmentation", - "unicode-width", + "unicode-width 0.2.0", ] [[package]] @@ -10251,6 +11841,19 @@ dependencies = [ "tracing", ] +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "yasna", +] + [[package]] name = "rdrand" version = "0.4.0" @@ -11380,21 +12983,36 @@ dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", "reth-chainspec", + "reth-cli-util", "reth-codecs", "reth-consensus", "reth-consensus-common", "reth-db", + "reth-engine-local", + "reth-eth-wire", + "reth-ethereum-cli", "reth-ethereum-consensus", "reth-ethereum-primitives", "reth-evm", "reth-evm-ethereum", + "reth-network", + "reth-network-api", "reth-node-api", + "reth-node-builder", "reth-node-core", + "reth-node-ethereum", "reth-primitives-traits", "reth-provider", "reth-revm", + "reth-rpc", + "reth-rpc-api", + "reth-rpc-builder", + "reth-rpc-eth-types", "reth-storage-api", "reth-tasks", + "reth-transaction-pool", + "reth-trie", + "reth-trie-db", ] [[package]] @@ -11561,6 +13179,7 @@ dependencies = [ "alloy-primitives 1.6.0", "alloy-rpc-types-engine", "derive_more 2.1.0", + "parking_lot", "reth-chainspec", "reth-ethereum-forks", "reth-ethereum-primitives", @@ -11764,7 +13383,7 @@ version = "1.11.3" source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.3#d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" dependencies = [ "futures-util", - "if-addrs", + "if-addrs 0.14.0", "reqwest 0.12.24", "serde_with", "thiserror 2.0.17", @@ -12992,6 +14611,7 @@ dependencies = [ "futures-util", "metrics", "parking_lot", + "paste", "pin-project", "rand 0.9.2", "reth-chain-state", @@ -13504,6 +15124,24 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rtnetlink" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b960d5d873a75b5be9761b1e73b146f52dddcd27bac75263f40fba686d4d7b5" +dependencies = [ + "futures-channel", + "futures-util", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "nix", + "thiserror 1.0.69", + "tokio", +] + [[package]] name = "ruint" version = "1.17.0" @@ -13622,6 +15260,15 @@ dependencies = [ "semver 1.0.27", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" version = "1.1.2" @@ -13794,6 +15441,17 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "rw-stream-sink" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + [[package]] name = "ryu" version = "1.0.20" @@ -13922,6 +15580,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "sec1" version = "0.3.0" @@ -14584,6 +16248,23 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" +[[package]] +name = "snow" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" +dependencies = [ + "aes-gcm", + "blake2", + "chacha20poly1305", + "curve25519-dalek", + "rand_core 0.6.4", + "ring", + "rustc_version 0.4.1", + "sha2 0.10.9", + "subtle", +] + [[package]] name = "socket2" version = "0.5.10" @@ -14737,7 +16418,7 @@ dependencies = [ "crc", "crossbeam-queue", "either", - "event-listener", + "event-listener 2.5.3", "futures-channel", "futures-core", "futures-intrusive", @@ -15126,6 +16807,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "0.15.44" @@ -15283,6 +16970,17 @@ dependencies = [ "system-configuration-sys 0.6.0", ] +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.13.0", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", +] + [[package]] name = "system-configuration-sys" version = "0.5.0" @@ -15605,6 +17303,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.6.1", "tokio-macros", + "tracing", "windows-sys 0.61.2", ] @@ -15720,6 +17419,30 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio_with_wasm" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34e40fbbbd95441133fe9483f522db15dbfd26dc636164ebd8f2dd28759a6aa6" +dependencies = [ + "js-sys", + "tokio", + "tokio_with_wasm_proc", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "tokio_with_wasm_proc" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d01145a2c788d6aae4cd653afec1e8332534d7d783d01897cefcafe4428de992" +dependencies = [ + "quote 1.0.42", + "syn 2.0.117", +] + [[package]] name = "toml" version = "0.5.11" @@ -15981,9 +17704,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -16016,9 +17739,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -16365,9 +18088,15 @@ checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ "itertools 0.14.0", "unicode-segmentation", - "unicode-width", + "unicode-width 0.2.0", ] +[[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" @@ -16413,6 +18142,11 @@ name = "unsigned-varint" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" +dependencies = [ + "asynchronous-codec", + "bytes", + "tokio-util", +] [[package]] name = "untrusted" @@ -17616,6 +19350,35 @@ dependencies = [ "tap", ] +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 2.0.17", + "time", +] + [[package]] name = "xattr" version = "1.6.1" @@ -17626,6 +19389,21 @@ dependencies = [ "rustix", ] +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + [[package]] name = "xsum" version = "0.1.6" @@ -17647,12 +19425,52 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yamux" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot", + "pin-project", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "yamux" +version = "0.13.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1991f6690292030e31b0144d73f5e8368936c58e45e7068254f7138b23b00672" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot", + "pin-project", + "rand 0.9.2", + "static_assertions", + "web-time", +] + [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + [[package]] name = "yoke" version = "0.8.1" diff --git a/Cargo.toml b/Cargo.toml index 13305149a..c9ec355fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ members = [ "crates/rbuilder-operator", "crates/rbuilder-rebalancer", "crates/reth-rbuilder", + "crates/arc-rbuilder", "crates/rbuilder/src/test_utils", "crates/rbuilder/src/telemetry/metrics_macros", "crates/eth-sparse-mpt", @@ -27,6 +28,7 @@ default-members = [ "crates/rbuilder", "crates/rbuilder-operator", "crates/reth-rbuilder", + "crates/arc-rbuilder", "crates/rbuilder-rebalancer", "crates/rbuilder-primitives", "crates/rbuilder-utils", @@ -107,6 +109,8 @@ reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v1 reth-trie-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } +reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.3" } # compatible with reth v1.11.3 (d6324d63e27ef6b7c49cdc9b1977c1b808234c7b) dependencies revm = { version = "34.0.0", features = [ @@ -194,6 +198,7 @@ arc-evm-node = { path = "../../arc-node/crates/evm-node" } arc-execution-payload = { path = "../../arc-node/crates/execution-payload" } arc-execution-txpool = { path = "../../arc-node/crates/execution-txpool" } arc-shared = { path = "../../arc-node/crates/shared" } +arc-execution-validation = { path = "../../arc-node/crates/execution-validation" } eth-sparse-mpt = { path = "crates/eth-sparse-mpt" } bid-scraper = { path = "crates/bid-scraper" } diff --git a/crates/arc-rbuilder/Cargo.toml b/crates/arc-rbuilder/Cargo.toml new file mode 100644 index 000000000..924024b34 --- /dev/null +++ b/crates/arc-rbuilder/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "arc-rbuilder" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true + +[dependencies] +rbuilder = { workspace = true, features = ["arc"] } +rbuilder-config.workspace = true + +arc-evm.workspace = true +arc-evm-node.workspace = true +arc-execution-config.workspace = true +arc-execution-payload.workspace = true +arc-execution-txpool.workspace = true +arc-execution-validation.workspace = true + +reth.workspace = true +reth-cli-util.workspace = true +reth-node-api.workspace = true +reth-node-builder.workspace = true +reth-payload-builder.workspace = true +reth-basic-payload-builder.workspace = true +reth-ethereum-engine-primitives.workspace = true +reth-provider.workspace = true +reth-transaction-pool.workspace = true +reth-revm.workspace = true +reth-evm.workspace = true +reth-chainspec.workspace = true +reth-node-ethereum.workspace = true +alloy-consensus.workspace = true + +alloy-primitives.workspace = true +alloy-rpc-types-beacon.workspace = true +alloy-rpc-types-engine.workspace = true +revm.workspace = true + +clap.workspace = true +eyre.workspace = true +futures.workspace = true +tokio.workspace = true +tokio-util.workspace = true +tracing.workspace = true + +[target.'cfg(not(target_env = "msvc"))'.dependencies] +tikv-jemallocator = { workspace = true } + +[features] +jemalloc = [] + +[[bin]] +name = "arc-rbuilder" +path = "src/main.rs" diff --git a/crates/arc-rbuilder/config-arc-example.toml b/crates/arc-rbuilder/config-arc-example.toml new file mode 100644 index 000000000..a10f5609b --- /dev/null +++ b/crates/arc-rbuilder/config-arc-example.toml @@ -0,0 +1,53 @@ +# Example rbuilder config for building Arc chain blocks (arc-rbuilder binary). +# +# Usage: +# cargo run -p arc-rbuilder -- node \ +# --chain arc-testnet \ +# --rbuilder.config crates/arc-rbuilder/config-arc-example.toml +# +# There are no relays and no bidding on Arc: blocks are delivered to Malachite +# consensus through the engine API (engine_getPayload), so all MEV-Boost +# related settings (relays, cl_node_url, relay secret keys) are unused. + +log_json = false +log_level = "info,rbuilder=debug" +error_storage_path = "/tmp/rbuilder.error.sqlite" + +# Address that collects priority fees while building; the block's true value +# is paid to the proposer's suggested fee recipient with the payout tx. +# env: COINBASE_SECRET_KEY +coinbase_secret_key = "env:COINBASE_SECRET_KEY" + +# chain is unused by arc-rbuilder itself (the node's --chain flag wins) but +# must parse; use the same network here. +chain = "arc-testnet" + +full_telemetry_server_port = 6060 +redacted_telemetry_server_port = 6061 + +# Order intake: the in-process txpool subscription is wired automatically; +# these servers additionally accept bundles / raw txs over ipc/http. +jsonrpc_server_port = 8645 +jsonrpc_server_ip = "0.0.0.0" +ignore_cancellable_orders = true + +# Sub-second blocks: keep simulation lean. +simulation_threads = 4 + +live_builders = ["mp-ordering", "mgp-ordering"] + +[[builders]] +name = "mgp-ordering" +algo = "ordering-builder" +discard_txs = true +sorting = "mev-gas-price" +failed_order_retries = 1 +drop_failed_orders = true + +[[builders]] +name = "mp-ordering" +algo = "ordering-builder" +discard_txs = true +sorting = "max-profit" +failed_order_retries = 1 +drop_failed_orders = true diff --git a/crates/arc-rbuilder/src/main.rs b/crates/arc-rbuilder/src/main.rs new file mode 100644 index 000000000..fec43dfa1 --- /dev/null +++ b/crates/arc-rbuilder/src/main.rs @@ -0,0 +1,261 @@ +//! `rbuilder` building blocks for the Arc chain, running in-process with an +//! arc-node execution node. +//! +//! Usage: `cargo run -p arc-rbuilder -- node --chain arc-testnet --rbuilder.config ` +//! +//! Malachite consensus drives block production through the engine API; this +//! binary wraps the regular Arc payload builder so that `engine_getPayload` +//! returns rbuilder's best block, with the stock Arc builder as fallback. + +use clap::{Args, Parser}; +use rbuilder::{ + live_builder::{ + base_config::BaseConfig, + block_output::engine_payload_sink::{EnginePayloadRegistry, EnginePayloadSinkFactory}, + cli::{create_start_slot_watchdog, LiveBuilderConfig as _}, + config::{create_builders, Config}, + payload_events::{MevBoostSlotData, SlotSource}, + }, + provider::reth_prov::StateProviderFactoryFromRethProvider, + telemetry, +}; +use rbuilder_config::load_toml_config; +use reth::{chainspec::EthereumHardforks, cli::Cli, primitives::Header}; +use reth_provider::{ + providers::BlockchainProvider, BlockReader, ChainSpecProvider, ChangeSetReader, + DatabaseProviderFactory, HeaderProvider, PruneCheckpointReader, StageCheckpointReader, + StorageChangeSetReader, StorageSettingsCache, +}; +use std::{path::PathBuf, process, sync::atomic::AtomicBool, sync::Arc}; +use tokio::{sync::mpsc, task}; +use tokio_util::sync::CancellationToken; +use tracing::error; + +use arc_evm::{ArcEvmConfig, ArcEvmFactory}; +use arc_evm_node::node::{ArcAddOns, ArcNode}; +use arc_evm_node::ArcRpcLayer; +use arc_execution_config::chainspec::{ArcChainSpec, ArcChainSpecParser}; +use arc_execution_payload::payload::ArcNetworkPayloadBuilderBuilder; +mod payload_service; +use payload_service::{RbuilderBridge, RbuilderPayloadServiceBuilder}; + +// Prefer jemalloc for performance reasons. +#[cfg(all(feature = "jemalloc", unix))] +#[global_allocator] +static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; + +#[derive(Debug, Clone, Args, PartialEq, Eq, Default)] +pub struct ExtraArgs { + /// Path of the rbuilder config to use + #[arg(long = "rbuilder.config")] + pub rbuilder_config: PathBuf, +} + +/// Components used by reth CLI commands (init, import, ...) that need an EVM +/// + consensus instance. Mirrors arc-node's `arc_components`. +fn arc_components( + spec: Arc, +) -> ( + ArcEvmConfig, + Arc>, +) { + let eth_evm = reth_node_ethereum::EthEvmConfig::new_with_evm_factory( + spec.clone(), + ArcEvmFactory::new(spec.clone()), + ); + ( + ArcEvmConfig::new(eth_evm), + Arc::new(arc_execution_validation::ArcConsensus::new(spec)), + ) +} + +fn main() { + reth_cli_util::sigsegv_handler::install(); + + if std::env::var_os("RUST_BACKTRACE").is_none() { + std::env::set_var("RUST_BACKTRACE", "1"); + } + + if let Err(err) = Cli::::parse().run_with_components::( + arc_components, + async move |builder, extra_args| { + let (slot_sender, slot_receiver) = mpsc::unbounded_channel(); + let bridge = RbuilderBridge::new(slot_sender); + let registry = bridge.registry.clone(); + + let arc_node = ArcNode::default(); + + // Same components as a stock arc node, with the payload service + // wrapped so rbuilder gets first shot at every payload job. + let fallback_payload_builder = ArcNetworkPayloadBuilderBuilder::new( + None, + arc_node.payload_builder_deadline_ms, + arc_node.wait_for_payload, + ); + let components = ArcNode::components( + &arc_node.invalid_tx_list_cfg, + &arc_node.addresses_denylist_config, + arc_node.payload_builder_deadline_ms, + arc_node.wait_for_payload, + arc_node.rebroadcast_interval, + ) + .payload(RbuilderPayloadServiceBuilder::new( + fallback_payload_builder, + bridge, + )); + + let add_ons = ArcAddOns::default() + .with_arc_rpc_config(arc_node.rpc_cfg.clone()) + .with_rpc_middleware(ArcRpcLayer::new( + arc_node.filter_pending_txs, + arc_node.max_response_body_size as usize, + )); + + let handle = builder + .with_types_and_provider::>() + .with_components(components) + .with_add_ons(add_ons) + .on_node_started(move |node| { + spawn_rbuilder( + node.provider().clone(), + node.pool().clone(), + extra_args.rbuilder_config, + registry, + slot_receiver, + ); + Ok(()) + }) + .launch() + .await?; + handle.node_exit_future.await + }, + ) { + eprintln!("Error: {err:?}"); + std::process::exit(1); + } +} + +/// Spawns a tokio rbuilder task wired to the engine payload bridge. +/// +/// Takes down the entire process if the rbuilder errors or stops. +fn spawn_rbuilder( + provider: P, + pool: reth_transaction_pool::Pool, + config_path: PathBuf, + registry: Arc, + slot_receiver: mpsc::UnboundedReceiver, +) where + P: DatabaseProviderFactory< + Provider: BlockReader + + StageCheckpointReader + + PruneCheckpointReader + + ChangeSetReader + + StorageChangeSetReader + + StorageSettingsCache, + > + reth_provider::StateProviderFactory + + HeaderProvider

+ + reth_provider::ChainSpecProvider + + Clone + + 'static, +

::ChainSpec: EthereumHardforks, + V: reth_transaction_pool::TransactionValidator< + Transaction = reth_transaction_pool::EthPooledTransaction, + > + 'static, + T: reth_transaction_pool::TransactionOrdering< + Transaction = ::Transaction, + >, + S: reth_transaction_pool::blobstore::BlobStore, +{ + let _handle = task::spawn(async move { + let result = run_rbuilder(provider, pool, config_path, registry, slot_receiver).await; + + if let Err(e) = result { + error!("Fatal rbuilder error: {:#}", e); + process::exit(1); + } + + error!("rbuilder stopped unexpectedly"); + process::exit(1); + }); +} + +async fn run_rbuilder( + provider: P, + pool: reth_transaction_pool::Pool, + config_path: PathBuf, + registry: Arc, + slot_receiver: mpsc::UnboundedReceiver, +) -> eyre::Result<()> +where + P: DatabaseProviderFactory< + Provider: BlockReader + + StageCheckpointReader + + PruneCheckpointReader + + ChangeSetReader + + StorageChangeSetReader + + StorageSettingsCache, + > + reth_provider::StateProviderFactory + + HeaderProvider

+ + reth_provider::ChainSpecProvider + + Clone + + 'static, +

::ChainSpec: EthereumHardforks, + V: reth_transaction_pool::TransactionValidator< + Transaction = reth_transaction_pool::EthPooledTransaction, + > + 'static, + T: reth_transaction_pool::TransactionOrdering< + Transaction = ::Transaction, + >, + S: reth_transaction_pool::blobstore::BlobStore, +{ + let config: Config = load_toml_config(config_path)?; + let base_config: &BaseConfig = config.base_config(); + let cancel = CancellationToken::new(); + let abort = CancellationToken::new(); + let start_slot_watchdog_sender = create_start_slot_watchdog(base_config, cancel.clone())?; + + let ready_to_build = Arc::new(AtomicBool::new(false)); + telemetry::servers::redacted::spawn( + base_config.redacted_telemetry_server_address(), + ready_to_build.clone(), + ) + .await?; + telemetry::servers::full::spawn( + base_config.full_telemetry_server_address(), + config.version_for_telemetry(), + ) + .await?; + + let blocklist_provider = base_config.blocklist_provider(cancel.clone()).await?; + + let state_provider_factory = StateProviderFactoryFromRethProvider::new( + provider, + base_config.live_root_hash_config()?, + ); + + let sink_factory = EnginePayloadSinkFactory::new(registry); + + let live_builder = base_config + .create_builder_with_provider_factory( + cancel.clone(), + abort, + Box::new(sink_factory), + SlotSource::Channel(slot_receiver), + state_provider_factory, + blocklist_provider, + ) + .await?; + + let builders = create_builders( + config.live_builders()?, + base_config.max_order_execution_duration_warning(), + ); + let live_builder = live_builder.with_builders(builders); + + live_builder.connect_to_transaction_pool(pool).await?; + live_builder + .run(ready_to_build, start_slot_watchdog_sender) + .await?; + + Ok(()) +} diff --git a/crates/arc-rbuilder/src/payload_service.rs b/crates/arc-rbuilder/src/payload_service.rs new file mode 100644 index 000000000..db2ae1a2d --- /dev/null +++ b/crates/arc-rbuilder/src/payload_service.rs @@ -0,0 +1,362 @@ +//! Payload service wiring that puts rbuilder between Malachite consensus and +//! the Arc node's own payload builder. +//! +//! Flow: +//! 1. Malachite sends `engine_forkchoiceUpdatedV3` with payload attributes. +//! 2. [`RbuilderJobGenerator::new_payload_job`] registers a payload cell with +//! the rbuilder [`EnginePayloadRegistry`], pushes the slot to the rbuilder +//! [`SlotSource`] channel and starts the regular Arc payload job as +//! fallback. +//! 3. rbuilder builds blocks; every new best block is finalized and published +//! into the cell (see `EnginePayloadSink` in rbuilder). +//! 4. `engine_getPayload` resolves the job: rbuilder's best block wins, the +//! Arc builder's block is the fallback so consensus liveness never depends +//! on rbuilder. + +use alloy_primitives::B256; +use alloy_rpc_types_beacon::events::{PayloadAttributesData, PayloadAttributesEvent}; +use alloy_rpc_types_engine::PayloadAttributes; +use rbuilder::{ + building::arc_support, + chain::ChainSpec, + live_builder::{ + block_output::engine_payload_sink::EnginePayloadRegistry, + payload_events::{InternalPayloadId, MevBoostSlotData}, + }, +}; +use reth_basic_payload_builder::{BasicPayloadJobGenerator, BasicPayloadJobGeneratorConfig}; +use reth_chainspec::EthChainSpec as _; +use reth_ethereum_engine_primitives::{EthBuiltPayload, EthPayloadBuilderAttributes}; +use reth_evm::{ConfigureEvm as _, NextBlockEnvAttributes}; +use reth_node_api::{FullNodeTypes, NodeTypes, PayloadTypes}; +use reth_node_builder::{ + components::{PayloadBuilderBuilder, PayloadServiceBuilder}, + BuilderContext, +}; +use reth_payload_builder::{ + KeepPayloadJobAlive, PayloadBuilderError, PayloadBuilderHandle, PayloadBuilderService, + PayloadJob, PayloadJobGenerator, PayloadKind, +}; +use reth_provider::{ + CanonStateSubscriptions, ChainSpecProvider, HeaderProvider, StateProviderFactory, +}; +use reth_revm::database::StateProviderDatabase; +use reth_transaction_pool::TransactionPool; +use std::{ + future::Future, + pin::Pin, + sync::Arc, + task::{Context, Poll}, +}; +use tokio::sync::{mpsc, watch}; +use tracing::{info, warn}; + +/// Handles shared between the payload service and the rbuilder instance. +#[derive(Debug, Clone)] +pub struct RbuilderBridge { + pub registry: Arc, + pub slot_sender: mpsc::UnboundedSender, +} + +impl RbuilderBridge { + pub fn new(slot_sender: mpsc::UnboundedSender) -> Self { + Self { + registry: Arc::new(EnginePayloadRegistry::default()), + slot_sender, + } + } +} + +/// [`PayloadServiceBuilder`] that wraps the Arc payload builder ([`PB`]) with +/// the rbuilder bridge. Mirrors reth's `BasicPayloadServiceBuilder`, with the +/// job generator wrapped in [`RbuilderJobGenerator`]. +#[derive(Debug)] +pub struct RbuilderPayloadServiceBuilder { + inner: PB, + bridge: RbuilderBridge, +} + +impl RbuilderPayloadServiceBuilder { + pub fn new(inner: PB, bridge: RbuilderBridge) -> Self { + Self { inner, bridge } + } +} + +impl PayloadServiceBuilder + for RbuilderPayloadServiceBuilder +where + Node: FullNodeTypes< + Types: NodeTypes< + ChainSpec = ChainSpec, + Primitives = reth::primitives::EthPrimitives, + Payload: PayloadTypes< + PayloadBuilderAttributes = EthPayloadBuilderAttributes, + BuiltPayload = EthBuiltPayload, + >, + >, + >, + Pool: TransactionPool, + EvmCfg: Send, + PB: PayloadBuilderBuilder, + ::Attributes: + Unpin + Clone, + ::BuiltPayload: + Unpin + Clone, +{ + async fn spawn_payload_builder_service( + self, + ctx: &BuilderContext, + pool: Pool, + evm_config: EvmCfg, + ) -> eyre::Result::Payload>> { + let payload_builder = self.inner.build_payload_builder(ctx, pool, evm_config).await?; + + let conf = ctx.config().builder.clone(); + let payload_job_config = BasicPayloadJobGeneratorConfig::default() + .interval(conf.interval) + .deadline(conf.deadline) + .max_payload_tasks(conf.max_payload_tasks); + + let inner_generator = BasicPayloadJobGenerator::with_builder( + ctx.provider().clone(), + ctx.task_executor().clone(), + payload_job_config, + payload_builder, + ); + + let generator = RbuilderJobGenerator { + inner: inner_generator, + bridge: self.bridge, + client: ctx.provider().clone(), + chain_spec: ctx.chain_spec(), + }; + + let (payload_service, payload_service_handle) = + PayloadBuilderService::new(generator, ctx.provider().canonical_state_stream()); + + ctx.task_executor() + .spawn_critical_task("payload builder service", Box::pin(payload_service)); + + Ok(payload_service_handle) + } +} + +/// [`PayloadJobGenerator`] that forwards new payload jobs to rbuilder and +/// wraps the inner (Arc) jobs so resolution prefers rbuilder's block. +#[derive(Debug)] +pub struct RbuilderJobGenerator { + inner: Gen, + bridge: RbuilderBridge, + client: Client, + chain_spec: Arc, +} + +impl RbuilderJobGenerator +where + Client: StateProviderFactory + HeaderProvider

, +{ + /// Converts engine payload attributes into the slot data rbuilder + /// consumes, computing the ProtocolConfig gas limit on parent state. + fn slot_data( + &self, + attributes: &EthPayloadBuilderAttributes, + internal_payload_id: InternalPayloadId, + ) -> eyre::Result { + let parent_hash = attributes.parent; + let parent_header = self + .client + .header(parent_hash)? + .ok_or_else(|| eyre::eyre!("parent header {parent_hash} not found"))?; + + // EVM env for the ProtocolConfig system call on top of the parent + // state (gas limit value is a placeholder, exactly like + // ArcEvmConfig::builder_for_next_block does). + let evm_env = rbuilder::chain::evm_config(self.chain_spec.clone()).next_evm_env( + &parent_header, + &NextBlockEnvAttributes { + timestamp: attributes.timestamp, + suggested_fee_recipient: attributes.suggested_fee_recipient, + prev_randao: attributes.prev_randao, + gas_limit: parent_header.gas_limit, + withdrawals: Some(attributes.withdrawals.clone()), + parent_beacon_block_root: attributes.parent_beacon_block_root, + extra_data: Default::default(), + }, + )?; + let state = self.client.state_by_block_hash(parent_hash)?; + let db = revm::database::State::builder() + .with_database(StateProviderDatabase::new(state)) + .with_bundle_update() + .build(); + let gas_limit = arc_support::expected_block_gas_limit( + self.chain_spec.clone(), + db, + &parent_header, + evm_env, + ); + + let payload_attributes_event = PayloadAttributesEvent { + // Arc has no beacon chain; the version string is only used for + // logging inside rbuilder. + version: "arc".to_string(), + data: PayloadAttributesData { + proposal_slot: parent_header.number + 1, + parent_block_root: B256::ZERO, + parent_block_number: parent_header.number, + parent_block_hash: parent_hash, + proposer_index: 0, + payload_attributes: PayloadAttributes { + timestamp: attributes.timestamp, + prev_randao: attributes.prev_randao, + suggested_fee_recipient: attributes.suggested_fee_recipient, + withdrawals: Some(attributes.withdrawals.clone().into_inner()), + parent_beacon_block_root: attributes.parent_beacon_block_root, + }, + }, + }; + + Ok(MevBoostSlotData { + payload_attributes_event, + suggested_gas_limit: gas_limit, + relay_registrations: Arc::new(Default::default()), + slot_data: rbuilder::live_builder::payload_events::relay_epoch_cache::SlotData { + fee_recipient: attributes.suggested_fee_recipient, + gas_limit, + pubkey: Default::default(), + }, + payload_id: internal_payload_id, + }) + } +} + +impl PayloadJobGenerator for RbuilderJobGenerator +where + Gen: PayloadJobGenerator, + Gen::Job: PayloadJob< + PayloadAttributes = EthPayloadBuilderAttributes, + BuiltPayload = EthBuiltPayload, + > + Unpin, + Client: StateProviderFactory + + HeaderProvider
+ + ChainSpecProvider + + Clone + + 'static, +{ + type Job = RbuilderPayloadJob; + + fn new_payload_job( + &self, + attributes: EthPayloadBuilderAttributes, + ) -> Result { + let payload_id = attributes.payload_id(); + let internal_id = u64::from_be_bytes(payload_id.0 .0); + + let inner = self.inner.new_payload_job(attributes.clone())?; + + let best_payload = self.bridge.registry.register(internal_id); + match self.slot_data(&attributes, internal_id) { + Ok(slot_data) => { + info!( + %payload_id, + block = slot_data.block(), + parent_hash = %slot_data.parent_block_hash(), + gas_limit = slot_data.suggested_gas_limit, + chain = %self.chain_spec.chain_id(), + "Forwarding payload job to rbuilder" + ); + if self.bridge.slot_sender.send(slot_data).is_err() { + warn!("rbuilder slot channel closed; building with fallback builder only"); + } + } + Err(err) => { + warn!(?err, %payload_id, "Failed to build rbuilder slot data; building with fallback builder only"); + } + } + + Ok(RbuilderPayloadJob { + inner, + registry: self.bridge.registry.clone(), + internal_id, + best_payload, + }) + } + + fn on_new_state( + &mut self, + new_state: reth_provider::CanonStateNotification, + ) { + self.inner.on_new_state(new_state) + } +} + +/// Payload job preferring rbuilder's published block over the inner (Arc +/// builder) job's payload. +#[derive(Debug)] +pub struct RbuilderPayloadJob { + inner: J, + registry: Arc, + internal_id: InternalPayloadId, + best_payload: watch::Receiver>, +} + +impl Drop for RbuilderPayloadJob { + fn drop(&mut self) { + self.registry.unregister(self.internal_id); + } +} + +impl Future for RbuilderPayloadJob +where + J: Future> + Unpin, +{ + type Output = Result<(), PayloadBuilderError>; + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + Pin::new(&mut self.inner).poll(cx) + } +} + +impl PayloadJob for RbuilderPayloadJob +where + J: PayloadJob + + Unpin, +{ + type PayloadAttributes = EthPayloadBuilderAttributes; + type ResolvePayloadFuture = futures::future::Either< + futures::future::Ready>, + J::ResolvePayloadFuture, + >; + type BuiltPayload = EthBuiltPayload; + + fn best_payload(&self) -> Result { + if let Some(payload) = self.best_payload.borrow().clone() { + return Ok(payload); + } + self.inner.best_payload() + } + + fn payload_attributes(&self) -> Result { + self.inner.payload_attributes() + } + + fn resolve_kind( + &mut self, + kind: PayloadKind, + ) -> (Self::ResolvePayloadFuture, KeepPayloadJobAlive) { + if let Some(payload) = self.best_payload.borrow().clone() { + info!( + payload_id = %payload.id(), + block = payload.block().number, + fees = %payload.fees(), + "Resolving payload with rbuilder block" + ); + return ( + futures::future::Either::Left(futures::future::ready(Ok(payload))), + KeepPayloadJobAlive::No, + ); + } + info!("No rbuilder block available, resolving payload with fallback builder"); + let (fut, keep_alive) = self.inner.resolve_kind(kind); + (futures::future::Either::Right(fut), keep_alive) + } +} diff --git a/crates/rbuilder/src/live_builder/config.rs b/crates/rbuilder/src/live_builder/config.rs index 5081c38a5..2360b4b1b 100644 --- a/crates/rbuilder/src/live_builder/config.rs +++ b/crates/rbuilder/src/live_builder/config.rs @@ -660,7 +660,7 @@ where } impl Config { - fn live_builders(&self) -> eyre::Result> { + pub fn live_builders(&self) -> eyre::Result> { self.base_config .live_builders .iter() diff --git a/docs/ARC.md b/docs/ARC.md new file mode 100644 index 000000000..5b99b5827 --- /dev/null +++ b/docs/ARC.md @@ -0,0 +1,68 @@ +# Building blocks for the Arc chain + +rbuilder can build blocks for [Arc](https://www.arc.network/) (an EVM L1 built +on Malachite BFT consensus, [arc-node](https://github.com/circlefin/arc-node)). +Support is selected at compile time with the `arc` cargo feature; the +`arc-rbuilder` binary runs rbuilder in-process with an arc-node execution +node. + +## How it differs from Ethereum L1 + +| | Ethereum | Arc | +|---|---|---| +| Slot trigger | CL p2p `payload_attributes` events | `engine_forkchoiceUpdatedV3` from Malachite | +| Block delivery | MEV-Boost relays (bidding, BLS) | `engine_getPayloadV4/V5` response | +| Chain spec | `reth_chainspec::ChainSpec` | `ArcChainSpec` (Zero3–Zero7 hardforks) | +| EVM | `EthEvmConfig` | `ArcEvmConfig` (custom precompiles, SELFDESTRUCT override, EIP-7708 transfer logs) | +| Base fee | EIP-1559 from parent header field | decoded from parent header `extra_data`; next base fee EMA-computed from on-chain ProtocolConfig params and persisted into SystemAccounting contract storage post-block | +| Gas limit | EIP-1559 gradual adjustment | exact value dictated by the ProtocolConfig contract (ADR-0003) | +| Pre-block system calls | EIP-4788 beacon root + EIP-2935 blockhashes | EIP-2935 blockhashes only (Zero5+) | +| Execution requests | EIP-6110/7002/7251 | none (empty `Requests`, hash still present post-Prague) | + +The chain selection lives in `crates/rbuilder/src/chain.rs`; the Arc block +building rules in `crates/rbuilder/src/building/arc_support.rs` mirror +arc-node's `ArcBlockExecutor`/`ArcBlockAssembler` so blocks finalize with the +exact same state root and header an arc-node payload builder would produce. + +## Architecture (arc-rbuilder) + +``` +Malachite ──FCU+attrs──▶ engine API ──▶ RbuilderJobGenerator + │ │ + │ ├─▶ slot channel ─▶ rbuilder LiveBuilder + │ │ (order pool, simulation, ordering/parallel builders) + │ │ │ best block, finalized + │ │ ▼ + │ └─▶ EnginePayloadRegistry cell + ▼ │ + Arc payload job (fallback) │ + │ │ +Malachite ◀──getPayload── resolve: rbuilder block if present ◀──┘ + else fallback block +``` + +Consensus liveness never depends on rbuilder: if rbuilder produced nothing for +a job, the stock Arc payload builder's block is returned. + +## Running + +```bash +# requires ../../arc-node checked out next to this repo (path dependencies) +cargo run -p arc-rbuilder -- node \ + --chain arc-testnet \ + --rbuilder.config crates/arc-rbuilder/config-arc-example.toml +``` + +The binary accepts all arc-node/reth `node` flags (datadir, ports, engine JWT, +etc.). Malachite consensus connects to the engine API exactly as with a stock +arc-node execution node. + +## Development notes + +* Both repos must pin the same reth release (currently `v1.11.3`); the git + dependencies unify because both use `tag = "v1.11.3"`. +* `cargo check -p rbuilder` builds the Ethereum flavor, `cargo check -p + rbuilder --features arc` the Arc flavor. CI should keep both green. +* Precompile call caching is disabled for Arc + (`ArcCachedEvmFactory`): NativeCoinControl/SystemAccounting precompiles read + contract storage, so caching by input would return stale results. From d5b15a14a9a13ae39aa7bc3a426f3c58e2870061 Mon Sep 17 00:00:00 2001 From: Solar Mithril Date: Wed, 10 Jun 2026 23:56:23 +0400 Subject: [PATCH 4/5] Add arc tests; gate Ethereum-gas-semantics tests under arc feature - arc_support tests: named chain parsing, base fee decoded from parent extra_data + exact ProtocolConfig gas limit, EIP-7708 transfer log emitted through the rbuilder EVM factory - bundle refund/simulation tests encode Ethereum SELFDESTRUCT/refund semantics; ignored under the arc feature with reason - test fixtures wrap chain specs via chain::chain_spec_from_inner so the test build compiles for both flavors Co-Authored-By: Claude Fable 5 --- crates/rbuilder/src/building/arc_support.rs | 141 ++++++++++++++++++ crates/rbuilder/src/building/payout_tx.rs | 4 +- .../src/building/testing/bundle_tests/mod.rs | 16 ++ .../rbuilder/src/live_builder/base_config.rs | 4 +- .../src/live_builder/simulation/mod.rs | 4 + 5 files changed, 166 insertions(+), 3 deletions(-) diff --git a/crates/rbuilder/src/building/arc_support.rs b/crates/rbuilder/src/building/arc_support.rs index 914a604a6..d3cf8cae8 100644 --- a/crates/rbuilder/src/building/arc_support.rs +++ b/crates/rbuilder/src/building/arc_support.rs @@ -273,3 +273,144 @@ fn gas_limit(ctx: &BlockBuildingContext) -> u64 { fn base_fee(ctx: &BlockBuildingContext) -> u64 { ctx.evm_env.block_env.basefee } + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + building::{ + builders::mock_block_building_helper::MockRootHasher, + evm::{create_chain_evm_factory, EvmFactory as _}, + BlockBuildingContext, + }, + live_builder::order_input::mempool_txs_detector::MempoolTxsDetector, + utils::Signer, + }; + use alloy_primitives::{Address, U256}; + use alloy_rpc_types_beacon::events::{PayloadAttributesData, PayloadAttributesEvent}; + use alloy_rpc_types_engine::PayloadAttributes; + use reth_chainspec::EthChainSpec as _; + use revm::{ + context::TxEnv, + database::{CacheDB, EmptyDB}, + state::AccountInfo, + }; + use std::sync::Arc; + + #[test] + fn parse_named_arc_chains() { + for name in ["arc-localdev", "arc-devnet", "arc-testnet", "arc-mainnet"] { + let spec = chain::parse_chain_spec(name).unwrap(); + assert!(spec.chain_id() != 0); + } + } + + /// The base fee of a new Arc block must come from the parent header's + /// extra_data (where the executor of the parent block encoded it), and the + /// gas limit must be exactly the suggested one (ProtocolConfig value), not + /// an EIP-1559 gradual adjustment. + #[test] + fn block_env_from_arc_parent() { + let chain_spec = chain::chain_spec_for_testing(); + let mut parent = chain::inner_chain_spec(&chain_spec) + .sealed_genesis_header() + .header() + .clone(); + parent.extra_data = encode_base_fee_to_bytes(12_345); + let parent_hash = parent.hash_slow(); + + let attributes = PayloadAttributesEvent { + version: "arc".to_string(), + data: PayloadAttributesData { + proposal_slot: 1, + parent_block_root: Default::default(), + parent_block_number: parent.number, + parent_block_hash: parent_hash, + proposer_index: 0, + payload_attributes: PayloadAttributes { + timestamp: parent.timestamp + 1, + prev_randao: Default::default(), + suggested_fee_recipient: Address::random(), + withdrawals: Some(vec![]), + parent_beacon_block_root: Some(parent_hash), + }, + }, + }; + + let ctx = BlockBuildingContext::from_attributes( + attributes, + &parent, + Signer::random(), + chain_spec, + Default::default(), + Some(55_000_000), + vec![], + None, + Arc::new(MockRootHasher {}), + 0, + false, + true, + U256::ZERO, + Default::default(), + Arc::new(MempoolTxsDetector::new()), + ) + .unwrap(); + + assert_eq!(ctx.evm_env.block_env.basefee, 12_345); + assert_eq!(ctx.evm_env.block_env.gas_limit, 55_000_000); + } + + /// A plain value transfer through the rbuilder EVM factory must emit the + /// Arc EIP-7708 native transfer log (proving order execution runs through + /// the Arc EVM, not the stock Ethereum one). + #[test] + fn arc_evm_emits_native_transfer_log() { + let chain_spec = chain::chain_spec_for_testing(); + let factory = create_chain_evm_factory(&chain_spec); + + let alice = Address::random(); + let bob = Address::random(); + let mut db = CacheDB::new(EmptyDB::default()); + db.insert_account_info( + alice, + AccountInfo { + balance: U256::from(10).pow(U256::from(18)), + ..Default::default() + }, + ); + + let evm_config = chain::evm_config(chain_spec.clone()); + let genesis = chain::inner_chain_spec(&chain_spec).sealed_genesis_header(); + let mut evm_env = evm_config.evm_env(genesis.header()).unwrap(); + evm_env.block_env.basefee = 0; + evm_env.cfg_env.chain_id = chain_spec.chain_id(); + + let mut evm = factory.create_evm(&mut db, evm_env); + let result = alloy_evm::Evm::transact( + &mut evm, + TxEnv { + caller: alice, + kind: alloy_primitives::TxKind::Call(bob), + value: U256::from(7), + gas_limit: 21_000, + gas_price: 0, + chain_id: Some(chain_spec.chain_id()), + ..Default::default() + }, + ) + .unwrap(); + + assert!(result.result.is_success()); + let logs = result.result.logs(); + // EIP-7708 (Zero5+): plain value transfers emit an ERC-20 style + // Transfer log from the EVM system address. + let system_address = Address::from_slice(&alloy_primitives::hex!( + "fffffffffffffffffffffffffffffffffffffffe" + )); + assert!( + logs.iter().any(|log| log.address == system_address + && log.data.data.as_ref().last() == Some(&7)), + "expected EIP-7708 native transfer log, got: {logs:?}" + ); + } +} diff --git a/crates/rbuilder/src/building/payout_tx.rs b/crates/rbuilder/src/building/payout_tx.rs index bc1cd05bc..c8d1231db 100644 --- a/crates/rbuilder/src/building/payout_tx.rs +++ b/crates/rbuilder/src/building/payout_tx.rs @@ -273,7 +273,9 @@ mod tests { block.header.excess_blob_gas = Some(1000); let ctx = BlockBuildingContext::from_onchain_block( block, - chain_spec, + Arc::new(crate::chain::chain_spec_from_inner( + chain_spec.as_ref().clone(), + )), Some(spec_id), Default::default(), signer.address, diff --git a/crates/rbuilder/src/building/testing/bundle_tests/mod.rs b/crates/rbuilder/src/building/testing/bundle_tests/mod.rs index a29d725fa..67c2429a2 100644 --- a/crates/rbuilder/src/building/testing/bundle_tests/mod.rs +++ b/crates/rbuilder/src/building/testing/bundle_tests/mod.rs @@ -219,6 +219,10 @@ fn bundle_revert_tests() -> eyre::Result<()> { } /// Test combined refunds #[test] +#[cfg_attr( + feature = "arc", + ignore = "encodes Ethereum gas/refund semantics; Arc overrides SELFDESTRUCT and emits EIP-7708 logs" +)] fn test_bundle_combined_refunds() -> eyre::Result<()> { let target_block = BlockArgs::MIN_BLOCK_NUMBER; let profit: u64 = 100_000; @@ -295,6 +299,10 @@ fn test_bundle_combined_refunds() -> eyre::Result<()> { /// Test delayed refunds #[test] +#[cfg_attr( + feature = "arc", + ignore = "encodes Ethereum gas/refund semantics; Arc overrides SELFDESTRUCT and emits EIP-7708 logs" +)] fn test_bundle_delayed_refunds() -> eyre::Result<()> { let target_block = BlockArgs::MIN_BLOCK_NUMBER; let profit: u64 = 100_000; @@ -372,6 +380,10 @@ fn test_bundle_delayed_refunds() -> eyre::Result<()> { /// Test immediate refunds to contract recipients #[test] +#[cfg_attr( + feature = "arc", + ignore = "encodes Ethereum gas/refund semantics; Arc overrides SELFDESTRUCT and emits EIP-7708 logs" +)] fn test_bundle_contract_refunds() -> eyre::Result<()> { let target_block = BlockArgs::MIN_BLOCK_NUMBER; let profit: u64 = 100_000; @@ -414,6 +426,10 @@ fn test_bundle_contract_refunds() -> eyre::Result<()> { } #[test] +#[cfg_attr( + feature = "arc", + ignore = "encodes Ethereum gas/refund semantics; Arc overrides SELFDESTRUCT and emits EIP-7708 logs" +)] fn test_bundle_ok_inner_tx_profits() -> eyre::Result<()> { let target_block = BlockArgs::MIN_BLOCK_NUMBER; let mut test_setup = TestSetup::gen_test_setup(BlockArgs::default().with_number(target_block))?; diff --git a/crates/rbuilder/src/live_builder/base_config.rs b/crates/rbuilder/src/live_builder/base_config.rs index a1c865284..2e862ff7c 100644 --- a/crates/rbuilder/src/live_builder/base_config.rs +++ b/crates/rbuilder/src/live_builder/base_config.rs @@ -687,7 +687,7 @@ mod test { let db = Arc::new(init_db(data_dir.db(), Default::default()).unwrap()); let provider_factory = ProviderFactory::>::new( db, - SEPOLIA.clone(), + Arc::new(crate::chain::chain_spec_from_inner(SEPOLIA.as_ref().clone())), StaticFileProvider::read_write(data_dir.static_files().as_path()).unwrap(), RocksDBProvider::builder(data_dir.data_dir().join("rocksdb")) .with_default_tables() @@ -734,7 +734,7 @@ mod test { reth_datadir_path.as_deref(), reth_db_path.as_deref(), reth_static_files_path.as_deref(), - Default::default(), + Arc::new(crate::chain::chain_spec_from_inner(Default::default())), true, None, ); diff --git a/crates/rbuilder/src/live_builder/simulation/mod.rs b/crates/rbuilder/src/live_builder/simulation/mod.rs index 3b370963f..deea635fd 100644 --- a/crates/rbuilder/src/live_builder/simulation/mod.rs +++ b/crates/rbuilder/src/live_builder/simulation/mod.rs @@ -215,6 +215,10 @@ mod tests { use rbuilder_primitives::{MempoolTx, Order, TransactionSignedEcRecoveredWithBlobs}; #[tokio::test] + #[cfg_attr( + feature = "arc", + ignore = "encodes Ethereum gas/refund semantics; Arc overrides SELFDESTRUCT and emits EIP-7708 logs" + )] async fn test_simulate_order_to_coinbase() { let test_context = TestChainState::new(BlockArgs::default()).unwrap(); From 132fccedf1018d0f44bebfed494778e7359a924e Mon Sep 17 00:00:00 2001 From: Solar Mithril Date: Thu, 11 Jun 2026 00:20:12 +0400 Subject: [PATCH 5/5] arc-rbuilder: source chain spec from the node; E2E-verified block building MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rbuilder now uses the node's chain spec instead of the config 'chain' value (a mismatch made every order fail simulation with InvalidChainId) - log failed order simulations (trace) and non-critically discarded engine-payload blocks (debug) — both were previously silent - sim-path regression test executing a signed tx through the ctx EVM Verified end-to-end against arc-localdev driving the engine API like Malachite: FCU(attrs) -> rbuilder builds (mempool txs + payout) -> getPayload returns rbuilder's block -> newPayload validates it VALID (arc executor re-checks state root, ADR-004 extra_data base fee, SystemAccounting gas values) -> head advances to rbuilder's block. Co-Authored-By: Claude Fable 5 --- crates/arc-rbuilder/config-arc-example.toml | 10 +- crates/arc-rbuilder/src/main.rs | 11 +- crates/rbuilder/src/building/arc_support.rs | 115 ++++++++++++++++++ .../block_output/engine_payload_sink.rs | 2 + .../src/live_builder/simulation/sim_worker.rs | 5 +- 5 files changed, 136 insertions(+), 7 deletions(-) diff --git a/crates/arc-rbuilder/config-arc-example.toml b/crates/arc-rbuilder/config-arc-example.toml index a10f5609b..4aa2d6594 100644 --- a/crates/arc-rbuilder/config-arc-example.toml +++ b/crates/arc-rbuilder/config-arc-example.toml @@ -18,9 +18,9 @@ error_storage_path = "/tmp/rbuilder.error.sqlite" # env: COINBASE_SECRET_KEY coinbase_secret_key = "env:COINBASE_SECRET_KEY" -# chain is unused by arc-rbuilder itself (the node's --chain flag wins) but -# must parse; use the same network here. -chain = "arc-testnet" +# arc-rbuilder always builds for the chain the node runs (--chain flag); this +# value only needs to parse. Keep it matching the node anyway. +chain = "arc-localdev" full_telemetry_server_port = 6060 redacted_telemetry_server_port = 6061 @@ -36,6 +36,10 @@ simulation_threads = 4 live_builders = ["mp-ordering", "mgp-ordering"] +# Required: sparse trie root hash (parallel impl currently disallowed). +root_hash_use_sparse_trie = true +root_hash_compare_sparse_trie = false + [[builders]] name = "mgp-ordering" algo = "ordering-builder" diff --git a/crates/arc-rbuilder/src/main.rs b/crates/arc-rbuilder/src/main.rs index fec43dfa1..a149acfe7 100644 --- a/crates/arc-rbuilder/src/main.rs +++ b/crates/arc-rbuilder/src/main.rs @@ -154,7 +154,7 @@ fn spawn_rbuilder( + StorageSettingsCache, > + reth_provider::StateProviderFactory + HeaderProvider
- + reth_provider::ChainSpecProvider + + reth_provider::ChainSpecProvider + Clone + 'static,

::ChainSpec: EthereumHardforks, @@ -196,7 +196,7 @@ where + StorageSettingsCache, > + reth_provider::StateProviderFactory + HeaderProvider

- + reth_provider::ChainSpecProvider + + reth_provider::ChainSpecProvider + Clone + 'static,

::ChainSpec: EthereumHardforks, @@ -228,6 +228,10 @@ where let blocklist_provider = base_config.blocklist_provider(cancel.clone()).await?; + // The chain spec must be the node's: rbuilder simulates and builds for the + // chain the node runs, regardless of what the rbuilder config says. + let node_chain_spec = reth_provider::ChainSpecProvider::chain_spec(&provider); + let state_provider_factory = StateProviderFactoryFromRethProvider::new( provider, base_config.live_root_hash_config()?, @@ -250,7 +254,8 @@ where config.live_builders()?, base_config.max_order_execution_duration_warning(), ); - let live_builder = live_builder.with_builders(builders); + let mut live_builder = live_builder.with_builders(builders); + live_builder.chain_chain_spec = node_chain_spec; live_builder.connect_to_transaction_pool(pool).await?; live_builder diff --git a/crates/rbuilder/src/building/arc_support.rs b/crates/rbuilder/src/building/arc_support.rs index d3cf8cae8..b706607a5 100644 --- a/crates/rbuilder/src/building/arc_support.rs +++ b/crates/rbuilder/src/building/arc_support.rs @@ -274,6 +274,71 @@ fn base_fee(ctx: &BlockBuildingContext) -> u64 { ctx.evm_env.block_env.basefee } +#[cfg(test)] +pub(crate) mod tests_helpers { + use super::*; + use crate::{ + building::{builders::mock_block_building_helper::MockRootHasher, BlockBuildingContext}, + live_builder::order_input::mempool_txs_detector::MempoolTxsDetector, + utils::Signer, + }; + use alloy_primitives::{Address, U256}; + use alloy_rpc_types_beacon::events::{PayloadAttributesData, PayloadAttributesEvent}; + use alloy_rpc_types_engine::PayloadAttributes; + use std::sync::Arc; + + /// BlockBuildingContext for block 1 on the arc localdev chain with a + /// parent extra_data encoded base fee of 12_345. + pub(crate) fn make_arc_ctx() -> (BlockBuildingContext, Signer) { + let chain_spec = chain::chain_spec_for_testing(); + let mut parent = chain::inner_chain_spec(&chain_spec) + .sealed_genesis_header() + .header() + .clone(); + parent.extra_data = encode_base_fee_to_bytes(12_345); + let parent_hash = parent.hash_slow(); + + let attributes = PayloadAttributesEvent { + version: "arc".to_string(), + data: PayloadAttributesData { + proposal_slot: 1, + parent_block_root: Default::default(), + parent_block_number: parent.number, + parent_block_hash: parent_hash, + proposer_index: 0, + payload_attributes: PayloadAttributes { + timestamp: parent.timestamp + 1, + prev_randao: Default::default(), + suggested_fee_recipient: Address::random(), + withdrawals: Some(vec![]), + parent_beacon_block_root: Some(parent_hash), + }, + }, + }; + + let signer = Signer::random(); + let ctx = BlockBuildingContext::from_attributes( + attributes, + &parent, + signer.clone(), + chain_spec, + Default::default(), + Some(55_000_000), + vec![], + None, + Arc::new(MockRootHasher {}), + 0, + false, + true, + U256::ZERO, + Default::default(), + Arc::new(MempoolTxsDetector::new()), + ) + .unwrap(); + (ctx, signer) + } +} + #[cfg(test)] mod tests { use super::*; @@ -358,6 +423,7 @@ mod tests { assert_eq!(ctx.evm_env.block_env.basefee, 12_345); assert_eq!(ctx.evm_env.block_env.gas_limit, 55_000_000); + assert_eq!(ctx.evm_env.cfg_env.chain_id, 1337); } /// A plain value transfer through the rbuilder EVM factory must emit the @@ -414,3 +480,52 @@ mod tests { ); } } + +#[cfg(test)] +mod sim_repro_tests { + use super::tests_helpers::make_arc_ctx; + use crate::building::evm::EvmFactory as _; + use alloy_consensus::TxEip1559; + use alloy_primitives::{Address, TxKind, U256}; + use revm::{ + database::{CacheDB, EmptyDB}, + state::AccountInfo, + }; + + /// Replicates the live simulation path: a signed EIP-1559 tx executed + /// through ctx.evm_factory with the ctx evm_env. + #[test] + fn signed_tx_executes_through_ctx_evm() { + let (ctx, signer) = make_arc_ctx(); + let recipient = Address::random(); + + let tx = signer + .sign_tx(reth_primitives::Transaction::Eip1559(TxEip1559 { + chain_id: 1337, + nonce: 0, + gas_limit: 21_000, + max_fee_per_gas: 3_000_000_000, + max_priority_fee_per_gas: 1_000_000_000, + to: TxKind::Call(recipient), + value: U256::from(1), + ..Default::default() + })) + .unwrap(); + + let mut db = CacheDB::new(EmptyDB::default()); + db.insert_account_info( + signer.address, + AccountInfo { + balance: U256::from(10).pow(U256::from(18)), + ..Default::default() + }, + ); + + let mut evm = ctx.evm_factory.create_evm(&mut db, ctx.evm_env.clone()); + let res = reth_evm::Evm::transact(&mut evm, &tx); + match res { + Ok(r) => assert!(r.result.is_success(), "tx failed: {:?}", r.result), + Err(err) => panic!("transact error: {err:?}"), + } + } +} diff --git a/crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs b/crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs index 5b6cf7c8f..c3bae18e9 100644 --- a/crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs +++ b/crates/rbuilder/src/live_builder/block_output/engine_payload_sink.rs @@ -153,6 +153,8 @@ impl UnfinishedBlockBuildingSink for EnginePayloadSink { Err(err) => { if err.is_critical() { error!(?err, "Failed to finalize block for engine payload"); + } else { + tracing::debug!(?err, "Discarded block for engine payload"); } return; } diff --git a/crates/rbuilder/src/live_builder/simulation/sim_worker.rs b/crates/rbuilder/src/live_builder/simulation/sim_worker.rs index bc47a694d..002f05b16 100644 --- a/crates/rbuilder/src/live_builder/simulation/sim_worker.rs +++ b/crates/rbuilder/src/live_builder/simulation/sim_worker.rs @@ -107,7 +107,10 @@ pub fn run_sim_worker

( true } - OrderSimResult::Failed(_) => false, + OrderSimResult::Failed(err) => { + tracing::trace!(?order_id, ?err, "Order simulation failed"); + false + } }; telemetry::inc_simulated_orders(sim_ok); telemetry::inc_simulation_gas_used(sim_result.gas_used);