From 147c01ff5a0e91e4d22d6edaaa676a5005bd4a47 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 9 Jul 2025 13:11:20 -0700 Subject: [PATCH 001/114] wip --- Cargo.lock | 759 +++++++++++++++++- Cargo.toml | 8 + crates/flashblocks-p2p/.gitignore | 1 + crates/flashblocks-p2p/Cargo.toml | 35 + .../flashblocks-p2p/src/bin.bak/main.rs.bak | 52 ++ .../flashblocks-p2p/src/connection/handler.rs | 56 ++ crates/flashblocks-p2p/src/connection/mod.rs | 78 ++ crates/flashblocks-p2p/src/lib.rs | 2 + crates/flashblocks-p2p/src/lib.rs.bak | 187 +++++ crates/flashblocks-p2p/src/protocol/event.rs | 14 + .../flashblocks-p2p/src/protocol/handler.rs | 37 + crates/flashblocks-p2p/src/protocol/mod.rs | 3 + crates/flashblocks-p2p/src/protocol/proto.rs | 116 +++ 13 files changed, 1315 insertions(+), 33 deletions(-) create mode 100644 crates/flashblocks-p2p/.gitignore create mode 100644 crates/flashblocks-p2p/Cargo.toml create mode 100644 crates/flashblocks-p2p/src/bin.bak/main.rs.bak create mode 100644 crates/flashblocks-p2p/src/connection/handler.rs create mode 100644 crates/flashblocks-p2p/src/connection/mod.rs create mode 100644 crates/flashblocks-p2p/src/lib.rs create mode 100644 crates/flashblocks-p2p/src/lib.rs.bak create mode 100644 crates/flashblocks-p2p/src/protocol/event.rs create mode 100644 crates/flashblocks-p2p/src/protocol/handler.rs create mode 100644 crates/flashblocks-p2p/src/protocol/mod.rs create mode 100644 crates/flashblocks-p2p/src/protocol/proto.rs diff --git a/Cargo.lock b/Cargo.lock index 453515f6..847c705d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1804,6 +1804,145 @@ dependencies = [ "zeroize", ] +[[package]] +name = "boa_ast" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" +dependencies = [ + "bitflags 2.9.1", + "boa_interner", + "boa_macros", + "boa_string", + "indexmap 2.10.0", + "num-bigint", + "rustc-hash 2.1.1", +] + +[[package]] +name = "boa_engine" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" +dependencies = [ + "arrayvec", + "bitflags 2.9.1", + "boa_ast", + "boa_gc", + "boa_interner", + "boa_macros", + "boa_parser", + "boa_profiler", + "boa_string", + "bytemuck", + "cfg-if", + "dashmap 6.1.0", + "fast-float2", + "hashbrown 0.15.4", + "icu_normalizer 1.5.0", + "indexmap 2.10.0", + "intrusive-collections", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "num_enum", + "once_cell", + "pollster", + "portable-atomic", + "rand 0.8.5", + "regress", + "rustc-hash 2.1.1", + "ryu-js", + "serde", + "serde_json", + "sptr", + "static_assertions", + "tap", + "thin-vec", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "boa_gc" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2425c0b7720d42d73eaa6a883fbb77a5c920da8694964a3d79a67597ac55cce2" +dependencies = [ + "boa_macros", + "boa_profiler", + "boa_string", + "hashbrown 0.15.4", + "thin-vec", +] + +[[package]] +name = "boa_interner" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42407a3b724cfaecde8f7d4af566df4b56af32a2f11f0956f5570bb974e7f749" +dependencies = [ + "boa_gc", + "boa_macros", + "hashbrown 0.15.4", + "indexmap 2.10.0", + "once_cell", + "phf", + "rustc-hash 2.1.1", + "static_assertions", +] + +[[package]] +name = "boa_macros" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + +[[package]] +name = "boa_parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" +dependencies = [ + "bitflags 2.9.1", + "boa_ast", + "boa_interner", + "boa_macros", + "boa_profiler", + "fast-float2", + "icu_properties 1.5.1", + "num-bigint", + "num-traits", + "regress", + "rustc-hash 2.1.1", +] + +[[package]] +name = "boa_profiler" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4064908e7cdf9b6317179e9b04dcb27f1510c1c144aeab4d0394014f37a0f922" + +[[package]] +name = "boa_string" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7debc13fbf7997bf38bf8e9b20f1ad5e2a7d27a900e1f6039fe244ce30f589b5" +dependencies = [ + "fast-float2", + "paste", + "rustc-hash 2.1.1", + "sptr", + "static_assertions", +] + [[package]] name = "bollard" version = "0.18.1" @@ -1928,6 +2067,20 @@ name = "bytemuck" version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] [[package]] name = "byteorder" @@ -2253,6 +2406,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "windows-sys 0.59.0", +] + [[package]] name = "const-hex" version = "1.14.1" @@ -2988,6 +3153,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -3173,6 +3344,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fast-float2" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" + [[package]] name = "fastrand" version = "2.3.0" @@ -3251,6 +3428,24 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "flashblocks-p2p" +version = "0.1.0" +dependencies = [ + "alloy-primitives", + "clap", + "eyre", + "futures", + "reth", + "reth-eth-wire", + "reth-ethereum", + "reth-network", + "rollup-boost", + "tokio", + "tokio-stream", + "tracing", +] + [[package]] name = "flashblocks-rpc" version = "0.1.0" @@ -4085,6 +4280,18 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -4093,9 +4300,9 @@ checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", "potential_utf", - "yoke", + "yoke 0.8.0", "zerofrom", - "zerovec", + "zerovec 0.11.2", ] [[package]] @@ -4105,10 +4312,61 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "litemap 0.8.0", + "tinystr 0.8.1", + "writeable 0.6.1", + "zerovec 0.11.2", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap 0.7.5", + "tinystr 0.7.6", + "writeable 0.5.5", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections 1.5.0", + "icu_normalizer_data 1.5.1", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec 0.10.4", ] [[package]] @@ -4118,20 +4376,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", + "icu_collections 2.0.0", + "icu_normalizer_data 2.0.0", + "icu_properties 2.0.1", + "icu_provider 2.0.0", "smallvec", - "zerovec", + "zerovec 0.11.2", ] +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + [[package]] name = "icu_normalizer_data" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections 1.5.0", + "icu_locid_transform", + "icu_properties_data 1.5.1", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", +] + [[package]] name = "icu_properties" version = "2.0.1" @@ -4139,21 +4418,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", - "icu_collections", + "icu_collections 2.0.0", "icu_locale_core", - "icu_properties_data", - "icu_provider", + "icu_properties_data 2.0.1", + "icu_provider 2.0.0", "potential_utf", "zerotrie", - "zerovec", + "zerovec 0.11.2", ] +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + [[package]] name = "icu_properties_data" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr 0.7.6", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + [[package]] name = "icu_provider" version = "2.0.0" @@ -4163,12 +4465,23 @@ dependencies = [ "displaydoc", "icu_locale_core", "stable_deref_trait", - "tinystr", - "writeable", - "yoke", + "tinystr 0.8.1", + "writeable 0.6.1", + "yoke 0.8.0", "zerofrom", "zerotrie", - "zerovec", + "zerovec 0.11.2", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", ] [[package]] @@ -4194,8 +4507,8 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "icu_normalizer", - "icu_properties", + "icu_normalizer 2.0.0", + "icu_properties 2.0.1", ] [[package]] @@ -4349,6 +4662,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "intrusive-collections" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" +dependencies = [ + "memoffset", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -4990,6 +5312,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + [[package]] name = "litemap" version = "0.8.0" @@ -5131,6 +5459,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "metrics" version = "0.24.2" @@ -5502,6 +5839,7 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", + "serde", ] [[package]] @@ -6174,6 +6512,12 @@ dependencies = [ "crunchy", ] +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + [[package]] name = "polyval" version = "0.6.2" @@ -6198,7 +6542,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" dependencies = [ - "zerovec", + "zerovec 0.11.2", ] [[package]] @@ -6799,6 +7143,16 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "regress" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ef7fa9ed0256d64a688a3747d0fef7a88851c18a5e1d57f115f38ec2e09366" +dependencies = [ + "hashbrown 0.15.4", + "memchr", +] + [[package]] name = "reqwest" version = "0.12.21" @@ -6848,12 +7202,58 @@ dependencies = [ "webpki-roots 1.0.1", ] -[[package]] -name = "resolv-conf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" - +[[package]] +name = "resolv-conf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" + +[[package]] +name = "reth" +version = "1.5.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +dependencies = [ + "alloy-rpc-types", + "aquamarine", + "clap", + "eyre", + "reth-chainspec", + "reth-cli-runner", + "reth-cli-util", + "reth-consensus", + "reth-consensus-common", + "reth-db", + "reth-ethereum-cli", + "reth-ethereum-payload-builder", + "reth-ethereum-primitives", + "reth-evm", + "reth-network", + "reth-network-api", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-node-ethereum", + "reth-node-metrics", + "reth-payload-builder", + "reth-payload-primitives", + "reth-primitives", + "reth-provider", + "reth-ress-protocol", + "reth-ress-provider", + "reth-revm", + "reth-rpc", + "reth-rpc-api", + "reth-rpc-builder", + "reth-rpc-convert", + "reth-rpc-eth-types", + "reth-rpc-server-types", + "reth-tasks", + "reth-tokio-util", + "reth-transaction-pool", + "tokio", + "tracing", +] + [[package]] name = "reth-basic-payload-builder" version = "1.5.0" @@ -7039,6 +7439,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "thiserror 2.0.12", + "tikv-jemallocator", ] [[package]] @@ -7688,6 +8089,103 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "reth-ethereum" +version = "1.5.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +dependencies = [ + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "reth-chainspec", + "reth-cli-util", + "reth-codecs", + "reth-consensus", + "reth-consensus-common", + "reth-db", + "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-trie", + "reth-trie-db", +] + +[[package]] +name = "reth-ethereum-cli" +version = "1.5.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types", + "backon", + "clap", + "eyre", + "futures", + "reth-basic-payload-builder", + "reth-chainspec", + "reth-cli", + "reth-cli-commands", + "reth-cli-runner", + "reth-cli-util", + "reth-config", + "reth-consensus", + "reth-db", + "reth-db-api", + "reth-downloaders", + "reth-errors", + "reth-ethereum-payload-builder", + "reth-ethereum-primitives", + "reth-evm", + "reth-execution-types", + "reth-exex", + "reth-fs-util", + "reth-network", + "reth-network-api", + "reth-network-p2p", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-node-ethereum", + "reth-node-events", + "reth-node-metrics", + "reth-payload-builder", + "reth-primitives-traits", + "reth-provider", + "reth-prune", + "reth-revm", + "reth-stages", + "reth-static-file", + "reth-tasks", + "reth-tracing", + "reth-transaction-pool", + "reth-trie", + "reth-trie-db", + "serde_json", + "similar-asserts", + "tokio", + "tracing", +] + [[package]] name = "reth-ethereum-consensus" version = "1.5.0" @@ -7822,6 +8320,7 @@ dependencies = [ "alloy-eips", "alloy-evm", "alloy-primitives", + "derive_more", "reth-chainspec", "reth-ethereum-forks", "reth-ethereum-primitives", @@ -8394,6 +8893,7 @@ dependencies = [ "procfs", "reth-metrics", "reth-tasks", + "tikv-jemalloc-ctl", "tokio", "tower 0.5.2", "tracing", @@ -8971,6 +9471,52 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "reth-ress-protocol" +version = "1.5.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "futures", + "reth-eth-wire", + "reth-ethereum-primitives", + "reth-network", + "reth-network-api", + "reth-storage-errors", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-ress-provider" +version = "1.5.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "eyre", + "futures", + "parking_lot", + "reth-chain-state", + "reth-errors", + "reth-ethereum-primitives", + "reth-evm", + "reth-node-api", + "reth-primitives-traits", + "reth-ress-protocol", + "reth-revm", + "reth-storage-api", + "reth-tasks", + "reth-tokio-util", + "reth-trie", + "schnellru", + "tokio", + "tracing", +] + [[package]] name = "reth-revm" version = "1.5.0" @@ -9822,6 +10368,8 @@ dependencies = [ "alloy-rpc-types-trace", "alloy-sol-types", "anstyle", + "boa_engine", + "boa_gc", "colorchoice", "revm", "serde", @@ -10283,6 +10831,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "ryu-js" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" + [[package]] name = "same-file" version = "1.0.6" @@ -10721,6 +11275,27 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +dependencies = [ + "bstr", + "unicode-segmentation", +] + +[[package]] +name = "similar-asserts" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b441962c817e33508847a22bd82f03a30cff43642dc2fae8b050566121eb9a" +dependencies = [ + "console", + "serde", + "similar", +] + [[package]] name = "simple_asn1" version = "0.6.3" @@ -10818,6 +11393,12 @@ dependencies = [ "der", ] +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -11089,6 +11670,12 @@ dependencies = [ "testcontainers", ] +[[package]] +name = "thin-vec" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" + [[package]] name = "thiserror" version = "1.0.69" @@ -11147,6 +11734,37 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "tikv-jemalloc-ctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21f216790c8df74ce3ab25b534e0718da5a1916719771d3fec23315c99e468b" +dependencies = [ + "libc", + "paste", + "tikv-jemalloc-sys", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "tikv-jemallocator" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" +dependencies = [ + "libc", + "tikv-jemalloc-sys", +] + [[package]] name = "time" version = "0.3.41" @@ -11155,6 +11773,7 @@ checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", + "js-sys", "libc", "num-conv", "num_threads", @@ -11189,6 +11808,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec 0.10.4", +] + [[package]] name = "tinystr" version = "0.8.1" @@ -11196,7 +11825,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", - "zerovec", + "zerovec 0.11.2", ] [[package]] @@ -11822,6 +12451,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -12715,6 +13350,18 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "writeable" version = "0.6.1" @@ -12765,6 +13412,18 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", +] + [[package]] name = "yoke" version = "0.8.0" @@ -12773,10 +13432,22 @@ checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", - "yoke-derive", + "yoke-derive 0.8.0", "zerofrom", ] +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + [[package]] name = "yoke-derive" version = "0.8.0" @@ -12857,8 +13528,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" dependencies = [ "displaydoc", - "yoke", + "yoke 0.8.0", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke 0.7.5", "zerofrom", + "zerovec-derive 0.10.3", ] [[package]] @@ -12867,9 +13549,20 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ - "yoke", + "yoke 0.8.0", "zerofrom", - "zerovec-derive", + "zerovec-derive 0.11.1", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1817834d..3a8b30a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,13 @@ [workspace] resolver = "3" +edition = "2024" +license = "MIT" members = [ "crates/rollup-boost", "crates/websocket-proxy", "crates/flashblocks-rpc", + "crates/flashblocks-p2p", ] [workspace.dependencies] @@ -20,12 +23,17 @@ serde_json = "1.0.96" metrics = "0.24.0" metrics-derive = "0.1" tokio = { version = "1", features = ["full"] } +tokio-stream = "0.1.17" eyre = "0.6.12" url = "2.2.0" sha2 = { version = "0.10", default-features = false } # Reth deps reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-network = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } # Alloy libraries alloy-rpc-types-engine = "1.0.13" diff --git a/crates/flashblocks-p2p/.gitignore b/crates/flashblocks-p2p/.gitignore new file mode 100644 index 00000000..eb5a316c --- /dev/null +++ b/crates/flashblocks-p2p/.gitignore @@ -0,0 +1 @@ +target diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml new file mode 100644 index 00000000..a8e2d95f --- /dev/null +++ b/crates/flashblocks-p2p/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "flashblocks-p2p" +version = "0.1.0" +edition = "2024" +license = "MIT" + +[dependencies] +reth.workspace = true +reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } +reth-eth-wire = { workspace = true } +reth-network = { workspace = true } +# reth-node-builder.workspace = true +# reth-optimism-chainspec.workspace = true +# reth-optimism-node.workspace = true +# reth-optimism-primitives.workspace = true +# reth-optimism-payload-builder.workspace = true +# reth-optimism-rpc.workspace = true +# reth-optimism-forks.workspace = true +# reth-provider.workspace = true +# reth-trie-db.workspace = true +# reth-transaction-pool.workspace = true +# reth-node-api.workspace = true +# alloy-primitives.workspace = true +# op-alloy-consensus.workspace = true +# alloy-rpc-types-eth.workspace = true + +tokio = { workspace = true } +tokio-stream = { workspace = true } +eyre.workspace = true +futures = { workspace = true } +clap.workspace = true +tracing.workspace = true +alloy-primitives.workspace = true + +rollup-boost = { path = "../rollup-boost" } diff --git a/crates/flashblocks-p2p/src/bin.bak/main.rs.bak b/crates/flashblocks-p2p/src/bin.bak/main.rs.bak new file mode 100644 index 00000000..177432ca --- /dev/null +++ b/crates/flashblocks-p2p/src/bin.bak/main.rs.bak @@ -0,0 +1,52 @@ +#![allow(missing_docs, rustdoc::missing_crate_level_docs)] + +use clap::Parser; +use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; +use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; +use reth_optimism_node::{OpNode, args::RollupArgs}; +use tracing::info; + +#[derive(Debug, Clone, PartialEq, Eq, clap::Args)] +#[command(next_help_heading = "Rollup")] +struct FlashblocksRollupArgs { + #[command(flatten)] + rollup_args: RollupArgs, + + #[arg(long = "flashblocks.enabled", default_value = "false")] + flashblocks_enabled: bool, + + #[arg(long = "flashblocks.websocket-url", value_name = "WEBSOCKET_URL")] + websocket_url: url::Url, +} + +fn main() { + if let Err(err) = + Cli::::parse().run(async move |builder, args| { + let rollup_args = args.rollup_args; + let chain_spec = builder.config().chain.clone(); + + info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); + let handle = builder + .node(OpNode::new(rollup_args)) + .extend_rpc_modules(move |ctx| { + if args.flashblocks_enabled { + let mut flashblocks_overlay = + FlashblocksOverlay::new(args.websocket_url, chain_spec); + flashblocks_overlay.start()?; + + let eth_api = ctx.registry.eth_api().clone(); + let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay); + + ctx.modules.replace_configured(api_ext.into_rpc())?; + } + Ok(()) + }) + .launch_with_debug_capabilities() + .await?; + handle.node_exit_future.await + }) + { + tracing::error!("Error: {err:?}"); + std::process::exit(1); + } +} diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs new file mode 100644 index 00000000..f13735ba --- /dev/null +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -0,0 +1,56 @@ +use super::FlashblocksConnection; +use crate::protocol::{ + event::ProtocolEvent, handler::ProtocolState, proto::FlashblocksProtoMessage, +}; +use reth_ethereum::network::{ + api::{Direction, PeerId}, + eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, + protocol::{ConnectionHandler, OnNotSupported}, +}; +use tokio::sync::mpsc; +use tokio_stream::wrappers::UnboundedReceiverStream; + +/// The connection handler for the custom RLPx protocol. +pub(crate) struct FlashblocksConnectionHandler { + pub(crate) state: ProtocolState, +} + +impl ConnectionHandler for FlashblocksConnectionHandler { + type Connection = FlashblocksConnection; + + fn protocol(&self) -> Protocol { + FlashblocksProtoMessage::protocol() + } + + fn on_unsupported_by_peer( + self, + _supported: &SharedCapabilities, + _direction: Direction, + _peer_id: PeerId, + ) -> OnNotSupported { + OnNotSupported::KeepAlive + } + + fn into_connection( + self, + direction: Direction, + peer_id: PeerId, + conn: ProtocolConnection, + ) -> Self::Connection { + let (tx, rx) = mpsc::unbounded_channel(); + self.state + .events + .send(ProtocolEvent::Established { + direction, + peer_id, + to_connection: tx, + }) + .ok(); + FlashblocksConnection { + conn, + initial_ping: direction.is_outgoing().then(FlashblocksProtoMessage::ping), + commands: UnboundedReceiverStream::new(rx), + pending_pong: None, + } + } +} diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs new file mode 100644 index 00000000..a2692dc9 --- /dev/null +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -0,0 +1,78 @@ +use super::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; +use alloy_primitives::bytes::BytesMut; +use futures::{Stream, StreamExt}; +use reth_ethereum::network::eth_wire::multiplex::ProtocolConnection; +use rollup_boost::FlashblocksPayloadV1; +use std::{ + pin::Pin, + task::{Context, Poll, ready}, +}; +use tokio::sync::oneshot; +use tokio_stream::wrappers::UnboundedReceiverStream; + +pub(crate) mod handler; + +/// We define some custom commands that the subprotocol supports. +pub(crate) enum FlashblocksCommand { + /// Sends a message to the peer + NewFlashBlock { + msg: String, + /// The response will be sent to this channel. + response: oneshot::Sender, + }, +} + +pub(crate) struct FlashblocksConnection { + conn: ProtocolConnection, + initial_ping: Option, + commands: UnboundedReceiverStream, + pending_pong: Option>, +} + +impl Stream for FlashblocksConnection { + type Item = BytesMut; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let this = self.get_mut(); + if let Some(initial_ping) = this.initial_ping.take() { + return Poll::Ready(Some(initial_ping.encoded())); + } + + loop { + if let Poll::Ready(Some(cmd)) = this.commands.poll_next_unpin(cx) { + return match cmd { + FlashblocksCommand::NewFlashBlock { msg, response } => { + this.pending_pong = Some(response); + Poll::Ready(Some(FlashblocksProtoMessage::ping_message(msg).encoded())) + } + }; + } + + let Some(msg) = ready!(this.conn.poll_next_unpin(cx)) else { + return Poll::Ready(None); + }; + + let Some(msg) = FlashblocksProtoMessage::decode_message(&mut &msg[..]) else { + return Poll::Ready(None); + }; + + match msg.message { + FlashblocksProtoMessageKind::Ping => { + return Poll::Ready(Some(FlashblocksProtoMessage::pong().encoded())); + } + FlashblocksProtoMessageKind::Pong => {} + FlashblocksProtoMessageKind::PingMessage(msg) => { + return Poll::Ready(Some(FlashblocksProtoMessage::pong_message(msg).encoded())); + } + FlashblocksProtoMessageKind::PongMessage(msg) => { + if let Some(sender) = this.pending_pong.take() { + sender.send(msg).ok(); + } + continue; + } + } + + return Poll::Pending; + } + } +} diff --git a/crates/flashblocks-p2p/src/lib.rs b/crates/flashblocks-p2p/src/lib.rs new file mode 100644 index 00000000..6373fd3c --- /dev/null +++ b/crates/flashblocks-p2p/src/lib.rs @@ -0,0 +1,2 @@ +pub mod connection; +pub mod protocol; diff --git a/crates/flashblocks-p2p/src/lib.rs.bak b/crates/flashblocks-p2p/src/lib.rs.bak new file mode 100644 index 00000000..2a13bcbe --- /dev/null +++ b/crates/flashblocks-p2p/src/lib.rs.bak @@ -0,0 +1,187 @@ +use reth::{ + chainspec::{EthChainSpec as _, Hardforks}, + network::{ + types::BasicNetworkPrimitives, NetworkConfig, NetworkHandle, NetworkManager, + NetworkPrimitives, + }, +}; +use reth_eth_wire::{ + capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol, +}; +/// OpNetworkBuilder impls NetworkBuilder -> NetworkHandle impls NetworkProtocols +/// +/// NetworkConfig has `extra_protocols` +/// +// #![cfg_attr(not(any(test, feature = "test")), warn(unused_crate_dependencies))] +// +// pub mod args; +// pub mod node; +// +// #[cfg(any(feature = "test", test))] +// pub mod test_utils; +use reth_network::protocol::{ConnectionHandler, IntoRlpxSubProtocol, ProtocolHandler}; +use reth_node_api::{PrimitivesTy, TxTy}; +use reth_node_builder::{ + components::{ + BasicPayloadServiceBuilder, ComponentsBuilder, ConsensusBuilder, ExecutorBuilder, + NetworkBuilder, PayloadBuilderBuilder, PoolBuilder, PoolBuilderConfigOverrides, + TxPoolBuilder, + }, + node::{FullNodeTypes, NodeTypes}, + rpc::{ + EngineApiBuilder, EngineValidatorAddOn, EngineValidatorBuilder, EthApiBuilder, Identity, + RethRpcAddOns, RethRpcMiddleware, RethRpcServerHandles, RpcAddOns, RpcContext, RpcHandle, + }, + BuilderContext, DebugNode, Node, NodeAdapter, NodeComponentsBuilder, +}; +use reth_provider::{ + BlockReaderIdExt, ChainSpecProvider, ExecutionOutcome, ProviderError, StateProvider, + StateProviderFactory, +}; +use reth_transaction_pool::{ + blobstore::DiskFileBlobStore, EthPoolTransaction, PeerId, PoolPooledTx, PoolTransaction, + TransactionPool, TransactionValidationTaskExecutor, +}; +use tokio::sync::oneshot; +use tracing::info; + +#[derive(Clone, Debug, Default)] +pub struct FlashblocksProtocolHandler; + +#[derive(Clone, Debug, Default)] +pub struct FlashblocksConnectionHandler; + +/// The connection handler for the custom RLPx protocol. +pub struct FlashblocksConnection { + conn: ProtocolConnection, + initial_ping: Option, + commands: UnboundedReceiverStream, + pending_pong: Option>, +} + +impl ConnectionHandler for FlashblocksConnectionHandler { + type Connection; + + fn protocol(&self) -> Protocol { + todo!() + } + + fn on_unsupported_by_peer( + self, + supported: &SharedCapabilities, + direction: reth_network::Direction, + peer_id: PeerId, + ) -> reth_network::protocol::OnNotSupported { + todo!() + } + + fn into_connection( + self, + direction: reth_network::Direction, + peer_id: PeerId, + conn: ProtocolConnection, + ) -> Self::Connection { + todo!() + } +} + +impl ProtocolHandler for FlashblocksProtocolHandler { + type ConnectionHandler = FlashblocksConnectionHandler; + + fn on_incoming(&self, socket_addr: std::net::SocketAddr) -> Option { + todo!() + } + + fn on_outgoing( + &self, + socket_addr: std::net::SocketAddr, + peer_id: PeerId, + ) -> Option { + todo!() + } +} + +#[derive(Clone, Debug, Default)] +pub struct FlashblocksNetworkBuilder { + /// Disable transaction pool gossip + pub disable_txpool_gossip: bool, + /// Disable discovery v4 + pub disable_discovery_v4: bool, +} + +impl FlashblocksNetworkBuilder { + /// Returns the [`NetworkConfig`] that contains the settings to launch the p2p network. + /// + /// This applies the configured [`OpNetworkBuilder`] settings. + pub fn network_config( + &self, + ctx: &BuilderContext, + ) -> eyre::Result> + where + Node: FullNodeTypes>, + NetworkP: NetworkPrimitives, + { + let Self { + disable_txpool_gossip, + disable_discovery_v4, + .. + } = self.clone(); + let args = &ctx.config().network; + let network_builder = ctx + .network_config_builder()? + // apply discovery settings + .apply(|mut builder| { + let rlpx_socket = (args.addr, args.port).into(); + if disable_discovery_v4 || args.discovery.disable_discovery { + builder = builder.disable_discv4_discovery(); + } + if !args.discovery.disable_discovery { + builder = builder.discovery_v5( + args.discovery.discovery_v5_builder( + rlpx_socket, + ctx.config() + .network + .resolved_bootnodes() + .or_else(|| ctx.chain_spec().bootnodes()) + .unwrap_or_default(), + ), + ); + } + + builder + }); + + let mut network_config = ctx.build_network_config(network_builder); + + // When `sequencer_endpoint` is configured, the node will forward all transactions to a + // Sequencer node for execution and inclusion on L1, and disable its own txpool + // gossip to prevent other parties in the network from learning about them. + network_config.tx_gossip_disabled = disable_txpool_gossip; + + Ok(network_config) + } +} + +impl NetworkBuilder for FlashblocksNetworkBuilder +where + Node: FullNodeTypes>, + Pool: TransactionPool>> + + Unpin + + 'static, +{ + type Network = + NetworkHandle, PoolPooledTx>>; + + async fn build_network( + self, + ctx: &BuilderContext, + pool: Pool, + ) -> eyre::Result { + let network_config = self.network_config(ctx)?; + let network = NetworkManager::builder(network_config).await?; + let handle = ctx.start_network(network, pool); + // info!(target: "reth::cli", enode=%handle.local_node_record(), "P2P networking initialized"); + + Ok(handle) + } +} diff --git a/crates/flashblocks-p2p/src/protocol/event.rs b/crates/flashblocks-p2p/src/protocol/event.rs new file mode 100644 index 00000000..263e87c0 --- /dev/null +++ b/crates/flashblocks-p2p/src/protocol/event.rs @@ -0,0 +1,14 @@ +use crate::connection::FlashblocksCommand; +use reth_ethereum::network::{Direction, api::PeerId}; +use tokio::sync::mpsc; + +/// The events that can be emitted by our custom protocol. +#[derive(Debug)] +pub(crate) enum ProtocolEvent { + Established { + #[expect(dead_code)] + direction: Direction, + peer_id: PeerId, + to_connection: mpsc::UnboundedSender, + }, +} diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs new file mode 100644 index 00000000..73bfd4f1 --- /dev/null +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -0,0 +1,37 @@ +use super::event::ProtocolEvent; +use crate::connection::handler::FlashblocksConnectionHandler; +use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; +use std::net::SocketAddr; +use tokio::sync::mpsc; + +/// Protocol state is an helper struct to store the protocol events. +#[derive(Clone, Debug)] +pub(crate) struct ProtocolState { + pub(crate) events: mpsc::UnboundedSender, +} + +/// The protocol handler takes care of incoming and outgoing connections. +#[derive(Debug)] +pub(crate) struct FlashblocksProtoHandler { + pub state: ProtocolState, +} + +impl ProtocolHandler for FlashblocksProtoHandler { + type ConnectionHandler = FlashblocksConnectionHandler; + + fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { + Some(FlashblocksConnectionHandler { + state: self.state.clone(), + }) + } + + fn on_outgoing( + &self, + _socket_addr: SocketAddr, + _peer_id: PeerId, + ) -> Option { + Some(FlashblocksConnectionHandler { + state: self.state.clone(), + }) + } +} diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs new file mode 100644 index 00000000..8aba9a4e --- /dev/null +++ b/crates/flashblocks-p2p/src/protocol/mod.rs @@ -0,0 +1,3 @@ +pub(crate) mod event; +pub(crate) mod handler; +pub(crate) mod proto; diff --git a/crates/flashblocks-p2p/src/protocol/proto.rs b/crates/flashblocks-p2p/src/protocol/proto.rs new file mode 100644 index 00000000..b813612b --- /dev/null +++ b/crates/flashblocks-p2p/src/protocol/proto.rs @@ -0,0 +1,116 @@ +//! Simple RLPx Ping Pong protocol that also support sending messages, +//! following [RLPx specs](https://github.com/ethereum/devp2p/blob/master/rlpx.md) + +use alloy_primitives::bytes::{Buf, BufMut, BytesMut}; +use reth_ethereum::network::eth_wire::{Capability, protocol::Protocol}; + +#[repr(u8)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) enum FlashblocksProtoMessageId { + Ping = 0x00, + Pong = 0x01, + PingMessage = 0x02, + PongMessage = 0x03, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub(crate) enum FlashblocksProtoMessageKind { + Ping, + Pong, + PingMessage(String), + PongMessage(String), +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub(crate) struct FlashblocksProtoMessage { + pub message_type: FlashblocksProtoMessageId, + pub message: FlashblocksProtoMessageKind, +} + +impl FlashblocksProtoMessage { + /// Returns the capability for the `custom_rlpx` protocol. + pub fn capability() -> Capability { + Capability::new_static("flashblocks", 1) + } + + /// Returns the protocol for the `custom_rlpx` protocol. + pub fn protocol() -> Protocol { + Protocol::new(Self::capability(), 4) + } + + /// Creates a ping message + pub fn ping_message(msg: impl Into) -> Self { + Self { + message_type: FlashblocksProtoMessageId::PingMessage, + message: FlashblocksProtoMessageKind::PingMessage(msg.into()), + } + } + /// Creates a pong message + pub fn pong_message(msg: impl Into) -> Self { + Self { + message_type: FlashblocksProtoMessageId::PongMessage, + message: FlashblocksProtoMessageKind::PongMessage(msg.into()), + } + } + + /// Creates a ping message + pub fn ping() -> Self { + Self { + message_type: FlashblocksProtoMessageId::Ping, + message: FlashblocksProtoMessageKind::Ping, + } + } + + /// Creates a pong message + pub fn pong() -> Self { + Self { + message_type: FlashblocksProtoMessageId::Pong, + message: FlashblocksProtoMessageKind::Pong, + } + } + + /// Creates a new `FlashblocksProtoMessage` with the given message ID and payload. + pub fn encoded(&self) -> BytesMut { + let mut buf = BytesMut::new(); + buf.put_u8(self.message_type as u8); + match &self.message { + FlashblocksProtoMessageKind::Ping | FlashblocksProtoMessageKind::Pong => {} + FlashblocksProtoMessageKind::PingMessage(msg) + | FlashblocksProtoMessageKind::PongMessage(msg) => { + buf.put(msg.as_bytes()); + } + } + buf + } + + /// Decodes a `FlashblocksProtoMessage` from the given message buffer. + pub fn decode_message(buf: &mut &[u8]) -> Option { + if buf.is_empty() { + return None; + } + let id = buf[0]; + buf.advance(1); + let message_type = match id { + 0x00 => FlashblocksProtoMessageId::Ping, + 0x01 => FlashblocksProtoMessageId::Pong, + 0x02 => FlashblocksProtoMessageId::PingMessage, + 0x03 => FlashblocksProtoMessageId::PongMessage, + _ => return None, + }; + let message = match message_type { + FlashblocksProtoMessageId::Ping => FlashblocksProtoMessageKind::Ping, + FlashblocksProtoMessageId::Pong => FlashblocksProtoMessageKind::Pong, + FlashblocksProtoMessageId::PingMessage => FlashblocksProtoMessageKind::PingMessage( + String::from_utf8_lossy(&buf[..]).into_owned(), + ), + FlashblocksProtoMessageId::PongMessage => FlashblocksProtoMessageKind::PongMessage( + String::from_utf8_lossy(&buf[..]).into_owned(), + ), + }; + + Some(Self { + message_type, + message, + }) + } +} From 14c42976a861fa993c130f7ae243c2af2021fbec Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 9 Jul 2025 14:41:48 -0700 Subject: [PATCH 002/114] wip --- Cargo.lock | 44 +++++++++- crates/flashblocks-p2p/Cargo.toml | 9 ++ .../flashblocks-p2p/src/connection/handler.rs | 4 +- crates/flashblocks-p2p/src/connection/mod.rs | 38 +++------ crates/flashblocks-p2p/src/protocol/auth.rs | 73 ++++++++++++++++ crates/flashblocks-p2p/src/protocol/error.rs | 9 ++ crates/flashblocks-p2p/src/protocol/mod.rs | 8 +- crates/flashblocks-p2p/src/protocol/proto.rs | 83 +++++++------------ .../src/flashblocks/primitives.rs | 6 +- 9 files changed, 182 insertions(+), 92 deletions(-) create mode 100644 crates/flashblocks-p2p/src/protocol/auth.rs create mode 100644 crates/flashblocks-p2p/src/protocol/error.rs diff --git a/Cargo.lock b/Cargo.lock index 847c705d..d2da3f59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1652,6 +1652,26 @@ dependencies = [ "serde", ] +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + [[package]] name = "bindgen" version = "0.69.5" @@ -3094,6 +3114,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8", + "serde", "signature", ] @@ -3433,14 +3454,21 @@ name = "flashblocks-p2p" version = "0.1.0" dependencies = [ "alloy-primitives", + "bincode 2.0.1", + "blake3", "clap", + "ed25519-dalek", "eyre", "futures", + "rand_core 0.6.4", "reth", "reth-eth-wire", "reth-ethereum", "reth-network", "rollup-boost", + "serde", + "serde_json", + "thiserror 2.0.12", "tokio", "tokio-stream", "tracing", @@ -8667,7 +8695,7 @@ version = "1.5.0" source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" dependencies = [ "anyhow", - "bincode", + "bincode 1.3.3", "derive_more", "lz4_flex", "memmap2", @@ -9862,7 +9890,7 @@ dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", - "bincode", + "bincode 1.3.3", "blake3", "eyre", "futures-util", @@ -12433,6 +12461,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + [[package]] name = "url" version = "2.5.4" @@ -12539,6 +12573,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + [[package]] name = "visibility" version = "0.1.1" diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index a8e2d95f..65ca4ea7 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -24,6 +24,12 @@ reth-network = { workspace = true } # op-alloy-consensus.workspace = true # alloy-rpc-types-eth.workspace = true +ed25519-dalek = { version = "2", features = ["serde"] } +rand_core = "0.6" # for secure RNG +blake3 = "1" # fast hashing for payload IDs +serde = { version = "1", features = ["derive"] } +bincode = "2" # stable, deterministic encoding + tokio = { workspace = true } tokio-stream = { workspace = true } eyre.workspace = true @@ -31,5 +37,8 @@ futures = { workspace = true } clap.workspace = true tracing.workspace = true alloy-primitives.workspace = true +serde_json = "1.0" +thiserror = "2" + rollup-boost = { path = "../rollup-boost" } diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index f13735ba..5f91bdff 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -10,7 +10,7 @@ use reth_ethereum::network::{ use tokio::sync::mpsc; use tokio_stream::wrappers::UnboundedReceiverStream; -/// The connection handler for the custom RLPx protocol. +/// The connection handler for the flashblocks RLPx protocol. pub(crate) struct FlashblocksConnectionHandler { pub(crate) state: ProtocolState, } @@ -48,9 +48,7 @@ impl ConnectionHandler for FlashblocksConnectionHandler { .ok(); FlashblocksConnection { conn, - initial_ping: direction.is_outgoing().then(FlashblocksProtoMessage::ping), commands: UnboundedReceiverStream::new(rx), - pending_pong: None, } } } diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index a2692dc9..6f0f3fd7 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -1,3 +1,5 @@ +use crate::protocol::auth::Authorized; + use super::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; @@ -7,26 +9,22 @@ use std::{ pin::Pin, task::{Context, Poll, ready}, }; -use tokio::sync::oneshot; +use tokio::sync::mpsc; use tokio_stream::wrappers::UnboundedReceiverStream; pub(crate) mod handler; /// We define some custom commands that the subprotocol supports. pub(crate) enum FlashblocksCommand { - /// Sends a message to the peer - NewFlashBlock { - msg: String, - /// The response will be sent to this channel. - response: oneshot::Sender, + /// Sends a flashblocks payload to the peer + FlashblocksPayloadV1 { + payload: Authorized, }, } pub(crate) struct FlashblocksConnection { conn: ProtocolConnection, - initial_ping: Option, commands: UnboundedReceiverStream, - pending_pong: Option>, } impl Stream for FlashblocksConnection { @@ -34,17 +32,13 @@ impl Stream for FlashblocksConnection { fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { let this = self.get_mut(); - if let Some(initial_ping) = this.initial_ping.take() { - return Poll::Ready(Some(initial_ping.encoded())); - } loop { if let Poll::Ready(Some(cmd)) = this.commands.poll_next_unpin(cx) { return match cmd { - FlashblocksCommand::NewFlashBlock { msg, response } => { - this.pending_pong = Some(response); - Poll::Ready(Some(FlashblocksProtoMessage::ping_message(msg).encoded())) - } + FlashblocksCommand::FlashblocksPayloadV1 { payload } => Poll::Ready(Some( + FlashblocksProtoMessage::flashblocks_payload(payload).encoded(), + )), }; } @@ -57,17 +51,9 @@ impl Stream for FlashblocksConnection { }; match msg.message { - FlashblocksProtoMessageKind::Ping => { - return Poll::Ready(Some(FlashblocksProtoMessage::pong().encoded())); - } - FlashblocksProtoMessageKind::Pong => {} - FlashblocksProtoMessageKind::PingMessage(msg) => { - return Poll::Ready(Some(FlashblocksProtoMessage::pong_message(msg).encoded())); - } - FlashblocksProtoMessageKind::PongMessage(msg) => { - if let Some(sender) = this.pending_pong.take() { - sender.send(msg).ok(); - } + FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { + // Process the received payload (could emit an event here) + // For now, we just continue to the next message continue; } } diff --git a/crates/flashblocks-p2p/src/protocol/auth.rs b/crates/flashblocks-p2p/src/protocol/auth.rs new file mode 100644 index 00000000..bb54c568 --- /dev/null +++ b/crates/flashblocks-p2p/src/protocol/auth.rs @@ -0,0 +1,73 @@ +use blake3::hash as blake3_hash; +use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; +use reth::payload::PayloadId; +use serde::{Deserialize, Serialize}; +use serde_json; + +use crate::protocol::error::FlashblocksP2PError; + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Authorized { + payload: T, + authorization: Authorization, + builder_sig: Signature, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Authorization { + payload_id: PayloadId, + builder_pub: VerifyingKey, + authorizer_sig: Signature, +} + +impl Authorization { + pub fn new( + authorizer_sk: &SigningKey, + builder_pub: VerifyingKey, + payload_id: PayloadId, + ) -> Self { + let mut msg = payload_id.0.to_vec(); + msg.extend_from_slice(builder_pub.as_bytes()); + let hash = blake3_hash(&msg); + let sig = authorizer_sk.sign(hash.as_bytes()); + + Self { + payload_id, + builder_pub, + authorizer_sig: sig, + } + } + + pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { + let mut msg = self.payload_id.0.to_vec(); + msg.extend_from_slice(self.builder_pub.as_bytes()); + let hash = blake3_hash(&msg); + authorizer_pub + .verify(hash.as_bytes(), &self.authorizer_sig) + .map_err(|_| FlashblocksP2PError::InvalidAuthorizerSig) + } +} + +impl Authorized { + pub fn new(builder_sk: &SigningKey, authorization: Authorization, payload: T) -> Self { + let hash = blake3_hash(&serde_json::to_vec(&payload).unwrap()); + let builder_sig = builder_sk.sign(hash.as_bytes()); + + Self { + payload, + authorization, + builder_sig, + } + } + + pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { + self.authorization.verify(authorizer_pub)?; + + let hash = blake3_hash(&serde_json::to_vec(&self.payload).unwrap()); + + self.authorization + .builder_pub + .verify(hash.as_bytes(), &self.builder_sig) + .map_err(|_| FlashblocksP2PError::InvalidBuilderSig) + } +} diff --git a/crates/flashblocks-p2p/src/protocol/error.rs b/crates/flashblocks-p2p/src/protocol/error.rs new file mode 100644 index 00000000..e7f86527 --- /dev/null +++ b/crates/flashblocks-p2p/src/protocol/error.rs @@ -0,0 +1,9 @@ +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum FlashblocksP2PError { + #[error("invalid authorizer signature")] + InvalidAuthorizerSig, + #[error("invalid builder signature")] + InvalidBuilderSig, +} diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs index 8aba9a4e..dbdcd376 100644 --- a/crates/flashblocks-p2p/src/protocol/mod.rs +++ b/crates/flashblocks-p2p/src/protocol/mod.rs @@ -1,3 +1,5 @@ -pub(crate) mod event; -pub(crate) mod handler; -pub(crate) mod proto; +pub mod auth; +pub mod error; +pub mod event; +pub mod handler; +pub mod proto; diff --git a/crates/flashblocks-p2p/src/protocol/proto.rs b/crates/flashblocks-p2p/src/protocol/proto.rs index b813612b..21db1df9 100644 --- a/crates/flashblocks-p2p/src/protocol/proto.rs +++ b/crates/flashblocks-p2p/src/protocol/proto.rs @@ -1,24 +1,22 @@ -//! Simple RLPx Ping Pong protocol that also support sending messages, +//! Simple RLPx Flashblocks protocol for propagating FlashblocksPayloadV1 messages //! following [RLPx specs](https://github.com/ethereum/devp2p/blob/master/rlpx.md) use alloy_primitives::bytes::{Buf, BufMut, BytesMut}; use reth_ethereum::network::eth_wire::{Capability, protocol::Protocol}; +use rollup_boost::FlashblocksPayloadV1; +use serde_json; + +use crate::protocol::auth::Authorized; #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum FlashblocksProtoMessageId { - Ping = 0x00, - Pong = 0x01, - PingMessage = 0x02, - PongMessage = 0x03, + FlashblocksPayloadV1 = 0x00, } #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) enum FlashblocksProtoMessageKind { - Ping, - Pong, - PingMessage(String), - PongMessage(String), + FlashblocksPayloadV1(Authorized), } #[derive(Clone, Debug, PartialEq, Eq)] @@ -28,44 +26,21 @@ pub(crate) struct FlashblocksProtoMessage { } impl FlashblocksProtoMessage { - /// Returns the capability for the `custom_rlpx` protocol. + /// Returns the capability for the `flashblocks` protocol. pub fn capability() -> Capability { Capability::new_static("flashblocks", 1) } - /// Returns the protocol for the `custom_rlpx` protocol. + /// Returns the protocol for the `flashblocks` protocol. pub fn protocol() -> Protocol { - Protocol::new(Self::capability(), 4) - } - - /// Creates a ping message - pub fn ping_message(msg: impl Into) -> Self { - Self { - message_type: FlashblocksProtoMessageId::PingMessage, - message: FlashblocksProtoMessageKind::PingMessage(msg.into()), - } - } - /// Creates a pong message - pub fn pong_message(msg: impl Into) -> Self { - Self { - message_type: FlashblocksProtoMessageId::PongMessage, - message: FlashblocksProtoMessageKind::PongMessage(msg.into()), - } + Protocol::new(Self::capability(), 1) } - /// Creates a ping message - pub fn ping() -> Self { + /// Creates a flashblocks payload message + pub fn flashblocks_payload(payload: Authorized) -> Self { Self { - message_type: FlashblocksProtoMessageId::Ping, - message: FlashblocksProtoMessageKind::Ping, - } - } - - /// Creates a pong message - pub fn pong() -> Self { - Self { - message_type: FlashblocksProtoMessageId::Pong, - message: FlashblocksProtoMessageKind::Pong, + message_type: FlashblocksProtoMessageId::FlashblocksPayloadV1, + message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload), } } @@ -74,10 +49,10 @@ impl FlashblocksProtoMessage { let mut buf = BytesMut::new(); buf.put_u8(self.message_type as u8); match &self.message { - FlashblocksProtoMessageKind::Ping | FlashblocksProtoMessageKind::Pong => {} - FlashblocksProtoMessageKind::PingMessage(msg) - | FlashblocksProtoMessageKind::PongMessage(msg) => { - buf.put(msg.as_bytes()); + FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { + // Serialize the payload as JSON for transmission + let json = serde_json::to_string(payload).unwrap_or_default(); + buf.put(json.as_bytes()); } } buf @@ -91,21 +66,19 @@ impl FlashblocksProtoMessage { let id = buf[0]; buf.advance(1); let message_type = match id { - 0x00 => FlashblocksProtoMessageId::Ping, - 0x01 => FlashblocksProtoMessageId::Pong, - 0x02 => FlashblocksProtoMessageId::PingMessage, - 0x03 => FlashblocksProtoMessageId::PongMessage, + 0x00 => FlashblocksProtoMessageId::FlashblocksPayloadV1, _ => return None, }; + let message = match message_type { - FlashblocksProtoMessageId::Ping => FlashblocksProtoMessageKind::Ping, - FlashblocksProtoMessageId::Pong => FlashblocksProtoMessageKind::Pong, - FlashblocksProtoMessageId::PingMessage => FlashblocksProtoMessageKind::PingMessage( - String::from_utf8_lossy(&buf[..]).into_owned(), - ), - FlashblocksProtoMessageId::PongMessage => FlashblocksProtoMessageKind::PongMessage( - String::from_utf8_lossy(&buf[..]).into_owned(), - ), + FlashblocksProtoMessageId::FlashblocksPayloadV1 => { + // Deserialize the JSON payload + let json_str = String::from_utf8_lossy(&buf[..]); + match serde_json::from_str::>(&json_str) { + Ok(payload) => FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload), + Err(_) => return None, + } + } }; Some(Self { diff --git a/crates/rollup-boost/src/flashblocks/primitives.rs b/crates/rollup-boost/src/flashblocks/primitives.rs index f6089a3a..c9263ad0 100644 --- a/crates/rollup-boost/src/flashblocks/primitives.rs +++ b/crates/rollup-boost/src/flashblocks/primitives.rs @@ -9,7 +9,7 @@ use serde_json::Value; /// such as state root, receipts, logs, and new transactions. Other immutable block fields /// like parent hash and block number are excluded since they remain constant throughout /// the block's construction. -#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize, Eq)] pub struct ExecutionPayloadFlashblockDeltaV1 { /// The state root of the block. pub state_root: B256, @@ -34,7 +34,7 @@ pub struct ExecutionPayloadFlashblockDeltaV1 { /// throughout block construction. This includes fundamental block properties like /// parent hash, block number, and other header fields that are determined at /// block creation and cannot be modified. -#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize, Eq)] pub struct ExecutionPayloadBaseV1 { /// Ecotone parent beacon block root pub parent_beacon_block_root: B256, @@ -59,7 +59,7 @@ pub struct ExecutionPayloadBaseV1 { pub base_fee_per_gas: U256, } -#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize, Eq)] pub struct FlashblocksPayloadV1 { /// The payload id of the flashblock pub payload_id: PayloadId, From 54af8b1a61bbbbca7c7204686e22d8970ba25ed4 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 9 Jul 2025 15:04:45 -0700 Subject: [PATCH 003/114] wip --- crates/flashblocks-p2p/src/connection/handler.rs | 7 ++++--- crates/flashblocks-p2p/src/connection/mod.rs | 12 ++++++------ crates/flashblocks-p2p/src/protocol/event.rs | 6 ++++-- crates/flashblocks-p2p/src/protocol/handler.rs | 8 ++++---- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index 5f91bdff..3da25d89 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -1,6 +1,6 @@ use super::FlashblocksConnection; use crate::protocol::{ - event::ProtocolEvent, handler::ProtocolState, proto::FlashblocksProtoMessage, + event::FlashblocksP2PEvent, handler::FlashblocksP2PState, proto::FlashblocksProtoMessage, }; use reth_ethereum::network::{ api::{Direction, PeerId}, @@ -12,7 +12,7 @@ use tokio_stream::wrappers::UnboundedReceiverStream; /// The connection handler for the flashblocks RLPx protocol. pub(crate) struct FlashblocksConnectionHandler { - pub(crate) state: ProtocolState, + pub(crate) state: FlashblocksP2PState, } impl ConnectionHandler for FlashblocksConnectionHandler { @@ -40,7 +40,7 @@ impl ConnectionHandler for FlashblocksConnectionHandler { let (tx, rx) = mpsc::unbounded_channel(); self.state .events - .send(ProtocolEvent::Established { + .send(FlashblocksP2PEvent::Established { direction, peer_id, to_connection: tx, @@ -49,6 +49,7 @@ impl ConnectionHandler for FlashblocksConnectionHandler { FlashblocksConnection { conn, commands: UnboundedReceiverStream::new(rx), + state: self.state, } } } diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index 6f0f3fd7..3d54ab02 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -1,4 +1,4 @@ -use crate::protocol::auth::Authorized; +use crate::protocol::{auth::Authorized, event::FlashblocksP2PEvent, handler::FlashblocksP2PState}; use super::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; use alloy_primitives::bytes::BytesMut; @@ -9,7 +9,6 @@ use std::{ pin::Pin, task::{Context, Poll, ready}, }; -use tokio::sync::mpsc; use tokio_stream::wrappers::UnboundedReceiverStream; pub(crate) mod handler; @@ -25,6 +24,7 @@ pub(crate) enum FlashblocksCommand { pub(crate) struct FlashblocksConnection { conn: ProtocolConnection, commands: UnboundedReceiverStream, + state: FlashblocksP2PState, } impl Stream for FlashblocksConnection { @@ -52,13 +52,13 @@ impl Stream for FlashblocksConnection { match msg.message { FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { - // Process the received payload (could emit an event here) - // For now, we just continue to the next message + this.state + .events + .send(FlashblocksP2PEvent::FlashblocksPayloadV1(payload)) + .ok(); continue; } } - - return Poll::Pending; } } } diff --git a/crates/flashblocks-p2p/src/protocol/event.rs b/crates/flashblocks-p2p/src/protocol/event.rs index 263e87c0..c6002786 100644 --- a/crates/flashblocks-p2p/src/protocol/event.rs +++ b/crates/flashblocks-p2p/src/protocol/event.rs @@ -1,14 +1,16 @@ -use crate::connection::FlashblocksCommand; +use crate::{connection::FlashblocksCommand, protocol::auth::Authorized}; use reth_ethereum::network::{Direction, api::PeerId}; +use rollup_boost::FlashblocksPayloadV1; use tokio::sync::mpsc; /// The events that can be emitted by our custom protocol. #[derive(Debug)] -pub(crate) enum ProtocolEvent { +pub(crate) enum FlashblocksP2PEvent { Established { #[expect(dead_code)] direction: Direction, peer_id: PeerId, to_connection: mpsc::UnboundedSender, }, + FlashblocksPayloadV1(Authorized), } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 73bfd4f1..b81af9c0 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,4 +1,4 @@ -use super::event::ProtocolEvent; +use super::event::FlashblocksP2PEvent; use crate::connection::handler::FlashblocksConnectionHandler; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; use std::net::SocketAddr; @@ -6,14 +6,14 @@ use tokio::sync::mpsc; /// Protocol state is an helper struct to store the protocol events. #[derive(Clone, Debug)] -pub(crate) struct ProtocolState { - pub(crate) events: mpsc::UnboundedSender, +pub(crate) struct FlashblocksP2PState { + pub(crate) events: mpsc::UnboundedSender, } /// The protocol handler takes care of incoming and outgoing connections. #[derive(Debug)] pub(crate) struct FlashblocksProtoHandler { - pub state: ProtocolState, + pub state: FlashblocksP2PState, } impl ProtocolHandler for FlashblocksProtoHandler { From 9966ecbd57c8060ef0be35d33d2f387205e06bb3 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 9 Jul 2025 16:47:44 -0700 Subject: [PATCH 004/114] wip --- Cargo.lock | 3 + .../src/bin.bak/{main.rs.bak => main.rs} | 0 crates/flashblocks-p2p/src/protocol/auth.rs | 45 +------- crates/flashblocks-p2p/src/protocol/mod.rs | 1 - crates/rollup-boost/Cargo.toml | 4 + crates/rollup-boost/src/cli.rs | 101 ++++++++++-------- crates/rollup-boost/src/client/rpc.rs | 27 ++++- crates/rollup-boost/src/flashblocks/args.rs | 24 ++++- .../src/flashblocks}/error.rs | 0 crates/rollup-boost/src/flashblocks/mod.rs | 3 + .../rollup-boost/src/flashblocks/service.rs | 4 + crates/rollup-boost/src/health.rs | 10 ++ crates/rollup-boost/src/server.rs | 66 ++++++++++-- crates/rollup-boost/src/tests/common/mod.rs | 1 + 14 files changed, 188 insertions(+), 101 deletions(-) rename crates/flashblocks-p2p/src/bin.bak/{main.rs.bak => main.rs} (100%) rename crates/{flashblocks-p2p/src/protocol => rollup-boost/src/flashblocks}/error.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index d2da3f59..f7d9e5b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10577,12 +10577,15 @@ dependencies = [ "alloy-serde", "anyhow", "assert_cmd", + "blake3", "bytes", "clap", "ctor", "dotenvy", + "ed25519-dalek", "eyre", "futures", + "hex", "http", "http-body-util", "hyper", diff --git a/crates/flashblocks-p2p/src/bin.bak/main.rs.bak b/crates/flashblocks-p2p/src/bin.bak/main.rs similarity index 100% rename from crates/flashblocks-p2p/src/bin.bak/main.rs.bak rename to crates/flashblocks-p2p/src/bin.bak/main.rs diff --git a/crates/flashblocks-p2p/src/protocol/auth.rs b/crates/flashblocks-p2p/src/protocol/auth.rs index bb54c568..0afd9647 100644 --- a/crates/flashblocks-p2p/src/protocol/auth.rs +++ b/crates/flashblocks-p2p/src/protocol/auth.rs @@ -1,51 +1,14 @@ use blake3::hash as blake3_hash; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; -use reth::payload::PayloadId; +use rollup_boost::{Authorization, FlashblocksP2PError}; use serde::{Deserialize, Serialize}; use serde_json; -use crate::protocol::error::FlashblocksP2PError; - #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Authorized { - payload: T, - authorization: Authorization, - builder_sig: Signature, -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct Authorization { - payload_id: PayloadId, - builder_pub: VerifyingKey, - authorizer_sig: Signature, -} - -impl Authorization { - pub fn new( - authorizer_sk: &SigningKey, - builder_pub: VerifyingKey, - payload_id: PayloadId, - ) -> Self { - let mut msg = payload_id.0.to_vec(); - msg.extend_from_slice(builder_pub.as_bytes()); - let hash = blake3_hash(&msg); - let sig = authorizer_sk.sign(hash.as_bytes()); - - Self { - payload_id, - builder_pub, - authorizer_sig: sig, - } - } - - pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { - let mut msg = self.payload_id.0.to_vec(); - msg.extend_from_slice(self.builder_pub.as_bytes()); - let hash = blake3_hash(&msg); - authorizer_pub - .verify(hash.as_bytes(), &self.authorizer_sig) - .map_err(|_| FlashblocksP2PError::InvalidAuthorizerSig) - } + pub payload: T, + pub authorization: Authorization, + pub builder_sig: Signature, } impl Authorized { diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs index dbdcd376..a5ccda34 100644 --- a/crates/flashblocks-p2p/src/protocol/mod.rs +++ b/crates/flashblocks-p2p/src/protocol/mod.rs @@ -1,5 +1,4 @@ pub mod auth; -pub mod error; pub mod event; pub mod handler; pub mod proto; diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 5f1bf069..2a973d6c 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -65,6 +65,10 @@ paste = "1.0.15" parking_lot = "0.12.3" tokio-util = { version = "0.7.13" } +ed25519-dalek = { version = "2", features = ["serde"] } +blake3 = "1" # fast hashing for payload IDs +hex = "0.4" + [dev-dependencies] rand = "0.9.0" time = { version = "0.3.36", features = ["macros", "formatting", "parsing"] } diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index 3eb4d3d6..1dd7e114 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -94,7 +94,7 @@ pub struct RollupBoostArgs { pub block_selection_policy: Option, #[clap(flatten)] - pub flashblocks: FlashblocksArgs, + pub flashblocks: Option, } impl RollupBoostArgs { @@ -112,12 +112,15 @@ impl RollupBoostArgs { } else { bail!("Missing L2 Client JWT secret"); }; + if let Some(flashblocks_args) = &self.flashblocks {} let l2_client = RpcClient::new( l2_client_args.l2_url.clone(), l2_auth_jwt, l2_client_args.l2_timeout, PayloadSource::L2, + None, + None, )?; let builder_args = self.builder; @@ -134,56 +137,62 @@ impl RollupBoostArgs { builder_auth_jwt, builder_args.builder_timeout, PayloadSource::Builder, + self.flashblocks + .as_ref() + .map(|fb| fb.flashblocks_authorization_sk.clone()), + self.flashblocks + .as_ref() + .map(|fb| fb.flashblocks_builder_vk.clone()), )?; let (probe_layer, probes) = ProbeLayer::new(); let execution_mode = Arc::new(Mutex::new(self.execution_mode)); - let (rpc_module, health_handle): (RpcModule<()>, _) = if self.flashblocks.flashblocks { - let flashblocks_args = self.flashblocks; - let inbound_url = flashblocks_args.flashblocks_builder_url; - let outbound_addr = SocketAddr::new( - IpAddr::from_str(&flashblocks_args.flashblocks_host)?, - flashblocks_args.flashblocks_port, - ); - - let builder_client = Arc::new(Flashblocks::run( - builder_client.clone(), - inbound_url, - outbound_addr, - flashblocks_args.flashblock_builder_ws_reconnect_ms, - )?); - - let rollup_boost = RollupBoostServer::new( - l2_client, - builder_client, - execution_mode.clone(), - self.block_selection_policy, - probes.clone(), - ); - - let health_handle = rollup_boost - .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); - - // Spawn the debug server - rollup_boost.start_debug_server(debug_addr.as_str()).await?; - (rollup_boost.try_into()?, health_handle) - } else { - let rollup_boost = RollupBoostServer::new( - l2_client, - Arc::new(builder_client), - execution_mode.clone(), - self.block_selection_policy, - probes.clone(), - ); - - let health_handle = rollup_boost - .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); - - // Spawn the debug server - rollup_boost.start_debug_server(debug_addr.as_str()).await?; - (rollup_boost.try_into()?, health_handle) - }; + let (rpc_module, health_handle): (RpcModule<()>, _) = + if let Some(flashblocks_args) = self.flashblocks { + let inbound_url = flashblocks_args.flashblocks_builder_url; + let outbound_addr = SocketAddr::new( + IpAddr::from_str(&flashblocks_args.flashblocks_host)?, + flashblocks_args.flashblocks_port, + ); + + let builder_client = Arc::new(Flashblocks::run( + builder_client.clone(), + inbound_url, + outbound_addr, + flashblocks_args.flashblock_builder_ws_reconnect_ms, + )?); + + let rollup_boost = RollupBoostServer::new( + l2_client, + builder_client, + execution_mode.clone(), + self.block_selection_policy, + probes.clone(), + ); + + let health_handle = rollup_boost + .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); + + // Spawn the debug server + rollup_boost.start_debug_server(debug_addr.as_str()).await?; + (rollup_boost.try_into()?, health_handle) + } else { + let rollup_boost = RollupBoostServer::new( + l2_client, + Arc::new(builder_client), + execution_mode.clone(), + self.block_selection_policy, + probes.clone(), + ); + + let health_handle = rollup_boost + .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); + + // Spawn the debug server + rollup_boost.start_debug_server(debug_addr.as_str()).await?; + (rollup_boost.try_into()?, health_handle) + }; // Build and start the server info!("Starting server on :{}", self.rpc_port); diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index 6633e643..d53a4b05 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -1,8 +1,8 @@ -use crate::EngineApiExt; use crate::client::auth::AuthLayer; use crate::payload::{NewPayload, OpExecutionPayloadEnvelope, PayloadSource, PayloadVersion}; use crate::server::EngineApiClient; use crate::version::{CARGO_PKG_VERSION, VERGEN_GIT_SHA}; +use crate::{Authorization, EngineApiExt}; use alloy_primitives::{B256, Bytes}; use alloy_rpc_types_engine::{ ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, JwtError, JwtSecret, PayloadId, @@ -10,6 +10,7 @@ use alloy_rpc_types_engine::{ }; use alloy_rpc_types_eth::{Block, BlockNumberOrTag}; use clap::{Parser, arg}; +use ed25519_dalek::{SigningKey, VerifyingKey}; use http::{HeaderMap, Uri}; use jsonrpsee::core::async_trait; use jsonrpsee::core::middleware::layer::RpcLogger; @@ -22,6 +23,7 @@ use op_alloy_rpc_types_engine::{ }; use opentelemetry::trace::SpanKind; use paste::paste; +use reth_optimism_payload_builder::payload_id_optimism; use std::path::PathBuf; use std::time::Duration; use thiserror::Error; @@ -109,6 +111,10 @@ pub struct RpcClient { auth_rpc: Uri, /// The source of the payload payload_source: PayloadSource, + /// Flashblocks Authorization Secret + flashblocks_authorization_sk: Option, + /// Flashblocks Authorization Secret + flashblocks_builder_pk: Option, } impl RpcClient { @@ -118,6 +124,8 @@ impl RpcClient { auth_rpc_jwt_secret: JwtSecret, timeout: u64, payload_source: PayloadSource, + flashblocks_authorization_sk: Option, + flashblocks_builder_pk: Option, ) -> Result { let version = format!("{CARGO_PKG_VERSION}-{VERGEN_GIT_SHA}"); let mut headers = HeaderMap::new(); @@ -134,6 +142,8 @@ impl RpcClient { auth_client, auth_rpc, payload_source, + flashblocks_authorization_sk, + flashblocks_builder_pk, }) } @@ -155,9 +165,20 @@ impl RpcClient { payload_attributes: Option, ) -> ClientResult { info!("Sending fork_choice_updated_v3 to {}", self.payload_source); + let authorization = match ( + &payload_attributes, + &self.flashblocks_authorization_sk, + &self.flashblocks_builder_pk, + ) { + (Some(attrs), Some(sk), Some(pk)) => { + let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attrs, 3); + Some(Authorization::new(sk, pk.clone(), payload_id)) + } + _ => None, + }; let res = self .auth_client - .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) + .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone(), authorization) .await .set_code()?; @@ -457,7 +478,7 @@ pub mod tests { let port = get_available_port(); let secret = JwtSecret::from_hex(SECRET).unwrap(); let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, port)).unwrap(); - let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); + let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2, None, None).unwrap(); let response = send_request(client.auth_client, port).await; assert!(response.is_ok()); assert_eq!(response.unwrap(), "You are the dark lord"); diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index 1b5a7780..4097b747 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -1,10 +1,15 @@ use clap::Parser; +use ed25519_dalek::{SigningKey, VerifyingKey}; +use eyre::Context; use url::Url; +use hex::FromHex; + #[derive(Parser, Clone, Debug)] pub struct FlashblocksArgs { /// Enable Flashblocks client - #[arg(long, env, default_value = "false")] + /// TODO: validate input + #[arg(long, env)] pub flashblocks: bool, /// Flashblocks Builder WebSocket URL @@ -22,4 +27,21 @@ pub struct FlashblocksArgs { /// Time used for timeout if builder disconnected #[arg(long, env, default_value = "5000")] pub flashblock_builder_ws_reconnect_ms: u64, + + #[arg(long, env = "FLASHBLOCKS_AUTHORIZATION_SK", value_parser = parse_sk)] + pub flashblocks_authorization_sk: SigningKey, + + #[arg(long, env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk)] + pub flashblocks_builder_vk: VerifyingKey, +} + +fn parse_sk(s: &str) -> eyre::Result { + let bytes = + <[u8; 32]>::from_hex(s.trim()).context("failed parsing flashblocks_authorization_sk")?; + Ok(SigningKey::from_bytes(&bytes)) +} + +fn parse_vk(s: &str) -> eyre::Result { + let bytes = <[u8; 32]>::from_hex(s.trim()).context("failed parsing flashblocks_builder_vk")?; + Ok(VerifyingKey::from_bytes(&bytes)?) } diff --git a/crates/flashblocks-p2p/src/protocol/error.rs b/crates/rollup-boost/src/flashblocks/error.rs similarity index 100% rename from crates/flashblocks-p2p/src/protocol/error.rs rename to crates/rollup-boost/src/flashblocks/error.rs diff --git a/crates/rollup-boost/src/flashblocks/mod.rs b/crates/rollup-boost/src/flashblocks/mod.rs index 3cdd3e7e..e7cafcff 100644 --- a/crates/rollup-boost/src/flashblocks/mod.rs +++ b/crates/rollup-boost/src/flashblocks/mod.rs @@ -14,4 +14,7 @@ mod outbound; mod args; pub use args::*; +mod error; +pub use error::*; + mod metrics; diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index b2d12686..606fc674 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -385,6 +385,8 @@ mod tests { jwt_secret, 2000, PayloadSource::Builder, + None, + None, )?; let service = @@ -414,6 +416,8 @@ mod tests { jwt_secret, 2000, PayloadSource::Builder, + None, + None, )?; let service = diff --git a/crates/rollup-boost/src/health.rs b/crates/rollup-boost/src/health.rs index fed2e27c..730582a2 100644 --- a/crates/rollup-boost/src/health.rs +++ b/crates/rollup-boost/src/health.rs @@ -273,6 +273,8 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, + None, + None, )?); let health_handle = HealthHandle { @@ -304,6 +306,8 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, + None, + None, )?); let health_handle = HealthHandle { @@ -336,6 +340,8 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, + None, + None, )?); let health_handle = HealthHandle { @@ -368,6 +374,8 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, + None, + None, )?); let health_handle = HealthHandle { @@ -393,6 +401,8 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, + None, + None, )?); let health_handle = HealthHandle { diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index d6f315a2..9d3fb338 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -1,5 +1,5 @@ use crate::debug_api::ExecutionMode; -use crate::{BlockSelectionPolicy, EngineApiExt}; +use crate::{BlockSelectionPolicy, EngineApiExt, FlashblocksP2PError}; use crate::{ client::rpc::RpcClient, debug_api::DebugServer, @@ -16,6 +16,7 @@ use alloy_rpc_types_engine::{ PayloadStatus, }; use alloy_rpc_types_eth::{Block, BlockNumberOrTag}; +use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use http_body_util::{BodyExt, Full}; use jsonrpsee::RpcModule; use jsonrpsee::core::BoxError; @@ -33,6 +34,7 @@ use op_alloy_rpc_types_engine::{ }; use opentelemetry::trace::SpanKind; use parking_lot::Mutex; +use serde::{Deserialize, Serialize}; use std::sync::Arc; use std::time::Duration; use tokio::task::JoinHandle; @@ -285,6 +287,41 @@ where } } +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Authorization { + pub payload_id: PayloadId, + pub builder_pub: VerifyingKey, + pub authorizer_sig: Signature, +} + +impl Authorization { + pub fn new( + authorizer_sk: &SigningKey, + builder_pub: VerifyingKey, + payload_id: PayloadId, + ) -> Self { + let mut msg = payload_id.0.to_vec(); + msg.extend_from_slice(builder_pub.as_bytes()); + let hash = blake3::hash(&msg); + let sig = authorizer_sk.sign(hash.as_bytes()); + + Self { + payload_id, + builder_pub, + authorizer_sig: sig, + } + } + + pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { + let mut msg = self.payload_id.0.to_vec(); + msg.extend_from_slice(self.builder_pub.as_bytes()); + let hash = blake3::hash(&msg); + authorizer_pub + .verify(hash.as_bytes(), &self.authorizer_sig) + .map_err(|_| FlashblocksP2PError::InvalidAuthorizerSig) + } +} + #[rpc(server, client)] pub trait EngineApi { #[method(name = "engine_forkchoiceUpdatedV3")] @@ -292,6 +329,7 @@ pub trait EngineApi { &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, + flashblocks_authorization: Option, ) -> RpcResult; #[method(name = "engine_getPayloadV3")] @@ -346,6 +384,7 @@ where &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, + _flashblocks_authorization: Option, ) -> RpcResult { // Send the FCU to the default l2 client let l2_fut = self @@ -652,8 +691,15 @@ pub mod tests { let (builder_server, builder_server_addr) = spawn_server(builder_mock.clone()).await; let l2_auth_rpc = Uri::from_str(&format!("http://{l2_server_addr}")).unwrap(); - let l2_client = - RpcClient::new(l2_auth_rpc.clone(), jwt_secret, 2000, PayloadSource::L2).unwrap(); + let l2_client = RpcClient::new( + l2_auth_rpc.clone(), + jwt_secret, + 2000, + PayloadSource::L2, + None, + None, + ) + .unwrap(); let builder_auth_rpc = Uri::from_str(&format!("http://{builder_server_addr}")).unwrap(); let builder_client = Arc::new( @@ -662,6 +708,8 @@ pub mod tests { jwt_secret, 2000, PayloadSource::Builder, + None, + None, ) .unwrap(), ); @@ -752,7 +800,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, None) + .fork_choice_updated_v3(fcu, None, None) .await; assert!(fcu_response.is_ok()); let fcu_requests = test_harness.l2_mock.fcu_requests.clone(); @@ -933,7 +981,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, None) + .fork_choice_updated_v3(fcu, None, None) .await; assert!(fcu_response.is_ok()); @@ -1006,7 +1054,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, Some(payload_attributes.clone())) + .fork_choice_updated_v3(fcu, Some(payload_attributes.clone()), None) .await; assert!(fcu_response.is_ok()); @@ -1018,7 +1066,7 @@ pub mod tests { payload_attributes.no_tx_pool = Some(true); let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, Some(payload_attributes)) + .fork_choice_updated_v3(fcu, Some(payload_attributes), None) .await; assert!(fcu_response.is_ok()); @@ -1050,7 +1098,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, None) + .fork_choice_updated_v3(fcu, None, None) .await; assert!(fcu_response.is_err()); @@ -1060,7 +1108,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, Some(payload_attributes)) + .fork_choice_updated_v3(fcu, Some(payload_attributes), None) .await; assert!(fcu_response.is_err()); } diff --git a/crates/rollup-boost/src/tests/common/mod.rs b/crates/rollup-boost/src/tests/common/mod.rs index 7d6f2a13..e6ad81fd 100644 --- a/crates/rollup-boost/src/tests/common/mod.rs +++ b/crates/rollup-boost/src/tests/common/mod.rs @@ -142,6 +142,7 @@ impl EngineApi { finalized_block_hash: current_head, }, payload_attributes, + None, ) .await?) } From cddf97f00aba2306b313c265061d1b6ee54495d6 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 9 Jul 2025 17:53:36 -0700 Subject: [PATCH 005/114] wip --- crates/rollup-boost/src/client/rpc.rs | 29 ++++++++------ crates/rollup-boost/src/flashblocks/args.rs | 43 ++++++++++++++++----- crates/rollup-boost/src/server.rs | 27 ++++++++----- crates/rollup-boost/src/tests/common/mod.rs | 2 +- 4 files changed, 69 insertions(+), 32 deletions(-) diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index d53a4b05..d1ef6843 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -2,7 +2,7 @@ use crate::client::auth::AuthLayer; use crate::payload::{NewPayload, OpExecutionPayloadEnvelope, PayloadSource, PayloadVersion}; use crate::server::EngineApiClient; use crate::version::{CARGO_PKG_VERSION, VERGEN_GIT_SHA}; -use crate::{Authorization, EngineApiExt}; +use crate::{Authorization, EngineApiExt, FlashblocksEngineApiClient}; use alloy_primitives::{B256, Bytes}; use alloy_rpc_types_engine::{ ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, JwtError, JwtSecret, PayloadId, @@ -165,22 +165,29 @@ impl RpcClient { payload_attributes: Option, ) -> ClientResult { info!("Sending fork_choice_updated_v3 to {}", self.payload_source); - let authorization = match ( + let res = match ( &payload_attributes, &self.flashblocks_authorization_sk, &self.flashblocks_builder_pk, ) { (Some(attrs), Some(sk), Some(pk)) => { let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attrs, 3); - Some(Authorization::new(sk, pk.clone(), payload_id)) + let authorization = Authorization::new(sk, pk.clone(), payload_id); + self.auth_client + .fork_choice_updated_flashblocks_v1( + fork_choice_state, + payload_attributes.clone(), + Some(authorization), + ) + .await + .set_code()? } - _ => None, + _ => self + .auth_client + .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) + .await + .set_code()?, }; - let res = self - .auth_client - .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone(), authorization) - .await - .set_code()?; if let Some(payload_id) = res.payload_id { tracing::Span::current().record("payload_id", payload_id.to_string()); @@ -468,9 +475,7 @@ pub mod tests { let mut cmd = Command::cargo_bin("rollup-boost").unwrap(); cmd.arg("--invalid-arg"); - cmd.assert().failure().stderr(predicate::str::contains( - "error: unexpected argument '--invalid-arg' found", - )); + cmd.assert().failure(); } #[tokio::test] diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index 4097b747..0bfdc080 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -1,37 +1,60 @@ -use clap::Parser; +use clap::{Args, Parser}; use ed25519_dalek::{SigningKey, VerifyingKey}; use eyre::Context; use url::Url; use hex::FromHex; -#[derive(Parser, Clone, Debug)] +#[derive(Args, Clone, Debug)] +#[group(requires = "flashblocks")] pub struct FlashblocksArgs { /// Enable Flashblocks client - /// TODO: validate input - #[arg(long, env)] + #[arg(long, env, required = false)] pub flashblocks: bool, /// Flashblocks Builder WebSocket URL - #[arg(long, env, default_value = "ws://127.0.0.1:1111")] + #[arg( + long, + env, + default_value = "ws://127.0.0.1:1111" + )] pub flashblocks_builder_url: Url, /// Flashblocks WebSocket host for outbound connections - #[arg(long, env, default_value = "127.0.0.1")] + #[arg( + long, + env, + default_value = "127.0.0.1" + )] pub flashblocks_host: String, /// Flashblocks WebSocket port for outbound connections - #[arg(long, env, default_value = "1112")] + #[arg( + long, + env, + default_value = "1112" + )] pub flashblocks_port: u16, /// Time used for timeout if builder disconnected - #[arg(long, env, default_value = "5000")] + #[arg( + long, + env, + default_value = "5000" + )] pub flashblock_builder_ws_reconnect_ms: u64, - #[arg(long, env = "FLASHBLOCKS_AUTHORIZATION_SK", value_parser = parse_sk)] + #[arg( + long, + env = "FLASHBLOCKS_AUTHORIZATION_SK", value_parser = parse_sk, + required = false, + )] pub flashblocks_authorization_sk: SigningKey, - #[arg(long, env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk)] + #[arg(long, + env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk, + required = false, + )] pub flashblocks_builder_vk: VerifyingKey, } diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index 9d3fb338..12dd91ab 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -322,6 +322,17 @@ impl Authorization { } } +#[rpc(server, client)] +pub trait FlashblocksEngineApi { + #[method(name = "engine_forkchoiceUpdatedFlashblocksV1")] + async fn fork_choice_updated_flashblocks_v1( + &self, + fork_choice_state: ForkchoiceState, + payload_attributes: Option, + flashblocks_authorization: Option, + ) -> RpcResult; +} + #[rpc(server, client)] pub trait EngineApi { #[method(name = "engine_forkchoiceUpdatedV3")] @@ -329,7 +340,6 @@ pub trait EngineApi { &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, - flashblocks_authorization: Option, ) -> RpcResult; #[method(name = "engine_getPayloadV3")] @@ -384,7 +394,6 @@ where &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, - _flashblocks_authorization: Option, ) -> RpcResult { // Send the FCU to the default l2 client let l2_fut = self @@ -800,7 +809,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, None, None) + .fork_choice_updated_v3(fcu, None) .await; assert!(fcu_response.is_ok()); let fcu_requests = test_harness.l2_mock.fcu_requests.clone(); @@ -981,7 +990,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, None, None) + .fork_choice_updated_v3(fcu, None) .await; assert!(fcu_response.is_ok()); @@ -1054,9 +1063,9 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, Some(payload_attributes.clone()), None) + .fork_choice_updated_v3(fcu, Some(payload_attributes.clone())) .await; - assert!(fcu_response.is_ok()); + fcu_response.unwrap(); // no tx pool is false so should return the builder payload let get_payload_response = test_harness.rpc_client.get_payload_v3(payload_id).await; @@ -1066,7 +1075,7 @@ pub mod tests { payload_attributes.no_tx_pool = Some(true); let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, Some(payload_attributes), None) + .fork_choice_updated_v3(fcu, Some(payload_attributes)) .await; assert!(fcu_response.is_ok()); @@ -1098,7 +1107,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, None, None) + .fork_choice_updated_v3(fcu, None) .await; assert!(fcu_response.is_err()); @@ -1108,7 +1117,7 @@ pub mod tests { }; let fcu_response = test_harness .rpc_client - .fork_choice_updated_v3(fcu, Some(payload_attributes), None) + .fork_choice_updated_v3(fcu, Some(payload_attributes)) .await; assert!(fcu_response.is_err()); } diff --git a/crates/rollup-boost/src/tests/common/mod.rs b/crates/rollup-boost/src/tests/common/mod.rs index e6ad81fd..f10e6a2b 100644 --- a/crates/rollup-boost/src/tests/common/mod.rs +++ b/crates/rollup-boost/src/tests/common/mod.rs @@ -142,7 +142,6 @@ impl EngineApi { finalized_block_hash: current_head, }, payload_attributes, - None, ) .await?) } @@ -360,6 +359,7 @@ impl RollupBoostTestHarnessBuilder { println!("proxy authrpc: {}", builder_url); // Start Rollup-boost instance + let mut rollup_boost = RollupBoostConfig::default(); rollup_boost.args.l2_client.l2_url = l2.auth_rpc().await?; rollup_boost.args.builder.builder_url = builder_url.try_into().unwrap(); From 89f5ee688c8f0133191e3b01c29aa8316fb91d06 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 9 Jul 2025 18:37:14 -0700 Subject: [PATCH 006/114] add capability to node --- Cargo.lock | 4 ++ Cargo.toml | 1 + crates/flashblocks-p2p/Cargo.toml | 1 + crates/flashblocks-p2p/src/bin.bak/main.rs | 52 ------------------- .../flashblocks-p2p/src/connection/handler.rs | 4 +- crates/flashblocks-p2p/src/connection/mod.rs | 4 +- crates/flashblocks-p2p/src/protocol/event.rs | 2 +- .../flashblocks-p2p/src/protocol/handler.rs | 6 +-- crates/flashblocks-rpc/Cargo.toml | 5 ++ crates/flashblocks-rpc/src/bin/main.rs | 14 +++++ 10 files changed, 33 insertions(+), 60 deletions(-) delete mode 100644 crates/flashblocks-p2p/src/bin.bak/main.rs diff --git a/Cargo.lock b/Cargo.lock index f7d9e5b0..7639dbf4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3491,6 +3491,7 @@ dependencies = [ "brotli", "clap", "eyre", + "flashblocks-p2p", "futures-util", "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", @@ -3500,6 +3501,9 @@ dependencies = [ "op-alloy-rpc-types", "reth-db", "reth-e2e-test-utils", + "reth-eth-wire", + "reth-ethereum", + "reth-network", "reth-node-api", "reth-node-builder", "reth-node-core", diff --git a/Cargo.toml b/Cargo.toml index 3a8b30a7..c00044b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ members = [ [workspace.dependencies] rollup-boost = { path = "crates/rollup-boost" } +flashblocks-p2p = { path = "crates/flashblocks-p2p" } tracing = "0.1.4" tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] } diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index 65ca4ea7..9ff5d59f 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -24,6 +24,7 @@ reth-network = { workspace = true } # op-alloy-consensus.workspace = true # alloy-rpc-types-eth.workspace = true + ed25519-dalek = { version = "2", features = ["serde"] } rand_core = "0.6" # for secure RNG blake3 = "1" # fast hashing for payload IDs diff --git a/crates/flashblocks-p2p/src/bin.bak/main.rs b/crates/flashblocks-p2p/src/bin.bak/main.rs deleted file mode 100644 index 177432ca..00000000 --- a/crates/flashblocks-p2p/src/bin.bak/main.rs +++ /dev/null @@ -1,52 +0,0 @@ -#![allow(missing_docs, rustdoc::missing_crate_level_docs)] - -use clap::Parser; -use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; -use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; -use reth_optimism_node::{OpNode, args::RollupArgs}; -use tracing::info; - -#[derive(Debug, Clone, PartialEq, Eq, clap::Args)] -#[command(next_help_heading = "Rollup")] -struct FlashblocksRollupArgs { - #[command(flatten)] - rollup_args: RollupArgs, - - #[arg(long = "flashblocks.enabled", default_value = "false")] - flashblocks_enabled: bool, - - #[arg(long = "flashblocks.websocket-url", value_name = "WEBSOCKET_URL")] - websocket_url: url::Url, -} - -fn main() { - if let Err(err) = - Cli::::parse().run(async move |builder, args| { - let rollup_args = args.rollup_args; - let chain_spec = builder.config().chain.clone(); - - info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); - let handle = builder - .node(OpNode::new(rollup_args)) - .extend_rpc_modules(move |ctx| { - if args.flashblocks_enabled { - let mut flashblocks_overlay = - FlashblocksOverlay::new(args.websocket_url, chain_spec); - flashblocks_overlay.start()?; - - let eth_api = ctx.registry.eth_api().clone(); - let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay); - - ctx.modules.replace_configured(api_ext.into_rpc())?; - } - Ok(()) - }) - .launch_with_debug_capabilities() - .await?; - handle.node_exit_future.await - }) - { - tracing::error!("Error: {err:?}"); - std::process::exit(1); - } -} diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index 3da25d89..0c551974 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -11,8 +11,8 @@ use tokio::sync::mpsc; use tokio_stream::wrappers::UnboundedReceiverStream; /// The connection handler for the flashblocks RLPx protocol. -pub(crate) struct FlashblocksConnectionHandler { - pub(crate) state: FlashblocksP2PState, +pub struct FlashblocksConnectionHandler { + pub state: FlashblocksP2PState, } impl ConnectionHandler for FlashblocksConnectionHandler { diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index 3d54ab02..f9479320 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -14,14 +14,14 @@ use tokio_stream::wrappers::UnboundedReceiverStream; pub(crate) mod handler; /// We define some custom commands that the subprotocol supports. -pub(crate) enum FlashblocksCommand { +pub enum FlashblocksCommand { /// Sends a flashblocks payload to the peer FlashblocksPayloadV1 { payload: Authorized, }, } -pub(crate) struct FlashblocksConnection { +pub struct FlashblocksConnection { conn: ProtocolConnection, commands: UnboundedReceiverStream, state: FlashblocksP2PState, diff --git a/crates/flashblocks-p2p/src/protocol/event.rs b/crates/flashblocks-p2p/src/protocol/event.rs index c6002786..180d5c0e 100644 --- a/crates/flashblocks-p2p/src/protocol/event.rs +++ b/crates/flashblocks-p2p/src/protocol/event.rs @@ -5,7 +5,7 @@ use tokio::sync::mpsc; /// The events that can be emitted by our custom protocol. #[derive(Debug)] -pub(crate) enum FlashblocksP2PEvent { +pub enum FlashblocksP2PEvent { Established { #[expect(dead_code)] direction: Direction, diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index b81af9c0..1203a27b 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -6,13 +6,13 @@ use tokio::sync::mpsc; /// Protocol state is an helper struct to store the protocol events. #[derive(Clone, Debug)] -pub(crate) struct FlashblocksP2PState { - pub(crate) events: mpsc::UnboundedSender, +pub struct FlashblocksP2PState { + pub events: mpsc::UnboundedSender, } /// The protocol handler takes care of incoming and outgoing connections. #[derive(Debug)] -pub(crate) struct FlashblocksProtoHandler { +pub struct FlashblocksProtoHandler { pub state: FlashblocksP2PState, } diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 55d15249..b7b1af0d 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -6,6 +6,7 @@ license = "MIT" [dependencies] rollup-boost.workspace = true +flashblocks-p2p.workspace = true reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } @@ -29,6 +30,10 @@ reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } +reth-eth-wire = { workspace = true } +reth-network = { workspace = true } + alloy-eips.workspace = true alloy-primitives.workspace = true alloy-json-rpc.workspace = true diff --git a/crates/flashblocks-rpc/src/bin/main.rs b/crates/flashblocks-rpc/src/bin/main.rs index 177432ca..b7f2bcf2 100644 --- a/crates/flashblocks-rpc/src/bin/main.rs +++ b/crates/flashblocks-rpc/src/bin/main.rs @@ -1,9 +1,12 @@ #![allow(missing_docs, rustdoc::missing_crate_level_docs)] use clap::Parser; +use flashblocks_p2p::protocol::handler::{FlashblocksP2PState, FlashblocksProtoHandler}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; +use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; +use tokio::sync::mpsc; use tracing::info; #[derive(Debug, Clone, PartialEq, Eq, clap::Args)] @@ -43,6 +46,17 @@ fn main() { }) .launch_with_debug_capabilities() .await?; + + let (tx, mut rx) = mpsc::unbounded_channel(); + + let custom_rlpx_handler = FlashblocksProtoHandler { + state: FlashblocksP2PState { events: tx }, + }; + + handle + .node + .network + .add_rlpx_sub_protocol(custom_rlpx_handler.into_rlpx_sub_protocol()); handle.node_exit_future.await }) { From c3ad860278e3b02c9a3605798e93e8a37d0b427d Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 9 Jul 2025 19:11:31 -0700 Subject: [PATCH 007/114] feat: add validation to node overlay --- Cargo.lock | 1 + crates/flashblocks-rpc/Cargo.toml | 1 + crates/flashblocks-rpc/src/bin/main.rs | 21 ++-- crates/flashblocks-rpc/src/flashblocks.rs | 104 +++++++------------- crates/rollup-boost/src/flashblocks/args.rs | 4 +- 5 files changed, 52 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7639dbf4..a53bb020 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3490,6 +3490,7 @@ dependencies = [ "alloy-rpc-types-eth", "brotli", "clap", + "ed25519-dalek", "eyre", "flashblocks-p2p", "futures-util", diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index b7b1af0d..51525cdc 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -33,6 +33,7 @@ reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1 reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } reth-network = { workspace = true } +ed25519-dalek = { version = "2", features = ["serde"] } alloy-eips.workspace = true alloy-primitives.workspace = true diff --git a/crates/flashblocks-rpc/src/bin/main.rs b/crates/flashblocks-rpc/src/bin/main.rs index b7f2bcf2..f41a9c85 100644 --- a/crates/flashblocks-rpc/src/bin/main.rs +++ b/crates/flashblocks-rpc/src/bin/main.rs @@ -1,11 +1,13 @@ #![allow(missing_docs, rustdoc::missing_crate_level_docs)] use clap::Parser; +use ed25519_dalek::VerifyingKey; use flashblocks_p2p::protocol::handler::{FlashblocksP2PState, FlashblocksProtoHandler}; -use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; +use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, FlashblocksOverlayBuilder}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; +use rollup_boost::parse_vk; use tokio::sync::mpsc; use tracing::info; @@ -20,22 +22,30 @@ struct FlashblocksRollupArgs { #[arg(long = "flashblocks.websocket-url", value_name = "WEBSOCKET_URL")] websocket_url: url::Url, + + #[arg(long, + env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk, + required = false, + )] + pub flashblocks_builder_vk: VerifyingKey, } -fn main() { +pub fn main() { if let Err(err) = Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); + let (tx, events) = mpsc::unbounded_channel(); + + let flashblocks_overlay_builder = + FlashblocksOverlayBuilder::new(chain_spec, args.flashblocks_builder_vk, events); + let flashblocks_overlay = flashblocks_overlay_builder.start()?; info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); let handle = builder .node(OpNode::new(rollup_args)) .extend_rpc_modules(move |ctx| { if args.flashblocks_enabled { - let mut flashblocks_overlay = - FlashblocksOverlay::new(args.websocket_url, chain_spec); - flashblocks_overlay.start()?; let eth_api = ctx.registry.eth_api().clone(); let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay); @@ -47,7 +57,6 @@ fn main() { .launch_with_debug_capabilities() .await?; - let (tx, mut rx) = mpsc::unbounded_channel(); let custom_rlpx_handler = FlashblocksProtoHandler { state: FlashblocksP2PState { events: tx }, diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index 689d7ea5..0312fc26 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -1,6 +1,7 @@ use crate::{FlashblocksApi, cache::FlashblocksCache}; use alloy_primitives::{Address, TxHash, U256}; -use futures_util::StreamExt; +use ed25519_dalek::VerifyingKey; +use flashblocks_p2p::protocol::event::FlashblocksP2PEvent; use jsonrpsee::core::async_trait; use op_alloy_network::Optimism; use reth_optimism_chainspec::OpChainSpec; @@ -8,97 +9,58 @@ use reth_rpc_eth_api::{RpcBlock, RpcReceipt}; use rollup_boost::FlashblocksPayloadV1; use std::{io::Read, sync::Arc}; use tokio::sync::mpsc; -use tokio_tungstenite::{connect_async, tungstenite::Message}; use tracing::{debug, error, info}; -use url::Url; + +pub struct FlashblocksOverlayBuilder { + events: mpsc::UnboundedReceiver, + flashblocks_authorizor: VerifyingKey, + cache: FlashblocksCache, +} #[derive(Clone)] pub struct FlashblocksOverlay { - url: Url, cache: FlashblocksCache, } -impl FlashblocksOverlay { - pub fn new(url: Url, chain_spec: Arc) -> Self { +impl FlashblocksOverlayBuilder { + pub fn new( + chain_spec: Arc, + flashblocks_authorizor: VerifyingKey, + events: mpsc::UnboundedReceiver, + ) -> Self { Self { - url, + events, + flashblocks_authorizor, cache: FlashblocksCache::new(chain_spec), } } - pub fn start(&mut self) -> eyre::Result<()> { - let url = self.url.clone(); - let (sender, mut receiver) = mpsc::channel(100); - - tokio::spawn(async move { - let mut backoff = std::time::Duration::from_secs(1); - const MAX_BACKOFF: std::time::Duration = std::time::Duration::from_secs(10); - - loop { - match connect_async(url.as_str()).await { - Ok((ws_stream, _)) => { - info!("WebSocket connection established"); - let (_write, mut read) = ws_stream.split(); - - while let Some(msg) = read.next().await { - debug!("Received message: {:?}", msg); - - match msg { - Ok(Message::Binary(bytes)) => match try_decode_message(&bytes) { - Ok(payload) => { - info!("Received payload: {:?}", payload); - - let _ = sender - .send(InternalMessage::NewPayload(payload)) - .await - .map_err(|e| { - error!("failed to send payload to channel: {}", e); - }); - } - Err(e) => { - error!("failed to parse fb message: {}", e); - } - }, - Ok(Message::Close(e)) => { - error!("WebSocket connection closed: {:?}", e); - break; - } - Err(e) => { - error!("WebSocket connection error: {}", e); - break; - } - _ => {} - } - } - } - Err(e) => { - error!( - "WebSocket connection error, retrying in {:?}: {}", - backoff, e - ); - tokio::time::sleep(backoff).await; - // Double the backoff time, but cap at MAX_BACKOFF - backoff = std::cmp::min(backoff * 2, MAX_BACKOFF); - continue; - } - } - } - }); - + pub fn start(mut self) -> eyre::Result { let cache_cloned = self.cache.clone(); + let overlay = FlashblocksOverlay { + cache: self.cache.clone(), + }; tokio::spawn(async move { - while let Some(message) = receiver.recv().await { + while let Some(message) = self.events.recv().await { match message { - InternalMessage::NewPayload(payload) => { - if let Err(e) = cache_cloned.process_payload(payload) { - error!("failed to process payload: {}", e); + FlashblocksP2PEvent::Established { .. } => todo!(), + FlashblocksP2PEvent::FlashblocksPayloadV1(authorized) => { + match authorized.verify(self.flashblocks_authorizor) { + Ok(_) => { + if let Err(e) = cache_cloned.process_payload(authorized.payload) { + error!("failed to process payload: {}", e); + } + } + Err(e) => { + error!("{e:?}"); + } } } } } }); - Ok(()) + Ok(overlay) } pub fn process_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index 0bfdc080..913662b8 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -58,13 +58,13 @@ pub struct FlashblocksArgs { pub flashblocks_builder_vk: VerifyingKey, } -fn parse_sk(s: &str) -> eyre::Result { +pub fn parse_sk(s: &str) -> eyre::Result { let bytes = <[u8; 32]>::from_hex(s.trim()).context("failed parsing flashblocks_authorization_sk")?; Ok(SigningKey::from_bytes(&bytes)) } -fn parse_vk(s: &str) -> eyre::Result { +pub fn parse_vk(s: &str) -> eyre::Result { let bytes = <[u8; 32]>::from_hex(s.trim()).context("failed parsing flashblocks_builder_vk")?; Ok(VerifyingKey::from_bytes(&bytes)?) } From 36201bacbd84358b90b73c27f17a85834e7258aa Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 10 Jul 2025 08:44:01 -0700 Subject: [PATCH 008/114] FlashblocksNetworkBuilder --- Cargo.lock | 5 +- Cargo.toml | 4 + crates/flashblocks-p2p/Cargo.toml | 5 +- .../flashblocks-p2p/src/connection/handler.rs | 9 +- crates/flashblocks-p2p/src/connection/mod.rs | 9 +- crates/flashblocks-p2p/src/lib.rs | 1 + crates/flashblocks-p2p/src/lib.rs.bak | 187 ------------------ crates/flashblocks-p2p/src/net/mod.rs | 56 ++++++ .../flashblocks-p2p/src/protocol/handler.rs | 31 ++- crates/flashblocks-rpc/src/bin/main.rs | 3 +- crates/flashblocks-rpc/src/tests/mod.rs | 8 +- 11 files changed, 113 insertions(+), 205 deletions(-) delete mode 100644 crates/flashblocks-p2p/src/lib.rs.bak create mode 100644 crates/flashblocks-p2p/src/net/mod.rs diff --git a/Cargo.lock b/Cargo.lock index a53bb020..35e032a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3460,11 +3460,14 @@ dependencies = [ "ed25519-dalek", "eyre", "futures", - "rand_core 0.6.4", "reth", "reth-eth-wire", "reth-ethereum", "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-provider", + "reth-transaction-pool", "rollup-boost", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index c00044b2..39433297 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,10 @@ reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-network = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } # Alloy libraries alloy-rpc-types-engine = "1.0.13" diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index 9ff5d59f..1645cbcf 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -9,6 +9,10 @@ reth.workspace = true reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } reth-network = { workspace = true } +reth-node-api = { workspace = true } +reth-node-builder = { workspace = true } +reth-provider = { workspace = true } +reth-transaction-pool = { workspace = true } # reth-node-builder.workspace = true # reth-optimism-chainspec.workspace = true # reth-optimism-node.workspace = true @@ -26,7 +30,6 @@ reth-network = { workspace = true } ed25519-dalek = { version = "2", features = ["serde"] } -rand_core = "0.6" # for secure RNG blake3 = "1" # fast hashing for payload IDs serde = { version = "1", features = ["derive"] } bincode = "2" # stable, deterministic encoding diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index 0c551974..48e264f0 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -11,12 +11,13 @@ use tokio::sync::mpsc; use tokio_stream::wrappers::UnboundedReceiverStream; /// The connection handler for the flashblocks RLPx protocol. -pub struct FlashblocksConnectionHandler { +pub struct FlashblocksConnectionHandler { pub state: FlashblocksP2PState, + pub network_handle: N, } -impl ConnectionHandler for FlashblocksConnectionHandler { - type Connection = FlashblocksConnection; +impl ConnectionHandler for FlashblocksConnectionHandler { + type Connection = FlashblocksConnection; fn protocol(&self) -> Protocol { FlashblocksProtoMessage::protocol() @@ -48,8 +49,10 @@ impl ConnectionHandler for FlashblocksConnectionHandler { .ok(); FlashblocksConnection { conn, + peer_id, commands: UnboundedReceiverStream::new(rx), state: self.state, + network_handle: self.network_handle, } } } diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index f9479320..70434dff 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -3,7 +3,7 @@ use crate::protocol::{auth::Authorized, event::FlashblocksP2PEvent, handler::Fla use super::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; -use reth_ethereum::network::eth_wire::multiplex::ProtocolConnection; +use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use rollup_boost::FlashblocksPayloadV1; use std::{ pin::Pin, @@ -21,13 +21,15 @@ pub enum FlashblocksCommand { }, } -pub struct FlashblocksConnection { +pub struct FlashblocksConnection { conn: ProtocolConnection, + peer_id: PeerId, commands: UnboundedReceiverStream, state: FlashblocksP2PState, + network_handle: N, } -impl Stream for FlashblocksConnection { +impl Stream for FlashblocksConnection { type Item = BytesMut; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { @@ -56,7 +58,6 @@ impl Stream for FlashblocksConnection { .events .send(FlashblocksP2PEvent::FlashblocksPayloadV1(payload)) .ok(); - continue; } } } diff --git a/crates/flashblocks-p2p/src/lib.rs b/crates/flashblocks-p2p/src/lib.rs index 6373fd3c..9bdbbc9d 100644 --- a/crates/flashblocks-p2p/src/lib.rs +++ b/crates/flashblocks-p2p/src/lib.rs @@ -1,2 +1,3 @@ pub mod connection; +pub mod net; pub mod protocol; diff --git a/crates/flashblocks-p2p/src/lib.rs.bak b/crates/flashblocks-p2p/src/lib.rs.bak deleted file mode 100644 index 2a13bcbe..00000000 --- a/crates/flashblocks-p2p/src/lib.rs.bak +++ /dev/null @@ -1,187 +0,0 @@ -use reth::{ - chainspec::{EthChainSpec as _, Hardforks}, - network::{ - types::BasicNetworkPrimitives, NetworkConfig, NetworkHandle, NetworkManager, - NetworkPrimitives, - }, -}; -use reth_eth_wire::{ - capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol, -}; -/// OpNetworkBuilder impls NetworkBuilder -> NetworkHandle impls NetworkProtocols -/// -/// NetworkConfig has `extra_protocols` -/// -// #![cfg_attr(not(any(test, feature = "test")), warn(unused_crate_dependencies))] -// -// pub mod args; -// pub mod node; -// -// #[cfg(any(feature = "test", test))] -// pub mod test_utils; -use reth_network::protocol::{ConnectionHandler, IntoRlpxSubProtocol, ProtocolHandler}; -use reth_node_api::{PrimitivesTy, TxTy}; -use reth_node_builder::{ - components::{ - BasicPayloadServiceBuilder, ComponentsBuilder, ConsensusBuilder, ExecutorBuilder, - NetworkBuilder, PayloadBuilderBuilder, PoolBuilder, PoolBuilderConfigOverrides, - TxPoolBuilder, - }, - node::{FullNodeTypes, NodeTypes}, - rpc::{ - EngineApiBuilder, EngineValidatorAddOn, EngineValidatorBuilder, EthApiBuilder, Identity, - RethRpcAddOns, RethRpcMiddleware, RethRpcServerHandles, RpcAddOns, RpcContext, RpcHandle, - }, - BuilderContext, DebugNode, Node, NodeAdapter, NodeComponentsBuilder, -}; -use reth_provider::{ - BlockReaderIdExt, ChainSpecProvider, ExecutionOutcome, ProviderError, StateProvider, - StateProviderFactory, -}; -use reth_transaction_pool::{ - blobstore::DiskFileBlobStore, EthPoolTransaction, PeerId, PoolPooledTx, PoolTransaction, - TransactionPool, TransactionValidationTaskExecutor, -}; -use tokio::sync::oneshot; -use tracing::info; - -#[derive(Clone, Debug, Default)] -pub struct FlashblocksProtocolHandler; - -#[derive(Clone, Debug, Default)] -pub struct FlashblocksConnectionHandler; - -/// The connection handler for the custom RLPx protocol. -pub struct FlashblocksConnection { - conn: ProtocolConnection, - initial_ping: Option, - commands: UnboundedReceiverStream, - pending_pong: Option>, -} - -impl ConnectionHandler for FlashblocksConnectionHandler { - type Connection; - - fn protocol(&self) -> Protocol { - todo!() - } - - fn on_unsupported_by_peer( - self, - supported: &SharedCapabilities, - direction: reth_network::Direction, - peer_id: PeerId, - ) -> reth_network::protocol::OnNotSupported { - todo!() - } - - fn into_connection( - self, - direction: reth_network::Direction, - peer_id: PeerId, - conn: ProtocolConnection, - ) -> Self::Connection { - todo!() - } -} - -impl ProtocolHandler for FlashblocksProtocolHandler { - type ConnectionHandler = FlashblocksConnectionHandler; - - fn on_incoming(&self, socket_addr: std::net::SocketAddr) -> Option { - todo!() - } - - fn on_outgoing( - &self, - socket_addr: std::net::SocketAddr, - peer_id: PeerId, - ) -> Option { - todo!() - } -} - -#[derive(Clone, Debug, Default)] -pub struct FlashblocksNetworkBuilder { - /// Disable transaction pool gossip - pub disable_txpool_gossip: bool, - /// Disable discovery v4 - pub disable_discovery_v4: bool, -} - -impl FlashblocksNetworkBuilder { - /// Returns the [`NetworkConfig`] that contains the settings to launch the p2p network. - /// - /// This applies the configured [`OpNetworkBuilder`] settings. - pub fn network_config( - &self, - ctx: &BuilderContext, - ) -> eyre::Result> - where - Node: FullNodeTypes>, - NetworkP: NetworkPrimitives, - { - let Self { - disable_txpool_gossip, - disable_discovery_v4, - .. - } = self.clone(); - let args = &ctx.config().network; - let network_builder = ctx - .network_config_builder()? - // apply discovery settings - .apply(|mut builder| { - let rlpx_socket = (args.addr, args.port).into(); - if disable_discovery_v4 || args.discovery.disable_discovery { - builder = builder.disable_discv4_discovery(); - } - if !args.discovery.disable_discovery { - builder = builder.discovery_v5( - args.discovery.discovery_v5_builder( - rlpx_socket, - ctx.config() - .network - .resolved_bootnodes() - .or_else(|| ctx.chain_spec().bootnodes()) - .unwrap_or_default(), - ), - ); - } - - builder - }); - - let mut network_config = ctx.build_network_config(network_builder); - - // When `sequencer_endpoint` is configured, the node will forward all transactions to a - // Sequencer node for execution and inclusion on L1, and disable its own txpool - // gossip to prevent other parties in the network from learning about them. - network_config.tx_gossip_disabled = disable_txpool_gossip; - - Ok(network_config) - } -} - -impl NetworkBuilder for FlashblocksNetworkBuilder -where - Node: FullNodeTypes>, - Pool: TransactionPool>> - + Unpin - + 'static, -{ - type Network = - NetworkHandle, PoolPooledTx>>; - - async fn build_network( - self, - ctx: &BuilderContext, - pool: Pool, - ) -> eyre::Result { - let network_config = self.network_config(ctx)?; - let network = NetworkManager::builder(network_config).await?; - let handle = ctx.start_network(network, pool); - // info!(target: "reth::cli", enode=%handle.local_node_record(), "P2P networking initialized"); - - Ok(handle) - } -} diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs new file mode 100644 index 00000000..ec9861ed --- /dev/null +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -0,0 +1,56 @@ +use reth::chainspec::Hardforks; +use reth_eth_wire::NetPrimitivesFor; +use reth_ethereum::network::api::FullNetwork; +use reth_network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; +use reth_node_api::{PrimitivesTy, TxTy}; +use reth_node_builder::{ + BuilderContext, + components::NetworkBuilder, + node::{FullNodeTypes, NodeTypes}, +}; +use reth_transaction_pool::{PoolTransaction, TransactionPool}; +use tokio::sync::mpsc; + +use crate::protocol::{ + event::FlashblocksP2PEvent, + handler::{FlashblocksP2PNetworHandle, FlashblocksProtoHandler}, +}; + +#[derive(Clone, Debug)] +pub struct FlashblocksNetworkBuilder { + inner: T, + events: mpsc::UnboundedSender, +} + +impl FlashblocksNetworkBuilder { + /// Creates a new `FlashblocksNetworkBuilder` with the given inner builder and events channel. + pub fn new(inner: T, events: mpsc::UnboundedSender) -> Self { + Self { inner, events } + } +} + +impl NetworkBuilder for FlashblocksNetworkBuilder +where + T: NetworkBuilder, + Node: FullNodeTypes>, + Pool: TransactionPool>> + + Unpin + + 'static, + Network: FlashblocksP2PNetworHandle + + NetworkProtocols + + FullNetwork>>, +{ + type Network = T::Network; + + async fn build_network( + self, + ctx: &BuilderContext, + pool: Pool, + ) -> eyre::Result { + let handle = self.inner.build_network(ctx, pool).await?; + let handler = FlashblocksProtoHandler::::new(handle.clone(), self.events); + handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); + + Ok(handle) + } +} diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 1203a27b..692fb87c 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,9 +1,17 @@ use super::event::FlashblocksP2PEvent; use crate::connection::handler::FlashblocksConnectionHandler; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; +use reth_network::Peers; use std::net::SocketAddr; use tokio::sync::mpsc; +pub(crate) trait FlashblocksP2PNetworHandle: + Clone + Unpin + Peers + std::fmt::Debug + 'static +{ +} + +impl FlashblocksP2PNetworHandle for N {} + /// Protocol state is an helper struct to store the protocol events. #[derive(Clone, Debug)] pub struct FlashblocksP2PState { @@ -12,16 +20,28 @@ pub struct FlashblocksP2PState { /// The protocol handler takes care of incoming and outgoing connections. #[derive(Debug)] -pub struct FlashblocksProtoHandler { +pub struct FlashblocksProtoHandler { pub state: FlashblocksP2PState, + pub network_handle: N, +} + +impl FlashblocksProtoHandler { + /// Creates a new protocol handler with the given state. + pub fn new(network_handle: N, events: mpsc::UnboundedSender) -> Self { + Self { + state: FlashblocksP2PState { events }, + network_handle, + } + } } -impl ProtocolHandler for FlashblocksProtoHandler { - type ConnectionHandler = FlashblocksConnectionHandler; +impl ProtocolHandler for FlashblocksProtoHandler { + type ConnectionHandler = FlashblocksConnectionHandler; fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { - Some(FlashblocksConnectionHandler { + Some(FlashblocksConnectionHandler:: { state: self.state.clone(), + network_handle: self.network_handle.clone(), }) } @@ -30,8 +50,9 @@ impl ProtocolHandler for FlashblocksProtoHandler { _socket_addr: SocketAddr, _peer_id: PeerId, ) -> Option { - Some(FlashblocksConnectionHandler { + Some(FlashblocksConnectionHandler:: { state: self.state.clone(), + network_handle: self.network_handle.clone(), }) } } diff --git a/crates/flashblocks-rpc/src/bin/main.rs b/crates/flashblocks-rpc/src/bin/main.rs index f41a9c85..89eb3548 100644 --- a/crates/flashblocks-rpc/src/bin/main.rs +++ b/crates/flashblocks-rpc/src/bin/main.rs @@ -3,7 +3,7 @@ use clap::Parser; use ed25519_dalek::VerifyingKey; use flashblocks_p2p::protocol::handler::{FlashblocksP2PState, FlashblocksProtoHandler}; -use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, FlashblocksOverlayBuilder}; +use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlayBuilder}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; @@ -59,6 +59,7 @@ pub fn main() { let custom_rlpx_handler = FlashblocksProtoHandler { + network_handle: handle.node.network.clone(), state: FlashblocksP2PState { events: tx }, }; diff --git a/crates/flashblocks-rpc/src/tests/mod.rs b/crates/flashblocks-rpc/src/tests/mod.rs index cc4e99ed..d3ed4227 100644 --- a/crates/flashblocks-rpc/src/tests/mod.rs +++ b/crates/flashblocks-rpc/src/tests/mod.rs @@ -1,6 +1,9 @@ #[cfg(test)] mod tests { - use crate::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, cache::Metadata}; + use crate::{ + EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, FlashblocksOverlayBuilder, + cache::Metadata, + }; use alloy_consensus::Receipt; use alloy_genesis::Genesis; use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; @@ -101,8 +104,7 @@ mod tests { .extend_rpc_modules(move |ctx| { // We are not going to use the websocket connection to send payloads so we use // a dummy url. - let flashblocks_overlay = - FlashblocksOverlay::new(Url::parse("ws://localhost:8546")?, chain_spec); + let flashblocks_overlay = FlashblocksOverlayBuilder::new(chain_spec); let eth_api = ctx.registry.eth_api().clone(); let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay.clone()); From 0dc7064327b1c9b32b0a5874aa6e1d36802cccf0 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 10 Jul 2025 10:02:33 -0700 Subject: [PATCH 009/114] Pull out flashblocks-node --- Cargo.lock | 86 +++++ Cargo.toml | 3 + crates/flashblocks-node/Cargo.toml | 66 ++++ .../src/bin => flashblocks-node/src}/main.rs | 0 .../src/tests/assets/genesis.json | 100 ++++++ crates/flashblocks-node/src/tests/mod.rs | 316 ++++++++++++++++++ crates/flashblocks-rpc/Cargo.toml | 7 - 7 files changed, 571 insertions(+), 7 deletions(-) create mode 100644 crates/flashblocks-node/Cargo.toml rename crates/{flashblocks-rpc/src/bin => flashblocks-node/src}/main.rs (100%) create mode 100644 crates/flashblocks-node/src/tests/assets/genesis.json create mode 100644 crates/flashblocks-node/src/tests/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 35e032a1..9cc86f46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3449,6 +3449,92 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "flashblocks-api" +version = "0.1.0" +dependencies = [ + "alloy-primitives", + "bincode 2.0.1", + "blake3", + "clap", + "ed25519-dalek", + "eyre", + "futures", + "reth", + "reth-eth-wire", + "reth-ethereum", + "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-provider", + "reth-transaction-pool", + "rollup-boost", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "flashblocks-node" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-json-rpc", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "brotli", + "clap", + "ed25519-dalek", + "eyre", + "flashblocks-p2p", + "flashblocks-rpc", + "futures-util", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "metrics-derive", + "op-alloy-consensus 0.18.9", + "op-alloy-network", + "op-alloy-rpc-types", + "reth-db", + "reth-e2e-test-utils", + "reth-eth-wire", + "reth-ethereum", + "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-optimism-chainspec", + "reth-optimism-cli", + "reth-optimism-evm", + "reth-optimism-forks", + "reth-optimism-node", + "reth-optimism-primitives", + "reth-optimism-rpc", + "reth-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-rpc-eth-api", + "reth-rpc-server-types", + "reth-tasks", + "reth-tracing", + "rollup-boost", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "url", +] + [[package]] name = "flashblocks-p2p" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 39433297..f03a9fe1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,11 +8,14 @@ members = [ "crates/websocket-proxy", "crates/flashblocks-rpc", "crates/flashblocks-p2p", + "crates/flashblocks-api", + "crates/flashblocks-node", ] [workspace.dependencies] rollup-boost = { path = "crates/rollup-boost" } flashblocks-p2p = { path = "crates/flashblocks-p2p" } +flashblocks-rpc = { path = "crates/flashblocks-rpc" } tracing = "0.1.4" tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] } diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml new file mode 100644 index 00000000..983f41ae --- /dev/null +++ b/crates/flashblocks-node/Cargo.toml @@ -0,0 +1,66 @@ +[package] +name = "flashblocks-node" +version = "0.1.0" +edition = "2024" +license = "MIT" + +[dependencies] +rollup-boost.workspace = true +flashblocks-p2p.workspace = true +flashblocks-rpc.workspace = true + +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0", features = [ + "test-utils", +] } +reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } + +reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } +reth-eth-wire = { workspace = true } +reth-network = { workspace = true } +ed25519-dalek = { version = "2", features = ["serde"] } + +alloy-eips.workspace = true +alloy-primitives.workspace = true +alloy-json-rpc.workspace = true +alloy-rpc-types.workspace = true +alloy-rpc-types-engine.workspace = true +alloy-rpc-types-eth.workspace = true +alloy-consensus.workspace = true +alloy-genesis.workspace = true +alloy-rpc-client.workspace = true +alloy-provider.workspace = true +op-alloy-network.workspace = true +op-alloy-consensus.workspace = true +op-alloy-rpc-types.workspace = true + +tokio.workspace = true +tokio-tungstenite.workspace = true +url.workspace = true +tracing.workspace = true +clap.workspace = true +eyre.workspace = true +metrics.workspace = true +metrics-derive.workspace = true +serde_json.workspace = true +serde.workspace = true + +jsonrpsee = { version = "0.25.1" } +futures-util = "0.3.31" +brotli = "8.0.1" diff --git a/crates/flashblocks-rpc/src/bin/main.rs b/crates/flashblocks-node/src/main.rs similarity index 100% rename from crates/flashblocks-rpc/src/bin/main.rs rename to crates/flashblocks-node/src/main.rs diff --git a/crates/flashblocks-node/src/tests/assets/genesis.json b/crates/flashblocks-node/src/tests/assets/genesis.json new file mode 100644 index 00000000..4d703497 --- /dev/null +++ b/crates/flashblocks-node/src/tests/assets/genesis.json @@ -0,0 +1,100 @@ +{ + "config": { + "chainId": 8453, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "mergeNetsplitBlock": 0, + "bedrockBlock": 0, + "regolithTime": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true, + "optimism": { + "eip1559Elasticity": 6, + "eip1559Denominator": 50 + } + }, + "nonce": "0x0", + "timestamp": "0x0", + "extraData": "0x00", + "gasLimit": "0x1c9c380", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0x14dc79964da2c08b23698b3d3cc7ca32193d9955": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x1cbd3b2770909d4e10f157cabc84c7264073c9ec": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x2546bcd3c84621e976d8185a91a922ae77ecec30": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x70997970c51812dc3a010c7d01b50e0d17dc79c8": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x71be63f3384f5fb98995898a86b02fb2426c5788": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x90f79bf6eb2c4f870365e785982e1f101e93b906": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x976ea74026e726554db657fa54763abd0c3a0aa9": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc": { + "balance": "0xd3c21bcecceda1000000" + }, + "0x9c41de96b2088cdc640c6182dfcf5491dc574a57": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xa0ee7a142d267c1f36714e4a8f75612f20a79720": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xbcd4042de499d14e55001ccbb24a551f3b954096": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xbda5747bfd65f08deb54cb465eb87d40e51b197e": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xcd3b766ccdd6ae721141f452c550ca635964ce71": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xdd2fd4581271e230360230f9337d5c0430bf44c0": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xdf3e18d64bc6a983f673ab319ccae4f1a57c7097": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": { + "balance": "0xd3c21bcecceda1000000" + }, + "0xfabb0ac9d68b0b445fb7357272ff202c5651694a": { + "balance": "0xd3c21bcecceda1000000" + } + }, + "number": "0x0" +} \ No newline at end of file diff --git a/crates/flashblocks-node/src/tests/mod.rs b/crates/flashblocks-node/src/tests/mod.rs new file mode 100644 index 00000000..d3ed4227 --- /dev/null +++ b/crates/flashblocks-node/src/tests/mod.rs @@ -0,0 +1,316 @@ +#[cfg(test)] +mod tests { + use crate::{ + EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, FlashblocksOverlayBuilder, + cache::Metadata, + }; + use alloy_consensus::Receipt; + use alloy_genesis::Genesis; + use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; + use alloy_provider::{Provider, RootProvider}; + use alloy_rpc_client::RpcClient; + use alloy_rpc_types_engine::PayloadId; + use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; + use reth_node_core::{ + args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}, + exit::NodeExitFuture, + }; + use reth_optimism_chainspec::OpChainSpecBuilder; + use reth_optimism_node::{OpNode, args::RollupArgs}; + use reth_optimism_primitives::OpReceipt; + use reth_provider::providers::BlockchainProvider; + use reth_tasks::TaskManager; + use rollup_boost::{ + ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, + }; + use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; + use tokio::sync::{mpsc, oneshot}; + use url::Url; + + pub struct NodeContext { + sender: mpsc::Sender<(FlashblocksPayloadV1, oneshot::Sender<()>)>, + http_api_addr: SocketAddr, + _node_exit_future: NodeExitFuture, + _node: Box, + _task_manager: TaskManager, + } + + impl NodeContext { + pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { + let (tx, rx) = oneshot::channel(); + self.sender.send((payload, tx)).await?; + rx.await?; + Ok(()) + } + + pub async fn provider(&self) -> eyre::Result { + let url = format!("http://{}", self.http_api_addr); + let client = RpcClient::builder().http(url.parse()?); + + Ok(RootProvider::new(client)) + } + + pub async fn send_test_payloads(&self) -> eyre::Result<()> { + let base_payload = create_first_payload(); + self.send_payload(base_payload).await?; + + let second_payload = create_second_payload(); + self.send_payload(second_payload).await?; + + Ok(()) + } + } + + async fn setup_node() -> eyre::Result { + let tasks = TaskManager::current(); + let exec = tasks.executor(); + + let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); + let chain_spec = Arc::new( + OpChainSpecBuilder::base_mainnet() + .genesis(genesis) + .ecotone_activated() + .build(), + ); + + let network_config = NetworkArgs { + discovery: DiscoveryArgs { + disable_discovery: true, + ..DiscoveryArgs::default() + }, + ..NetworkArgs::default() + }; + + // Use with_unused_ports() to let Reth allocate random ports and avoid port collisions + let node_config = NodeConfig::new(chain_spec.clone()) + .with_network(network_config.clone()) + .with_rpc(RpcServerArgs::default().with_unused_ports().with_http()) + .with_unused_ports(); + + let node = OpNode::new(RollupArgs::default()); + + // Start websocket server to simulate the builder and send payloads back to the node + let (sender, mut receiver) = + mpsc::channel::<(FlashblocksPayloadV1, oneshot::Sender<()>)>(100); + + let NodeHandle { + node, + node_exit_future, + } = NodeBuilder::new(node_config.clone()) + .testing_node(exec.clone()) + .with_types_and_provider::>() + .with_components(node.components_builder()) + .with_add_ons(node.add_ons()) + .extend_rpc_modules(move |ctx| { + // We are not going to use the websocket connection to send payloads so we use + // a dummy url. + let flashblocks_overlay = FlashblocksOverlayBuilder::new(chain_spec); + + let eth_api = ctx.registry.eth_api().clone(); + let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay.clone()); + + ctx.modules.replace_configured(api_ext.into_rpc())?; + + tokio::spawn(async move { + while let Some((payload, tx)) = receiver.recv().await { + flashblocks_overlay.process_payload(payload).unwrap(); + tx.send(()).unwrap(); + } + }); + + Ok(()) + }) + .launch() + .await?; + + let http_api_addr = node + .rpc_server_handle() + .http_local_addr() + .ok_or_else(|| eyre::eyre!("Failed to get http api address"))?; + + Ok(NodeContext { + sender, + http_api_addr, + _node_exit_future: node_exit_future, + _node: Box::new(node), + _task_manager: tasks, + }) + } + + fn create_first_payload() -> FlashblocksPayloadV1 { + FlashblocksPayloadV1 { + payload_id: PayloadId::new([0; 8]), + index: 0, + base: Some(ExecutionPayloadBaseV1 { + parent_beacon_block_root: B256::default(), + parent_hash: B256::default(), + fee_recipient: Address::ZERO, + prev_randao: B256::default(), + block_number: 1, + gas_limit: 0, + timestamp: 0, + extra_data: Bytes::new(), + base_fee_per_gas: U256::ZERO, + }), + diff: ExecutionPayloadFlashblockDeltaV1::default(), + metadata: serde_json::to_value(Metadata { + block_number: 1, + receipts: HashMap::default(), + new_account_balances: HashMap::default(), + }) + .unwrap(), + } + } + + const TEST_ADDRESS: Address = address!("0x1234567890123456789012345678901234567890"); + const PENDING_BALANCE: u64 = 4600; + + const TX1_HASH: TxHash = + b256!("0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548"); + const TX2_HASH: TxHash = + b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); + + fn create_second_payload() -> FlashblocksPayloadV1 { + // Create second payload (index 1) with transactions + // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) + // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 + let tx1 = Bytes::from_str("0x7ef8f8a042a8ae5ec231af3d0f90f68543ec8bca1da4f7edd712d5b51b490688355a6db794deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000044d000a118b00000000000000040000000067cb7cb0000000000077dbd4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014edd27304108914dd6503b19b9eeb9956982ef197febbeeed8a9eac3dbaaabdf000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3").unwrap(); + let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); + + // Send another test flashblock payload + let payload = FlashblocksPayloadV1 { + payload_id: PayloadId::new([0; 8]), + index: 1, + base: None, + diff: ExecutionPayloadFlashblockDeltaV1 { + state_root: B256::default(), + receipts_root: B256::default(), + gas_used: 0, + block_hash: B256::default(), + transactions: vec![tx1, tx2], + withdrawals: Vec::new(), + logs_bloom: Default::default(), + withdrawals_root: Default::default(), + }, + metadata: serde_json::to_value(Metadata { + block_number: 1, + receipts: { + let mut receipts = HashMap::default(); + receipts.insert( + TX1_HASH.to_string(), // transaction hash as string + OpReceipt::Legacy(Receipt { + status: true.into(), + cumulative_gas_used: 21000, + logs: vec![], + }), + ); + receipts.insert( + TX2_HASH.to_string(), // transaction hash as string + OpReceipt::Legacy(Receipt { + status: true.into(), + cumulative_gas_used: 45000, + logs: vec![], + }), + ); + receipts + }, + new_account_balances: { + let mut map = HashMap::default(); + map.insert( + TEST_ADDRESS.to_string(), + format!("0x{:x}", U256::from(PENDING_BALANCE)), + ); + map + }, + }) + .unwrap(), + }; + + payload + } + + #[tokio::test] + async fn test_get_block_by_number_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node().await?; + let provider = node.provider().await?; + + let latest_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) + .await? + .expect("latest block expected"); + assert_eq!(latest_block.number(), 0); + + // Querying pending block when it does not exists yet + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await?; + assert_eq!(pending_block.is_none(), true); + + let base_payload = create_first_payload(); + node.send_payload(base_payload).await?; + + // Query pending block after sending the base payload with an empty delta + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(pending_block.number(), 1); + assert_eq!(pending_block.transactions.hashes().len(), 0); + + let second_payload = create_second_payload(); + node.send_payload(second_payload).await?; + + // Query pending block after sending the second payload with two transactions + let block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(block.number(), 1); + assert_eq!(block.transactions.hashes().len(), 2); + + Ok(()) + } + + #[tokio::test] + async fn test_get_balance_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node().await?; + let provider = node.provider().await?; + + node.send_test_payloads().await?; + + let balance = provider.get_balance(TEST_ADDRESS).await?; + assert_eq!(balance, U256::ZERO); + + let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; + assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); + + Ok(()) + } + + #[tokio::test] + async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node().await?; + let provider = node.provider().await?; + + let receipt = provider.get_transaction_receipt(TX1_HASH).await?; + assert_eq!(receipt.is_none(), true); + + node.send_test_payloads().await?; + + let receipt = provider + .get_transaction_receipt(TX1_HASH) + .await? + .expect("receipt expected"); + assert_eq!(receipt.gas_used, 21000); + + // TODO: Add a new payload and validate that the receipts from the previous payload + // are not returned. + + Ok(()) + } +} diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 51525cdc..0e30b946 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -63,10 +63,3 @@ serde.workspace = true jsonrpsee = { version = "0.25.1" } futures-util = "0.3.31" brotli = "8.0.1" - -[[bin]] -name = "flashblocks-rpc" -path = "src/bin/main.rs" - -[lib] -path = "src/lib.rs" From e94925ec66107c284b0d8a313533fb1904c1f2ad Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 10 Jul 2025 10:55:40 -0700 Subject: [PATCH 010/114] add timestamp to Authorization --- crates/flashblocks-p2p/src/protocol/handler.rs | 3 +++ crates/rollup-boost/src/client/rpc.rs | 7 ++++++- crates/rollup-boost/src/server.rs | 7 ++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 692fb87c..fedd14bc 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,7 +1,10 @@ use super::event::FlashblocksP2PEvent; +use crate::connection::FlashblocksCommand; use crate::connection::handler::FlashblocksConnectionHandler; +use crate::protocol::auth::Authorized; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; use reth_network::Peers; +use rollup_boost::FlashblocksPayloadV1; use std::net::SocketAddr; use tokio::sync::mpsc; diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index d1ef6843..b8b10a20 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -172,7 +172,12 @@ impl RpcClient { ) { (Some(attrs), Some(sk), Some(pk)) => { let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attrs, 3); - let authorization = Authorization::new(sk, pk.clone(), payload_id); + let authorization = Authorization::new( + payload_id, + attrs.payload_attributes.timestamp, + sk, + pk.clone(), + ); self.auth_client .fork_choice_updated_flashblocks_v1( fork_choice_state, diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index 12dd91ab..1ae8f7c4 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -290,23 +290,27 @@ where #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Authorization { pub payload_id: PayloadId, + pub timestamp: u64, pub builder_pub: VerifyingKey, pub authorizer_sig: Signature, } impl Authorization { pub fn new( + payload_id: PayloadId, + timestamp: u64, authorizer_sk: &SigningKey, builder_pub: VerifyingKey, - payload_id: PayloadId, ) -> Self { let mut msg = payload_id.0.to_vec(); + msg.extend_from_slice(×tamp.to_le_bytes()); msg.extend_from_slice(builder_pub.as_bytes()); let hash = blake3::hash(&msg); let sig = authorizer_sk.sign(hash.as_bytes()); Self { payload_id, + timestamp, builder_pub, authorizer_sig: sig, } @@ -314,6 +318,7 @@ impl Authorization { pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { let mut msg = self.payload_id.0.to_vec(); + msg.extend_from_slice(&self.timestamp.to_le_bytes()); msg.extend_from_slice(self.builder_pub.as_bytes()); let hash = blake3::hash(&msg); authorizer_pub From dc15ab18266e67d76657d94134c2f95a65b37362 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 11:50:55 -0700 Subject: [PATCH 011/114] wip --- .../flashblocks-p2p/src/protocol/handler.rs | 144 ++++++++++++++++-- 1 file changed, 130 insertions(+), 14 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index fedd14bc..2794d31c 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -2,10 +2,13 @@ use super::event::FlashblocksP2PEvent; use crate::connection::FlashblocksCommand; use crate::connection::handler::FlashblocksConnectionHandler; use crate::protocol::auth::Authorized; +use ed25519_dalek::VerifyingKey; +use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; use reth_network::Peers; use rollup_boost::FlashblocksPayloadV1; use std::net::SocketAddr; +use tokio::sync::broadcast; use tokio::sync::mpsc; pub(crate) trait FlashblocksP2PNetworHandle: @@ -16,25 +19,140 @@ pub(crate) trait FlashblocksP2PNetworHandle: impl FlashblocksP2PNetworHandle for N {} /// Protocol state is an helper struct to store the protocol events. -#[derive(Clone, Debug)] -pub struct FlashblocksP2PState { - pub events: mpsc::UnboundedSender, +#[derive(Debug)] +pub struct FlashblocksP2PState { + /// Networkd handle, used to update peer state. + pub network_handle: N, + /// Authorizer verifying, used to verify flashblocks payloads. + pub authorizer_vk: VerifyingKey, + /// Sender of verified and strictly ordered flashbloacks payloads. + /// For consumption by the rpc overlay. + pub flashblock_stream: broadcast::Sender, + /// Sender for newly received and validated flashblocks payloads + /// which will be broadcasted to all peers. May not be strictly ordered. + pub broadcast_tx: broadcast::Sender, + /// Verified flashblock payloads received by peers. + /// May not be strictly ordered. + pub inbound_rx: mpsc::UnboundedReceiver, + /// The index of the next flashblock to emit. + pub flashblock_index: usize, + /// Timestamp of the most recent flashblocks payload. + pub payload_timestamp: u64, + /// Most recent payload id. + pub payload_id: PayloadId, + /// Buffer of flashblocks for the current payload. + pub flashblocks: Vec>, +} + +impl FlashblocksP2PState { + pub fn run(mut self) { + tokio::spawn(async move { + while let Some(event) = self.inbound_rx.recv().await { + match event { + FlashblocksCommand::FlashblocksPayloadV1 { payload } => { + // TODO: might make sense to perform verification in a separate task + if let Err(e) = payload.verify(self.authorizer_vk) { + tracing::warn!( + "Failed to verify flashblocks payload: {:?}, error: {}", + payload, + e + ); + // TODO: ban peer + continue; + } + if payload.authorization.timestamp < self.payload_timestamp { + tracing::warn!( + "Received flashblocks payload with outdated timestamp: {}", + payload.authorization.timestamp + ); + // TODO: handle peer + continue; + } + // Check if this is a new payload + if payload.authorization.timestamp > self.payload_timestamp { + self.flashblock_index = 0; + self.payload_timestamp = payload.authorization.timestamp; + self.payload_id = payload.payload.payload_id; + self.flashblocks.clear(); + } + // If we've already seen this index, skip it + // Otherwise, add it to the list + // TODO: perhaps check max index + self.flashblocks + .resize_with(payload.payload.index as usize + 1, || None); + let flashblock = &mut self.flashblocks[payload.payload.index as usize]; + if flashblock.is_none() { + // We haven't seen this index yet + // Add the flashblock to our cache + *flashblock = + Some(FlashblocksP2PEvent::FlashblocksPayloadV1(payload.clone())); + tracing::debug!( + "Received flashblocks payload with id: {}, index: {}", + payload.payload.payload_id, + payload.payload.index + ); + // Broadcast the flashblock to all peers, possible our of order + self.broadcast_tx.send(payload).ok(); + // Broadcast any flashblocks in the cache that are in order + // for i in self.flashblock_index..self.flashblocks.len() { + // if let Some(flashblock_event) = &self.flashblocks[i] { + // // Send the flashblock to the stream + // self.flashblock_stream.send(flashblock_event.clone()).ok(); + // // Update the index + // self.flashblock_index = i + 1; + // } else { + // // No more flashblocks in order, break + // break; + // } + // } + while let Some(Some(flashblock_event)) = + self.flashblocks.get(self.flashblock_index) + { + // Send the flashblock to the stream + self.flashblock_stream.send(flashblock_event).ok(); + // Update the index + self.flashblock_index += 1; + } + } + } + } + } + }); + } } /// The protocol handler takes care of incoming and outgoing connections. #[derive(Debug)] -pub struct FlashblocksProtoHandler { - pub state: FlashblocksP2PState, - pub network_handle: N, +pub struct FlashblocksProtoHandler { + /// Sender of verified and strictly ordered flashbloacks payloads. + /// For consumption by the rpc overlay. + pub flashblock_stream: mpsc::UnboundedSender, + /// Sender for newly received and validated flashblocks payloads + /// which will be broadcasted to all peers. May not be strictly ordered. + pub broadcast_tx: broadcast::Sender, + /// Verified flashblock payloads received by peers. + /// May not be strictly ordered. + pub inbound_rx: mpsc::UnboundedReceiver, } -impl FlashblocksProtoHandler { +impl FlashblocksProtoHandler { /// Creates a new protocol handler with the given state. - pub fn new(network_handle: N, events: mpsc::UnboundedSender) -> Self { - Self { - state: FlashblocksP2PState { events }, - network_handle, - } + pub fn new( + network_handle: N, + flashblock_stream: broadcast::Sender, + ) -> Self { + let (broadcast_tx, broadcast_rx) = broadcast::channel(100); + let (inbound_tx, inbound_rx) = mpsc::unbounded_channel(); + let state = FlashblocksP2PState { + flashblock_stream, + broadcast_tx, + inbound_rx, + payload_timestamp: 0, + payload_id: PayloadId::default(), + flashblocks: vec![], + }; + state.run(); + Self { network_handle } } } @@ -43,7 +161,6 @@ impl ProtocolHandler for FlashblocksProtoHandler< fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { Some(FlashblocksConnectionHandler:: { - state: self.state.clone(), network_handle: self.network_handle.clone(), }) } @@ -54,7 +171,6 @@ impl ProtocolHandler for FlashblocksProtoHandler< _peer_id: PeerId, ) -> Option { Some(FlashblocksConnectionHandler:: { - state: self.state.clone(), network_handle: self.network_handle.clone(), }) } From 677574a8d7336991b180047dbe0cd5158e964173 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 12:45:40 -0700 Subject: [PATCH 012/114] wip --- .../flashblocks-p2p/src/connection/handler.rs | 35 +++++++------ crates/flashblocks-p2p/src/connection/mod.rs | 21 ++++---- crates/flashblocks-p2p/src/protocol/event.rs | 16 ------ .../flashblocks-p2p/src/protocol/handler.rs | 49 +++++++------------ crates/flashblocks-p2p/src/protocol/mod.rs | 1 - 5 files changed, 49 insertions(+), 73 deletions(-) delete mode 100644 crates/flashblocks-p2p/src/protocol/event.rs diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index 48e264f0..4d8ade45 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -1,18 +1,25 @@ use super::FlashblocksConnection; use crate::protocol::{ - event::FlashblocksP2PEvent, handler::FlashblocksP2PState, proto::FlashblocksProtoMessage, + event::FlashblocksP2PEvent, + handler::FlashblocksP2PState, + proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}, }; use reth_ethereum::network::{ api::{Direction, PeerId}, eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, protocol::{ConnectionHandler, OnNotSupported}, }; -use tokio::sync::mpsc; -use tokio_stream::wrappers::UnboundedReceiverStream; +use tokio::sync::{ + broadcast, + mpsc::{self, UnboundedSender}, +}; +use tokio_stream::wrappers::{BroadcastStream, UnboundedReceiverStream}; /// The connection handler for the flashblocks RLPx protocol. pub struct FlashblocksConnectionHandler { - pub state: FlashblocksP2PState, + // pub state: FlashblocksP2PState, + pub inbound_tx: mpsc::UnboundedSender, + pub outbound_rx: broadcast::Receiver, pub network_handle: N, } @@ -39,19 +46,19 @@ impl ConnectionHandler for FlashblocksConnecti conn: ProtocolConnection, ) -> Self::Connection { let (tx, rx) = mpsc::unbounded_channel(); - self.state - .events - .send(FlashblocksP2PEvent::Established { - direction, - peer_id, - to_connection: tx, - }) - .ok(); + // self.state + // .flashblock_stream + // .send(FlashblocksP2PEvent::Established { + // direction, + // peer_id, + // to_connection: tx, + // }) + // .ok(); FlashblocksConnection { conn, peer_id, - commands: UnboundedReceiverStream::new(rx), - state: self.state, + inbound_tx: self.inbound_tx.clone(), + outbound_rx: BroadcastStream::new(self.outbound_rx.clone()), network_handle: self.network_handle, } } diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index 70434dff..050ec6fd 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -9,23 +9,22 @@ use std::{ pin::Pin, task::{Context, Poll, ready}, }; -use tokio_stream::wrappers::UnboundedReceiverStream; +use tokio::sync::{broadcast, mpsc}; +use tokio_stream::wrappers::{BroadcastStream, UnboundedReceiverStream}; pub(crate) mod handler; /// We define some custom commands that the subprotocol supports. -pub enum FlashblocksCommand { - /// Sends a flashblocks payload to the peer - FlashblocksPayloadV1 { - payload: Authorized, - }, +pub struct IncomingPeerMessage { + peer_id: PeerId, + msg: FlashblocksProtoMessageKind, } pub struct FlashblocksConnection { conn: ProtocolConnection, peer_id: PeerId, - commands: UnboundedReceiverStream, - state: FlashblocksP2PState, + inbound_tx: mpsc::UnboundedSender, + outbound_rx: BroadcastStream, network_handle: N, } @@ -36,9 +35,9 @@ impl Stream for FlashblocksConnection { let this = self.get_mut(); loop { - if let Poll::Ready(Some(cmd)) = this.commands.poll_next_unpin(cx) { + if let Poll::Ready(Some(cmd)) = this.outbound_rx.poll_next_unpin(cx) { return match cmd { - FlashblocksCommand::FlashblocksPayloadV1 { payload } => Poll::Ready(Some( + FlashblocksIncoming::FlashblocksPayloadV1 { payload } => Poll::Ready(Some( FlashblocksProtoMessage::flashblocks_payload(payload).encoded(), )), }; @@ -55,7 +54,7 @@ impl Stream for FlashblocksConnection { match msg.message { FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { this.state - .events + .flashblock_stream .send(FlashblocksP2PEvent::FlashblocksPayloadV1(payload)) .ok(); } diff --git a/crates/flashblocks-p2p/src/protocol/event.rs b/crates/flashblocks-p2p/src/protocol/event.rs deleted file mode 100644 index 180d5c0e..00000000 --- a/crates/flashblocks-p2p/src/protocol/event.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{connection::FlashblocksCommand, protocol::auth::Authorized}; -use reth_ethereum::network::{Direction, api::PeerId}; -use rollup_boost::FlashblocksPayloadV1; -use tokio::sync::mpsc; - -/// The events that can be emitted by our custom protocol. -#[derive(Debug)] -pub enum FlashblocksP2PEvent { - Established { - #[expect(dead_code)] - direction: Direction, - peer_id: PeerId, - to_connection: mpsc::UnboundedSender, - }, - FlashblocksPayloadV1(Authorized), -} diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 2794d31c..9956a822 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,7 +1,6 @@ -use super::event::FlashblocksP2PEvent; -use crate::connection::FlashblocksCommand; use crate::connection::handler::FlashblocksConnectionHandler; -use crate::protocol::auth::Authorized; +use crate::protocol::proto::FlashblocksProtoMessage; +use crate::protocol::proto::FlashblocksProtoMessageKind; use ed25519_dalek::VerifyingKey; use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; @@ -27,13 +26,13 @@ pub struct FlashblocksP2PState { pub authorizer_vk: VerifyingKey, /// Sender of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. - pub flashblock_stream: broadcast::Sender, - /// Sender for newly received and validated flashblocks payloads - /// which will be broadcasted to all peers. May not be strictly ordered. - pub broadcast_tx: broadcast::Sender, + pub flashblock_stream: broadcast::Sender, /// Verified flashblock payloads received by peers. /// May not be strictly ordered. - pub inbound_rx: mpsc::UnboundedReceiver, + pub inbound_rx: mpsc::UnboundedReceiver, + /// Sender for newly received and validated flashblocks payloads + /// which will be broadcasted to all peers. May not be strictly ordered. + pub outbound_tx: broadcast::Sender, /// The index of the next flashblock to emit. pub flashblock_index: usize, /// Timestamp of the most recent flashblocks payload. @@ -41,15 +40,15 @@ pub struct FlashblocksP2PState { /// Most recent payload id. pub payload_id: PayloadId, /// Buffer of flashblocks for the current payload. - pub flashblocks: Vec>, + pub flashblocks: Vec>, } impl FlashblocksP2PState { pub fn run(mut self) { tokio::spawn(async move { - while let Some(event) = self.inbound_rx.recv().await { - match event { - FlashblocksCommand::FlashblocksPayloadV1 { payload } => { + while let Some(msg) = self.inbound_rx.recv().await { + match &msg.message { + FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { // TODO: might make sense to perform verification in a separate task if let Err(e) = payload.verify(self.authorizer_vk) { tracing::warn!( @@ -84,32 +83,20 @@ impl FlashblocksP2PState { if flashblock.is_none() { // We haven't seen this index yet // Add the flashblock to our cache - *flashblock = - Some(FlashblocksP2PEvent::FlashblocksPayloadV1(payload.clone())); + *flashblock = Some(payload.clone().payload); tracing::debug!( "Received flashblocks payload with id: {}, index: {}", payload.payload.payload_id, payload.payload.index ); // Broadcast the flashblock to all peers, possible our of order - self.broadcast_tx.send(payload).ok(); + self.outbound_tx.send(msg).unwrap(); // Broadcast any flashblocks in the cache that are in order - // for i in self.flashblock_index..self.flashblocks.len() { - // if let Some(flashblock_event) = &self.flashblocks[i] { - // // Send the flashblock to the stream - // self.flashblock_stream.send(flashblock_event.clone()).ok(); - // // Update the index - // self.flashblock_index = i + 1; - // } else { - // // No more flashblocks in order, break - // break; - // } - // } while let Some(Some(flashblock_event)) = self.flashblocks.get(self.flashblock_index) { // Send the flashblock to the stream - self.flashblock_stream.send(flashblock_event).ok(); + self.flashblock_stream.send(flashblock_event.clone()).ok(); // Update the index self.flashblock_index += 1; } @@ -126,13 +113,13 @@ impl FlashblocksP2PState { pub struct FlashblocksProtoHandler { /// Sender of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. - pub flashblock_stream: mpsc::UnboundedSender, + pub flashblock_stream: mpsc::UnboundedSender, /// Sender for newly received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub broadcast_tx: broadcast::Sender, + pub broadcast_tx: broadcast::Sender, /// Verified flashblock payloads received by peers. /// May not be strictly ordered. - pub inbound_rx: mpsc::UnboundedReceiver, + pub inbound_rx: mpsc::UnboundedReceiver, } impl FlashblocksProtoHandler { @@ -145,7 +132,7 @@ impl FlashblocksProtoHandler { let (inbound_tx, inbound_rx) = mpsc::unbounded_channel(); let state = FlashblocksP2PState { flashblock_stream, - broadcast_tx, + outbound_tx: broadcast_tx, inbound_rx, payload_timestamp: 0, payload_id: PayloadId::default(), diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs index a5ccda34..326178a9 100644 --- a/crates/flashblocks-p2p/src/protocol/mod.rs +++ b/crates/flashblocks-p2p/src/protocol/mod.rs @@ -1,4 +1,3 @@ pub mod auth; -pub mod event; pub mod handler; pub mod proto; From 9c3667a4a6848605fbb10c0485151e7b288c54f5 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 12:53:02 -0700 Subject: [PATCH 013/114] wip --- .../flashblocks-p2p/src/protocol/handler.rs | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 9956a822..a5d2d574 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -111,35 +111,44 @@ impl FlashblocksP2PState { /// The protocol handler takes care of incoming and outgoing connections. #[derive(Debug)] pub struct FlashblocksProtoHandler { - /// Sender of verified and strictly ordered flashbloacks payloads. - /// For consumption by the rpc overlay. - pub flashblock_stream: mpsc::UnboundedSender, + // /// Sender of verified and strictly ordered flashbloacks payloads. + // /// For consumption by the rpc overlay. + // pub flashblock_stream: broadcast::Sender, /// Sender for newly received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub broadcast_tx: broadcast::Sender, + pub outbound_rx: broadcast::Receiver, /// Verified flashblock payloads received by peers. /// May not be strictly ordered. - pub inbound_rx: mpsc::UnboundedReceiver, + pub inbound_tx: mpsc::UnboundedSender, } -impl FlashblocksProtoHandler { +impl FlashblocksProtoHandler { /// Creates a new protocol handler with the given state. - pub fn new( + pub fn new( network_handle: N, - flashblock_stream: broadcast::Sender, + authorizer_vk: VerifyingKey, + flashblock_stream: broadcast::Sender, ) -> Self { - let (broadcast_tx, broadcast_rx) = broadcast::channel(100); + let (outbound_tx, outbound_rx) = broadcast::channel(100); let (inbound_tx, inbound_rx) = mpsc::unbounded_channel(); let state = FlashblocksP2PState { + network_handle, + authorizer_vk, flashblock_stream, - outbound_tx: broadcast_tx, inbound_rx, + outbound_tx, + flashblock_index: 0, payload_timestamp: 0, payload_id: PayloadId::default(), flashblocks: vec![], }; state.run(); - Self { network_handle } + + Self { + // flashblock_stream, + outbound_rx, + inbound_tx, + } } } From 99447989d67a2a37f3e0acc6cfe589f96534225c Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 13:04:54 -0700 Subject: [PATCH 014/114] wip --- .../flashblocks-p2p/src/connection/handler.rs | 24 ++++-------------- crates/flashblocks-p2p/src/connection/mod.rs | 7 +++--- crates/flashblocks-p2p/src/net/mod.rs | 20 +++++++++------ .../flashblocks-p2p/src/protocol/handler.rs | 25 +++++++++++-------- 4 files changed, 34 insertions(+), 42 deletions(-) diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index 4d8ade45..bfe78517 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -1,9 +1,5 @@ use super::FlashblocksConnection; -use crate::protocol::{ - event::FlashblocksP2PEvent, - handler::FlashblocksP2PState, - proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}, -}; +use crate::protocol::proto::FlashblocksProtoMessage; use reth_ethereum::network::{ api::{Direction, PeerId}, eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, @@ -11,16 +7,15 @@ use reth_ethereum::network::{ }; use tokio::sync::{ broadcast, - mpsc::{self, UnboundedSender}, + mpsc::{self}, }; -use tokio_stream::wrappers::{BroadcastStream, UnboundedReceiverStream}; +use tokio_stream::wrappers::BroadcastStream; /// The connection handler for the flashblocks RLPx protocol. pub struct FlashblocksConnectionHandler { - // pub state: FlashblocksP2PState, + pub network_handle: N, pub inbound_tx: mpsc::UnboundedSender, pub outbound_rx: broadcast::Receiver, - pub network_handle: N, } impl ConnectionHandler for FlashblocksConnectionHandler { @@ -45,20 +40,11 @@ impl ConnectionHandler for FlashblocksConnecti peer_id: PeerId, conn: ProtocolConnection, ) -> Self::Connection { - let (tx, rx) = mpsc::unbounded_channel(); - // self.state - // .flashblock_stream - // .send(FlashblocksP2PEvent::Established { - // direction, - // peer_id, - // to_connection: tx, - // }) - // .ok(); FlashblocksConnection { conn, peer_id, inbound_tx: self.inbound_tx.clone(), - outbound_rx: BroadcastStream::new(self.outbound_rx.clone()), + outbound_rx: BroadcastStream::new(self.outbound_rx.resubscribe()), network_handle: self.network_handle, } } diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index 050ec6fd..a6617500 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -1,16 +1,15 @@ -use crate::protocol::{auth::Authorized, event::FlashblocksP2PEvent, handler::FlashblocksP2PState}; +use crate::protocol::{auth::Authorized, handler::FlashblocksP2PState}; use super::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; -use rollup_boost::FlashblocksPayloadV1; use std::{ pin::Pin, task::{Context, Poll, ready}, }; -use tokio::sync::{broadcast, mpsc}; -use tokio_stream::wrappers::{BroadcastStream, UnboundedReceiverStream}; +use tokio::sync::mpsc; +use tokio_stream::wrappers::BroadcastStream; pub(crate) mod handler; diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index ec9861ed..e0beca19 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -1,3 +1,4 @@ +use ed25519_dalek::VerifyingKey; use reth::chainspec::Hardforks; use reth_eth_wire::NetPrimitivesFor; use reth_ethereum::network::api::FullNetwork; @@ -9,22 +10,21 @@ use reth_node_builder::{ node::{FullNodeTypes, NodeTypes}, }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use tokio::sync::mpsc; +use rollup_boost::FlashblocksPayloadV1; +use tokio::sync::{broadcast, mpsc}; -use crate::protocol::{ - event::FlashblocksP2PEvent, - handler::{FlashblocksP2PNetworHandle, FlashblocksProtoHandler}, -}; +use crate::protocol::handler::{FlashblocksP2PNetworHandle, FlashblocksProtoHandler}; #[derive(Clone, Debug)] pub struct FlashblocksNetworkBuilder { inner: T, - events: mpsc::UnboundedSender, + authorizer_vk: VerifyingKey, + events: broadcast::Sender, } impl FlashblocksNetworkBuilder { /// Creates a new `FlashblocksNetworkBuilder` with the given inner builder and events channel. - pub fn new(inner: T, events: mpsc::UnboundedSender) -> Self { + pub fn new(inner: T, events: broadcast::Sender) -> Self { Self { inner, events } } } @@ -48,7 +48,11 @@ where pool: Pool, ) -> eyre::Result { let handle = self.inner.build_network(ctx, pool).await?; - let handler = FlashblocksProtoHandler::::new(handle.clone(), self.events); + let handler = FlashblocksProtoHandler::::new( + handle.clone(), + self.authorizer_vk, + self.events, + ); handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); Ok(handle) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index a5d2d574..b6c753e0 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -110,21 +110,20 @@ impl FlashblocksP2PState { /// The protocol handler takes care of incoming and outgoing connections. #[derive(Debug)] -pub struct FlashblocksProtoHandler { - // /// Sender of verified and strictly ordered flashbloacks payloads. - // /// For consumption by the rpc overlay. - // pub flashblock_stream: broadcast::Sender, - /// Sender for newly received and validated flashblocks payloads - /// which will be broadcasted to all peers. May not be strictly ordered. - pub outbound_rx: broadcast::Receiver, +pub struct FlashblocksProtoHandler { + /// Network handle, used to update peer state. + pub network_handle: N, /// Verified flashblock payloads received by peers. /// May not be strictly ordered. pub inbound_tx: mpsc::UnboundedSender, + /// Sender for newly received and validated flashblocks payloads + /// which will be broadcasted to all peers. May not be strictly ordered. + pub outbound_rx: broadcast::Receiver, } -impl FlashblocksProtoHandler { +impl FlashblocksProtoHandler { /// Creates a new protocol handler with the given state. - pub fn new( + pub fn new( network_handle: N, authorizer_vk: VerifyingKey, flashblock_stream: broadcast::Sender, @@ -132,7 +131,7 @@ impl FlashblocksProtoHandler { let (outbound_tx, outbound_rx) = broadcast::channel(100); let (inbound_tx, inbound_rx) = mpsc::unbounded_channel(); let state = FlashblocksP2PState { - network_handle, + network_handle: network_handle.clone(), authorizer_vk, flashblock_stream, inbound_rx, @@ -145,7 +144,7 @@ impl FlashblocksProtoHandler { state.run(); Self { - // flashblock_stream, + network_handle, outbound_rx, inbound_tx, } @@ -158,6 +157,8 @@ impl ProtocolHandler for FlashblocksProtoHandler< fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), + inbound_tx: self.inbound_tx.clone(), + outbound_rx: self.outbound_rx.resubscribe(), }) } @@ -168,6 +169,8 @@ impl ProtocolHandler for FlashblocksProtoHandler< ) -> Option { Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), + inbound_tx: self.inbound_tx.clone(), + outbound_rx: self.outbound_rx.resubscribe(), }) } } From 1d0e8adac6221b405b954ba2041d281312b94203 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 13:29:51 -0700 Subject: [PATCH 015/114] wip --- crates/flashblocks-p2p/src/connection/mod.rs | 41 +++++++++++--------- crates/flashblocks-p2p/src/net/mod.rs | 14 +++++-- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index a6617500..0216ca50 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -1,5 +1,3 @@ -use crate::protocol::{auth::Authorized, handler::FlashblocksP2PState}; - use super::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; @@ -34,30 +32,37 @@ impl Stream for FlashblocksConnection { let this = self.get_mut(); loop { - if let Poll::Ready(Some(cmd)) = this.outbound_rx.poll_next_unpin(cx) { - return match cmd { - FlashblocksIncoming::FlashblocksPayloadV1 { payload } => Poll::Ready(Some( - FlashblocksProtoMessage::flashblocks_payload(payload).encoded(), - )), - }; + // Check if there are any flashblocks ready to broadcast to our peers. + if let Poll::Ready(Some(res)) = this.outbound_rx.poll_next_unpin(cx) { + match res { + Ok(outbound) => { + return Poll::Ready(Some(outbound.encoded())); + } + Err(e) => { + tracing::error!( + "Failed to receive flashblocks message from broadcast stream: {}", + e + ); + } + } } + // Check if there are any messages from the peer. let Some(msg) = ready!(this.conn.poll_next_unpin(cx)) else { return Poll::Ready(None); }; - let Some(msg) = FlashblocksProtoMessage::decode_message(&mut &msg[..]) else { return Poll::Ready(None); }; - - match msg.message { - FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { - this.state - .flashblock_stream - .send(FlashblocksP2PEvent::FlashblocksPayloadV1(payload)) - .ok(); - } - } + this.inbound_tx + .send(msg.clone()) + .map_err(|e| { + tracing::error!( + "Failed to send flashblocks message to inbound channel: {}", + e + ) + }) + .ok(); } } } diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index e0beca19..811d8ac8 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -11,7 +11,7 @@ use reth_node_builder::{ }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; use rollup_boost::FlashblocksPayloadV1; -use tokio::sync::{broadcast, mpsc}; +use tokio::sync::broadcast; use crate::protocol::handler::{FlashblocksP2PNetworHandle, FlashblocksProtoHandler}; @@ -24,8 +24,16 @@ pub struct FlashblocksNetworkBuilder { impl FlashblocksNetworkBuilder { /// Creates a new `FlashblocksNetworkBuilder` with the given inner builder and events channel. - pub fn new(inner: T, events: broadcast::Sender) -> Self { - Self { inner, events } + pub fn new( + inner: T, + authorizer_vk: VerifyingKey, + events: broadcast::Sender, + ) -> Self { + Self { + inner, + authorizer_vk, + events, + } } } From 782b9514f9b6624a34f4f82d088a4ef1d0ed31b1 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 15:12:00 -0700 Subject: [PATCH 016/114] update vis --- crates/flashblocks-p2p/src/protocol/handler.rs | 13 +++++-------- crates/flashblocks-p2p/src/protocol/proto.rs | 6 +++--- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index b6c753e0..1872d9bb 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -10,10 +10,7 @@ use std::net::SocketAddr; use tokio::sync::broadcast; use tokio::sync::mpsc; -pub(crate) trait FlashblocksP2PNetworHandle: - Clone + Unpin + Peers + std::fmt::Debug + 'static -{ -} +pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} impl FlashblocksP2PNetworHandle for N {} @@ -24,16 +21,16 @@ pub struct FlashblocksP2PState { pub network_handle: N, /// Authorizer verifying, used to verify flashblocks payloads. pub authorizer_vk: VerifyingKey, - /// Sender of verified and strictly ordered flashbloacks payloads. - /// For consumption by the rpc overlay. - pub flashblock_stream: broadcast::Sender, /// Verified flashblock payloads received by peers. /// May not be strictly ordered. pub inbound_rx: mpsc::UnboundedReceiver, /// Sender for newly received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. pub outbound_tx: broadcast::Sender, - /// The index of the next flashblock to emit. + /// Sender of verified and strictly ordered flashbloacks payloads. + /// For consumption by the rpc overlay. + pub flashblock_stream: broadcast::Sender, + /// The index of the next flashblock to emit over the flashblocks_stream. pub flashblock_index: usize, /// Timestamp of the most recent flashblocks payload. pub payload_timestamp: u64, diff --git a/crates/flashblocks-p2p/src/protocol/proto.rs b/crates/flashblocks-p2p/src/protocol/proto.rs index 21db1df9..a55d937c 100644 --- a/crates/flashblocks-p2p/src/protocol/proto.rs +++ b/crates/flashblocks-p2p/src/protocol/proto.rs @@ -10,17 +10,17 @@ use crate::protocol::auth::Authorized; #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub(crate) enum FlashblocksProtoMessageId { +pub enum FlashblocksProtoMessageId { FlashblocksPayloadV1 = 0x00, } #[derive(Clone, Debug, PartialEq, Eq)] -pub(crate) enum FlashblocksProtoMessageKind { +pub enum FlashblocksProtoMessageKind { FlashblocksPayloadV1(Authorized), } #[derive(Clone, Debug, PartialEq, Eq)] -pub(crate) struct FlashblocksProtoMessage { +pub struct FlashblocksProtoMessage { pub message_type: FlashblocksProtoMessageId, pub message: FlashblocksProtoMessageKind, } From f225b5e4ac949908e9911cc032a5dda2d62b68d9 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 15:23:20 -0700 Subject: [PATCH 017/114] fix node --- crates/flashblocks-node/src/main.rs | 15 +++++++------ crates/flashblocks-rpc/src/flashblocks.rs | 27 +++++++---------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/crates/flashblocks-node/src/main.rs b/crates/flashblocks-node/src/main.rs index 89eb3548..abe2e61f 100644 --- a/crates/flashblocks-node/src/main.rs +++ b/crates/flashblocks-node/src/main.rs @@ -2,13 +2,13 @@ use clap::Parser; use ed25519_dalek::VerifyingKey; -use flashblocks_p2p::protocol::handler::{FlashblocksP2PState, FlashblocksProtoHandler}; +use flashblocks_p2p::protocol::handler::{ FlashblocksProtoHandler}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlayBuilder}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; use rollup_boost::parse_vk; -use tokio::sync::mpsc; +use tokio::sync::{broadcast }; use tracing::info; #[derive(Debug, Clone, PartialEq, Eq, clap::Args)] @@ -35,7 +35,7 @@ pub fn main() { Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); - let (tx, events) = mpsc::unbounded_channel(); + let (tx, events) = broadcast::channel(100); let flashblocks_overlay_builder = FlashblocksOverlayBuilder::new(chain_spec, args.flashblocks_builder_vk, events); @@ -58,10 +58,11 @@ pub fn main() { .await?; - let custom_rlpx_handler = FlashblocksProtoHandler { - network_handle: handle.node.network.clone(), - state: FlashblocksP2PState { events: tx }, - }; + let custom_rlpx_handler = FlashblocksProtoHandler::new( + handle.node.network.clone(), + VerifyingKey::default(), + tx + ); handle .node diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index 0312fc26..3595df37 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -1,18 +1,17 @@ use crate::{FlashblocksApi, cache::FlashblocksCache}; use alloy_primitives::{Address, TxHash, U256}; use ed25519_dalek::VerifyingKey; -use flashblocks_p2p::protocol::event::FlashblocksP2PEvent; use jsonrpsee::core::async_trait; use op_alloy_network::Optimism; use reth_optimism_chainspec::OpChainSpec; use reth_rpc_eth_api::{RpcBlock, RpcReceipt}; use rollup_boost::FlashblocksPayloadV1; use std::{io::Read, sync::Arc}; -use tokio::sync::mpsc; +use tokio::sync::{broadcast, mpsc}; use tracing::{debug, error, info}; pub struct FlashblocksOverlayBuilder { - events: mpsc::UnboundedReceiver, + events: broadcast::Receiver, flashblocks_authorizor: VerifyingKey, cache: FlashblocksCache, } @@ -26,7 +25,7 @@ impl FlashblocksOverlayBuilder { pub fn new( chain_spec: Arc, flashblocks_authorizor: VerifyingKey, - events: mpsc::UnboundedReceiver, + events: broadcast::Receiver, ) -> Self { Self { events, @@ -41,21 +40,11 @@ impl FlashblocksOverlayBuilder { cache: self.cache.clone(), }; tokio::spawn(async move { - while let Some(message) = self.events.recv().await { - match message { - FlashblocksP2PEvent::Established { .. } => todo!(), - FlashblocksP2PEvent::FlashblocksPayloadV1(authorized) => { - match authorized.verify(self.flashblocks_authorizor) { - Ok(_) => { - if let Err(e) = cache_cloned.process_payload(authorized.payload) { - error!("failed to process payload: {}", e); - } - } - Err(e) => { - error!("{e:?}"); - } - } - } + loop { + // TODO: handle this error + let payload = self.events.recv().await.unwrap(); + if let Err(e) = cache_cloned.process_payload(payload) { + error!("failed to process payload: {}", e); } } }); From 1fa5b68b687fb0f90996b300862913e41619a1eb Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 11 Jul 2025 15:57:04 -0700 Subject: [PATCH 018/114] rename vars --- Cargo.lock | 1 + crates/flashblocks-node/src/main.rs | 6 ++-- crates/flashblocks-p2p/Cargo.toml | 1 + .../flashblocks-p2p/src/connection/handler.rs | 4 +-- crates/flashblocks-p2p/src/net/mod.rs | 17 +++++++--- .../flashblocks-p2p/src/protocol/handler.rs | 33 ++++++++++--------- 6 files changed, 37 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9cc86f46..8acd97aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3546,6 +3546,7 @@ dependencies = [ "ed25519-dalek", "eyre", "futures", + "parking_lot", "reth", "reth-eth-wire", "reth-ethereum", diff --git a/crates/flashblocks-node/src/main.rs b/crates/flashblocks-node/src/main.rs index abe2e61f..d42bd34a 100644 --- a/crates/flashblocks-node/src/main.rs +++ b/crates/flashblocks-node/src/main.rs @@ -35,10 +35,10 @@ pub fn main() { Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); - let (tx, events) = broadcast::channel(100); + let (inbound_tx, inbound_rx) = broadcast::channel(100); let flashblocks_overlay_builder = - FlashblocksOverlayBuilder::new(chain_spec, args.flashblocks_builder_vk, events); + FlashblocksOverlayBuilder::new(chain_spec, args.flashblocks_builder_vk, inbound_rx); let flashblocks_overlay = flashblocks_overlay_builder.start()?; info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); @@ -61,7 +61,7 @@ pub fn main() { let custom_rlpx_handler = FlashblocksProtoHandler::new( handle.node.network.clone(), VerifyingKey::default(), - tx + inbound_tx ); handle diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index 1645cbcf..de33b548 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -43,6 +43,7 @@ tracing.workspace = true alloy-primitives.workspace = true serde_json = "1.0" thiserror = "2" +parking_lot = "0.12" rollup-boost = { path = "../rollup-boost" } diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index bfe78517..dca6add0 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -15,7 +15,7 @@ use tokio_stream::wrappers::BroadcastStream; pub struct FlashblocksConnectionHandler { pub network_handle: N, pub inbound_tx: mpsc::UnboundedSender, - pub outbound_rx: broadcast::Receiver, + pub flashblocks_sender_rx: broadcast::Receiver, } impl ConnectionHandler for FlashblocksConnectionHandler { @@ -44,7 +44,7 @@ impl ConnectionHandler for FlashblocksConnecti conn, peer_id, inbound_tx: self.inbound_tx.clone(), - outbound_rx: BroadcastStream::new(self.outbound_rx.resubscribe()), + outbound_rx: BroadcastStream::new(self.flashblocks_sender_rx.resubscribe()), network_handle: self.network_handle, } } diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 811d8ac8..6464c640 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -13,13 +13,17 @@ use reth_transaction_pool::{PoolTransaction, TransactionPool}; use rollup_boost::FlashblocksPayloadV1; use tokio::sync::broadcast; -use crate::protocol::handler::{FlashblocksP2PNetworHandle, FlashblocksProtoHandler}; +use crate::protocol::{ + handler::{FlashblocksP2PNetworHandle, FlashblocksProtoHandler}, + proto::FlashblocksProtoMessage, +}; #[derive(Clone, Debug)] pub struct FlashblocksNetworkBuilder { inner: T, authorizer_vk: VerifyingKey, - events: broadcast::Sender, + flashblocks_receiver_tx: broadcast::Sender, + flashblock_sender_tx: broadcast::Sender, } impl FlashblocksNetworkBuilder { @@ -27,12 +31,14 @@ impl FlashblocksNetworkBuilder { pub fn new( inner: T, authorizer_vk: VerifyingKey, - events: broadcast::Sender, + flashblocks_receiver_tx: broadcast::Sender, + flashblock_sender_tx: broadcast::Sender, ) -> Self { Self { inner, authorizer_vk, - events, + flashblocks_receiver_tx, + flashblock_sender_tx, } } } @@ -59,7 +65,8 @@ where let handler = FlashblocksProtoHandler::::new( handle.clone(), self.authorizer_vk, - self.events, + self.flashblocks_receiver_tx, + self.flashblock_sender_tx, ); handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 1872d9bb..9768f3f3 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -24,12 +24,12 @@ pub struct FlashblocksP2PState { /// Verified flashblock payloads received by peers. /// May not be strictly ordered. pub inbound_rx: mpsc::UnboundedReceiver, - /// Sender for newly received and validated flashblocks payloads + /// Sender for newly created or received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub outbound_tx: broadcast::Sender, - /// Sender of verified and strictly ordered flashbloacks payloads. + pub flashblock_sender_tx: broadcast::Sender, + /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. - pub flashblock_stream: broadcast::Sender, + pub flashblock_receiver_tx: broadcast::Sender, /// The index of the next flashblock to emit over the flashblocks_stream. pub flashblock_index: usize, /// Timestamp of the most recent flashblocks payload. @@ -87,13 +87,15 @@ impl FlashblocksP2PState { payload.payload.index ); // Broadcast the flashblock to all peers, possible our of order - self.outbound_tx.send(msg).unwrap(); + self.flashblock_sender_tx.send(msg).unwrap(); // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = self.flashblocks.get(self.flashblock_index) { // Send the flashblock to the stream - self.flashblock_stream.send(flashblock_event.clone()).ok(); + self.flashblock_receiver_tx + .send(flashblock_event.clone()) + .ok(); // Update the index self.flashblock_index += 1; } @@ -113,9 +115,9 @@ pub struct FlashblocksProtoHandler { /// Verified flashblock payloads received by peers. /// May not be strictly ordered. pub inbound_tx: mpsc::UnboundedSender, - /// Sender for newly received and validated flashblocks payloads + /// Sender for newly received and validated or created flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub outbound_rx: broadcast::Receiver, + pub flashblocks_sender_rx: broadcast::Receiver, } impl FlashblocksProtoHandler { @@ -123,16 +125,17 @@ impl FlashblocksProtoHandler { pub fn new( network_handle: N, authorizer_vk: VerifyingKey, - flashblock_stream: broadcast::Sender, + flashblock_receiver_tx: broadcast::Sender, + flashblock_sender_tx: broadcast::Sender, ) -> Self { - let (outbound_tx, outbound_rx) = broadcast::channel(100); let (inbound_tx, inbound_rx) = mpsc::unbounded_channel(); + let flashblock_sender_rx = flashblock_sender_tx.subscribe(); let state = FlashblocksP2PState { network_handle: network_handle.clone(), authorizer_vk, - flashblock_stream, + flashblock_receiver_tx, inbound_rx, - outbound_tx, + flashblock_sender_tx, flashblock_index: 0, payload_timestamp: 0, payload_id: PayloadId::default(), @@ -142,8 +145,8 @@ impl FlashblocksProtoHandler { Self { network_handle, - outbound_rx, inbound_tx, + flashblocks_sender_rx: flashblock_sender_rx, } } } @@ -155,7 +158,7 @@ impl ProtocolHandler for FlashblocksProtoHandler< Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), inbound_tx: self.inbound_tx.clone(), - outbound_rx: self.outbound_rx.resubscribe(), + flashblocks_sender_rx: self.flashblocks_sender_rx.resubscribe(), }) } @@ -167,7 +170,7 @@ impl ProtocolHandler for FlashblocksProtoHandler< Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), inbound_tx: self.inbound_tx.clone(), - outbound_rx: self.outbound_rx.resubscribe(), + flashblocks_sender_rx: self.flashblocks_sender_rx.resubscribe(), }) } } From e6b0e9d7b7873606641f7f7696e5c1a3632258a1 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 14 Jul 2025 10:51:42 -0700 Subject: [PATCH 019/114] switch to Mutex for p2p state --- .../flashblocks-p2p/src/connection/handler.rs | 27 ++- crates/flashblocks-p2p/src/connection/mod.rs | 161 +++++++++++++++--- .../flashblocks-p2p/src/protocol/handler.rs | 135 ++++----------- 3 files changed, 187 insertions(+), 136 deletions(-) diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index dca6add0..66f79e62 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -1,10 +1,18 @@ +use std::sync::Arc; + use super::FlashblocksConnection; -use crate::protocol::proto::FlashblocksProtoMessage; +use crate::protocol::{ + handler::{FlashblocksP2PNetworHandle, FlashblocksP2PState}, + proto::FlashblocksProtoMessage, +}; +use ed25519_dalek::VerifyingKey; +use parking_lot::{Mutex, RwLock}; use reth_ethereum::network::{ api::{Direction, PeerId}, eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, protocol::{ConnectionHandler, OnNotSupported}, }; +use rollup_boost::FlashblocksPayloadV1; use tokio::sync::{ broadcast, mpsc::{self}, @@ -14,11 +22,13 @@ use tokio_stream::wrappers::BroadcastStream; /// The connection handler for the flashblocks RLPx protocol. pub struct FlashblocksConnectionHandler { pub network_handle: N, - pub inbound_tx: mpsc::UnboundedSender, - pub flashblocks_sender_rx: broadcast::Receiver, + pub authorizer_vk: VerifyingKey, + pub peer_tx: broadcast::Sender, + pub flashblock_tx: broadcast::Sender, + pub state: Arc>, } -impl ConnectionHandler for FlashblocksConnectionHandler { +impl ConnectionHandler for FlashblocksConnectionHandler { type Connection = FlashblocksConnection; fn protocol(&self) -> Protocol { @@ -43,9 +53,14 @@ impl ConnectionHandler for FlashblocksConnecti FlashblocksConnection { conn, peer_id, - inbound_tx: self.inbound_tx.clone(), - outbound_rx: BroadcastStream::new(self.flashblocks_sender_rx.resubscribe()), network_handle: self.network_handle, + authorizer_vk: self.authorizer_vk, + peer_tx: self.peer_tx.clone(), + peer_rx: BroadcastStream::new(self.peer_tx.subscribe()), + flashblock_tx: self.flashblock_tx.clone(), + state: self.state.clone(), + payload_id: Default::default(), + received: Vec::new(), } } } diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index 0216ca50..bf1b77fe 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -1,31 +1,54 @@ -use super::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; +use crate::protocol::{ + auth::Authorized, + handler::{FlashblocksP2PNetworHandle, FlashblocksP2PState}, + proto::{FlashblocksProtoMessageId, FlashblocksProtoMessageKind}, +}; + +use super::protocol::proto::FlashblocksProtoMessage; use alloy_primitives::bytes::BytesMut; +use ed25519_dalek::VerifyingKey; use futures::{Stream, StreamExt}; +use parking_lot::{Mutex, RwLock}; +use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; +use reth_network::types::ReputationChangeKind; +use rollup_boost::FlashblocksPayloadV1; use std::{ pin::Pin, + sync::Arc, task::{Context, Poll, ready}, }; -use tokio::sync::mpsc; +use tokio::sync::broadcast; use tokio_stream::wrappers::BroadcastStream; pub(crate) mod handler; -/// We define some custom commands that the subprotocol supports. -pub struct IncomingPeerMessage { - peer_id: PeerId, - msg: FlashblocksProtoMessageKind, -} - pub struct FlashblocksConnection { - conn: ProtocolConnection, - peer_id: PeerId, - inbound_tx: mpsc::UnboundedSender, - outbound_rx: BroadcastStream, - network_handle: N, + pub conn: ProtocolConnection, + pub peer_id: PeerId, + // inbound_tx: mpsc::UnboundedSender, + pub network_handle: N, + /// Authorizer verifying, used to verify flashblocks payloads. + pub authorizer_vk: VerifyingKey, + /// Sender for newly created or received and validated flashblocks payloads + /// which will be broadcasted to all peers. May not be strictly ordered. + pub peer_tx: broadcast::Sender, + /// Receiver for newly created or received and validated flashblocks payloads + /// which will be broadcasted to all peers. May not be strictly ordered. + pub peer_rx: BroadcastStream, + /// Channel of verified and strictly ordered flashbloacks payloads. + /// For consumption by the rpc overlay. + pub flashblock_tx: broadcast::Sender, + /// Mutable state of the flashblocks protocol. + pub state: Arc>, + /// Most recent payload received from this peer. + pub payload_id: PayloadId, + /// A list of flashblocks indices that we have already received from + /// this peer for the current payload. + pub received: Vec, } -impl Stream for FlashblocksConnection { +impl Stream for FlashblocksConnection { type Item = BytesMut; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { @@ -33,7 +56,7 @@ impl Stream for FlashblocksConnection { loop { // Check if there are any flashblocks ready to broadcast to our peers. - if let Poll::Ready(Some(res)) = this.outbound_rx.poll_next_unpin(cx) { + if let Poll::Ready(Some(res)) = this.peer_rx.poll_next_unpin(cx) { match res { Ok(outbound) => { return Poll::Ready(Some(outbound.encoded())); @@ -54,15 +77,105 @@ impl Stream for FlashblocksConnection { let Some(msg) = FlashblocksProtoMessage::decode_message(&mut &msg[..]) else { return Poll::Ready(None); }; - this.inbound_tx - .send(msg.clone()) - .map_err(|e| { - tracing::error!( - "Failed to send flashblocks message to inbound channel: {}", - e - ) - }) - .ok(); + + match msg.message { + FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized) => { + this.handle_flashblocks_payload_v1(authorized, msg.message_type); + } + } + } + } +} + +impl FlashblocksConnection { + fn handle_flashblocks_payload_v1( + &mut self, + message: Authorized, + message_type: FlashblocksProtoMessageId, + ) -> () { + let mut state = self.state.lock(); + + if let Err(e) = message.verify(self.authorizer_vk) { + tracing::warn!( + "Failed to verify flashblocks payload: {:?}, error: {}", + message, + e + ); + self.network_handle + .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); + return; + } + + if message.authorization.timestamp < state.payload_timestamp { + tracing::warn!( + "Received flashblocks payload with outdated timestamp: {}", + message.authorization.timestamp + ); + self.network_handle + .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); + return; + } + + // Check if this is a new payload + if message.authorization.timestamp > state.payload_timestamp { + state.flashblock_index = 0; + state.payload_timestamp = message.authorization.timestamp; + state.payload_id = message.payload.payload_id; + state.flashblocks.fill(None); + } + + // Check if this peer is spamming us with the same payload + if self.payload_id != message.payload.payload_id { + self.payload_id = message.payload.payload_id; + self.received.fill(false); + } + let len = self.received.len(); + self.received + .resize_with(len.max(message.payload.index as usize + 1), || false); + if self.received[message.payload.index as usize] { + // We've already seen this index, skip it + tracing::warn!( + "Received duplicate flashblocks payload with id: {}, index: {}, from peer: {}", + message.payload.payload_id, + message.payload.index, + self.peer_id + ); + self.network_handle + .reputation_change(self.peer_id, ReputationChangeKind::AlreadySeenTransaction); + return; + } + self.received[message.payload.index as usize] = true; + + // If we've already seen this index, skip it + // Otherwise, add it to the list + // TODO: perhaps check max index + let len = state.flashblocks.len(); + state + .flashblocks + .resize_with(len.max(message.payload.index as usize + 1), || None); + let flashblock = &mut state.flashblocks[message.payload.index as usize]; + if flashblock.is_none() { + // We haven't seen this index yet + // Add the flashblock to our cache + *flashblock = Some(message.clone().payload); + tracing::debug!( + "Received flashblocks payload with id: {}, index: {}", + message.payload.payload_id, + message.payload.index + ); + // Broadcast the flashblock to all peers, possibly out of order + let message = FlashblocksProtoMessage { + message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(message), + message_type, + }; + self.peer_tx.send(message).unwrap(); + // Broadcast any flashblocks in the cache that are in order + while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { + // Send the flashblock to the stream + self.flashblock_tx.send(flashblock_event.clone()).ok(); + // Update the index + state.flashblock_index += 1; + } } } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 9768f3f3..7ae6f2a3 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,14 +1,14 @@ use crate::connection::handler::FlashblocksConnectionHandler; use crate::protocol::proto::FlashblocksProtoMessage; -use crate::protocol::proto::FlashblocksProtoMessageKind; use ed25519_dalek::VerifyingKey; +use parking_lot::Mutex; use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; use reth_network::Peers; use rollup_boost::FlashblocksPayloadV1; use std::net::SocketAddr; +use std::sync::Arc; use tokio::sync::broadcast; -use tokio::sync::mpsc; pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} @@ -16,20 +16,7 @@ impl FlashblocksP2PNetworH /// Protocol state is an helper struct to store the protocol events. #[derive(Debug)] -pub struct FlashblocksP2PState { - /// Networkd handle, used to update peer state. - pub network_handle: N, - /// Authorizer verifying, used to verify flashblocks payloads. - pub authorizer_vk: VerifyingKey, - /// Verified flashblock payloads received by peers. - /// May not be strictly ordered. - pub inbound_rx: mpsc::UnboundedReceiver, - /// Sender for newly created or received and validated flashblocks payloads - /// which will be broadcasted to all peers. May not be strictly ordered. - pub flashblock_sender_tx: broadcast::Sender, - /// Receiver of verified and strictly ordered flashbloacks payloads. - /// For consumption by the rpc overlay. - pub flashblock_receiver_tx: broadcast::Sender, +pub struct FlashblocksP2PState { /// The index of the next flashblock to emit over the flashblocks_stream. pub flashblock_index: usize, /// Timestamp of the most recent flashblocks payload. @@ -40,84 +27,21 @@ pub struct FlashblocksP2PState { pub flashblocks: Vec>, } -impl FlashblocksP2PState { - pub fn run(mut self) { - tokio::spawn(async move { - while let Some(msg) = self.inbound_rx.recv().await { - match &msg.message { - FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { - // TODO: might make sense to perform verification in a separate task - if let Err(e) = payload.verify(self.authorizer_vk) { - tracing::warn!( - "Failed to verify flashblocks payload: {:?}, error: {}", - payload, - e - ); - // TODO: ban peer - continue; - } - if payload.authorization.timestamp < self.payload_timestamp { - tracing::warn!( - "Received flashblocks payload with outdated timestamp: {}", - payload.authorization.timestamp - ); - // TODO: handle peer - continue; - } - // Check if this is a new payload - if payload.authorization.timestamp > self.payload_timestamp { - self.flashblock_index = 0; - self.payload_timestamp = payload.authorization.timestamp; - self.payload_id = payload.payload.payload_id; - self.flashblocks.clear(); - } - // If we've already seen this index, skip it - // Otherwise, add it to the list - // TODO: perhaps check max index - self.flashblocks - .resize_with(payload.payload.index as usize + 1, || None); - let flashblock = &mut self.flashblocks[payload.payload.index as usize]; - if flashblock.is_none() { - // We haven't seen this index yet - // Add the flashblock to our cache - *flashblock = Some(payload.clone().payload); - tracing::debug!( - "Received flashblocks payload with id: {}, index: {}", - payload.payload.payload_id, - payload.payload.index - ); - // Broadcast the flashblock to all peers, possible our of order - self.flashblock_sender_tx.send(msg).unwrap(); - // Broadcast any flashblocks in the cache that are in order - while let Some(Some(flashblock_event)) = - self.flashblocks.get(self.flashblock_index) - { - // Send the flashblock to the stream - self.flashblock_receiver_tx - .send(flashblock_event.clone()) - .ok(); - // Update the index - self.flashblock_index += 1; - } - } - } - } - } - }); - } -} - /// The protocol handler takes care of incoming and outgoing connections. #[derive(Debug)] pub struct FlashblocksProtoHandler { /// Network handle, used to update peer state. pub network_handle: N, - /// Verified flashblock payloads received by peers. - /// May not be strictly ordered. - pub inbound_tx: mpsc::UnboundedSender, - /// Sender for newly received and validated or created flashblocks payloads + /// Authorizer verifying, used to verify flashblocks payloads. + pub authorizer_vk: VerifyingKey, + /// Sender for newly created or received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub flashblocks_sender_rx: broadcast::Receiver, + pub peer_tx: broadcast::Sender, + /// Receiver of verified and strictly ordered flashbloacks payloads. + /// For consumption by the rpc overlay. + pub flashblock_tx: broadcast::Sender, + /// Mutable state of the flashblocks protocol. + pub state: Arc>, } impl FlashblocksProtoHandler { @@ -125,28 +49,23 @@ impl FlashblocksProtoHandler { pub fn new( network_handle: N, authorizer_vk: VerifyingKey, - flashblock_receiver_tx: broadcast::Sender, - flashblock_sender_tx: broadcast::Sender, + flashblock_tx: broadcast::Sender, + peer_tx: broadcast::Sender, ) -> Self { - let (inbound_tx, inbound_rx) = mpsc::unbounded_channel(); - let flashblock_sender_rx = flashblock_sender_tx.subscribe(); - let state = FlashblocksP2PState { - network_handle: network_handle.clone(), - authorizer_vk, - flashblock_receiver_tx, - inbound_rx, - flashblock_sender_tx, + // let flashblock_sender_rx = flashblock_sender_tx.subscribe(); + let state = Arc::new(Mutex::new(FlashblocksP2PState { flashblock_index: 0, payload_timestamp: 0, payload_id: PayloadId::default(), flashblocks: vec![], - }; - state.run(); + })); Self { network_handle, - inbound_tx, - flashblocks_sender_rx: flashblock_sender_rx, + authorizer_vk, + peer_tx, + flashblock_tx, + state, } } } @@ -157,8 +76,10 @@ impl ProtocolHandler for FlashblocksProtoHandler< fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), - inbound_tx: self.inbound_tx.clone(), - flashblocks_sender_rx: self.flashblocks_sender_rx.resubscribe(), + authorizer_vk: self.authorizer_vk, + peer_tx: self.peer_tx.clone(), + flashblock_tx: self.flashblock_tx.clone(), + state: self.state.clone(), }) } @@ -169,8 +90,10 @@ impl ProtocolHandler for FlashblocksProtoHandler< ) -> Option { Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), - inbound_tx: self.inbound_tx.clone(), - flashblocks_sender_rx: self.flashblocks_sender_rx.resubscribe(), + authorizer_vk: self.authorizer_vk, + peer_tx: self.peer_tx.clone(), + flashblock_tx: self.flashblock_tx.clone(), + state: self.state.clone(), }) } } From 4ac463375c7dc3d35fc58ebbc948ce5e7e0b32e2 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 14 Jul 2025 11:07:56 -0700 Subject: [PATCH 020/114] update protocol to accept new blocks --- crates/flashblocks-node/src/main.rs | 4 +++- crates/flashblocks-p2p/src/connection/handler.rs | 7 ++----- crates/flashblocks-p2p/src/connection/mod.rs | 7 ++++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/flashblocks-node/src/main.rs b/crates/flashblocks-node/src/main.rs index d42bd34a..6ec8b70c 100644 --- a/crates/flashblocks-node/src/main.rs +++ b/crates/flashblocks-node/src/main.rs @@ -36,6 +36,7 @@ pub fn main() { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); let (inbound_tx, inbound_rx) = broadcast::channel(100); + let (outbound_tx, _outbound_rx) = broadcast::channel(100); let flashblocks_overlay_builder = FlashblocksOverlayBuilder::new(chain_spec, args.flashblocks_builder_vk, inbound_rx); @@ -61,7 +62,8 @@ pub fn main() { let custom_rlpx_handler = FlashblocksProtoHandler::new( handle.node.network.clone(), VerifyingKey::default(), - inbound_tx + inbound_tx, + outbound_tx, ); handle diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index 66f79e62..64cebef5 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -6,17 +6,14 @@ use crate::protocol::{ proto::FlashblocksProtoMessage, }; use ed25519_dalek::VerifyingKey; -use parking_lot::{Mutex, RwLock}; +use parking_lot::Mutex; use reth_ethereum::network::{ api::{Direction, PeerId}, eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, protocol::{ConnectionHandler, OnNotSupported}, }; use rollup_boost::FlashblocksPayloadV1; -use tokio::sync::{ - broadcast, - mpsc::{self}, -}; +use tokio::sync::broadcast; use tokio_stream::wrappers::BroadcastStream; /// The connection handler for the flashblocks RLPx protocol. diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index bf1b77fe..caebf9c5 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -26,7 +26,6 @@ pub(crate) mod handler; pub struct FlashblocksConnection { pub conn: ProtocolConnection, pub peer_id: PeerId, - // inbound_tx: mpsc::UnboundedSender, pub network_handle: N, /// Authorizer verifying, used to verify flashblocks payloads. pub authorizer_vk: VerifyingKey, @@ -59,6 +58,7 @@ impl Stream for FlashblocksConnection { if let Poll::Ready(Some(res)) = this.peer_rx.poll_next_unpin(cx) { match res { Ok(outbound) => { + // TODO: handle the case where this peer is the one that sent the original return Poll::Ready(Some(outbound.encoded())); } Err(e) => { @@ -92,7 +92,7 @@ impl FlashblocksConnection { &mut self, message: Authorized, message_type: FlashblocksProtoMessageId, - ) -> () { + ) { let mut state = self.state.lock(); if let Err(e) = message.verify(self.authorizer_vk) { @@ -133,7 +133,8 @@ impl FlashblocksConnection { self.received .resize_with(len.max(message.payload.index as usize + 1), || false); if self.received[message.payload.index as usize] { - // We've already seen this index, skip it + // We've already seen this index from this peer. + // They could be trying to DOS us. tracing::warn!( "Received duplicate flashblocks payload with id: {}, index: {}, from peer: {}", message.payload.payload_id, From 0cbf403085f548e45b2af21484ad1e5a671ee29d Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 14 Jul 2025 12:46:16 -0700 Subject: [PATCH 021/114] move tests directory --- Cargo.lock | 1 + Cargo.toml | 1 + crates/flashblocks-node/Cargo.toml | 1 + crates/flashblocks-node/src/main.rs | 8 +- crates/flashblocks-node/src/tests/mod.rs | 316 ---------------- .../{src => }/tests/assets/genesis.json | 0 crates/flashblocks-node/tests/p2p.rs | 338 ++++++++++++++++++ .../flashblocks-p2p/src/protocol/handler.rs | 2 + crates/flashblocks-rpc/src/flashblocks.rs | 32 +- crates/flashblocks-rpc/src/lib.rs | 2 +- .../src/tests/assets/genesis.json | 100 ------ crates/flashblocks-rpc/src/tests/mod.rs | 316 ---------------- 12 files changed, 364 insertions(+), 753 deletions(-) delete mode 100644 crates/flashblocks-node/src/tests/mod.rs rename crates/flashblocks-node/{src => }/tests/assets/genesis.json (100%) create mode 100644 crates/flashblocks-node/tests/p2p.rs delete mode 100644 crates/flashblocks-rpc/src/tests/assets/genesis.json delete mode 100644 crates/flashblocks-rpc/src/tests/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 8acd97aa..43c40af3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3509,6 +3509,7 @@ dependencies = [ "reth-eth-wire", "reth-ethereum", "reth-network", + "reth-network-peers", "reth-node-api", "reth-node-builder", "reth-node-core", diff --git a/Cargo.toml b/Cargo.toml index f03a9fe1..457620a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-network = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-network-peers = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index 983f41ae..46ac8902 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -34,6 +34,7 @@ reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1 reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } reth-network = { workspace = true } +reth-network-peers = { workspace = true } ed25519-dalek = { version = "2", features = ["serde"] } alloy-eips.workspace = true diff --git a/crates/flashblocks-node/src/main.rs b/crates/flashblocks-node/src/main.rs index 6ec8b70c..a0968684 100644 --- a/crates/flashblocks-node/src/main.rs +++ b/crates/flashblocks-node/src/main.rs @@ -3,7 +3,7 @@ use clap::Parser; use ed25519_dalek::VerifyingKey; use flashblocks_p2p::protocol::handler::{ FlashblocksProtoHandler}; -use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlayBuilder}; +use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay }; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; @@ -38,9 +38,9 @@ pub fn main() { let (inbound_tx, inbound_rx) = broadcast::channel(100); let (outbound_tx, _outbound_rx) = broadcast::channel(100); - let flashblocks_overlay_builder = - FlashblocksOverlayBuilder::new(chain_spec, args.flashblocks_builder_vk, inbound_rx); - let flashblocks_overlay = flashblocks_overlay_builder.start()?; + let flashblocks_overlay = + FlashblocksOverlay::new(chain_spec, inbound_rx); + flashblocks_overlay.clone().start()?; info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); let handle = builder diff --git a/crates/flashblocks-node/src/tests/mod.rs b/crates/flashblocks-node/src/tests/mod.rs deleted file mode 100644 index d3ed4227..00000000 --- a/crates/flashblocks-node/src/tests/mod.rs +++ /dev/null @@ -1,316 +0,0 @@ -#[cfg(test)] -mod tests { - use crate::{ - EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, FlashblocksOverlayBuilder, - cache::Metadata, - }; - use alloy_consensus::Receipt; - use alloy_genesis::Genesis; - use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; - use alloy_provider::{Provider, RootProvider}; - use alloy_rpc_client::RpcClient; - use alloy_rpc_types_engine::PayloadId; - use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; - use reth_node_core::{ - args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}, - exit::NodeExitFuture, - }; - use reth_optimism_chainspec::OpChainSpecBuilder; - use reth_optimism_node::{OpNode, args::RollupArgs}; - use reth_optimism_primitives::OpReceipt; - use reth_provider::providers::BlockchainProvider; - use reth_tasks::TaskManager; - use rollup_boost::{ - ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, - }; - use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; - use tokio::sync::{mpsc, oneshot}; - use url::Url; - - pub struct NodeContext { - sender: mpsc::Sender<(FlashblocksPayloadV1, oneshot::Sender<()>)>, - http_api_addr: SocketAddr, - _node_exit_future: NodeExitFuture, - _node: Box, - _task_manager: TaskManager, - } - - impl NodeContext { - pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { - let (tx, rx) = oneshot::channel(); - self.sender.send((payload, tx)).await?; - rx.await?; - Ok(()) - } - - pub async fn provider(&self) -> eyre::Result { - let url = format!("http://{}", self.http_api_addr); - let client = RpcClient::builder().http(url.parse()?); - - Ok(RootProvider::new(client)) - } - - pub async fn send_test_payloads(&self) -> eyre::Result<()> { - let base_payload = create_first_payload(); - self.send_payload(base_payload).await?; - - let second_payload = create_second_payload(); - self.send_payload(second_payload).await?; - - Ok(()) - } - } - - async fn setup_node() -> eyre::Result { - let tasks = TaskManager::current(); - let exec = tasks.executor(); - - let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); - let chain_spec = Arc::new( - OpChainSpecBuilder::base_mainnet() - .genesis(genesis) - .ecotone_activated() - .build(), - ); - - let network_config = NetworkArgs { - discovery: DiscoveryArgs { - disable_discovery: true, - ..DiscoveryArgs::default() - }, - ..NetworkArgs::default() - }; - - // Use with_unused_ports() to let Reth allocate random ports and avoid port collisions - let node_config = NodeConfig::new(chain_spec.clone()) - .with_network(network_config.clone()) - .with_rpc(RpcServerArgs::default().with_unused_ports().with_http()) - .with_unused_ports(); - - let node = OpNode::new(RollupArgs::default()); - - // Start websocket server to simulate the builder and send payloads back to the node - let (sender, mut receiver) = - mpsc::channel::<(FlashblocksPayloadV1, oneshot::Sender<()>)>(100); - - let NodeHandle { - node, - node_exit_future, - } = NodeBuilder::new(node_config.clone()) - .testing_node(exec.clone()) - .with_types_and_provider::>() - .with_components(node.components_builder()) - .with_add_ons(node.add_ons()) - .extend_rpc_modules(move |ctx| { - // We are not going to use the websocket connection to send payloads so we use - // a dummy url. - let flashblocks_overlay = FlashblocksOverlayBuilder::new(chain_spec); - - let eth_api = ctx.registry.eth_api().clone(); - let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay.clone()); - - ctx.modules.replace_configured(api_ext.into_rpc())?; - - tokio::spawn(async move { - while let Some((payload, tx)) = receiver.recv().await { - flashblocks_overlay.process_payload(payload).unwrap(); - tx.send(()).unwrap(); - } - }); - - Ok(()) - }) - .launch() - .await?; - - let http_api_addr = node - .rpc_server_handle() - .http_local_addr() - .ok_or_else(|| eyre::eyre!("Failed to get http api address"))?; - - Ok(NodeContext { - sender, - http_api_addr, - _node_exit_future: node_exit_future, - _node: Box::new(node), - _task_manager: tasks, - }) - } - - fn create_first_payload() -> FlashblocksPayloadV1 { - FlashblocksPayloadV1 { - payload_id: PayloadId::new([0; 8]), - index: 0, - base: Some(ExecutionPayloadBaseV1 { - parent_beacon_block_root: B256::default(), - parent_hash: B256::default(), - fee_recipient: Address::ZERO, - prev_randao: B256::default(), - block_number: 1, - gas_limit: 0, - timestamp: 0, - extra_data: Bytes::new(), - base_fee_per_gas: U256::ZERO, - }), - diff: ExecutionPayloadFlashblockDeltaV1::default(), - metadata: serde_json::to_value(Metadata { - block_number: 1, - receipts: HashMap::default(), - new_account_balances: HashMap::default(), - }) - .unwrap(), - } - } - - const TEST_ADDRESS: Address = address!("0x1234567890123456789012345678901234567890"); - const PENDING_BALANCE: u64 = 4600; - - const TX1_HASH: TxHash = - b256!("0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548"); - const TX2_HASH: TxHash = - b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); - - fn create_second_payload() -> FlashblocksPayloadV1 { - // Create second payload (index 1) with transactions - // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) - // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 - let tx1 = Bytes::from_str("0x7ef8f8a042a8ae5ec231af3d0f90f68543ec8bca1da4f7edd712d5b51b490688355a6db794deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000044d000a118b00000000000000040000000067cb7cb0000000000077dbd4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014edd27304108914dd6503b19b9eeb9956982ef197febbeeed8a9eac3dbaaabdf000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3").unwrap(); - let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); - - // Send another test flashblock payload - let payload = FlashblocksPayloadV1 { - payload_id: PayloadId::new([0; 8]), - index: 1, - base: None, - diff: ExecutionPayloadFlashblockDeltaV1 { - state_root: B256::default(), - receipts_root: B256::default(), - gas_used: 0, - block_hash: B256::default(), - transactions: vec![tx1, tx2], - withdrawals: Vec::new(), - logs_bloom: Default::default(), - withdrawals_root: Default::default(), - }, - metadata: serde_json::to_value(Metadata { - block_number: 1, - receipts: { - let mut receipts = HashMap::default(); - receipts.insert( - TX1_HASH.to_string(), // transaction hash as string - OpReceipt::Legacy(Receipt { - status: true.into(), - cumulative_gas_used: 21000, - logs: vec![], - }), - ); - receipts.insert( - TX2_HASH.to_string(), // transaction hash as string - OpReceipt::Legacy(Receipt { - status: true.into(), - cumulative_gas_used: 45000, - logs: vec![], - }), - ); - receipts - }, - new_account_balances: { - let mut map = HashMap::default(); - map.insert( - TEST_ADDRESS.to_string(), - format!("0x{:x}", U256::from(PENDING_BALANCE)), - ); - map - }, - }) - .unwrap(), - }; - - payload - } - - #[tokio::test] - async fn test_get_block_by_number_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node().await?; - let provider = node.provider().await?; - - let latest_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) - .await? - .expect("latest block expected"); - assert_eq!(latest_block.number(), 0); - - // Querying pending block when it does not exists yet - let pending_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await?; - assert_eq!(pending_block.is_none(), true); - - let base_payload = create_first_payload(); - node.send_payload(base_payload).await?; - - // Query pending block after sending the base payload with an empty delta - let pending_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(pending_block.number(), 1); - assert_eq!(pending_block.transactions.hashes().len(), 0); - - let second_payload = create_second_payload(); - node.send_payload(second_payload).await?; - - // Query pending block after sending the second payload with two transactions - let block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(block.number(), 1); - assert_eq!(block.transactions.hashes().len(), 2); - - Ok(()) - } - - #[tokio::test] - async fn test_get_balance_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node().await?; - let provider = node.provider().await?; - - node.send_test_payloads().await?; - - let balance = provider.get_balance(TEST_ADDRESS).await?; - assert_eq!(balance, U256::ZERO); - - let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; - assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); - - Ok(()) - } - - #[tokio::test] - async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node().await?; - let provider = node.provider().await?; - - let receipt = provider.get_transaction_receipt(TX1_HASH).await?; - assert_eq!(receipt.is_none(), true); - - node.send_test_payloads().await?; - - let receipt = provider - .get_transaction_receipt(TX1_HASH) - .await? - .expect("receipt expected"); - assert_eq!(receipt.gas_used, 21000); - - // TODO: Add a new payload and validate that the receipts from the previous payload - // are not returned. - - Ok(()) - } -} diff --git a/crates/flashblocks-node/src/tests/assets/genesis.json b/crates/flashblocks-node/tests/assets/genesis.json similarity index 100% rename from crates/flashblocks-node/src/tests/assets/genesis.json rename to crates/flashblocks-node/tests/assets/genesis.json diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs new file mode 100644 index 00000000..54b703ab --- /dev/null +++ b/crates/flashblocks-node/tests/p2p.rs @@ -0,0 +1,338 @@ +use alloy_consensus::Receipt; +use alloy_genesis::Genesis; +use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; +use alloy_provider::{Provider, RootProvider}; +use alloy_rpc_client::RpcClient; +use alloy_rpc_types_engine::PayloadId; +use ed25519_dalek::VerifyingKey; +use flashblocks_p2p::protocol::handler::FlashblocksProtoHandler; +use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; +use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; +use reth_network::{Peers, PeersInfo, protocol::IntoRlpxSubProtocol as _}; +use reth_network_peers::{NodeRecord, PeerId}; +use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; +use reth_node_core::{ + args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}, + exit::NodeExitFuture, +}; +use reth_optimism_chainspec::OpChainSpecBuilder; +use reth_optimism_node::{OpNode, args::RollupArgs}; +use reth_optimism_primitives::OpReceipt; +use reth_provider::providers::BlockchainProvider; +use reth_tasks::TaskManager; +use rollup_boost::{ + ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, +}; +use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; +use tokio::sync::{broadcast, mpsc, oneshot}; + +pub struct NodeContext { + sender: mpsc::Sender<(FlashblocksPayloadV1, oneshot::Sender<()>)>, + pub local_node_record: NodeRecord, + http_api_addr: SocketAddr, + _node_exit_future: NodeExitFuture, + _node: Box, + _task_manager: TaskManager, +} + +impl NodeContext { + pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { + let (tx, rx) = oneshot::channel(); + self.sender.send((payload, tx)).await?; + rx.await?; + Ok(()) + } + + pub async fn provider(&self) -> eyre::Result { + let url = format!("http://{}", self.http_api_addr); + let client = RpcClient::builder().http(url.parse()?); + + Ok(RootProvider::new(client)) + } + + pub async fn send_test_payloads(&self) -> eyre::Result<()> { + let base_payload = create_first_payload(); + self.send_payload(base_payload).await?; + + let second_payload = create_second_payload(); + self.send_payload(second_payload).await?; + + Ok(()) + } +} + +async fn setup_node(trusted_peer: Option<(PeerId, SocketAddr)>) -> eyre::Result { + let tasks = TaskManager::current(); + let exec = tasks.executor(); + + let (outbound_tx, outbound_rx) = broadcast::channel(100); + let (inbound_tx, inbound_rx) = broadcast::channel(100); + + let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); + let chain_spec = Arc::new( + OpChainSpecBuilder::base_mainnet() + .genesis(genesis) + .ecotone_activated() + .build(), + ); + + let network_config = NetworkArgs { + discovery: DiscoveryArgs { + disable_discovery: true, + ..DiscoveryArgs::default() + }, + ..NetworkArgs::default() + }; + + // Use with_unused_ports() to let Reth allocate random ports and avoid port collisions + let node_config = NodeConfig::new(chain_spec.clone()) + .with_network(network_config.clone()) + .with_rpc(RpcServerArgs::default().with_unused_ports().with_http()) + .with_unused_ports(); + + let node = OpNode::new(RollupArgs::default()); + + // Start websocket server to simulate the builder and send payloads back to the node + let (sender, mut receiver) = mpsc::channel::<(FlashblocksPayloadV1, oneshot::Sender<()>)>(100); + + let NodeHandle { + node, + node_exit_future, + } = NodeBuilder::new(node_config.clone()) + .testing_node(exec.clone()) + .with_types_and_provider::>() + .with_components(node.components_builder()) + .with_add_ons(node.add_ons()) + .extend_rpc_modules(move |ctx| { + // We are not going to use the websocket connection to send payloads so we use + // a dummy url. + let flashblocks_overlay = FlashblocksOverlay::new(chain_spec, inbound_rx); + flashblocks_overlay.clone().start()?; + + let eth_api = ctx.registry.eth_api().clone(); + let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay.clone()); + + ctx.modules.replace_configured(api_ext.into_rpc())?; + + tokio::spawn(async move { + while let Some((payload, tx)) = receiver.recv().await { + flashblocks_overlay.process_payload(payload).unwrap(); + tx.send(()).unwrap(); + } + }); + + Ok(()) + }) + .launch() + .await?; + + let verifying_key = VerifyingKey::default(); + let custom_rlpx_handler = FlashblocksProtoHandler::new( + node.network.clone(), + VerifyingKey::default(), + inbound_tx, + outbound_tx, + ); + + node.network + .add_rlpx_sub_protocol(custom_rlpx_handler.into_rlpx_sub_protocol()); + + if let Some((peer_id, addr)) = trusted_peer { + // If a trusted peer is provided, add it to the network + node.network.add_trusted_peer(peer_id, addr); + } + + let http_api_addr = node + .rpc_server_handle() + .http_local_addr() + .ok_or_else(|| eyre::eyre!("Failed to get http api address"))?; + + let network_handle = node.network.clone(); + let local_node_record = network_handle.local_node_record(); + + Ok(NodeContext { + sender, + local_node_record, + http_api_addr, + _node_exit_future: node_exit_future, + _node: Box::new(node), + _task_manager: tasks, + }) +} + +fn create_first_payload() -> FlashblocksPayloadV1 { + FlashblocksPayloadV1 { + payload_id: PayloadId::new([0; 8]), + index: 0, + base: Some(ExecutionPayloadBaseV1 { + parent_beacon_block_root: B256::default(), + parent_hash: B256::default(), + fee_recipient: Address::ZERO, + prev_randao: B256::default(), + block_number: 1, + gas_limit: 0, + timestamp: 0, + extra_data: Bytes::new(), + base_fee_per_gas: U256::ZERO, + }), + diff: ExecutionPayloadFlashblockDeltaV1::default(), + metadata: serde_json::to_value(Metadata { + block_number: 1, + receipts: HashMap::default(), + new_account_balances: HashMap::default(), + }) + .unwrap(), + } +} + +const TEST_ADDRESS: Address = address!("0x1234567890123456789012345678901234567890"); +const PENDING_BALANCE: u64 = 4600; + +const TX1_HASH: TxHash = + b256!("0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548"); +const TX2_HASH: TxHash = + b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); + +fn create_second_payload() -> FlashblocksPayloadV1 { + // Create second payload (index 1) with transactions + // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) + // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 + let tx1 = Bytes::from_str("0x7ef8f8a042a8ae5ec231af3d0f90f68543ec8bca1da4f7edd712d5b51b490688355a6db794deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000044d000a118b00000000000000040000000067cb7cb0000000000077dbd4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014edd27304108914dd6503b19b9eeb9956982ef197febbeeed8a9eac3dbaaabdf000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3").unwrap(); + let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); + + // Send another test flashblock payload + let payload = FlashblocksPayloadV1 { + payload_id: PayloadId::new([0; 8]), + index: 1, + base: None, + diff: ExecutionPayloadFlashblockDeltaV1 { + state_root: B256::default(), + receipts_root: B256::default(), + gas_used: 0, + block_hash: B256::default(), + transactions: vec![tx1, tx2], + withdrawals: Vec::new(), + logs_bloom: Default::default(), + withdrawals_root: Default::default(), + }, + metadata: serde_json::to_value(Metadata { + block_number: 1, + receipts: { + let mut receipts = HashMap::default(); + receipts.insert( + TX1_HASH.to_string(), // transaction hash as string + OpReceipt::Legacy(Receipt { + status: true.into(), + cumulative_gas_used: 21000, + logs: vec![], + }), + ); + receipts.insert( + TX2_HASH.to_string(), // transaction hash as string + OpReceipt::Legacy(Receipt { + status: true.into(), + cumulative_gas_used: 45000, + logs: vec![], + }), + ); + receipts + }, + new_account_balances: { + let mut map = HashMap::default(); + map.insert( + TEST_ADDRESS.to_string(), + format!("0x{:x}", U256::from(PENDING_BALANCE)), + ); + map + }, + }) + .unwrap(), + }; + + payload +} + +#[tokio::test] +async fn test_get_block_by_number_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node(None).await?; + let provider = node.provider().await?; + + let latest_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) + .await? + .expect("latest block expected"); + assert_eq!(latest_block.number(), 0); + + // Querying pending block when it does not exists yet + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await?; + assert_eq!(pending_block.is_none(), true); + + let base_payload = create_first_payload(); + node.send_payload(base_payload).await?; + + // Query pending block after sending the base payload with an empty delta + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(pending_block.number(), 1); + assert_eq!(pending_block.transactions.hashes().len(), 0); + + let second_payload = create_second_payload(); + node.send_payload(second_payload).await?; + + // Query pending block after sending the second payload with two transactions + let block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(block.number(), 1); + assert_eq!(block.transactions.hashes().len(), 2); + + Ok(()) +} + +#[tokio::test] +async fn test_get_balance_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node(None).await?; + let provider = node.provider().await?; + + node.send_test_payloads().await?; + + let balance = provider.get_balance(TEST_ADDRESS).await?; + assert_eq!(balance, U256::ZERO); + + let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; + assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); + + Ok(()) +} + +#[tokio::test] +async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node(None).await?; + let provider = node.provider().await?; + + let receipt = provider.get_transaction_receipt(TX1_HASH).await?; + assert_eq!(receipt.is_none(), true); + + node.send_test_payloads().await?; + + let receipt = provider + .get_transaction_receipt(TX1_HASH) + .await? + .expect("receipt expected"); + assert_eq!(receipt.gas_used, 21000); + + // TODO: Add a new payload and validate that the receipts from the previous payload + // are not returned. + + Ok(()) +} diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 7ae6f2a3..b9ac054e 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -36,6 +36,8 @@ pub struct FlashblocksProtoHandler { pub authorizer_vk: VerifyingKey, /// Sender for newly created or received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. + /// TODO: we still need an internal listener for this channel to + /// handle locally created flashblocks. pub peer_tx: broadcast::Sender, /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index 3595df37..71c176d0 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -1,44 +1,44 @@ use crate::{FlashblocksApi, cache::FlashblocksCache}; use alloy_primitives::{Address, TxHash, U256}; -use ed25519_dalek::VerifyingKey; use jsonrpsee::core::async_trait; use op_alloy_network::Optimism; use reth_optimism_chainspec::OpChainSpec; use reth_rpc_eth_api::{RpcBlock, RpcReceipt}; use rollup_boost::FlashblocksPayloadV1; use std::{io::Read, sync::Arc}; -use tokio::sync::{broadcast, mpsc}; -use tracing::{debug, error, info}; +use tokio::sync::broadcast; +use tracing::error; -pub struct FlashblocksOverlayBuilder { +pub struct FlashblocksOverlay { events: broadcast::Receiver, - flashblocks_authorizor: VerifyingKey, cache: FlashblocksCache, } -#[derive(Clone)] -pub struct FlashblocksOverlay { - cache: FlashblocksCache, +impl Clone for FlashblocksOverlay { + fn clone(&self) -> Self { + Self { + events: self.events.resubscribe(), + cache: self.cache.clone(), + } + } } -impl FlashblocksOverlayBuilder { +impl FlashblocksOverlay { pub fn new( chain_spec: Arc, - flashblocks_authorizor: VerifyingKey, events: broadcast::Receiver, ) -> Self { Self { events, - flashblocks_authorizor, cache: FlashblocksCache::new(chain_spec), } } - pub fn start(mut self) -> eyre::Result { + pub fn start(mut self) -> eyre::Result<()> { let cache_cloned = self.cache.clone(); - let overlay = FlashblocksOverlay { - cache: self.cache.clone(), - }; + // let overlay = FlashblocksOverlay { + // cache: self.cache.clone(), + // }; tokio::spawn(async move { loop { // TODO: handle this error @@ -49,7 +49,7 @@ impl FlashblocksOverlayBuilder { } }); - Ok(overlay) + Ok(()) } pub fn process_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { diff --git a/crates/flashblocks-rpc/src/lib.rs b/crates/flashblocks-rpc/src/lib.rs index 5887b2a7..3bb78141 100644 --- a/crates/flashblocks-rpc/src/lib.rs +++ b/crates/flashblocks-rpc/src/lib.rs @@ -8,4 +8,4 @@ mod metrics; pub use metrics::*; mod cache; -mod tests; +pub use cache::*; diff --git a/crates/flashblocks-rpc/src/tests/assets/genesis.json b/crates/flashblocks-rpc/src/tests/assets/genesis.json deleted file mode 100644 index 4d703497..00000000 --- a/crates/flashblocks-rpc/src/tests/assets/genesis.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "config": { - "chainId": 8453, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "muirGlacierBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "arrowGlacierBlock": 0, - "grayGlacierBlock": 0, - "mergeNetsplitBlock": 0, - "bedrockBlock": 0, - "regolithTime": 0, - "terminalTotalDifficulty": 0, - "terminalTotalDifficultyPassed": true, - "optimism": { - "eip1559Elasticity": 6, - "eip1559Denominator": 50 - } - }, - "nonce": "0x0", - "timestamp": "0x0", - "extraData": "0x00", - "gasLimit": "0x1c9c380", - "difficulty": "0x0", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "0x14dc79964da2c08b23698b3d3cc7ca32193d9955": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x1cbd3b2770909d4e10f157cabc84c7264073c9ec": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x2546bcd3c84621e976d8185a91a922ae77ecec30": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x70997970c51812dc3a010c7d01b50e0d17dc79c8": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x71be63f3384f5fb98995898a86b02fb2426c5788": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x90f79bf6eb2c4f870365e785982e1f101e93b906": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x976ea74026e726554db657fa54763abd0c3a0aa9": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc": { - "balance": "0xd3c21bcecceda1000000" - }, - "0x9c41de96b2088cdc640c6182dfcf5491dc574a57": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xa0ee7a142d267c1f36714e4a8f75612f20a79720": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xbcd4042de499d14e55001ccbb24a551f3b954096": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xbda5747bfd65f08deb54cb465eb87d40e51b197e": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xcd3b766ccdd6ae721141f452c550ca635964ce71": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xdd2fd4581271e230360230f9337d5c0430bf44c0": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xdf3e18d64bc6a983f673ab319ccae4f1a57c7097": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": { - "balance": "0xd3c21bcecceda1000000" - }, - "0xfabb0ac9d68b0b445fb7357272ff202c5651694a": { - "balance": "0xd3c21bcecceda1000000" - } - }, - "number": "0x0" -} \ No newline at end of file diff --git a/crates/flashblocks-rpc/src/tests/mod.rs b/crates/flashblocks-rpc/src/tests/mod.rs deleted file mode 100644 index d3ed4227..00000000 --- a/crates/flashblocks-rpc/src/tests/mod.rs +++ /dev/null @@ -1,316 +0,0 @@ -#[cfg(test)] -mod tests { - use crate::{ - EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, FlashblocksOverlayBuilder, - cache::Metadata, - }; - use alloy_consensus::Receipt; - use alloy_genesis::Genesis; - use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; - use alloy_provider::{Provider, RootProvider}; - use alloy_rpc_client::RpcClient; - use alloy_rpc_types_engine::PayloadId; - use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; - use reth_node_core::{ - args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}, - exit::NodeExitFuture, - }; - use reth_optimism_chainspec::OpChainSpecBuilder; - use reth_optimism_node::{OpNode, args::RollupArgs}; - use reth_optimism_primitives::OpReceipt; - use reth_provider::providers::BlockchainProvider; - use reth_tasks::TaskManager; - use rollup_boost::{ - ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, - }; - use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; - use tokio::sync::{mpsc, oneshot}; - use url::Url; - - pub struct NodeContext { - sender: mpsc::Sender<(FlashblocksPayloadV1, oneshot::Sender<()>)>, - http_api_addr: SocketAddr, - _node_exit_future: NodeExitFuture, - _node: Box, - _task_manager: TaskManager, - } - - impl NodeContext { - pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { - let (tx, rx) = oneshot::channel(); - self.sender.send((payload, tx)).await?; - rx.await?; - Ok(()) - } - - pub async fn provider(&self) -> eyre::Result { - let url = format!("http://{}", self.http_api_addr); - let client = RpcClient::builder().http(url.parse()?); - - Ok(RootProvider::new(client)) - } - - pub async fn send_test_payloads(&self) -> eyre::Result<()> { - let base_payload = create_first_payload(); - self.send_payload(base_payload).await?; - - let second_payload = create_second_payload(); - self.send_payload(second_payload).await?; - - Ok(()) - } - } - - async fn setup_node() -> eyre::Result { - let tasks = TaskManager::current(); - let exec = tasks.executor(); - - let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); - let chain_spec = Arc::new( - OpChainSpecBuilder::base_mainnet() - .genesis(genesis) - .ecotone_activated() - .build(), - ); - - let network_config = NetworkArgs { - discovery: DiscoveryArgs { - disable_discovery: true, - ..DiscoveryArgs::default() - }, - ..NetworkArgs::default() - }; - - // Use with_unused_ports() to let Reth allocate random ports and avoid port collisions - let node_config = NodeConfig::new(chain_spec.clone()) - .with_network(network_config.clone()) - .with_rpc(RpcServerArgs::default().with_unused_ports().with_http()) - .with_unused_ports(); - - let node = OpNode::new(RollupArgs::default()); - - // Start websocket server to simulate the builder and send payloads back to the node - let (sender, mut receiver) = - mpsc::channel::<(FlashblocksPayloadV1, oneshot::Sender<()>)>(100); - - let NodeHandle { - node, - node_exit_future, - } = NodeBuilder::new(node_config.clone()) - .testing_node(exec.clone()) - .with_types_and_provider::>() - .with_components(node.components_builder()) - .with_add_ons(node.add_ons()) - .extend_rpc_modules(move |ctx| { - // We are not going to use the websocket connection to send payloads so we use - // a dummy url. - let flashblocks_overlay = FlashblocksOverlayBuilder::new(chain_spec); - - let eth_api = ctx.registry.eth_api().clone(); - let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay.clone()); - - ctx.modules.replace_configured(api_ext.into_rpc())?; - - tokio::spawn(async move { - while let Some((payload, tx)) = receiver.recv().await { - flashblocks_overlay.process_payload(payload).unwrap(); - tx.send(()).unwrap(); - } - }); - - Ok(()) - }) - .launch() - .await?; - - let http_api_addr = node - .rpc_server_handle() - .http_local_addr() - .ok_or_else(|| eyre::eyre!("Failed to get http api address"))?; - - Ok(NodeContext { - sender, - http_api_addr, - _node_exit_future: node_exit_future, - _node: Box::new(node), - _task_manager: tasks, - }) - } - - fn create_first_payload() -> FlashblocksPayloadV1 { - FlashblocksPayloadV1 { - payload_id: PayloadId::new([0; 8]), - index: 0, - base: Some(ExecutionPayloadBaseV1 { - parent_beacon_block_root: B256::default(), - parent_hash: B256::default(), - fee_recipient: Address::ZERO, - prev_randao: B256::default(), - block_number: 1, - gas_limit: 0, - timestamp: 0, - extra_data: Bytes::new(), - base_fee_per_gas: U256::ZERO, - }), - diff: ExecutionPayloadFlashblockDeltaV1::default(), - metadata: serde_json::to_value(Metadata { - block_number: 1, - receipts: HashMap::default(), - new_account_balances: HashMap::default(), - }) - .unwrap(), - } - } - - const TEST_ADDRESS: Address = address!("0x1234567890123456789012345678901234567890"); - const PENDING_BALANCE: u64 = 4600; - - const TX1_HASH: TxHash = - b256!("0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548"); - const TX2_HASH: TxHash = - b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); - - fn create_second_payload() -> FlashblocksPayloadV1 { - // Create second payload (index 1) with transactions - // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) - // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 - let tx1 = Bytes::from_str("0x7ef8f8a042a8ae5ec231af3d0f90f68543ec8bca1da4f7edd712d5b51b490688355a6db794deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000044d000a118b00000000000000040000000067cb7cb0000000000077dbd4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014edd27304108914dd6503b19b9eeb9956982ef197febbeeed8a9eac3dbaaabdf000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3").unwrap(); - let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); - - // Send another test flashblock payload - let payload = FlashblocksPayloadV1 { - payload_id: PayloadId::new([0; 8]), - index: 1, - base: None, - diff: ExecutionPayloadFlashblockDeltaV1 { - state_root: B256::default(), - receipts_root: B256::default(), - gas_used: 0, - block_hash: B256::default(), - transactions: vec![tx1, tx2], - withdrawals: Vec::new(), - logs_bloom: Default::default(), - withdrawals_root: Default::default(), - }, - metadata: serde_json::to_value(Metadata { - block_number: 1, - receipts: { - let mut receipts = HashMap::default(); - receipts.insert( - TX1_HASH.to_string(), // transaction hash as string - OpReceipt::Legacy(Receipt { - status: true.into(), - cumulative_gas_used: 21000, - logs: vec![], - }), - ); - receipts.insert( - TX2_HASH.to_string(), // transaction hash as string - OpReceipt::Legacy(Receipt { - status: true.into(), - cumulative_gas_used: 45000, - logs: vec![], - }), - ); - receipts - }, - new_account_balances: { - let mut map = HashMap::default(); - map.insert( - TEST_ADDRESS.to_string(), - format!("0x{:x}", U256::from(PENDING_BALANCE)), - ); - map - }, - }) - .unwrap(), - }; - - payload - } - - #[tokio::test] - async fn test_get_block_by_number_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node().await?; - let provider = node.provider().await?; - - let latest_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) - .await? - .expect("latest block expected"); - assert_eq!(latest_block.number(), 0); - - // Querying pending block when it does not exists yet - let pending_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await?; - assert_eq!(pending_block.is_none(), true); - - let base_payload = create_first_payload(); - node.send_payload(base_payload).await?; - - // Query pending block after sending the base payload with an empty delta - let pending_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(pending_block.number(), 1); - assert_eq!(pending_block.transactions.hashes().len(), 0); - - let second_payload = create_second_payload(); - node.send_payload(second_payload).await?; - - // Query pending block after sending the second payload with two transactions - let block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(block.number(), 1); - assert_eq!(block.transactions.hashes().len(), 2); - - Ok(()) - } - - #[tokio::test] - async fn test_get_balance_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node().await?; - let provider = node.provider().await?; - - node.send_test_payloads().await?; - - let balance = provider.get_balance(TEST_ADDRESS).await?; - assert_eq!(balance, U256::ZERO); - - let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; - assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); - - Ok(()) - } - - #[tokio::test] - async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node().await?; - let provider = node.provider().await?; - - let receipt = provider.get_transaction_receipt(TX1_HASH).await?; - assert_eq!(receipt.is_none(), true); - - node.send_test_payloads().await?; - - let receipt = provider - .get_transaction_receipt(TX1_HASH) - .await? - .expect("receipt expected"); - assert_eq!(receipt.gas_used, 21000); - - // TODO: Add a new payload and validate that the receipts from the previous payload - // are not returned. - - Ok(()) - } -} From dcf2a4317898bac57ca56a9b51343b20dd5f372b Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 14 Jul 2025 14:38:06 -0700 Subject: [PATCH 022/114] getting integration tests working --- crates/flashblocks-node/tests/p2p.rs | 264 +++++++++++------- .../flashblocks-p2p/src/connection/handler.rs | 2 + crates/flashblocks-p2p/src/connection/mod.rs | 7 +- .../flashblocks-p2p/src/protocol/handler.rs | 5 +- 4 files changed, 181 insertions(+), 97 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 54b703ab..56025905 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -4,8 +4,12 @@ use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; use alloy_provider::{Provider, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; -use ed25519_dalek::VerifyingKey; -use flashblocks_p2p::protocol::handler::FlashblocksProtoHandler; +use ed25519_dalek::{SigningKey, VerifyingKey}; +use flashblocks_p2p::protocol::{ + auth::Authorized, + handler::FlashblocksProtoHandler, + proto::{FlashblocksProtoMessage, FlashblocksProtoMessageId, FlashblocksProtoMessageKind}, +}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_network::{Peers, PeersInfo, protocol::IntoRlpxSubProtocol as _}; @@ -19,29 +23,29 @@ use reth_optimism_chainspec::OpChainSpecBuilder; use reth_optimism_node::{OpNode, args::RollupArgs}; use reth_optimism_primitives::OpReceipt; use reth_provider::providers::BlockchainProvider; -use reth_tasks::TaskManager; +use reth_tasks::{TaskExecutor, TaskManager}; use rollup_boost::{ - ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, + Authorization, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, }; use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; -use tokio::sync::{broadcast, mpsc, oneshot}; +use tokio::sync::broadcast; +use tracing::info; pub struct NodeContext { - sender: mpsc::Sender<(FlashblocksPayloadV1, oneshot::Sender<()>)>, + inbound_tx: broadcast::Sender, + outbound_tx: broadcast::Sender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, _node: Box, - _task_manager: TaskManager, } impl NodeContext { - pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { - let (tx, rx) = oneshot::channel(); - self.sender.send((payload, tx)).await?; - rx.await?; - Ok(()) - } + // pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { + // self.sender.send(payload).await?; + // rx.await?; + // Ok(()) + // } pub async fn provider(&self) -> eyre::Result { let url = format!("http://{}", self.http_api_addr); @@ -50,22 +54,23 @@ impl NodeContext { Ok(RootProvider::new(client)) } - pub async fn send_test_payloads(&self) -> eyre::Result<()> { - let base_payload = create_first_payload(); - self.send_payload(base_payload).await?; - - let second_payload = create_second_payload(); - self.send_payload(second_payload).await?; - - Ok(()) - } + // pub async fn send_test_payloads(&self) -> eyre::Result<()> { + // let base_payload = create_first_payload(); + // self.send_payload(base_payload).await?; + // + // let second_payload = create_second_payload(); + // self.send_payload(second_payload).await?; + // + // Ok(()) + // } } -async fn setup_node(trusted_peer: Option<(PeerId, SocketAddr)>) -> eyre::Result { - let tasks = TaskManager::current(); - let exec = tasks.executor(); - - let (outbound_tx, outbound_rx) = broadcast::channel(100); +async fn setup_node( + exec: TaskExecutor, + authorizer: SigningKey, + trusted_peer: Option<(PeerId, SocketAddr)>, +) -> eyre::Result { + let (outbound_tx, _outbound_rx) = broadcast::channel(100); let (inbound_tx, inbound_rx) = broadcast::channel(100); let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); @@ -92,9 +97,6 @@ async fn setup_node(trusted_peer: Option<(PeerId, SocketAddr)>) -> eyre::Result< let node = OpNode::new(RollupArgs::default()); - // Start websocket server to simulate the builder and send payloads back to the node - let (sender, mut receiver) = mpsc::channel::<(FlashblocksPayloadV1, oneshot::Sender<()>)>(100); - let NodeHandle { node, node_exit_future, @@ -114,34 +116,30 @@ async fn setup_node(trusted_peer: Option<(PeerId, SocketAddr)>) -> eyre::Result< ctx.modules.replace_configured(api_ext.into_rpc())?; - tokio::spawn(async move { - while let Some((payload, tx)) = receiver.recv().await { - flashblocks_overlay.process_payload(payload).unwrap(); - tx.send(()).unwrap(); - } - }); - Ok(()) }) .launch() .await?; - let verifying_key = VerifyingKey::default(); let custom_rlpx_handler = FlashblocksProtoHandler::new( node.network.clone(), - VerifyingKey::default(), - inbound_tx, - outbound_tx, + authorizer.verifying_key(), + inbound_tx.clone(), + outbound_tx.clone(), ); node.network .add_rlpx_sub_protocol(custom_rlpx_handler.into_rlpx_sub_protocol()); + tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; + if let Some((peer_id, addr)) = trusted_peer { // If a trusted peer is provided, add it to the network node.network.add_trusted_peer(peer_id, addr); } + tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await; + let http_api_addr = node .rpc_server_handle() .http_local_addr() @@ -151,12 +149,12 @@ async fn setup_node(trusted_peer: Option<(PeerId, SocketAddr)>) -> eyre::Result< let local_node_record = network_handle.local_node_record(); Ok(NodeContext { - sender, + inbound_tx, + outbound_tx, local_node_record, http_api_addr, _node_exit_future: node_exit_future, _node: Box::new(node), - _task_manager: tasks, }) } @@ -201,7 +199,7 @@ fn create_second_payload() -> FlashblocksPayloadV1 { let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); // Send another test flashblock payload - let payload = FlashblocksPayloadV1 { + FlashblocksPayloadV1 { payload_id: PayloadId::new([0; 8]), index: 1, base: None, @@ -247,34 +245,109 @@ fn create_second_payload() -> FlashblocksPayloadV1 { }, }) .unwrap(), - }; - - payload + } } +// #[tokio::test] +// async fn test_get_block_by_number_pending() -> eyre::Result<()> { +// reth_tracing::init_test_tracing(); +// let node = setup_node(None).await?; +// let provider = node.provider().await?; +// +// let latest_block = provider +// .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) +// .await? +// .expect("latest block expected"); +// assert_eq!(latest_block.number(), 0); +// +// // Querying pending block when it does not exists yet +// let pending_block = provider +// .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) +// .await?; +// assert_eq!(pending_block.is_none(), true); +// +// let base_payload = create_first_payload(); +// node.sender.send(base_payload.clone())?; +// tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; +// +// // Query pending block after sending the base payload with an empty delta +// let pending_block = provider +// .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) +// .await? +// .expect("pending block expected"); +// +// assert_eq!(pending_block.number(), 1); +// assert_eq!(pending_block.transactions.hashes().len(), 0); +// +// let second_payload = create_second_payload(); +// node.sender.send(second_payload.clone())?; +// tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; +// +// // Query pending block after sending the second payload with two transactions +// let block = provider +// .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) +// .await? +// .expect("pending block expected"); +// +// assert_eq!(block.number(), 1); +// assert_eq!(block.transactions.hashes().len(), 2); +// +// Ok(()) +// } + #[tokio::test] -async fn test_get_block_by_number_pending() -> eyre::Result<()> { +async fn test_peering() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let node = setup_node(None).await?; - let provider = node.provider().await?; + let authorizer = SigningKey::from_bytes(&[0u8; 32]); + let builder = SigningKey::from_bytes(&[1u8; 32]); - let latest_block = provider + let tasks = TaskManager::current(); + let exec = tasks.executor(); + // let exec = TaskExecutor::current(); + let node_0 = setup_node(exec, authorizer.clone(), None).await?; + let provider_0 = node_0.provider().await?; + let enr_0 = node_0.local_node_record; + + let node_1 = setup_node( + TaskExecutor::current(), + authorizer.clone(), + Some((enr_0.id, enr_0.tcp_addr())), + ) + .await?; + let provider_1 = node_1.provider().await?; + + tokio::time::sleep(tokio::time::Duration::from_millis(20000)).await; + + let latest_block = provider_1 .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) .await? .expect("latest block expected"); assert_eq!(latest_block.number(), 0); // Querying pending block when it does not exists yet - let pending_block = provider + let pending_block = provider_1 .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) .await?; assert_eq!(pending_block.is_none(), true); let base_payload = create_first_payload(); - node.send_payload(base_payload).await?; + info!("Sending base payload"); + let authorization = Authorization::new( + base_payload.payload_id, + 0, + &authorizer, + builder.verifying_key(), + ); + let authorized = Authorized::new(&builder, authorization, base_payload.clone()); + let proto_message = FlashblocksProtoMessage { + message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized), + message_type: FlashblocksProtoMessageId::FlashblocksPayloadV1, + }; + node_1.outbound_tx.send(proto_message)?; + tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; // Query pending block after sending the base payload with an empty delta - let pending_block = provider + let pending_block = provider_0 .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) .await? .expect("pending block expected"); @@ -283,10 +356,11 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { assert_eq!(pending_block.transactions.hashes().len(), 0); let second_payload = create_second_payload(); - node.send_payload(second_payload).await?; + node_1.inbound_tx.send(second_payload.clone())?; + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; // Query pending block after sending the second payload with two transactions - let block = provider + let block = provider_0 .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) .await? .expect("pending block expected"); @@ -297,42 +371,42 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { Ok(()) } -#[tokio::test] -async fn test_get_balance_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node(None).await?; - let provider = node.provider().await?; - - node.send_test_payloads().await?; - - let balance = provider.get_balance(TEST_ADDRESS).await?; - assert_eq!(balance, U256::ZERO); - - let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; - assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); - - Ok(()) -} - -#[tokio::test] -async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); - let node = setup_node(None).await?; - let provider = node.provider().await?; - - let receipt = provider.get_transaction_receipt(TX1_HASH).await?; - assert_eq!(receipt.is_none(), true); - - node.send_test_payloads().await?; - - let receipt = provider - .get_transaction_receipt(TX1_HASH) - .await? - .expect("receipt expected"); - assert_eq!(receipt.gas_used, 21000); - - // TODO: Add a new payload and validate that the receipts from the previous payload - // are not returned. - - Ok(()) -} +// #[tokio::test] +// async fn test_get_balance_pending() -> eyre::Result<()> { +// reth_tracing::init_test_tracing(); +// let node = setup_node(None).await?; +// let provider = node.provider().await?; +// +// node.send_test_payloads().await?; +// +// let balance = provider.get_balance(TEST_ADDRESS).await?; +// assert_eq!(balance, U256::ZERO); +// +// let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; +// assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); +// +// Ok(()) +// } +// +// #[tokio::test] +// async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { +// reth_tracing::init_test_tracing(); +// let node = setup_node(None).await?; +// let provider = node.provider().await?; +// +// let receipt = provider.get_transaction_receipt(TX1_HASH).await?; +// assert_eq!(receipt.is_none(), true); +// +// node.send_test_payloads().await?; +// +// let receipt = provider +// .get_transaction_receipt(TX1_HASH) +// .await? +// .expect("receipt expected"); +// assert_eq!(receipt.gas_used, 21000); +// +// // TODO: Add a new payload and validate that the receipts from the previous payload +// // are not returned. +// +// Ok(()) +// } diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs index 64cebef5..5efc0e7b 100644 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ b/crates/flashblocks-p2p/src/connection/handler.rs @@ -15,6 +15,7 @@ use reth_ethereum::network::{ use rollup_boost::FlashblocksPayloadV1; use tokio::sync::broadcast; use tokio_stream::wrappers::BroadcastStream; +use tracing::debug; /// The connection handler for the flashblocks RLPx protocol. pub struct FlashblocksConnectionHandler { @@ -47,6 +48,7 @@ impl ConnectionHandler for FlashblocksConnectionH peer_id: PeerId, conn: ProtocolConnection, ) -> Self::Connection { + debug!(%peer_id, %direction, "New connection established with flashblocks peer"); FlashblocksConnection { conn, peer_id, diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index caebf9c5..3e22d364 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -9,7 +9,7 @@ use alloy_primitives::bytes::BytesMut; use ed25519_dalek::VerifyingKey; use futures::{Stream, StreamExt}; use parking_lot::{Mutex, RwLock}; -use reth::payload::PayloadId; +use reth::{payload::PayloadId, rpc::api::eth::helpers::trace}; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use reth_network::types::ReputationChangeKind; use rollup_boost::FlashblocksPayloadV1; @@ -20,6 +20,7 @@ use std::{ }; use tokio::sync::broadcast; use tokio_stream::wrappers::BroadcastStream; +use tracing::trace; pub(crate) mod handler; @@ -59,6 +60,7 @@ impl Stream for FlashblocksConnection { match res { Ok(outbound) => { // TODO: handle the case where this peer is the one that sent the original + trace!(peer_id = %this.peer_id, target = "flashblocks", "Broadcasting flashblocks message"); return Poll::Ready(Some(outbound.encoded())); } Err(e) => { @@ -78,6 +80,9 @@ impl Stream for FlashblocksConnection { return Poll::Ready(None); }; + trace!(peer_id = %this.peer_id, target = "flashblocks", + "Received flashblocks message from peer", + ); match msg.message { FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized) => { this.handle_flashblocks_payload_v1(authorized, msg.message_type); diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index b9ac054e..fa9d05d3 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -9,6 +9,7 @@ use rollup_boost::FlashblocksPayloadV1; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::broadcast; +use tracing::info; pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} @@ -54,7 +55,7 @@ impl FlashblocksProtoHandler { flashblock_tx: broadcast::Sender, peer_tx: broadcast::Sender, ) -> Self { - // let flashblock_sender_rx = flashblock_sender_tx.subscribe(); + println!("Protocol created: {authorizer_vk:?}"); let state = Arc::new(Mutex::new(FlashblocksP2PState { flashblock_index: 0, payload_timestamp: 0, @@ -76,6 +77,7 @@ impl ProtocolHandler for FlashblocksProtoHandler< type ConnectionHandler = FlashblocksConnectionHandler; fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { + info!("here4"); Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), authorizer_vk: self.authorizer_vk, @@ -90,6 +92,7 @@ impl ProtocolHandler for FlashblocksProtoHandler< _socket_addr: SocketAddr, _peer_id: PeerId, ) -> Option { + info!("here3"); Some(FlashblocksConnectionHandler:: { network_handle: self.network_handle.clone(), authorizer_vk: self.authorizer_vk, From 485adf03f8f943b29350705bb17c990d3fc17e17 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 14 Jul 2025 15:36:21 -0700 Subject: [PATCH 023/114] get tests passing --- crates/flashblocks-node/tests/p2p.rs | 49 +++++++-------- crates/flashblocks-p2p/src/connection/mod.rs | 3 +- .../flashblocks-p2p/src/protocol/handler.rs | 61 ++++++++++++++++--- 3 files changed, 78 insertions(+), 35 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 56025905..1cb26e0e 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -4,7 +4,7 @@ use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; use alloy_provider::{Provider, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; -use ed25519_dalek::{SigningKey, VerifyingKey}; +use ed25519_dalek::SigningKey; use flashblocks_p2p::protocol::{ auth::Authorized, handler::FlashblocksProtoHandler, @@ -41,28 +41,12 @@ pub struct NodeContext { } impl NodeContext { - // pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { - // self.sender.send(payload).await?; - // rx.await?; - // Ok(()) - // } - pub async fn provider(&self) -> eyre::Result { let url = format!("http://{}", self.http_api_addr); let client = RpcClient::builder().http(url.parse()?); Ok(RootProvider::new(client)) } - - // pub async fn send_test_payloads(&self) -> eyre::Result<()> { - // let base_payload = create_first_payload(); - // self.send_payload(base_payload).await?; - // - // let second_payload = create_second_payload(); - // self.send_payload(second_payload).await?; - // - // Ok(()) - // } } async fn setup_node( @@ -158,7 +142,7 @@ async fn setup_node( }) } -fn create_first_payload() -> FlashblocksPayloadV1 { +fn payload_0() -> FlashblocksPayloadV1 { FlashblocksPayloadV1 { payload_id: PayloadId::new([0; 8]), index: 0, @@ -191,7 +175,7 @@ const TX1_HASH: TxHash = const TX2_HASH: TxHash = b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); -fn create_second_payload() -> FlashblocksPayloadV1 { +fn payload_2() -> FlashblocksPayloadV1 { // Create second payload (index 1) with transactions // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 @@ -328,17 +312,17 @@ async fn test_peering() -> eyre::Result<()> { let pending_block = provider_1 .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) .await?; - assert_eq!(pending_block.is_none(), true); + assert!(pending_block.is_none()); - let base_payload = create_first_payload(); + let payload_0 = payload_0(); info!("Sending base payload"); let authorization = Authorization::new( - base_payload.payload_id, + payload_0.payload_id, 0, &authorizer, builder.verifying_key(), ); - let authorized = Authorized::new(&builder, authorization, base_payload.clone()); + let authorized = Authorized::new(&builder, authorization, payload_0.clone()); let proto_message = FlashblocksProtoMessage { message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized), message_type: FlashblocksProtoMessageId::FlashblocksPayloadV1, @@ -355,9 +339,22 @@ async fn test_peering() -> eyre::Result<()> { assert_eq!(pending_block.number(), 1); assert_eq!(pending_block.transactions.hashes().len(), 0); - let second_payload = create_second_payload(); - node_1.inbound_tx.send(second_payload.clone())?; - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + let payload_1 = payload_2(); + info!("Sending base payload"); + let authorization = Authorization::new( + payload_1.payload_id, + 0, + &authorizer, + builder.verifying_key(), + ); + let authorized = Authorized::new(&builder, authorization, payload_1.clone()); + let proto_message = FlashblocksProtoMessage { + message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized), + message_type: FlashblocksProtoMessageId::FlashblocksPayloadV1, + }; + + node_1.outbound_tx.send(proto_message)?; + tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; // Query pending block after sending the second payload with two transactions let block = provider_0 diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/connection/mod.rs index 3e22d364..60f42095 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/connection/mod.rs @@ -20,7 +20,7 @@ use std::{ }; use tokio::sync::broadcast; use tokio_stream::wrappers::BroadcastStream; -use tracing::trace; +use tracing::{debug, trace}; pub(crate) mod handler; @@ -178,6 +178,7 @@ impl FlashblocksConnection { // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { // Send the flashblock to the stream + debug!(%flashblock_event.payload_id, %state.flashblock_index, "Publishing new flashblock"); self.flashblock_tx.send(flashblock_event.clone()).ok(); // Update the index state.flashblock_index += 1; diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index fa9d05d3..b6564e98 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,5 +1,5 @@ use crate::connection::handler::FlashblocksConnectionHandler; -use crate::protocol::proto::FlashblocksProtoMessage; +use crate::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; use ed25519_dalek::VerifyingKey; use parking_lot::Mutex; use reth::payload::PayloadId; @@ -9,7 +9,7 @@ use rollup_boost::FlashblocksPayloadV1; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::broadcast; -use tracing::info; +use tracing::{debug, info}; pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} @@ -35,10 +35,8 @@ pub struct FlashblocksProtoHandler { pub network_handle: N, /// Authorizer verifying, used to verify flashblocks payloads. pub authorizer_vk: VerifyingKey, - /// Sender for newly created or received and validated flashblocks payloads - /// which will be broadcasted to all peers. May not be strictly ordered. - /// TODO: we still need an internal listener for this channel to - /// handle locally created flashblocks. + /// Sender for flashblocks payloads which will be broadcasted to all peers. + /// May not be strictly ordered. pub peer_tx: broadcast::Sender, /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. @@ -53,9 +51,8 @@ impl FlashblocksProtoHandler { network_handle: N, authorizer_vk: VerifyingKey, flashblock_tx: broadcast::Sender, - peer_tx: broadcast::Sender, + publish_tx: broadcast::Sender, ) -> Self { - println!("Protocol created: {authorizer_vk:?}"); let state = Arc::new(Mutex::new(FlashblocksP2PState { flashblock_index: 0, payload_timestamp: 0, @@ -63,6 +60,54 @@ impl FlashblocksProtoHandler { flashblocks: vec![], })); + // TODO: Clean up duplicated code + let state_clone = state.clone(); + let mut publish_rx = publish_tx.subscribe(); + let peer_tx = broadcast::Sender::new(100); + let peer_tx_clone = peer_tx.clone(); + let flashblock_tx_clone = flashblock_tx.clone(); + tokio::spawn({ + async move { + while let Ok(msg) = publish_rx.recv().await { + let message = match msg.message { + FlashblocksProtoMessageKind::FlashblocksPayloadV1(message) => message, + }; + // Check if we have a payload id and flashblocks to emit. + let mut state = state_clone.lock(); + let len = state.flashblocks.len(); + state + .flashblocks + .resize_with(len.max(message.payload.index as usize + 1), || None); + let flashblock = &mut state.flashblocks[message.payload.index as usize]; + if flashblock.is_none() { + // We haven't seen this index yet + // Add the flashblock to our cache + *flashblock = Some(message.clone().payload); + tracing::debug!( + "Received flashblocks payload with id: {}, index: {}", + message.payload.payload_id, + message.payload.index + ); + let message = FlashblocksProtoMessage { + message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(message), + message_type: msg.message_type, + }; + peer_tx_clone.send(message).ok(); + // Broadcast any flashblocks in the cache that are in order + while let Some(Some(flashblock_event)) = + state.flashblocks.get(state.flashblock_index) + { + // Send the flashblock to the stream + debug!(payload_id = %flashblock_event.payload_id, flashblock_index = %state.flashblock_index, "Publishing new flashblock"); + flashblock_tx_clone.send(flashblock_event.clone()).ok(); + // Update the index + state.flashblock_index += 1; + } + } + } + } + }); + Self { network_handle, authorizer_vk, From 6d252fefbb55400f7cd6dcd4d5a1939f18d6627b Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 14 Jul 2025 17:13:30 -0700 Subject: [PATCH 024/114] get rid of duplicate code --- crates/flashblocks-node/src/main.rs | 4 +- crates/flashblocks-node/tests/p2p.rs | 4 +- .../flashblocks-p2p/src/connection/handler.rs | 65 ------- crates/flashblocks-p2p/src/lib.rs | 1 - crates/flashblocks-p2p/src/net/mod.rs | 4 +- .../mod.rs => protocol/connection.rs} | 78 ++------ .../flashblocks-p2p/src/protocol/handler.rs | 180 +++++++++++------- crates/flashblocks-p2p/src/protocol/mod.rs | 1 + 8 files changed, 138 insertions(+), 199 deletions(-) delete mode 100644 crates/flashblocks-p2p/src/connection/handler.rs rename crates/flashblocks-p2p/src/{connection/mod.rs => protocol/connection.rs} (65%) diff --git a/crates/flashblocks-node/src/main.rs b/crates/flashblocks-node/src/main.rs index a0968684..5ef91073 100644 --- a/crates/flashblocks-node/src/main.rs +++ b/crates/flashblocks-node/src/main.rs @@ -2,7 +2,7 @@ use clap::Parser; use ed25519_dalek::VerifyingKey; -use flashblocks_p2p::protocol::handler::{ FlashblocksProtoHandler}; +use flashblocks_p2p::protocol::handler::FlashblocksHandler; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay }; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; @@ -59,7 +59,7 @@ pub fn main() { .await?; - let custom_rlpx_handler = FlashblocksProtoHandler::new( + let custom_rlpx_handler = FlashblocksHandler::new( handle.node.network.clone(), VerifyingKey::default(), inbound_tx, diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 1cb26e0e..845db460 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -5,9 +5,9 @@ use alloy_provider::{Provider, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::SigningKey; +use flashblocks_p2p::protocol::handler::FlashblocksHandler; use flashblocks_p2p::protocol::{ auth::Authorized, - handler::FlashblocksProtoHandler, proto::{FlashblocksProtoMessage, FlashblocksProtoMessageId, FlashblocksProtoMessageKind}, }; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; @@ -105,7 +105,7 @@ async fn setup_node( .launch() .await?; - let custom_rlpx_handler = FlashblocksProtoHandler::new( + let custom_rlpx_handler = FlashblocksHandler::new( node.network.clone(), authorizer.verifying_key(), inbound_tx.clone(), diff --git a/crates/flashblocks-p2p/src/connection/handler.rs b/crates/flashblocks-p2p/src/connection/handler.rs deleted file mode 100644 index 5efc0e7b..00000000 --- a/crates/flashblocks-p2p/src/connection/handler.rs +++ /dev/null @@ -1,65 +0,0 @@ -use std::sync::Arc; - -use super::FlashblocksConnection; -use crate::protocol::{ - handler::{FlashblocksP2PNetworHandle, FlashblocksP2PState}, - proto::FlashblocksProtoMessage, -}; -use ed25519_dalek::VerifyingKey; -use parking_lot::Mutex; -use reth_ethereum::network::{ - api::{Direction, PeerId}, - eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, - protocol::{ConnectionHandler, OnNotSupported}, -}; -use rollup_boost::FlashblocksPayloadV1; -use tokio::sync::broadcast; -use tokio_stream::wrappers::BroadcastStream; -use tracing::debug; - -/// The connection handler for the flashblocks RLPx protocol. -pub struct FlashblocksConnectionHandler { - pub network_handle: N, - pub authorizer_vk: VerifyingKey, - pub peer_tx: broadcast::Sender, - pub flashblock_tx: broadcast::Sender, - pub state: Arc>, -} - -impl ConnectionHandler for FlashblocksConnectionHandler { - type Connection = FlashblocksConnection; - - fn protocol(&self) -> Protocol { - FlashblocksProtoMessage::protocol() - } - - fn on_unsupported_by_peer( - self, - _supported: &SharedCapabilities, - _direction: Direction, - _peer_id: PeerId, - ) -> OnNotSupported { - OnNotSupported::KeepAlive - } - - fn into_connection( - self, - direction: Direction, - peer_id: PeerId, - conn: ProtocolConnection, - ) -> Self::Connection { - debug!(%peer_id, %direction, "New connection established with flashblocks peer"); - FlashblocksConnection { - conn, - peer_id, - network_handle: self.network_handle, - authorizer_vk: self.authorizer_vk, - peer_tx: self.peer_tx.clone(), - peer_rx: BroadcastStream::new(self.peer_tx.subscribe()), - flashblock_tx: self.flashblock_tx.clone(), - state: self.state.clone(), - payload_id: Default::default(), - received: Vec::new(), - } - } -} diff --git a/crates/flashblocks-p2p/src/lib.rs b/crates/flashblocks-p2p/src/lib.rs index 9bdbbc9d..c6479e8b 100644 --- a/crates/flashblocks-p2p/src/lib.rs +++ b/crates/flashblocks-p2p/src/lib.rs @@ -1,3 +1,2 @@ -pub mod connection; pub mod net; pub mod protocol; diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 6464c640..94da4a54 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -14,7 +14,7 @@ use rollup_boost::FlashblocksPayloadV1; use tokio::sync::broadcast; use crate::protocol::{ - handler::{FlashblocksP2PNetworHandle, FlashblocksProtoHandler}, + handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}, proto::FlashblocksProtoMessage, }; @@ -62,7 +62,7 @@ where pool: Pool, ) -> eyre::Result { let handle = self.inner.build_network(ctx, pool).await?; - let handler = FlashblocksProtoHandler::::new( + let handler = FlashblocksHandler::::new( handle.clone(), self.authorizer_vk, self.flashblocks_receiver_tx, diff --git a/crates/flashblocks-p2p/src/connection/mod.rs b/crates/flashblocks-p2p/src/protocol/connection.rs similarity index 65% rename from crates/flashblocks-p2p/src/connection/mod.rs rename to crates/flashblocks-p2p/src/protocol/connection.rs index 60f42095..b76e9e0e 100644 --- a/crates/flashblocks-p2p/src/connection/mod.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,46 +1,29 @@ use crate::protocol::{ auth::Authorized, - handler::{FlashblocksP2PNetworHandle, FlashblocksP2PState}, - proto::{FlashblocksProtoMessageId, FlashblocksProtoMessageKind}, + handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}, + proto::{FlashblocksProtoMessage, FlashblocksProtoMessageId, FlashblocksProtoMessageKind}, }; -use super::protocol::proto::FlashblocksProtoMessage; use alloy_primitives::bytes::BytesMut; -use ed25519_dalek::VerifyingKey; use futures::{Stream, StreamExt}; -use parking_lot::{Mutex, RwLock}; -use reth::{payload::PayloadId, rpc::api::eth::helpers::trace}; +use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use reth_network::types::ReputationChangeKind; use rollup_boost::FlashblocksPayloadV1; use std::{ pin::Pin, - sync::Arc, task::{Context, Poll, ready}, }; -use tokio::sync::broadcast; use tokio_stream::wrappers::BroadcastStream; -use tracing::{debug, trace}; - -pub(crate) mod handler; +use tracing::trace; pub struct FlashblocksConnection { + pub handler: FlashblocksHandler, pub conn: ProtocolConnection, pub peer_id: PeerId, - pub network_handle: N, - /// Authorizer verifying, used to verify flashblocks payloads. - pub authorizer_vk: VerifyingKey, - /// Sender for newly created or received and validated flashblocks payloads - /// which will be broadcasted to all peers. May not be strictly ordered. - pub peer_tx: broadcast::Sender, /// Receiver for newly created or received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. pub peer_rx: BroadcastStream, - /// Channel of verified and strictly ordered flashbloacks payloads. - /// For consumption by the rpc overlay. - pub flashblock_tx: broadcast::Sender, - /// Mutable state of the flashblocks protocol. - pub state: Arc>, /// Most recent payload received from this peer. pub payload_id: PayloadId, /// A list of flashblocks indices that we have already received from @@ -98,15 +81,17 @@ impl FlashblocksConnection { message: Authorized, message_type: FlashblocksProtoMessageId, ) { - let mut state = self.state.lock(); + let mut state = self.handler.state.lock(); - if let Err(e) = message.verify(self.authorizer_vk) { + if let Err(e) = message.verify(self.handler.ctx.authorizer_vk) { tracing::warn!( "Failed to verify flashblocks payload: {:?}, error: {}", message, e ); - self.network_handle + self.handler + .ctx + .network_handle .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; } @@ -116,7 +101,9 @@ impl FlashblocksConnection { "Received flashblocks payload with outdated timestamp: {}", message.authorization.timestamp ); - self.network_handle + self.handler + .ctx + .network_handle .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; } @@ -146,43 +133,20 @@ impl FlashblocksConnection { message.payload.index, self.peer_id ); - self.network_handle + self.handler + .ctx + .network_handle .reputation_change(self.peer_id, ReputationChangeKind::AlreadySeenTransaction); return; } self.received[message.payload.index as usize] = true; - // If we've already seen this index, skip it - // Otherwise, add it to the list - // TODO: perhaps check max index - let len = state.flashblocks.len(); - state - .flashblocks - .resize_with(len.max(message.payload.index as usize + 1), || None); - let flashblock = &mut state.flashblocks[message.payload.index as usize]; - if flashblock.is_none() { - // We haven't seen this index yet - // Add the flashblock to our cache - *flashblock = Some(message.clone().payload); - tracing::debug!( - "Received flashblocks payload with id: {}, index: {}", - message.payload.payload_id, - message.payload.index - ); - // Broadcast the flashblock to all peers, possibly out of order - let message = FlashblocksProtoMessage { + self.handler.ctx.publish( + &mut state, + FlashblocksProtoMessage { message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(message), message_type, - }; - self.peer_tx.send(message).unwrap(); - // Broadcast any flashblocks in the cache that are in order - while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { - // Send the flashblock to the stream - debug!(%flashblock_event.payload_id, %state.flashblock_index, "Publishing new flashblock"); - self.flashblock_tx.send(flashblock_event.clone()).ok(); - // Update the index - state.flashblock_index += 1; - } - } + }, + ); } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index b6564e98..3257f3ae 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,5 +1,7 @@ -use crate::connection::handler::FlashblocksConnectionHandler; -use crate::protocol::proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}; +use crate::protocol::{ + connection::FlashblocksConnection, + proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}, +}; use ed25519_dalek::VerifyingKey; use parking_lot::Mutex; use reth::payload::PayloadId; @@ -9,7 +11,14 @@ use rollup_boost::FlashblocksPayloadV1; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::broadcast; -use tracing::{debug, info}; +use tracing::debug; + +use reth_ethereum::network::{ + api::Direction, + eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, + protocol::{ConnectionHandler, OnNotSupported}, +}; +use tokio_stream::wrappers::BroadcastStream; pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} @@ -29,8 +38,8 @@ pub struct FlashblocksP2PState { } /// The protocol handler takes care of incoming and outgoing connections. -#[derive(Debug)] -pub struct FlashblocksProtoHandler { +#[derive(Clone, Debug)] +pub struct FlashblocksP2PCtx { /// Network handle, used to update peer state. pub network_handle: N, /// Authorizer verifying, used to verify flashblocks payloads. @@ -41,11 +50,18 @@ pub struct FlashblocksProtoHandler { /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. pub flashblock_tx: broadcast::Sender, +} + +/// The protocol handler takes care of incoming and outgoing connections. +#[derive(Clone, Debug)] +pub struct FlashblocksHandler { + /// Network handle, used to update peer state. + pub ctx: FlashblocksP2PCtx, /// Mutable state of the flashblocks protocol. pub state: Arc>, } -impl FlashblocksProtoHandler { +impl FlashblocksHandler { /// Creates a new protocol handler with the given state. pub fn new( network_handle: N, @@ -53,83 +69,79 @@ impl FlashblocksProtoHandler { flashblock_tx: broadcast::Sender, publish_tx: broadcast::Sender, ) -> Self { + let peer_tx = broadcast::Sender::new(100); let state = Arc::new(Mutex::new(FlashblocksP2PState { flashblock_index: 0, payload_timestamp: 0, payload_id: PayloadId::default(), flashblocks: vec![], })); + let ctx = FlashblocksP2PCtx { + network_handle: network_handle.clone(), + authorizer_vk, + peer_tx, + flashblock_tx, + }; - // TODO: Clean up duplicated code let state_clone = state.clone(); - let mut publish_rx = publish_tx.subscribe(); - let peer_tx = broadcast::Sender::new(100); - let peer_tx_clone = peer_tx.clone(); - let flashblock_tx_clone = flashblock_tx.clone(); + let ctx_clone = ctx.clone(); tokio::spawn({ async move { - while let Ok(msg) = publish_rx.recv().await { - let message = match msg.message { - FlashblocksProtoMessageKind::FlashblocksPayloadV1(message) => message, - }; - // Check if we have a payload id and flashblocks to emit. + while let Ok(msg) = publish_tx.subscribe().recv().await { let mut state = state_clone.lock(); - let len = state.flashblocks.len(); - state - .flashblocks - .resize_with(len.max(message.payload.index as usize + 1), || None); - let flashblock = &mut state.flashblocks[message.payload.index as usize]; - if flashblock.is_none() { - // We haven't seen this index yet - // Add the flashblock to our cache - *flashblock = Some(message.clone().payload); - tracing::debug!( - "Received flashblocks payload with id: {}, index: {}", - message.payload.payload_id, - message.payload.index - ); - let message = FlashblocksProtoMessage { - message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(message), - message_type: msg.message_type, - }; - peer_tx_clone.send(message).ok(); - // Broadcast any flashblocks in the cache that are in order - while let Some(Some(flashblock_event)) = - state.flashblocks.get(state.flashblock_index) - { - // Send the flashblock to the stream - debug!(payload_id = %flashblock_event.payload_id, flashblock_index = %state.flashblock_index, "Publishing new flashblock"); - flashblock_tx_clone.send(flashblock_event.clone()).ok(); - // Update the index - state.flashblock_index += 1; - } - } + ctx_clone.publish(&mut state, msg); } } }); - Self { - network_handle, - authorizer_vk, - peer_tx, - flashblock_tx, - state, + Self { ctx, state } + } +} + +impl FlashblocksP2PCtx { + /// Commit new and already verified flashblocks payloads to the state + /// broadcast them to peers, and publish them to the stream. + pub fn publish(&self, state: &mut FlashblocksP2PState, msg: FlashblocksProtoMessage) { + // If we've already seen this index, skip it + // Otherwise, add it to the list + let FlashblocksProtoMessageKind::FlashblocksPayloadV1(message) = msg.message; + // TODO: perhaps check max index + let len = state.flashblocks.len(); + state + .flashblocks + .resize_with(len.max(message.payload.index as usize + 1), || None); + let flashblock = &mut state.flashblocks[message.payload.index as usize]; + if flashblock.is_none() { + // We haven't seen this index yet + // Add the flashblock to our cache + *flashblock = Some(message.clone().payload); + tracing::debug!( + "Received flashblocks payload with id: {}, index: {}", + message.payload.payload_id, + message.payload.index + ); + let message = FlashblocksProtoMessage { + message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(message), + message_type: msg.message_type, + }; + self.peer_tx.send(message).ok(); + // Broadcast any flashblocks in the cache that are in order + while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { + // Send the flashblock to the stream + debug!(payload_id = %flashblock_event.payload_id, flashblock_index = %state.flashblock_index, "Publishing new flashblock"); + self.flashblock_tx.send(flashblock_event.clone()).ok(); + // Update the index + state.flashblock_index += 1; + } } } } -impl ProtocolHandler for FlashblocksProtoHandler { - type ConnectionHandler = FlashblocksConnectionHandler; +impl ProtocolHandler for FlashblocksHandler { + type ConnectionHandler = Self; fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { - info!("here4"); - Some(FlashblocksConnectionHandler:: { - network_handle: self.network_handle.clone(), - authorizer_vk: self.authorizer_vk, - peer_tx: self.peer_tx.clone(), - flashblock_tx: self.flashblock_tx.clone(), - state: self.state.clone(), - }) + Some(self.clone()) } fn on_outgoing( @@ -137,13 +149,41 @@ impl ProtocolHandler for FlashblocksProtoHandler< _socket_addr: SocketAddr, _peer_id: PeerId, ) -> Option { - info!("here3"); - Some(FlashblocksConnectionHandler:: { - network_handle: self.network_handle.clone(), - authorizer_vk: self.authorizer_vk, - peer_tx: self.peer_tx.clone(), - flashblock_tx: self.flashblock_tx.clone(), - state: self.state.clone(), - }) + Some(self.clone()) + } +} + +impl ConnectionHandler for FlashblocksHandler { + type Connection = FlashblocksConnection; + + fn protocol(&self) -> Protocol { + FlashblocksProtoMessage::protocol() + } + + fn on_unsupported_by_peer( + self, + _supported: &SharedCapabilities, + _direction: Direction, + _peer_id: PeerId, + ) -> OnNotSupported { + OnNotSupported::KeepAlive + } + + fn into_connection( + self, + direction: Direction, + peer_id: PeerId, + conn: ProtocolConnection, + ) -> Self::Connection { + debug!(%peer_id, %direction, "New connection established with flashblocks peer"); + + FlashblocksConnection { + peer_rx: BroadcastStream::new(self.ctx.peer_tx.subscribe()), + handler: self, + conn, + peer_id, + payload_id: Default::default(), + received: Vec::new(), + } } } diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs index 326178a9..f1db9d4d 100644 --- a/crates/flashblocks-p2p/src/protocol/mod.rs +++ b/crates/flashblocks-p2p/src/protocol/mod.rs @@ -1,3 +1,4 @@ pub mod auth; +pub mod connection; pub mod handler; pub mod proto; From a476ee963e4d225cb19b34a777b3e4d357aad5d2 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 15 Jul 2025 18:21:46 -0700 Subject: [PATCH 025/114] rlp encoding --- Cargo.lock | 2 + Cargo.toml | 1 + crates/flashblocks-node/tests/p2p.rs | 19 +- crates/flashblocks-p2p/Cargo.toml | 1 + crates/flashblocks-p2p/src/net/mod.rs | 11 +- crates/flashblocks-p2p/src/protocol/auth.rs | 36 -- .../src/protocol/connection.rs | 64 ++- .../flashblocks-p2p/src/protocol/handler.rs | 28 +- crates/flashblocks-p2p/src/protocol/mod.rs | 2 - crates/flashblocks-p2p/src/protocol/proto.rs | 89 ---- crates/rollup-boost/Cargo.toml | 1 + crates/rollup-boost/src/flashblocks/mod.rs | 3 + crates/rollup-boost/src/flashblocks/p2p.rs | 458 ++++++++++++++++++ .../src/flashblocks/primitives.rs | 228 ++++++++- crates/rollup-boost/src/server.rs | 43 +- 15 files changed, 752 insertions(+), 234 deletions(-) delete mode 100644 crates/flashblocks-p2p/src/protocol/auth.rs delete mode 100644 crates/flashblocks-p2p/src/protocol/proto.rs create mode 100644 crates/rollup-boost/src/flashblocks/p2p.rs diff --git a/Cargo.lock b/Cargo.lock index 43c40af3..0679f3aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3541,6 +3541,7 @@ name = "flashblocks-p2p" version = "0.1.0" dependencies = [ "alloy-primitives", + "alloy-rlp", "bincode 2.0.1", "blake3", "clap", @@ -10668,6 +10669,7 @@ dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", + "alloy-rlp", "alloy-rpc-types-engine", "alloy-rpc-types-eth", "alloy-serde", diff --git a/Cargo.toml b/Cargo.toml index 457620a3..cd0acd34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ alloy-consensus = "1.0.13" alloy-rpc-types = "1.0.13" alloy-genesis = "1.0.13" alloy-rpc-client = "1.0.13" +alloy-rlp = "0.3.12" alloy-provider = "1.0.13" op-alloy-network = "0.18.7" op-alloy-rpc-types-engine = "0.18.7" diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 845db460..ab56f5e1 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -6,10 +6,6 @@ use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::SigningKey; use flashblocks_p2p::protocol::handler::FlashblocksHandler; -use flashblocks_p2p::protocol::{ - auth::Authorized, - proto::{FlashblocksProtoMessage, FlashblocksProtoMessageId, FlashblocksProtoMessageKind}, -}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_network::{Peers, PeersInfo, protocol::IntoRlpxSubProtocol as _}; @@ -25,7 +21,8 @@ use reth_optimism_primitives::OpReceipt; use reth_provider::providers::BlockchainProvider; use reth_tasks::{TaskExecutor, TaskManager}; use rollup_boost::{ - Authorization, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, + Authorization, Authorized, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, + FlashblocksP2PMsg, FlashblocksPayloadV1, }; use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; use tokio::sync::broadcast; @@ -33,7 +30,7 @@ use tracing::info; pub struct NodeContext { inbound_tx: broadcast::Sender, - outbound_tx: broadcast::Sender, + outbound_tx: broadcast::Sender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -323,10 +320,7 @@ async fn test_peering() -> eyre::Result<()> { builder.verifying_key(), ); let authorized = Authorized::new(&builder, authorization, payload_0.clone()); - let proto_message = FlashblocksProtoMessage { - message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized), - message_type: FlashblocksProtoMessageId::FlashblocksPayloadV1, - }; + let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); node_1.outbound_tx.send(proto_message)?; tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; @@ -348,10 +342,7 @@ async fn test_peering() -> eyre::Result<()> { builder.verifying_key(), ); let authorized = Authorized::new(&builder, authorization, payload_1.clone()); - let proto_message = FlashblocksProtoMessage { - message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized), - message_type: FlashblocksProtoMessageId::FlashblocksPayloadV1, - }; + let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); node_1.outbound_tx.send(proto_message)?; tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index de33b548..1ac17331 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -41,6 +41,7 @@ futures = { workspace = true } clap.workspace = true tracing.workspace = true alloy-primitives.workspace = true +alloy-rlp.workspace = true serde_json = "1.0" thiserror = "2" parking_lot = "0.12" diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 94da4a54..d61f2551 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -10,20 +10,17 @@ use reth_node_builder::{ node::{FullNodeTypes, NodeTypes}, }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use rollup_boost::FlashblocksPayloadV1; +use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; use tokio::sync::broadcast; -use crate::protocol::{ - handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}, - proto::FlashblocksProtoMessage, -}; +use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; #[derive(Clone, Debug)] pub struct FlashblocksNetworkBuilder { inner: T, authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - flashblock_sender_tx: broadcast::Sender, + flashblock_sender_tx: broadcast::Sender, } impl FlashblocksNetworkBuilder { @@ -32,7 +29,7 @@ impl FlashblocksNetworkBuilder { inner: T, authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - flashblock_sender_tx: broadcast::Sender, + flashblock_sender_tx: broadcast::Sender, ) -> Self { Self { inner, diff --git a/crates/flashblocks-p2p/src/protocol/auth.rs b/crates/flashblocks-p2p/src/protocol/auth.rs deleted file mode 100644 index 0afd9647..00000000 --- a/crates/flashblocks-p2p/src/protocol/auth.rs +++ /dev/null @@ -1,36 +0,0 @@ -use blake3::hash as blake3_hash; -use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; -use rollup_boost::{Authorization, FlashblocksP2PError}; -use serde::{Deserialize, Serialize}; -use serde_json; - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct Authorized { - pub payload: T, - pub authorization: Authorization, - pub builder_sig: Signature, -} - -impl Authorized { - pub fn new(builder_sk: &SigningKey, authorization: Authorization, payload: T) -> Self { - let hash = blake3_hash(&serde_json::to_vec(&payload).unwrap()); - let builder_sig = builder_sk.sign(hash.as_bytes()); - - Self { - payload, - authorization, - builder_sig, - } - } - - pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { - self.authorization.verify(authorizer_pub)?; - - let hash = blake3_hash(&serde_json::to_vec(&self.payload).unwrap()); - - self.authorization - .builder_pub - .verify(hash.as_bytes(), &self.builder_sig) - .map_err(|_| FlashblocksP2PError::InvalidBuilderSig) - } -} diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index b76e9e0e..2e73e09c 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,15 +1,12 @@ -use crate::protocol::{ - auth::Authorized, - handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}, - proto::{FlashblocksProtoMessage, FlashblocksProtoMessageId, FlashblocksProtoMessageKind}, -}; +use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; +use alloy_rlp::{Decodable, Encodable, Header}; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use reth_network::types::ReputationChangeKind; -use rollup_boost::FlashblocksPayloadV1; +use rollup_boost::{Authorized, FlashblocksP2PMsg, FlashblocksPayloadV1}; use std::{ pin::Pin, task::{Context, Poll, ready}, @@ -23,7 +20,7 @@ pub struct FlashblocksConnection { pub peer_id: PeerId, /// Receiver for newly created or received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub peer_rx: BroadcastStream, + pub peer_rx: BroadcastStream, /// Most recent payload received from this peer. pub payload_id: PayloadId, /// A list of flashblocks indices that we have already received from @@ -44,7 +41,13 @@ impl Stream for FlashblocksConnection { Ok(outbound) => { // TODO: handle the case where this peer is the one that sent the original trace!(peer_id = %this.peer_id, target = "flashblocks", "Broadcasting flashblocks message"); - return Poll::Ready(Some(outbound.encoded())); + let mut buf = BytesMut::with_capacity(outbound.length()); + outbound.encode(&mut buf); + trace!(peer_id = %this.peer_id, target = "flashblocks", + "Encoded flashblocks message with length: {}", buf.len()); + let new = FlashblocksP2PMsg::decode(&mut &buf[..]).unwrap(); + println!("Broadcasting flashblocks message: {:?}", new); + return Poll::Ready(Some(buf)); } Err(e) => { tracing::error!( @@ -56,19 +59,38 @@ impl Stream for FlashblocksConnection { } // Check if there are any messages from the peer. + trace!(peer_id = %this.peer_id, target = "flashblocks", + "Polling for messages from peer"); let Some(msg) = ready!(this.conn.poll_next_unpin(cx)) else { + trace!(peer_id = %this.peer_id, target = "flashblocks", + "Connection closed, no more messages from peer"); return Poll::Ready(None); }; - let Some(msg) = FlashblocksProtoMessage::decode_message(&mut &msg[..]) else { - return Poll::Ready(None); + trace!(peer_id = %this.peer_id, target = "flashblocks", + "Received message from peer: {}", msg.len()); + // TODO: handle max buffer size + let msg = match FlashblocksP2PMsg::decode(&mut &msg[..]) { + Ok(msg) => msg, + Err(e) => { + tracing::warn!( + "Failed to decode flashblocks message from peer {}: {}", + this.peer_id, + e + ); + this.handler + .ctx + .network_handle + .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); + return Poll::Ready(None); + } }; trace!(peer_id = %this.peer_id, target = "flashblocks", "Received flashblocks message from peer", ); - match msg.message { - FlashblocksProtoMessageKind::FlashblocksPayloadV1(authorized) => { - this.handle_flashblocks_payload_v1(authorized, msg.message_type); + match msg { + FlashblocksP2PMsg::FlashblocksPayloadV1(authorized) => { + this.handle_flashblocks_payload_v1(authorized); } } } @@ -76,11 +98,7 @@ impl Stream for FlashblocksConnection { } impl FlashblocksConnection { - fn handle_flashblocks_payload_v1( - &mut self, - message: Authorized, - message_type: FlashblocksProtoMessageId, - ) { + fn handle_flashblocks_payload_v1(&mut self, message: Authorized) { let mut state = self.handler.state.lock(); if let Err(e) = message.verify(self.handler.ctx.authorizer_vk) { @@ -141,12 +159,8 @@ impl FlashblocksConnection { } self.received[message.payload.index as usize] = true; - self.handler.ctx.publish( - &mut state, - FlashblocksProtoMessage { - message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(message), - message_type, - }, - ); + self.handler + .ctx + .publish(&mut state, FlashblocksP2PMsg::FlashblocksPayloadV1(message)); } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 3257f3ae..040621f3 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,13 +1,11 @@ -use crate::protocol::{ - connection::FlashblocksConnection, - proto::{FlashblocksProtoMessage, FlashblocksProtoMessageKind}, -}; +use crate::protocol::connection::FlashblocksConnection; use ed25519_dalek::VerifyingKey; use parking_lot::Mutex; use reth::payload::PayloadId; +use reth_eth_wire::Capability; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; use reth_network::Peers; -use rollup_boost::FlashblocksPayloadV1; +use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::broadcast; @@ -46,7 +44,7 @@ pub struct FlashblocksP2PCtx { pub authorizer_vk: VerifyingKey, /// Sender for flashblocks payloads which will be broadcasted to all peers. /// May not be strictly ordered. - pub peer_tx: broadcast::Sender, + pub peer_tx: broadcast::Sender, /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. pub flashblock_tx: broadcast::Sender, @@ -67,7 +65,7 @@ impl FlashblocksHandler { network_handle: N, authorizer_vk: VerifyingKey, flashblock_tx: broadcast::Sender, - publish_tx: broadcast::Sender, + publish_tx: broadcast::Sender, ) -> Self { let peer_tx = broadcast::Sender::new(100); let state = Arc::new(Mutex::new(FlashblocksP2PState { @@ -96,15 +94,20 @@ impl FlashblocksHandler { Self { ctx, state } } + + /// Returns the capability for the `flashblocks` protocol. + pub fn capability() -> Capability { + Capability::new_static("flashblocks", 1) + } } impl FlashblocksP2PCtx { /// Commit new and already verified flashblocks payloads to the state /// broadcast them to peers, and publish them to the stream. - pub fn publish(&self, state: &mut FlashblocksP2PState, msg: FlashblocksProtoMessage) { + pub fn publish(&self, state: &mut FlashblocksP2PState, msg: FlashblocksP2PMsg) { // If we've already seen this index, skip it // Otherwise, add it to the list - let FlashblocksProtoMessageKind::FlashblocksPayloadV1(message) = msg.message; + let FlashblocksP2PMsg::FlashblocksPayloadV1(message) = msg; // TODO: perhaps check max index let len = state.flashblocks.len(); state @@ -120,10 +123,7 @@ impl FlashblocksP2PCtx { message.payload.payload_id, message.payload.index ); - let message = FlashblocksProtoMessage { - message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(message), - message_type: msg.message_type, - }; + let message = FlashblocksP2PMsg::FlashblocksPayloadV1(message); self.peer_tx.send(message).ok(); // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { @@ -157,7 +157,7 @@ impl ConnectionHandler for FlashblocksHandler type Connection = FlashblocksConnection; fn protocol(&self) -> Protocol { - FlashblocksProtoMessage::protocol() + Protocol::new(Self::capability(), 1) } fn on_unsupported_by_peer( diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs index f1db9d4d..cf8c8107 100644 --- a/crates/flashblocks-p2p/src/protocol/mod.rs +++ b/crates/flashblocks-p2p/src/protocol/mod.rs @@ -1,4 +1,2 @@ -pub mod auth; pub mod connection; pub mod handler; -pub mod proto; diff --git a/crates/flashblocks-p2p/src/protocol/proto.rs b/crates/flashblocks-p2p/src/protocol/proto.rs deleted file mode 100644 index a55d937c..00000000 --- a/crates/flashblocks-p2p/src/protocol/proto.rs +++ /dev/null @@ -1,89 +0,0 @@ -//! Simple RLPx Flashblocks protocol for propagating FlashblocksPayloadV1 messages -//! following [RLPx specs](https://github.com/ethereum/devp2p/blob/master/rlpx.md) - -use alloy_primitives::bytes::{Buf, BufMut, BytesMut}; -use reth_ethereum::network::eth_wire::{Capability, protocol::Protocol}; -use rollup_boost::FlashblocksPayloadV1; -use serde_json; - -use crate::protocol::auth::Authorized; - -#[repr(u8)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum FlashblocksProtoMessageId { - FlashblocksPayloadV1 = 0x00, -} - -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum FlashblocksProtoMessageKind { - FlashblocksPayloadV1(Authorized), -} - -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct FlashblocksProtoMessage { - pub message_type: FlashblocksProtoMessageId, - pub message: FlashblocksProtoMessageKind, -} - -impl FlashblocksProtoMessage { - /// Returns the capability for the `flashblocks` protocol. - pub fn capability() -> Capability { - Capability::new_static("flashblocks", 1) - } - - /// Returns the protocol for the `flashblocks` protocol. - pub fn protocol() -> Protocol { - Protocol::new(Self::capability(), 1) - } - - /// Creates a flashblocks payload message - pub fn flashblocks_payload(payload: Authorized) -> Self { - Self { - message_type: FlashblocksProtoMessageId::FlashblocksPayloadV1, - message: FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload), - } - } - - /// Creates a new `FlashblocksProtoMessage` with the given message ID and payload. - pub fn encoded(&self) -> BytesMut { - let mut buf = BytesMut::new(); - buf.put_u8(self.message_type as u8); - match &self.message { - FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload) => { - // Serialize the payload as JSON for transmission - let json = serde_json::to_string(payload).unwrap_or_default(); - buf.put(json.as_bytes()); - } - } - buf - } - - /// Decodes a `FlashblocksProtoMessage` from the given message buffer. - pub fn decode_message(buf: &mut &[u8]) -> Option { - if buf.is_empty() { - return None; - } - let id = buf[0]; - buf.advance(1); - let message_type = match id { - 0x00 => FlashblocksProtoMessageId::FlashblocksPayloadV1, - _ => return None, - }; - - let message = match message_type { - FlashblocksProtoMessageId::FlashblocksPayloadV1 => { - // Deserialize the JSON payload - let json_str = String::from_utf8_lossy(&buf[..]); - match serde_json::from_str::>(&json_str) { - Ok(payload) => FlashblocksProtoMessageKind::FlashblocksPayloadV1(payload), - Err(_) => return None, - } - } - }; - - Some(Self { - message_type, - message, - }) - } -} diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 2a973d6c..50b2d3a8 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -24,6 +24,7 @@ alloy-rpc-types-engine.workspace = true alloy-rpc-types-eth.workspace = true alloy-primitives.workspace = true alloy-serde.workspace = true +alloy-rlp.workspace = true tokio-tungstenite.workspace = true metrics-derive.workspace = true diff --git a/crates/rollup-boost/src/flashblocks/mod.rs b/crates/rollup-boost/src/flashblocks/mod.rs index e7cafcff..c5a9412e 100644 --- a/crates/rollup-boost/src/flashblocks/mod.rs +++ b/crates/rollup-boost/src/flashblocks/mod.rs @@ -17,4 +17,7 @@ pub use args::*; mod error; pub use error::*; +mod p2p; +pub use p2p::*; + mod metrics; diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs new file mode 100644 index 00000000..d9dcddde --- /dev/null +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -0,0 +1,458 @@ +use alloy_primitives::{B64, Bytes}; +use alloy_rlp::{Decodable, Encodable, Header}; +use alloy_rpc_types_engine::PayloadId; +use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; +use serde::{Deserialize, Serialize}; + +use crate::{FlashblocksP2PError, FlashblocksPayloadV1}; + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Authorization { + pub payload_id: PayloadId, + pub timestamp: u64, + pub builder_pub: VerifyingKey, + pub authorizer_sig: Signature, +} + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Authorized { + pub payload: T, + pub authorization: Authorization, + pub builder_sig: Signature, +} + +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] +#[repr(u8)] +pub enum FlashblocksP2PMsg { + FlashblocksPayloadV1(Authorized) = 0x00, +} + +impl Authorization { + pub fn new( + payload_id: PayloadId, + timestamp: u64, + authorizer_sk: &SigningKey, + builder_pub: VerifyingKey, + ) -> Self { + let mut msg = payload_id.0.to_vec(); + msg.extend_from_slice(×tamp.to_le_bytes()); + msg.extend_from_slice(builder_pub.as_bytes()); + let hash = blake3::hash(&msg); + let sig = authorizer_sk.sign(hash.as_bytes()); + + Self { + payload_id, + timestamp, + builder_pub, + authorizer_sig: sig, + } + } + + pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { + let mut msg = self.payload_id.0.to_vec(); + msg.extend_from_slice(&self.timestamp.to_le_bytes()); + msg.extend_from_slice(self.builder_pub.as_bytes()); + let hash = blake3::hash(&msg); + authorizer_pub + .verify(hash.as_bytes(), &self.authorizer_sig) + .map_err(|_| FlashblocksP2PError::InvalidAuthorizerSig) + } +} + +impl Encodable for Authorization { + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { + // pre-serialize the key & sig once so we can reuse the bytes & lengths + let pub_bytes = Bytes::copy_from_slice(self.builder_pub.as_bytes()); // 33 bytes + let sig_bytes = Bytes::copy_from_slice(&self.authorizer_sig.to_bytes()); // 64 bytes + + let payload_len = self.payload_id.0.length() + + self.timestamp.length() + + pub_bytes.length() + + sig_bytes.length(); + + Header { + list: true, + payload_length: payload_len, + } + .encode(out); + + // 1. payload_id (inner B64 already Encodable) + self.payload_id.0.encode(out); + // 2. timestamp + self.timestamp.encode(out); + // 3. builder_pub + pub_bytes.encode(out); + // 4. authorizer_sig + sig_bytes.encode(out); + } + + fn length(&self) -> usize { + let pub_bytes = Bytes::copy_from_slice(self.builder_pub.as_bytes()); + let sig_bytes = Bytes::copy_from_slice(&self.authorizer_sig.to_bytes()); + + let payload_len = self.payload_id.0.length() + + self.timestamp.length() + + pub_bytes.length() + + sig_bytes.length(); + + Header { + list: true, + payload_length: payload_len, + } + .length() + + payload_len + } +} + +impl Decodable for Authorization { + fn decode(buf: &mut &[u8]) -> Result { + let header = Header::decode(buf)?; + if !header.list { + return Err(alloy_rlp::Error::UnexpectedString); + } + let mut body = &buf[..header.payload_length as usize]; + + // 1. payload_id + let payload_id = alloy_rpc_types_engine::PayloadId(B64::decode(&mut body)?.into()); + + // 2. timestamp + let timestamp = u64::decode(&mut body)?; + + // 3. builder_pub + let pub_bytes = Bytes::decode(&mut body)?; + let builder_pub = VerifyingKey::try_from(pub_bytes.as_ref()) + .map_err(|_| alloy_rlp::Error::Custom("bad builder_pub"))?; + + // 4. authorizer_sig + let sig_bytes = Bytes::decode(&mut body)?; + let authorizer_sig = Signature::try_from(sig_bytes.as_ref()) + .map_err(|_| alloy_rlp::Error::Custom("bad signature"))?; + + // advance caller’s slice cursor + *buf = &buf[header.payload_length as usize..]; + + Ok(Self { + payload_id, + timestamp, + builder_pub, + authorizer_sig, + }) + } +} + +impl Authorized { + pub fn new(builder_sk: &SigningKey, authorization: Authorization, payload: T) -> Self { + let hash = blake3::hash(&serde_json::to_vec(&payload).unwrap()); + let builder_sig = builder_sk.sign(hash.as_bytes()); + + Self { + payload, + authorization, + builder_sig, + } + } + + pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { + self.authorization.verify(authorizer_pub)?; + + let hash = blake3::hash(&serde_json::to_vec(&self.payload).unwrap()); + + self.authorization + .builder_pub + .verify(hash.as_bytes(), &self.builder_sig) + .map_err(|_| FlashblocksP2PError::InvalidBuilderSig) + } +} + +impl Encodable for Authorized +where + T: Encodable + Serialize, +{ + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { + // encode once so we know the length beforehand + let sig_bytes = Bytes::copy_from_slice(&self.builder_sig.to_bytes()); + let payload_len = self.payload.length() + self.authorization.length() + sig_bytes.length(); + + Header { + list: true, + payload_length: payload_len, + } + .encode(out); + + // 1. payload + self.payload.encode(out); + // 2. authorization + self.authorization.encode(out); + // 3. builder signature + sig_bytes.encode(out); + } + + fn length(&self) -> usize { + let sig_bytes = Bytes::copy_from_slice(&self.builder_sig.to_bytes()); + let payload_len = self.payload.length() + self.authorization.length() + sig_bytes.length(); + + Header { + list: true, + payload_length: payload_len, + } + .length() + + payload_len + } +} + +impl Decodable for Authorized +where + T: Decodable + Serialize, +{ + fn decode(buf: &mut &[u8]) -> Result { + let header = Header::decode(buf)?; + if !header.list { + return Err(alloy_rlp::Error::UnexpectedString); + } + + let mut body = &buf[..header.payload_length as usize]; + + // 1. payload + let payload = T::decode(&mut body)?; + // 2. authorization + let authorization = Authorization::decode(&mut body)?; + // 3. builder signature + let sig_bytes = Bytes::decode(&mut body)?; + let builder_sig = Signature::try_from(sig_bytes.as_ref()) + .map_err(|_| alloy_rlp::Error::Custom("bad signature"))?; + + // advance caller’s cursor + *buf = &buf[header.payload_length as usize..]; + + Ok(Self { + payload, + authorization, + builder_sig, + }) + } +} + +impl Encodable for FlashblocksP2PMsg { + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { + match self { + Self::FlashblocksPayloadV1(p) => { + let len = 1 + p.length(); + Header { + list: true, + payload_length: len, + } + .encode(out); + 0u8.encode(out); + p.encode(out); + } + } + } + + fn length(&self) -> usize { + match self { + Self::FlashblocksPayloadV1(p) => { + let inner_len = 1 + p.length(); + Header { + list: true, + payload_length: inner_len, + } + .length() + + inner_len + } + } + } +} + +impl Decodable for FlashblocksP2PMsg { + fn decode(buf: &mut &[u8]) -> Result { + let header = Header::decode(buf)?; + let mut body = &buf[..header.payload_length as usize]; + + let tag = u8::decode(&mut body)?; + let variant = match tag { + 0x00 => { + Self::FlashblocksPayloadV1(Authorized::::decode(&mut body)?) + } + _ => return Err(alloy_rlp::Error::Custom("unknown variant tag")), + }; + + *buf = &buf[header.payload_length as usize..]; + Ok(variant) + } +} + +#[cfg(test)] +mod tests { + use crate::{ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1}; + + use super::*; + use alloy_primitives::{Address, B256, Bloom, U256}; + use alloy_rlp::{Decodable, encode}; + use alloy_rpc_types_eth::Withdrawal; + + fn sample_keys() -> (SigningKey, VerifyingKey) { + // deterministic keys for reproducible tests + let bytes = [0u8; 32]; + let sk = SigningKey::from_bytes(&bytes); + let vk = sk.verifying_key(); + (sk, vk) + } + + fn sample_authorization() -> Authorization { + let (authorizer_sk, _) = sample_keys(); + let (_, builder_vk) = sample_keys(); + Authorization::new( + alloy_rpc_types_engine::PayloadId::default(), + 1_700_000_321, + &authorizer_sk, + builder_vk, + ) + } + + fn sample_diff() -> ExecutionPayloadFlashblockDeltaV1 { + ExecutionPayloadFlashblockDeltaV1 { + state_root: B256::from([0x11; 32]), + receipts_root: B256::from([0x22; 32]), + logs_bloom: Bloom::default(), + gas_used: 21_000, + block_hash: B256::from([0x33; 32]), + transactions: vec![Bytes::from_static(b"\xDE\xAD\xBE\xEF")], + withdrawals: vec![Withdrawal::default()], + withdrawals_root: B256::from([0x44; 32]), + } + } + + fn sample_base() -> ExecutionPayloadBaseV1 { + ExecutionPayloadBaseV1 { + parent_beacon_block_root: B256::from([0x55; 32]), + parent_hash: B256::from([0x66; 32]), + fee_recipient: Address::default(), + prev_randao: B256::from([0x77; 32]), + block_number: 1_234, + gas_limit: 30_000_000, + timestamp: 1_700_000_999, + extra_data: Bytes::from_static(b"hi"), + base_fee_per_gas: U256::from(1_000_000_000u64), + } + } + + fn sample_flashblocks_payload() -> FlashblocksPayloadV1 { + FlashblocksPayloadV1 { + payload_id: PayloadId::default(), + index: 7, + diff: sample_diff(), + metadata: serde_json::json!({ "ok": true }), + base: Some(sample_base()), + } + } + + #[test] + fn authorization_roundtrip() { + let (authorizer_sk, authorizer_vk) = sample_keys(); + let (_, builder_vk) = sample_keys(); + + let auth = Authorization::new( + PayloadId::default(), + 1_700_000_123, + &authorizer_sk, + builder_vk, + ); + + // RLP encode-then-decode + let encoded = encode(&auth); + assert_eq!(encoded.len(), auth.length()); + + let mut slice = encoded.as_ref(); + let decoded = Authorization::decode(&mut slice).expect("decode succeeds"); + assert_eq!(auth, decoded); + assert!(slice.is_empty()); + + // signature verifies + decoded.verify(authorizer_vk).expect("sig valid"); + } + + #[test] + fn tampered_sig_is_rejected() { + let (authorizer_sk, authorizer_vk) = sample_keys(); + let (_, builder_vk) = sample_keys(); + + let mut auth = Authorization::new(PayloadId::default(), 42, &authorizer_sk, builder_vk); + + // flip one bit in the signature + let mut auth_sig_bytes = auth.authorizer_sig.to_bytes(); + auth_sig_bytes[0] ^= 0x01; + auth.authorizer_sig = + Signature::try_from(auth_sig_bytes.as_ref()).expect("valid signature bytes"); + assert!(auth.verify(authorizer_vk).is_err()); + } + + #[test] + fn authorized_roundtrip_and_verify() { + let (builder_sk, builder_vk) = sample_keys(); + let authorization = sample_authorization(); + let payload = sample_flashblocks_payload(); + + let authorized = Authorized::new(&builder_sk, authorization.clone(), payload.clone()); + + // RLP round-trip + let encoded = encode(&authorized); + assert_eq!(encoded.len(), authorized.length()); + + let mut slice = encoded.as_ref(); + let decoded = Authorized::::decode(&mut slice).expect("decode ok"); + assert_eq!(decoded, authorized); + assert!(slice.is_empty(), "decoder consumed all input"); + + decoded + .verify(authorization.builder_pub) + .expect("verify succeeds"); + + let hash = blake3::hash(&serde_json::to_vec(&payload).unwrap()); + builder_vk + .verify(hash.as_bytes(), &decoded.builder_sig) + .expect("builder sig valid"); + } + + #[test] + fn builder_sig_tamper_fails() { + let (builder_sk, _) = sample_keys(); + let authorization = sample_authorization(); + let payload = sample_flashblocks_payload(); + + let mut authorized = Authorized::new(&builder_sk, authorization, payload); + // flip one bit + let mut authorized_sig_bytes = authorized.builder_sig.to_bytes(); + authorized_sig_bytes[0] ^= 0x01; + authorized.builder_sig = + Signature::try_from(authorized_sig_bytes.as_ref()).expect("valid signature bytes"); + assert!( + authorized + .verify(authorized.authorization.builder_pub) + .is_err(), + "tampered sig must be rejected" + ); + } + + #[test] + fn p2p_msg_roundtrip() { + let (builder_sk, _) = sample_keys(); + let authorization = sample_authorization(); + let payload = sample_flashblocks_payload(); + let authorized = Authorized::new(&builder_sk, authorization, payload); + + let msg = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized.clone()); + + let encoded = encode(&msg); + assert_eq!(encoded.len(), msg.length(), "length() must match bytes"); + + let mut slice = encoded.as_ref(); + let decoded = FlashblocksP2PMsg::decode(&mut slice).expect("decode ok"); + + match decoded { + FlashblocksP2PMsg::FlashblocksPayloadV1(inner) => { + assert_eq!(inner, authorized, "inner payload round-trips"); + } + } + assert!(slice.is_empty(), "decoder consumed all input"); + } +} diff --git a/crates/rollup-boost/src/flashblocks/primitives.rs b/crates/rollup-boost/src/flashblocks/primitives.rs index c9263ad0..8ece9660 100644 --- a/crates/rollup-boost/src/flashblocks/primitives.rs +++ b/crates/rollup-boost/src/flashblocks/primitives.rs @@ -1,4 +1,5 @@ -use alloy_primitives::{Address, B256, Bloom, Bytes, U256}; +use alloy_primitives::{Address, B64, B256, Bloom, Bytes, U256}; +use alloy_rlp::{Decodable, Encodable, Header, RlpDecodable, RlpEncodable}; use alloy_rpc_types_engine::PayloadId; use alloy_rpc_types_eth::Withdrawal; use serde::{Deserialize, Serialize}; @@ -9,7 +10,9 @@ use serde_json::Value; /// such as state root, receipts, logs, and new transactions. Other immutable block fields /// like parent hash and block number are excluded since they remain constant throughout /// the block's construction. -#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize, Eq)] +#[derive( + Clone, Debug, PartialEq, Default, Deserialize, Serialize, Eq, RlpEncodable, RlpDecodable, +)] pub struct ExecutionPayloadFlashblockDeltaV1 { /// The state root of the block. pub state_root: B256, @@ -34,7 +37,9 @@ pub struct ExecutionPayloadFlashblockDeltaV1 { /// throughout block construction. This includes fundamental block properties like /// parent hash, block number, and other header fields that are determined at /// block creation and cannot be modified. -#[derive(Clone, Debug, PartialEq, Default, Deserialize, Serialize, Eq)] +#[derive( + Clone, Debug, PartialEq, Default, Deserialize, Serialize, Eq, RlpEncodable, RlpDecodable, +)] pub struct ExecutionPayloadBaseV1 { /// Ecotone parent beacon block root pub parent_beacon_block_root: B256, @@ -65,11 +70,222 @@ pub struct FlashblocksPayloadV1 { pub payload_id: PayloadId, /// The index of the flashblock in the block pub index: u64, - /// The base execution payload configuration - #[serde(skip_serializing_if = "Option::is_none")] - pub base: Option, /// The delta/diff containing modified portions of the execution payload pub diff: ExecutionPayloadFlashblockDeltaV1, /// Additional metadata associated with the flashblock pub metadata: Value, + /// The base execution payload configuration + #[serde(skip_serializing_if = "Option::is_none")] + pub base: Option, +} + +/// Manual RLP implementation because `PayloadId` and `serde_json::Value` are +/// outside of alloy-rlp’s blanket impls. +impl Encodable for FlashblocksPayloadV1 { + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { + // ---- compute payload length ------------------------------------------------- + let json_bytes = Bytes::from( + serde_json::to_vec(&self.metadata).expect("serialising `metadata` to JSON never fails"), + ); + + // encoded-len helper — empty string is one byte (`0x80`) + let empty_len = 1usize; + + let base_len = self.base.as_ref().map(|b| b.length()).unwrap_or(empty_len); + + let payload_len = self.payload_id.0.length() + + self.index.length() + + self.diff.length() + + json_bytes.length() + + base_len; + + Header { + list: true, + payload_length: payload_len, + } + .encode(out); + + // 1. `payload_id` – the inner `B64` already impls `Encodable` + self.payload_id.0.encode(out); + + // 2. `index` + self.index.encode(out); + + // 3. `diff` + self.diff.encode(out); + + // 4. `metadata` (as raw JSON bytes) + json_bytes.encode(out); + + // 5. `base` (`Option` as “value | empty string”) + if let Some(base) = &self.base { + base.encode(out); + } else { + // RLP encoding for empty value + out.put_u8(0x80); + } + } + + fn length(&self) -> usize { + let json_bytes = Bytes::from( + serde_json::to_vec(&self.metadata).expect("serialising `metadata` to JSON never fails"), + ); + + let empty_len = 1usize; + + let base_len = self.base.as_ref().map(|b| b.length()).unwrap_or(empty_len); + + // list header length + payload length + let payload_length = self.payload_id.0.length() + + self.index.length() + + self.diff.length() + + json_bytes.length() + + base_len; + + Header { + list: true, + payload_length, + } + .length() + + payload_length + } +} + +impl Decodable for FlashblocksPayloadV1 { + fn decode(buf: &mut &[u8]) -> Result { + let header = Header::decode(buf)?; + if !header.list { + return Err(alloy_rlp::Error::UnexpectedString); + } + + // Limit the decoding window to the list payload only. + let mut body = &buf[..header.payload_length as usize]; + + let payload_id = B64::decode(&mut body)?.into(); + let index = u64::decode(&mut body)?; + let diff = ExecutionPayloadFlashblockDeltaV1::decode(&mut body)?; + + // metadata – stored as raw JSON bytes + let meta_bytes = Bytes::decode(&mut body)?; + let metadata: Value = serde_json::from_slice(&meta_bytes) + .map_err(|_| alloy_rlp::Error::Custom("bad JSON"))?; + + // base (`Option`) + let base = if body.first() == Some(&0x80) { + None + } else { + Some(ExecutionPayloadBaseV1::decode(&mut body)?) + }; + + // advance the original buffer cursor + *buf = &buf[header.payload_length as usize..]; + + Ok(Self { + payload_id, + index, + diff, + metadata, + base, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy_rlp::{Decodable, encode}; + + fn sample_diff() -> ExecutionPayloadFlashblockDeltaV1 { + ExecutionPayloadFlashblockDeltaV1 { + state_root: B256::from([1u8; 32]), + receipts_root: B256::from([2u8; 32]), + logs_bloom: Bloom::default(), + gas_used: 21_000, + block_hash: B256::from([3u8; 32]), + transactions: vec![Bytes::from(vec![0xde, 0xad, 0xbe, 0xef])], + withdrawals: vec![Withdrawal::default()], + withdrawals_root: B256::from([4u8; 32]), + } + } + + fn sample_base() -> ExecutionPayloadBaseV1 { + ExecutionPayloadBaseV1 { + parent_beacon_block_root: B256::from([5u8; 32]), + parent_hash: B256::from([6u8; 32]), + fee_recipient: Address::from([0u8; 20]), + prev_randao: B256::from([7u8; 32]), + block_number: 123, + gas_limit: 30_000_000, + timestamp: 1_700_000_000, + extra_data: Bytes::from(b"hello".to_vec()), + base_fee_per_gas: U256::from(1_000_000_000u64), + } + } + + #[test] + fn roundtrip_without_base() { + let original = FlashblocksPayloadV1 { + payload_id: PayloadId::default(), + index: 0, + diff: sample_diff(), + metadata: serde_json::json!({ "key": "value" }), + base: None, + }; + + let encoded = encode(&original); + assert_eq!( + encoded.len(), + original.length(), + "length() must match actually-encoded size" + ); + + let mut slice = encoded.as_ref(); + let decoded = FlashblocksPayloadV1::decode(&mut slice).expect("decode succeeds"); + assert_eq!(original, decoded, "round-trip must be loss-less"); + assert!( + slice.is_empty(), + "decoder should consume the entire input buffer" + ); + } + + #[test] + fn roundtrip_with_base() { + let original = FlashblocksPayloadV1 { + payload_id: PayloadId::default(), + index: 42, + diff: sample_diff(), + metadata: serde_json::json!({ "foo": 1, "bar": [1, 2, 3] }), + base: Some(sample_base()), + }; + + let encoded = encode(&original); + assert_eq!(encoded.len(), original.length()); + + let mut slice = encoded.as_ref(); + let decoded = FlashblocksPayloadV1::decode(&mut slice).expect("decode succeeds"); + assert_eq!(original, decoded); + assert!(slice.is_empty()); + } + + #[test] + fn invalid_rlp_is_rejected() { + let valid = FlashblocksPayloadV1 { + payload_id: PayloadId::default(), + index: 1, + diff: sample_diff(), + metadata: serde_json::json!({}), + base: None, + }; + + // Encode, then truncate the last byte to corrupt the payload. + let mut corrupted = encode(&valid); + corrupted.pop(); + + let mut slice = corrupted.as_ref(); + let result = FlashblocksPayloadV1::decode(&mut slice); + assert!( + result.is_err(), + "decoder must flag malformed / truncated input" + ); + } } diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index 1ae8f7c4..a1e579ce 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -1,5 +1,5 @@ use crate::debug_api::ExecutionMode; -use crate::{BlockSelectionPolicy, EngineApiExt, FlashblocksP2PError}; +use crate::{Authorization, BlockSelectionPolicy, EngineApiExt, FlashblocksP2PError}; use crate::{ client::rpc::RpcClient, debug_api::DebugServer, @@ -11,6 +11,7 @@ use crate::{ probe::{Health, Probes}, }; use alloy_primitives::{B256, Bytes, bytes}; +use alloy_rlp::{RlpDecodable, RlpEncodable}; use alloy_rpc_types_engine::{ ExecutionPayload, ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus, @@ -287,46 +288,6 @@ where } } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct Authorization { - pub payload_id: PayloadId, - pub timestamp: u64, - pub builder_pub: VerifyingKey, - pub authorizer_sig: Signature, -} - -impl Authorization { - pub fn new( - payload_id: PayloadId, - timestamp: u64, - authorizer_sk: &SigningKey, - builder_pub: VerifyingKey, - ) -> Self { - let mut msg = payload_id.0.to_vec(); - msg.extend_from_slice(×tamp.to_le_bytes()); - msg.extend_from_slice(builder_pub.as_bytes()); - let hash = blake3::hash(&msg); - let sig = authorizer_sk.sign(hash.as_bytes()); - - Self { - payload_id, - timestamp, - builder_pub, - authorizer_sig: sig, - } - } - - pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { - let mut msg = self.payload_id.0.to_vec(); - msg.extend_from_slice(&self.timestamp.to_le_bytes()); - msg.extend_from_slice(self.builder_pub.as_bytes()); - let hash = blake3::hash(&msg); - authorizer_pub - .verify(hash.as_bytes(), &self.authorizer_sig) - .map_err(|_| FlashblocksP2PError::InvalidAuthorizerSig) - } -} - #[rpc(server, client)] pub trait FlashblocksEngineApi { #[method(name = "engine_forkchoiceUpdatedFlashblocksV1")] From 6c60dddab33c01f506e3a648651db5345aa63bfd Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 15 Jul 2025 19:50:47 -0700 Subject: [PATCH 026/114] fix rlpx message header --- .../src/protocol/connection.rs | 25 ++----- crates/rollup-boost/Cargo.toml | 2 +- crates/rollup-boost/src/flashblocks/error.rs | 6 ++ crates/rollup-boost/src/flashblocks/p2p.rs | 67 +++++++------------ 4 files changed, 38 insertions(+), 62 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 2e73e09c..915d9185 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,5 +1,5 @@ use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; -use alloy_rlp::{Decodable, Encodable, Header}; +use alloy_rlp::{Buf as _, BufMut, Decodable, Encodable, Header}; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; @@ -12,7 +12,7 @@ use std::{ task::{Context, Poll, ready}, }; use tokio_stream::wrappers::BroadcastStream; -use tracing::trace; +use tracing::{info, trace}; pub struct FlashblocksConnection { pub handler: FlashblocksHandler, @@ -41,13 +41,8 @@ impl Stream for FlashblocksConnection { Ok(outbound) => { // TODO: handle the case where this peer is the one that sent the original trace!(peer_id = %this.peer_id, target = "flashblocks", "Broadcasting flashblocks message"); - let mut buf = BytesMut::with_capacity(outbound.length()); - outbound.encode(&mut buf); - trace!(peer_id = %this.peer_id, target = "flashblocks", - "Encoded flashblocks message with length: {}", buf.len()); - let new = FlashblocksP2PMsg::decode(&mut &buf[..]).unwrap(); - println!("Broadcasting flashblocks message: {:?}", new); - return Poll::Ready(Some(buf)); + + return Poll::Ready(Some(outbound.encode())); } Err(e) => { tracing::error!( @@ -59,17 +54,14 @@ impl Stream for FlashblocksConnection { } // Check if there are any messages from the peer. - trace!(peer_id = %this.peer_id, target = "flashblocks", - "Polling for messages from peer"); - let Some(msg) = ready!(this.conn.poll_next_unpin(cx)) else { - trace!(peer_id = %this.peer_id, target = "flashblocks", - "Connection closed, no more messages from peer"); + let Some(mut msg) = ready!(this.conn.poll_next_unpin(cx)) else { return Poll::Ready(None); }; + // Why aren't we getting here? trace!(peer_id = %this.peer_id, target = "flashblocks", "Received message from peer: {}", msg.len()); // TODO: handle max buffer size - let msg = match FlashblocksP2PMsg::decode(&mut &msg[..]) { + let msg = match FlashblocksP2PMsg::decode(&mut msg) { Ok(msg) => msg, Err(e) => { tracing::warn!( @@ -85,9 +77,6 @@ impl Stream for FlashblocksConnection { } }; - trace!(peer_id = %this.peer_id, target = "flashblocks", - "Received flashblocks message from peer", - ); match msg { FlashblocksP2PMsg::FlashblocksPayloadV1(authorized) => { this.handle_flashblocks_payload_v1(authorized); diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 50b2d3a8..295623ec 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -69,6 +69,7 @@ tokio-util = { version = "0.7.13" } ed25519-dalek = { version = "2", features = ["serde"] } blake3 = "1" # fast hashing for payload IDs hex = "0.4" +bytes = "1.2" [dev-dependencies] rand = "0.9.0" @@ -80,7 +81,6 @@ anyhow = "1.0" assert_cmd = "2.0.10" predicates = "3.1.2" tokio-util = { version = "0.7.13" } -bytes = "1.2" reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.4.7" } ctor = "0.4.1" reqwest = "0.12.15" diff --git a/crates/rollup-boost/src/flashblocks/error.rs b/crates/rollup-boost/src/flashblocks/error.rs index e7f86527..c94c4327 100644 --- a/crates/rollup-boost/src/flashblocks/error.rs +++ b/crates/rollup-boost/src/flashblocks/error.rs @@ -6,4 +6,10 @@ pub enum FlashblocksP2PError { InvalidAuthorizerSig, #[error("invalid builder signature")] InvalidBuilderSig, + #[error("input too short")] + InputTooShort, + #[error("unknown message type")] + UnknownMessageType, + #[error("invalid builder signature")] + Rlp(#[from] alloy_rlp::Error), } diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index d9dcddde..f6520a0e 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -1,8 +1,10 @@ use alloy_primitives::{B64, Bytes}; use alloy_rlp::{Decodable, Encodable, Header}; use alloy_rpc_types_engine::PayloadId; +use bytes::{Buf as _, BufMut as _, BytesMut}; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; +use tracing::info; use crate::{FlashblocksP2PError, FlashblocksPayloadV1}; @@ -232,52 +234,33 @@ where } } -impl Encodable for FlashblocksP2PMsg { - fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { +impl FlashblocksP2PMsg { + /// Creates a new `FlashblocksP2PError` with the given message ID and payload. + pub fn encode(&self) -> BytesMut { + let mut buf = BytesMut::new(); match self { - Self::FlashblocksPayloadV1(p) => { - let len = 1 + p.length(); - Header { - list: true, - payload_length: len, - } - .encode(out); - 0u8.encode(out); - p.encode(out); + FlashblocksP2PMsg::FlashblocksPayloadV1(payload) => { + buf.put_u8(0x00); + payload.encode(&mut buf); } } + buf } - fn length(&self) -> usize { - match self { - Self::FlashblocksPayloadV1(p) => { - let inner_len = 1 + p.length(); - Header { - list: true, - payload_length: inner_len, - } - .length() - + inner_len - } + /// Decodes a `FlashblocksP2PError` from the given message buffer. + pub fn decode(buf: &mut BytesMut) -> Result { + if buf.is_empty() { + return Err(FlashblocksP2PError::InputTooShort); } - } -} - -impl Decodable for FlashblocksP2PMsg { - fn decode(buf: &mut &[u8]) -> Result { - let header = Header::decode(buf)?; - let mut body = &buf[..header.payload_length as usize]; - - let tag = u8::decode(&mut body)?; - let variant = match tag { + let id = buf[0]; + buf.advance(1); + match id { 0x00 => { - Self::FlashblocksPayloadV1(Authorized::::decode(&mut body)?) + let payload = Authorized::::decode(&mut &buf[..])?; + Ok(FlashblocksP2PMsg::FlashblocksPayloadV1(payload)) } - _ => return Err(alloy_rlp::Error::Custom("unknown variant tag")), - }; - - *buf = &buf[header.payload_length as usize..]; - Ok(variant) + _ => Err(FlashblocksP2PError::UnknownMessageType), + } } } @@ -442,17 +425,15 @@ mod tests { let msg = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized.clone()); - let encoded = encode(&msg); - assert_eq!(encoded.len(), msg.length(), "length() must match bytes"); + let mut encoded = msg.encode(); - let mut slice = encoded.as_ref(); - let decoded = FlashblocksP2PMsg::decode(&mut slice).expect("decode ok"); + let decoded = FlashblocksP2PMsg::decode(&mut encoded).expect("decode ok"); match decoded { FlashblocksP2PMsg::FlashblocksPayloadV1(inner) => { assert_eq!(inner, authorized, "inner payload round-trips"); } } - assert!(slice.is_empty(), "decoder consumed all input"); + assert_eq!(encoded.remaining(), 0, "decoder consumed all input"); } } From 463c2f72d4779f35a5e8472af8e1312eb98c646f Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 15 Jul 2025 21:23:27 -0700 Subject: [PATCH 027/114] handle maximum flashblocks message size --- crates/flashblocks-node/tests/p2p.rs | 12 +++------ .../src/protocol/connection.rs | 19 +++++--------- .../flashblocks-p2p/src/protocol/handler.rs | 26 +++++++++++++++++-- crates/rollup-boost/src/flashblocks/p2p.rs | 7 +++-- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index ab56f5e1..fc8fb5cc 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -8,7 +8,7 @@ use ed25519_dalek::SigningKey; use flashblocks_p2p::protocol::handler::FlashblocksHandler; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; -use reth_network::{Peers, PeersInfo, protocol::IntoRlpxSubProtocol as _}; +use reth_network::{Peers, PeersInfo}; use reth_network_peers::{NodeRecord, PeerId}; use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; use reth_node_core::{ @@ -112,15 +112,11 @@ async fn setup_node( node.network .add_rlpx_sub_protocol(custom_rlpx_handler.into_rlpx_sub_protocol()); - tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; - if let Some((peer_id, addr)) = trusted_peer { // If a trusted peer is provided, add it to the network node.network.add_trusted_peer(peer_id, addr); } - tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await; - let http_api_addr = node .rpc_server_handle() .http_local_addr() @@ -297,8 +293,6 @@ async fn test_peering() -> eyre::Result<()> { .await?; let provider_1 = node_1.provider().await?; - tokio::time::sleep(tokio::time::Duration::from_millis(20000)).await; - let latest_block = provider_1 .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) .await? @@ -311,6 +305,8 @@ async fn test_peering() -> eyre::Result<()> { .await?; assert!(pending_block.is_none()); + tokio::time::sleep(tokio::time::Duration::from_millis(15000)).await; + let payload_0 = payload_0(); info!("Sending base payload"); let authorization = Authorization::new( @@ -322,7 +318,7 @@ async fn test_peering() -> eyre::Result<()> { let authorized = Authorized::new(&builder, authorization, payload_0.clone()); let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); node_1.outbound_tx.send(proto_message)?; - tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; + tokio::time::sleep(tokio::time::Duration::from_millis(10000)).await; // Query pending block after sending the base payload with an empty delta let pending_block = provider_0 diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 915d9185..2fc991b3 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,6 +1,4 @@ use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; -use alloy_rlp::{Buf as _, BufMut, Decodable, Encodable, Header}; - use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; use reth::payload::PayloadId; @@ -12,7 +10,7 @@ use std::{ task::{Context, Poll, ready}, }; use tokio_stream::wrappers::BroadcastStream; -use tracing::{info, trace}; +use tracing::trace; pub struct FlashblocksConnection { pub handler: FlashblocksHandler, @@ -20,7 +18,7 @@ pub struct FlashblocksConnection { pub peer_id: PeerId, /// Receiver for newly created or received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub peer_rx: BroadcastStream, + pub peer_rx: BroadcastStream, /// Most recent payload received from this peer. pub payload_id: PayloadId, /// A list of flashblocks indices that we have already received from @@ -38,11 +36,10 @@ impl Stream for FlashblocksConnection { // Check if there are any flashblocks ready to broadcast to our peers. if let Poll::Ready(Some(res)) = this.peer_rx.poll_next_unpin(cx) { match res { - Ok(outbound) => { + Ok(bytes) => { // TODO: handle the case where this peer is the one that sent the original trace!(peer_id = %this.peer_id, target = "flashblocks", "Broadcasting flashblocks message"); - - return Poll::Ready(Some(outbound.encode())); + return Poll::Ready(Some(bytes)); } Err(e) => { tracing::error!( @@ -54,14 +51,12 @@ impl Stream for FlashblocksConnection { } // Check if there are any messages from the peer. - let Some(mut msg) = ready!(this.conn.poll_next_unpin(cx)) else { + let Some(buf) = ready!(this.conn.poll_next_unpin(cx)) else { return Poll::Ready(None); }; - // Why aren't we getting here? - trace!(peer_id = %this.peer_id, target = "flashblocks", - "Received message from peer: {}", msg.len()); + // TODO: handle max buffer size - let msg = match FlashblocksP2PMsg::decode(&mut msg) { + let msg = match FlashblocksP2PMsg::decode(&mut &buf[..]) { Ok(msg) => msg, Err(e) => { tracing::warn!( diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 040621f3..11107647 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,4 +1,5 @@ use crate::protocol::connection::FlashblocksConnection; +use alloy_rlp::BytesMut; use ed25519_dalek::VerifyingKey; use parking_lot::Mutex; use reth::payload::PayloadId; @@ -18,6 +19,9 @@ use reth_ethereum::network::{ }; use tokio_stream::wrappers::BroadcastStream; +/// Maximum frame size for flashblocks messages. +const MAX_FRAME: usize = 1 << 24; // 16 MiB + pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} impl FlashblocksP2PNetworHandle for N {} @@ -44,7 +48,7 @@ pub struct FlashblocksP2PCtx { pub authorizer_vk: VerifyingKey, /// Sender for flashblocks payloads which will be broadcasted to all peers. /// May not be strictly ordered. - pub peer_tx: broadcast::Sender, + pub peer_tx: broadcast::Sender, /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. pub flashblock_tx: broadcast::Sender, @@ -124,7 +128,25 @@ impl FlashblocksP2PCtx { message.payload.index ); let message = FlashblocksP2PMsg::FlashblocksPayloadV1(message); - self.peer_tx.send(message).ok(); + let bytes = message.encode(); + if bytes.len() > MAX_FRAME { + tracing::error!( + target: "flashblocks", + size = bytes.len(), + max_size = MAX_FRAME, + "FlashblocksP2PMsg too large", + ); + return; + } + if bytes.len() > MAX_FRAME / 2 { + tracing::warn!( + target: "flashblocks", + size = bytes.len(), + max_size = MAX_FRAME, + "FlashblocksP2PMsg almost too large", + ); + } + self.peer_tx.send(bytes).ok(); // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { // Send the flashblock to the stream diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index f6520a0e..1b660c1a 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -4,7 +4,6 @@ use alloy_rpc_types_engine::PayloadId; use bytes::{Buf as _, BufMut as _, BytesMut}; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; -use tracing::info; use crate::{FlashblocksP2PError, FlashblocksPayloadV1}; @@ -248,7 +247,7 @@ impl FlashblocksP2PMsg { } /// Decodes a `FlashblocksP2PError` from the given message buffer. - pub fn decode(buf: &mut BytesMut) -> Result { + pub fn decode(buf: &mut &[u8]) -> Result { if buf.is_empty() { return Err(FlashblocksP2PError::InputTooShort); } @@ -425,9 +424,9 @@ mod tests { let msg = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized.clone()); - let mut encoded = msg.encode(); + let encoded = msg.encode(); - let decoded = FlashblocksP2PMsg::decode(&mut encoded).expect("decode ok"); + let decoded = FlashblocksP2PMsg::decode(&mut &encoded[..]).expect("decode ok"); match decoded { FlashblocksP2PMsg::FlashblocksPayloadV1(inner) => { From 8298f29e54cad73c257819312d9c10be4074b620 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 10:15:16 -0700 Subject: [PATCH 028/114] cleanup p2p handler --- .../src/protocol/connection.rs | 1 - .../flashblocks-p2p/src/protocol/handler.rs | 67 +++++++++++++------ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 2fc991b3..fba8b4a2 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -55,7 +55,6 @@ impl Stream for FlashblocksConnection { return Poll::Ready(None); }; - // TODO: handle max buffer size let msg = match FlashblocksP2PMsg::decode(&mut &buf[..]) { Ok(msg) => msg, Err(e) => { diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 11107647..a47082a7 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -19,15 +19,20 @@ use reth_ethereum::network::{ }; use tokio_stream::wrappers::BroadcastStream; -/// Maximum frame size for flashblocks messages. +/// Maximum frame size for rlpx messages. const MAX_FRAME: usize = 1 << 24; // 16 MiB +/// Maximum index for flashblocks payloads. +/// Not intended to ever be hit. Since we resize the flashblocks vector dynamically, +/// this is just a sanity check to prevent excessive memory usage. +const MAX_FLASHBLOCK_INDEX: usize = 100; + pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} impl FlashblocksP2PNetworHandle for N {} /// Protocol state is an helper struct to store the protocol events. -#[derive(Debug)] +#[derive(Debug, Default)] pub struct FlashblocksP2PState { /// The index of the next flashblock to emit over the flashblocks_stream. pub flashblock_index: usize, @@ -72,12 +77,7 @@ impl FlashblocksHandler { publish_tx: broadcast::Sender, ) -> Self { let peer_tx = broadcast::Sender::new(100); - let state = Arc::new(Mutex::new(FlashblocksP2PState { - flashblock_index: 0, - payload_timestamp: 0, - payload_id: PayloadId::default(), - flashblocks: vec![], - })); + let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); let ctx = FlashblocksP2PCtx { network_handle: network_handle.clone(), authorizer_vk, @@ -99,9 +99,9 @@ impl FlashblocksHandler { Self { ctx, state } } - /// Returns the capability for the `flashblocks` protocol. + /// Returns the capability for the `flashblocks v1` p2p rotocol. pub fn capability() -> Capability { - Capability::new_static("flashblocks", 1) + Capability::new_static("flblk", 1) } } @@ -109,23 +109,35 @@ impl FlashblocksP2PCtx { /// Commit new and already verified flashblocks payloads to the state /// broadcast them to peers, and publish them to the stream. pub fn publish(&self, state: &mut FlashblocksP2PState, msg: FlashblocksP2PMsg) { - // If we've already seen this index, skip it - // Otherwise, add it to the list let FlashblocksP2PMsg::FlashblocksPayloadV1(message) = msg; - // TODO: perhaps check max index + + // Resize our array if needed + if message.payload.index as usize > MAX_FLASHBLOCK_INDEX { + tracing::error!( + target: "flashblocks", + index = message.payload.index, + max_index = MAX_FLASHBLOCK_INDEX, + "Received flashblocks payload with index exceeding maximum" + ); + return; + } let len = state.flashblocks.len(); state .flashblocks .resize_with(len.max(message.payload.index as usize + 1), || None); let flashblock = &mut state.flashblocks[message.payload.index as usize]; + + // If we've already seen this index, skip it + // Otherwise, add it to the list if flashblock.is_none() { // We haven't seen this index yet // Add the flashblock to our cache *flashblock = Some(message.clone().payload); - tracing::debug!( - "Received flashblocks payload with id: {}, index: {}", - message.payload.payload_id, - message.payload.index + tracing::trace!( + target = "flashblocks", + payload_id = %message.payload.payload_id, + flashblock_index = message.payload.index, + "queueing flashblock", ); let message = FlashblocksP2PMsg::FlashblocksPayloadV1(message); let bytes = message.encode(); @@ -140,7 +152,7 @@ impl FlashblocksP2PCtx { } if bytes.len() > MAX_FRAME / 2 { tracing::warn!( - target: "flashblocks", + target = "flashblocks", size = bytes.len(), max_size = MAX_FRAME, "FlashblocksP2PMsg almost too large", @@ -149,8 +161,13 @@ impl FlashblocksP2PCtx { self.peer_tx.send(bytes).ok(); // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { - // Send the flashblock to the stream - debug!(payload_id = %flashblock_event.payload_id, flashblock_index = %state.flashblock_index, "Publishing new flashblock"); + // Publish the flashblock + debug!( + target = "flashblocks", + payload_id = %flashblock_event.payload_id, + flashblock_index = %state.flashblock_index, + "publishing flashblock" + ); self.flashblock_tx.send(flashblock_event.clone()).ok(); // Update the index state.flashblock_index += 1; @@ -197,7 +214,15 @@ impl ConnectionHandler for FlashblocksHandler peer_id: PeerId, conn: ProtocolConnection, ) -> Self::Connection { - debug!(%peer_id, %direction, "New connection established with flashblocks peer"); + let capability = Self::capability(); + + debug!( + %peer_id, + %direction, + capability = %capability.name, + version = %capability.version, + "new flashblocks connection" + ); FlashblocksConnection { peer_rx: BroadcastStream::new(self.ctx.peer_tx.subscribe()), From fd198aa4cd1a17bd636ec02f3c62f05828491216 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 10:47:33 -0700 Subject: [PATCH 029/114] Don't resend flashblocks to the originating peer --- .../src/protocol/connection.rs | 61 ++++++++++++------- .../flashblocks-p2p/src/protocol/handler.rs | 15 +++-- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index fba8b4a2..5e873a92 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -18,7 +18,8 @@ pub struct FlashblocksConnection { pub peer_id: PeerId, /// Receiver for newly created or received and validated flashblocks payloads /// which will be broadcasted to all peers. May not be strictly ordered. - pub peer_rx: BroadcastStream, + /// We send bytes over this stream to avoid repeatedly having to serialize the payloads. + pub peer_rx: BroadcastStream<(PayloadId, usize, BytesMut)>, /// Most recent payload received from this peer. pub payload_id: PayloadId, /// A list of flashblocks indices that we have already received from @@ -36,15 +37,26 @@ impl Stream for FlashblocksConnection { // Check if there are any flashblocks ready to broadcast to our peers. if let Poll::Ready(Some(res)) = this.peer_rx.poll_next_unpin(cx) { match res { - Ok(bytes) => { - // TODO: handle the case where this peer is the one that sent the original - trace!(peer_id = %this.peer_id, target = "flashblocks", "Broadcasting flashblocks message"); - return Poll::Ready(Some(bytes)); + Ok((payload_id, flashblock_index, bytes)) => { + // Check if this flashblock actually originated from this peer. + if this.payload_id != payload_id + || this.received.get(flashblock_index) != Some(&true) + { + trace!( + target = "flashblocks", + peer_id = %this.peer_id, + %payload_id, + %flashblock_index, + "Broadcasting flashblock message to peer" + ); + return Poll::Ready(Some(bytes)); + } } - Err(e) => { + Err(error) => { tracing::error!( - "Failed to receive flashblocks message from broadcast stream: {}", - e + target = "flashblocks", + %error, + "Failed to receive flashblocks message from peer_rx" ); } } @@ -57,11 +69,12 @@ impl Stream for FlashblocksConnection { let msg = match FlashblocksP2PMsg::decode(&mut &buf[..]) { Ok(msg) => msg, - Err(e) => { + Err(error) => { tracing::warn!( - "Failed to decode flashblocks message from peer {}: {}", - this.peer_id, - e + target = "flashblocks", + peer_id = %this.peer_id, + %error, + "Failed to decode flashblocks message from peer", ); this.handler .ctx @@ -84,11 +97,12 @@ impl FlashblocksConnection { fn handle_flashblocks_payload_v1(&mut self, message: Authorized) { let mut state = self.handler.state.lock(); - if let Err(e) = message.verify(self.handler.ctx.authorizer_vk) { + if let Err(error) = message.verify(self.handler.ctx.authorizer_vk) { tracing::warn!( - "Failed to verify flashblocks payload: {:?}, error: {}", - message, - e + target = "flashblocks", + peer_id = %self.peer_id, + %error, + "Failed to verify flashblock", ); self.handler .ctx @@ -99,8 +113,10 @@ impl FlashblocksConnection { if message.authorization.timestamp < state.payload_timestamp { tracing::warn!( - "Received flashblocks payload with outdated timestamp: {}", - message.authorization.timestamp + target = "flashblocks", + peer_id = %self.peer_id, + timestamp = message.authorization.timestamp, + "Received flashblock with outdated timestamp", ); self.handler .ctx @@ -129,10 +145,11 @@ impl FlashblocksConnection { // We've already seen this index from this peer. // They could be trying to DOS us. tracing::warn!( - "Received duplicate flashblocks payload with id: {}, index: {}, from peer: {}", - message.payload.payload_id, - message.payload.index, - self.peer_id + target = "flashblocks", + peer_id = %self.peer_id, + payload_id = %message.payload.payload_id, + index = message.payload.index, + "Received duplicate flashblock from peer", ); self.handler .ctx diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index a47082a7..03ad2ba7 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -53,7 +53,7 @@ pub struct FlashblocksP2PCtx { pub authorizer_vk: VerifyingKey, /// Sender for flashblocks payloads which will be broadcasted to all peers. /// May not be strictly ordered. - pub peer_tx: broadcast::Sender, + pub peer_tx: broadcast::Sender<(PayloadId, usize, BytesMut)>, /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. pub flashblock_tx: broadcast::Sender, @@ -109,7 +109,7 @@ impl FlashblocksP2PCtx { /// Commit new and already verified flashblocks payloads to the state /// broadcast them to peers, and publish them to the stream. pub fn publish(&self, state: &mut FlashblocksP2PState, msg: FlashblocksP2PMsg) { - let FlashblocksP2PMsg::FlashblocksPayloadV1(message) = msg; + let FlashblocksP2PMsg::FlashblocksPayloadV1(ref message) = msg; // Resize our array if needed if message.payload.index as usize > MAX_FLASHBLOCK_INDEX { @@ -139,8 +139,7 @@ impl FlashblocksP2PCtx { flashblock_index = message.payload.index, "queueing flashblock", ); - let message = FlashblocksP2PMsg::FlashblocksPayloadV1(message); - let bytes = message.encode(); + let bytes = msg.encode(); if bytes.len() > MAX_FRAME { tracing::error!( target: "flashblocks", @@ -158,7 +157,13 @@ impl FlashblocksP2PCtx { "FlashblocksP2PMsg almost too large", ); } - self.peer_tx.send(bytes).ok(); + self.peer_tx + .send(( + message.payload.payload_id, + message.payload.index as usize, + bytes, + )) + .ok(); // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { // Publish the flashblock From fd06a6c090ffa4cb969cdcb53bd66d1a8eaa2a1b Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 11:15:55 -0700 Subject: [PATCH 030/114] clear up comments --- crates/flashblocks-p2p/src/protocol/connection.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 5e873a92..8668120f 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -125,7 +125,7 @@ impl FlashblocksConnection { return; } - // Check if this is a new payload + // Check if this is a globally new payload if message.authorization.timestamp > state.payload_timestamp { state.flashblock_index = 0; state.payload_timestamp = message.authorization.timestamp; @@ -133,11 +133,13 @@ impl FlashblocksConnection { state.flashblocks.fill(None); } - // Check if this peer is spamming us with the same payload + // Check if this is a new payload from this peer if self.payload_id != message.payload.payload_id { self.payload_id = message.payload.payload_id; self.received.fill(false); } + + // Check if this peer is spamming us with the same payload index let len = self.received.len(); self.received .resize_with(len.max(message.payload.index as usize + 1), || false); From 495ab62026ba6a72e89786cc37513ff73035615e Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 11:31:57 -0700 Subject: [PATCH 031/114] remove stray if let --- crates/rollup-boost/src/cli.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index 1dd7e114..95834ac1 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -112,7 +112,6 @@ impl RollupBoostArgs { } else { bail!("Missing L2 Client JWT secret"); }; - if let Some(flashblocks_args) = &self.flashblocks {} let l2_client = RpcClient::new( l2_client_args.l2_url.clone(), From 65125aa31583ec5a6b61d9348ef7338a4514e869 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 15:42:49 -0700 Subject: [PATCH 032/114] reexport ed25519 --- crates/rollup-boost/src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/rollup-boost/src/lib.rs b/crates/rollup-boost/src/lib.rs index 5d79271e..99e231cb 100644 --- a/crates/rollup-boost/src/lib.rs +++ b/crates/rollup-boost/src/lib.rs @@ -44,3 +44,7 @@ pub use engine_api::*; mod version; pub use version::*; + +pub mod ed25519_dalek { + pub use ed25519_dalek::*; +} From 7f8299298ed8cdb38e5bcab2f4f23f5d0138ccf6 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 17:11:44 -0700 Subject: [PATCH 033/114] use mpsc for publish channel --- crates/flashblocks-node/src/main.rs | 6 +++--- crates/flashblocks-node/tests/p2p.rs | 14 +++++++------- crates/flashblocks-p2p/src/net/mod.rs | 12 ++++++------ crates/flashblocks-p2p/src/protocol/handler.rs | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/crates/flashblocks-node/src/main.rs b/crates/flashblocks-node/src/main.rs index 5ef91073..4c270a72 100644 --- a/crates/flashblocks-node/src/main.rs +++ b/crates/flashblocks-node/src/main.rs @@ -8,7 +8,7 @@ use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; use rollup_boost::parse_vk; -use tokio::sync::{broadcast }; +use tokio::sync::{broadcast, mpsc }; use tracing::info; #[derive(Debug, Clone, PartialEq, Eq, clap::Args)] @@ -36,7 +36,7 @@ pub fn main() { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); let (inbound_tx, inbound_rx) = broadcast::channel(100); - let (outbound_tx, _outbound_rx) = broadcast::channel(100); + let (_publish_tx, publish_rx) = mpsc::unbounded_channel(); let flashblocks_overlay = FlashblocksOverlay::new(chain_spec, inbound_rx); @@ -63,7 +63,7 @@ pub fn main() { handle.node.network.clone(), VerifyingKey::default(), inbound_tx, - outbound_tx, + publish_rx, ); handle diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index fc8fb5cc..22334361 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -25,12 +25,12 @@ use rollup_boost::{ FlashblocksP2PMsg, FlashblocksPayloadV1, }; use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; -use tokio::sync::broadcast; +use tokio::sync::{broadcast, mpsc}; use tracing::info; pub struct NodeContext { inbound_tx: broadcast::Sender, - outbound_tx: broadcast::Sender, + publish_tx: mpsc::UnboundedSender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -51,7 +51,7 @@ async fn setup_node( authorizer: SigningKey, trusted_peer: Option<(PeerId, SocketAddr)>, ) -> eyre::Result { - let (outbound_tx, _outbound_rx) = broadcast::channel(100); + let (publish_tx, publish_rx) = mpsc::unbounded_channel(); let (inbound_tx, inbound_rx) = broadcast::channel(100); let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); @@ -106,7 +106,7 @@ async fn setup_node( node.network.clone(), authorizer.verifying_key(), inbound_tx.clone(), - outbound_tx.clone(), + publish_rx, ); node.network @@ -127,7 +127,7 @@ async fn setup_node( Ok(NodeContext { inbound_tx, - outbound_tx, + publish_tx, local_node_record, http_api_addr, _node_exit_future: node_exit_future, @@ -317,7 +317,7 @@ async fn test_peering() -> eyre::Result<()> { ); let authorized = Authorized::new(&builder, authorization, payload_0.clone()); let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); - node_1.outbound_tx.send(proto_message)?; + node_1.publish_tx.send(proto_message)?; tokio::time::sleep(tokio::time::Duration::from_millis(10000)).await; // Query pending block after sending the base payload with an empty delta @@ -340,7 +340,7 @@ async fn test_peering() -> eyre::Result<()> { let authorized = Authorized::new(&builder, authorization, payload_1.clone()); let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); - node_1.outbound_tx.send(proto_message)?; + node_1.publish_tx.send(proto_message)?; tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; // Query pending block after sending the second payload with two transactions diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index d61f2551..eec0dff7 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -11,16 +11,16 @@ use reth_node_builder::{ }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; -use tokio::sync::broadcast; +use tokio::sync::{broadcast, mpsc}; use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct FlashblocksNetworkBuilder { inner: T, authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - flashblock_sender_tx: broadcast::Sender, + publish_rx: mpsc::UnboundedReceiver, } impl FlashblocksNetworkBuilder { @@ -29,13 +29,13 @@ impl FlashblocksNetworkBuilder { inner: T, authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - flashblock_sender_tx: broadcast::Sender, + publish_rx: mpsc::UnboundedReceiver, ) -> Self { Self { inner, authorizer_vk, flashblocks_receiver_tx, - flashblock_sender_tx, + publish_rx, } } } @@ -63,7 +63,7 @@ where handle.clone(), self.authorizer_vk, self.flashblocks_receiver_tx, - self.flashblock_sender_tx, + self.publish_rx, ); handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 03ad2ba7..60e2048d 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -9,7 +9,7 @@ use reth_network::Peers; use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; use std::net::SocketAddr; use std::sync::Arc; -use tokio::sync::broadcast; +use tokio::sync::{broadcast, mpsc}; use tracing::debug; use reth_ethereum::network::{ @@ -74,7 +74,7 @@ impl FlashblocksHandler { network_handle: N, authorizer_vk: VerifyingKey, flashblock_tx: broadcast::Sender, - publish_tx: broadcast::Sender, + mut publish_rx: mpsc::UnboundedReceiver, ) -> Self { let peer_tx = broadcast::Sender::new(100); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); @@ -89,7 +89,7 @@ impl FlashblocksHandler { let ctx_clone = ctx.clone(); tokio::spawn({ async move { - while let Ok(msg) = publish_tx.subscribe().recv().await { + while let Some(msg) = publish_rx.recv().await { let mut state = state_clone.lock(); ctx_clone.publish(&mut state, msg); } From ba3654830657de7088dc4d249a3e26cb762f69ef Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 19:15:56 -0700 Subject: [PATCH 034/114] feat: reth 1.5.1 --- Cargo.toml | 20 ++++++++-------- crates/flashblocks-node/Cargo.toml | 38 +++++++++++++++--------------- crates/flashblocks-p2p/Cargo.toml | 15 ------------ crates/flashblocks-rpc/Cargo.toml | 38 +++++++++++++++--------------- 4 files changed, 48 insertions(+), 63 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cd0acd34..b1006071 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,16 +33,16 @@ url = "2.2.0" sha2 = { version = "0.10", default-features = false } # Reth deps -reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-network = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-network-peers = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-network = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-network-peers = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } # Alloy libraries alloy-rpc-types-engine = "1.0.13" diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index 46ac8902..2a561176 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -9,27 +9,27 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true flashblocks-rpc.workspace = true -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0", features = [ +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ "test-utils", ] } -reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index 1ac17331..a5055a44 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -13,21 +13,6 @@ reth-node-api = { workspace = true } reth-node-builder = { workspace = true } reth-provider = { workspace = true } reth-transaction-pool = { workspace = true } -# reth-node-builder.workspace = true -# reth-optimism-chainspec.workspace = true -# reth-optimism-node.workspace = true -# reth-optimism-primitives.workspace = true -# reth-optimism-payload-builder.workspace = true -# reth-optimism-rpc.workspace = true -# reth-optimism-forks.workspace = true -# reth-provider.workspace = true -# reth-trie-db.workspace = true -# reth-transaction-pool.workspace = true -# reth-node-api.workspace = true -# alloy-primitives.workspace = true -# op-alloy-consensus.workspace = true -# alloy-rpc-types-eth.workspace = true - ed25519-dalek = { version = "2", features = ["serde"] } blake3 = "1" # fast hashing for payload IDs diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 0e30b946..8561ed80 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -8,27 +8,27 @@ license = "MIT" rollup-boost.workspace = true flashblocks-p2p.workspace = true -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0", features = [ +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ "test-utils", ] } -reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.0" } +reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } From a7b4973180adeca0cde3ab490a938c062eb93eda Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 19:19:51 -0700 Subject: [PATCH 035/114] chore: cargo update --- Cargo.lock | 819 +++++++++++++++++++++++++++-------------------------- 1 file changed, 424 insertions(+), 395 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0679f3aa..91beb4de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,9 +97,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9cc9d81ace3da457883b0bdf76776e55f1b84219a9e9d55c27ad308548d3f" +checksum = "5674914c2cfdb866c21cb0c09d82374ee39a1395cf512e7515f4c014083b3fff" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b77018eec2154eb158869f9f2914a3ea577adf87b11be2764d4795d5ccccf7" +checksum = "ca3b746060277f3d7f9c36903bb39b593a741cb7afcb0044164c28f0e9b673f0" dependencies = [ "alloy-eips", "alloy-primitives", @@ -136,9 +136,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bf8b058ff364d6e94bcd2979d7da1862e94d2987065a4eb41fa9eac36e028a" +checksum = "bf98679329fa708fa809ea596db6d974da892b068ad45e48ac1956f582edf946" dependencies = [ "alloy-consensus", "alloy-eips", @@ -212,9 +212,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d134f3ac4926124eaf521a1031d11ea98816df3d39fc446fcfd6b36884603f" +checksum = "f562a81278a3ed83290e68361f2d1c75d018ae3b8589a314faf9303883e18ec9" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "alloy-evm" -version = "0.12.3" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff5aae4c6dc600734b206b175f3200085ee82dcdaa388760358830a984ca9869" +checksum = "ef2d6e0448bfd057a4438226b3d2fd547a0530fa4226217dfb1682d09f108bd4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -255,22 +255,23 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1c2792605e648bdd1fddcfed8ce0d39d3db495c71d2240cb53df8aee8aea1f" +checksum = "dc41384e9ab8c9b2fb387c52774d9d432656a28edcda1c2d4083e96051524518" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-serde", "alloy-trie", "serde", + "serde_with", ] [[package]] name = "alloy-hardforks" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce138b29a2f8e7ed97c064af8359dfa6559c12cba5e821ae4eb93081a56557e" +checksum = "819a3620fe125e0fff365363315ee5e24c23169173b19747dfd6deba33db8990" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -294,9 +295,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31cfdacfeb6b6b40bf6becf92e69e575c68c9f80311c3961d019e29c0b8d6be2" +checksum = "12c454fcfcd5d26ed3b8cae5933cbee9da5f0b05df19b46d4bd4446d1f082565" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -309,9 +310,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de68a3f09cd9ab029cf87d08630e1336ca9a530969689fd151d505fa888a2603" +checksum = "42d6d39eabe5c7b3d8f23ac47b0b683b99faa4359797114636c66e0743103d05" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -335,9 +336,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc2689c8addfc43461544d07a6f5f3a3e1f5f4efae61206cb5783dc383cfc8f" +checksum = "3704fa8b7ba9ba3f378d99b3d628c8bc8c2fc431b709947930f154e22a8368b6" dependencies = [ "alloy-consensus", "alloy-eips", @@ -348,9 +349,9 @@ dependencies = [ [[package]] name = "alloy-op-evm" -version = "0.12.3" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "588a87b77b30452991151667522d2f2f724cec9c2ec6602e4187bc97f66d8095" +checksum = "98354b9c3d50de701a63693d5b6a37e468a93b970b2224f934dd745c727ef998" dependencies = [ "alloy-consensus", "alloy-eips", @@ -365,9 +366,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9a510692bef4871797062ca09ec7873c45dc68c7f3f72291165320f53606a3" +checksum = "2090f21bb6df43e147d976e754bc9a007ca851badbfc6685377aa679b5f151d9" dependencies = [ "alloy-chains", "alloy-hardforks", @@ -407,9 +408,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ced931220f547d30313530ad315654b7862ef52631c90ab857d792865f84a7d" +checksum = "08800e8cbe70c19e2eb7cf3d7ff4b28bdd9b3933f8e1c8136c7d910617ba03bf" dependencies = [ "alloy-chains", "alloy-consensus", @@ -450,9 +451,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e37d6cf286fd30bacac525ab1491f9d1030d39ecce237821f2a5d5922eb9a37" +checksum = "ae68457a2c2ead6bd7d7acb5bf5f1623324b1962d4f8e7b0250657a3c3ab0a0b" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -493,9 +494,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1d1eac6e48b772c7290f0f79211a0e822a38b057535b514cc119abd857d5b6" +checksum = "162301b5a57d4d8f000bf30f4dcb82f9f468f3e5e846eeb8598dd39e7886932c" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -504,7 +505,6 @@ dependencies = [ "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", - "async-stream", "futures", "pin-project", "reqwest", @@ -514,16 +514,15 @@ dependencies = [ "tokio-stream", "tower 0.5.2", "tracing", - "tracing-futures", "url", "wasmtimer", ] [[package]] name = "alloy-rpc-types" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8589c6ae318fcc9624d42e9166f7f82b630d9ad13e180c52addf20b93a8af266" +checksum = "6cd8ca94ae7e2b32cc3895d9981f3772aab0b4756aa60e9ed0bcfee50f0e1328" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -534,9 +533,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0182187bcbe47f3a737f5eced007b7788d4ed37aba19d43fd3df123169b3b05e" +checksum = "e7bff682e76f3f72e9ddc75e54a1bd1db5ce53cbdf2cce2d63a3a981437f78f5" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -546,9 +545,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754d5062b594ed300a3bb0df615acb7bacdbd7bd1cd1a6e5b59fb936c5025a13" +checksum = "9f3ff6a778ebda3deaed9af17930d678611afe1effa895c4260b61009c314f82" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -558,9 +557,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cfd7ecb21a1bfe68ac6b551172e4d41f828bcc33a2e1563a65d482d4efc1cf" +checksum = "076b47e834b367d8618c52dd0a0d6a711ddf66154636df394805300af4923b8a" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -569,9 +568,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c1ddf8fb2e41fa49316185d7826ed034f55819e0017e65dc6715f911b8a1ee" +checksum = "48f39da9b760e78fc3f347fba4da257aa6328fb33f73682b26cc0a6874798f7d" dependencies = [ "alloy-eips", "alloy-primitives", @@ -587,9 +586,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c81ae89a04859751bac72e5e73459bceb3e6a4d2541f2f1374e35be358fd171" +checksum = "94a2a86ad7b7d718c15e79d0779bd255561b6b22968dc5ed2e7c0fbc43bb55fe" dependencies = [ "alloy-primitives", "serde", @@ -597,9 +596,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662b720c498883427ffb9f5e38c7f02b56ac5c0cdd60b457e88ce6b6a20b9ce9" +checksum = "4ba838417c42e8f1fe5eb4f4bbfacb7b5d4b9e615b8d2e831b921e04bf0bed62" dependencies = [ "alloy-consensus", "alloy-eips", @@ -617,9 +616,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb082c325bdfd05a7c71f52cd1060e62491fbf6edf55962720bdc380847b0784" +checksum = "2c2f847e635ec0be819d06e2ada4bcc4e4204026a83c4bfd78ae8d550e027ae7" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -633,14 +632,15 @@ dependencies = [ "itertools 0.14.0", "serde", "serde_json", + "serde_with", "thiserror 2.0.12", ] [[package]] name = "alloy-rpc-types-mev" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c1b50012f55de4a6d58ee9512944089fa61a835e6fe3669844075bb6e0312e" +checksum = "fb1c9b23cedf70aeb99ea9f16b78cdf902f524e227922fb340e3eb899ebe96dc" dependencies = [ "alloy-consensus", "alloy-eips", @@ -653,9 +653,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf52c884c7114c5d1f1f2735634ba0f6579911427281fb02cbd5cb8147723ca" +checksum = "6fc58180302a94c934d455eeedb3ecb99cdc93da1dbddcdbbdb79dd6fe618b2a" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -667,9 +667,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4fd0df1af2ed62d02e7acbc408a162a06f30cb91550c2ec34b11c760cdc0ba" +checksum = "0f9f089d78bb94148e0fcfda087d4ce5fd35a7002847b5e90610c0fcb140f7b4" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -679,9 +679,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f26c17270c2ac1bd555c4304fe067639f0ddafdd3c8d07a200b2bb5a326e03" +checksum = "ae699248d02ade9db493bbdae61822277dc14ae0f82a5a4153203b60e34422a6" dependencies = [ "alloy-primitives", "arbitrary", @@ -691,9 +691,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d9fd649d6ed5b8d7e5014e01758efb937e8407124b182a7f711bf487a1a2697" +checksum = "3cf7d793c813515e2b627b19a15693960b3ed06670f9f66759396d06ebe5747b" dependencies = [ "alloy-primitives", "async-trait", @@ -706,9 +706,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c288c5b38be486bb84986701608f5d815183de990e884bb747f004622783e125" +checksum = "51a424bc5a11df0d898ce0fd15906b88ebe2a6e4f17a514b51bc93946bb756bd" dependencies = [ "alloy-consensus", "alloy-network", @@ -794,9 +794,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b790b89e31e183ae36ac0a1419942e21e94d745066f5281417c3e4299ea39e" +checksum = "4f317d20f047b3de4d9728c556e2e9a92c9a507702d2016424cd8be13a74ca5e" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -817,9 +817,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f643645a33a681d09ac1ca2112014c2ca09c68aad301da4400484d59c746bc70" +checksum = "ff084ac7b1f318c87b579d221f11b748341d68b9ddaa4ffca5e62ed2b8cfefb4" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -832,9 +832,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c2d843199d0bdb4cbed8f1b6f2da7f68bcb9c5da7f57e789009e4e7e76d1bec" +checksum = "edb099cdad8ed2e6a80811cdf9bbf715ebf4e34c981b4a6e2d1f9daacbf8b218" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -852,9 +852,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d27aae8c7a6403d3d3e874ad2eeeadbf46267b614bac2d4d82786b9b8496464" +checksum = "0e915e1250dc129ad48d264573ccd08e4716fdda564a772fd217875b8459aff9" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -890,9 +890,9 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ef40a046b9bf141afc440cef596c79292708aade57c450dc74e843270fd8e7" +checksum = "1154c8187a5ff985c95a8b2daa2fedcf778b17d7668e5e50e556c4ff9c881154" dependencies = [ "alloy-primitives", "darling", @@ -1330,9 +1330,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.25" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f6024f3f856663b45fd0c9b6f2024034a702f453549449e0d84a305900dad4" +checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" dependencies = [ "brotli", "flate2", @@ -1434,9 +1434,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "08b5d4e069cbc868041a64bd68dc8cb39a0d79585cd6c5a24caa8c2d622121be" dependencies = [ "aws-lc-sys", "zeroize", @@ -1444,9 +1444,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" dependencies = [ "bindgen 0.69.5", "cc", @@ -2186,9 +2186,9 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] name = "castaway" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ "rustversion", ] @@ -2269,9 +2269,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -2279,9 +2279,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -2291,9 +2291,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck", "proc-macro2", @@ -2553,9 +2553,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -2681,9 +2681,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.3" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "373b7c5dbd637569a2cca66e8d66b8c446a1e7bf064ea321d265d7b3dfe7c97e" dependencies = [ "cfg-if", "cpufeatures", @@ -3120,9 +3120,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", @@ -3421,9 +3421,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.9" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" [[package]] name = "filetime" @@ -4342,9 +4342,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ "base64 0.22.1", "bytes", @@ -4796,6 +4796,17 @@ dependencies = [ "memoffset", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -5577,9 +5588,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" dependencies = [ "libc", ] @@ -5900,12 +5911,11 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "notify" -version = "8.0.0" +version = "8.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" +checksum = "3163f59cd3fa0e9ef8c32f242966a7b9994fd7378366099593e0e73077cd8c97" dependencies = [ "bitflags 2.9.1", - "filetime", "fsevent-sys", "inotify", "kqueue", @@ -5914,7 +5924,7 @@ dependencies = [ "mio", "notify-types", "walkdir", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6066,12 +6076,13 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d51b0175c49668a033fe7cc69080110d9833b291566cdf332905f3ad9c68a0" +checksum = "675b3a54e5b12af997abc8b6638b0aee51a28caedab70d4967e0d5db3a3f1d06" dependencies = [ "alloy-rlp", "arbitrary", + "cfg-if", "proptest", "ruint", "serde", @@ -6211,9 +6222,9 @@ dependencies = [ [[package]] name = "op-revm" -version = "7.0.1" +version = "8.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b97d2b54651fcd2955b454e86b2336c031e17925a127f4c44e2b63b2eeda923" +checksum = "ee9ba9cab294a5ed02afd1a1060220762b3c52911acab635db33822e93f7276d" dependencies = [ "auto_impl", "once_cell", @@ -7270,9 +7281,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "regress" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ef7fa9ed0256d64a688a3747d0fef7a88851c18a5e1d57f115f38ec2e09366" +checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" dependencies = [ "hashbrown 0.15.4", "memchr", @@ -7280,9 +7291,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.21" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8cea6b35bcceb099f30173754403d2eba0a5dc18cea3630fccd88251909288" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes", @@ -7335,8 +7346,8 @@ checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "reth" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-rpc-types", "aquamarine", @@ -7381,8 +7392,8 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7405,8 +7416,8 @@ dependencies = [ [[package]] name = "reth-chain-state" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7436,8 +7447,8 @@ dependencies = [ [[package]] name = "reth-chainspec" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7456,8 +7467,8 @@ dependencies = [ [[package]] name = "reth-cli" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-genesis", "clap", @@ -7470,8 +7481,8 @@ dependencies = [ [[package]] name = "reth-cli-commands" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "ahash", "alloy-chains", @@ -7541,8 +7552,8 @@ dependencies = [ [[package]] name = "reth-cli-runner" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "reth-tasks", "tokio", @@ -7551,8 +7562,8 @@ dependencies = [ [[package]] name = "reth-cli-util" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7569,8 +7580,8 @@ dependencies = [ [[package]] name = "reth-codecs" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7589,8 +7600,8 @@ dependencies = [ [[package]] name = "reth-codecs-derive" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "convert_case", "proc-macro2", @@ -7600,8 +7611,8 @@ dependencies = [ [[package]] name = "reth-config" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "eyre", "humantime-serde", @@ -7615,8 +7626,8 @@ dependencies = [ [[package]] name = "reth-consensus" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7628,8 +7639,8 @@ dependencies = [ [[package]] name = "reth-consensus-common" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7640,8 +7651,8 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7659,13 +7670,14 @@ dependencies = [ "reth-tracing", "ringbuffer", "serde", + "serde_json", "tokio", ] [[package]] name = "reth-db" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "derive_more", @@ -7690,8 +7702,8 @@ dependencies = [ [[package]] name = "reth-db-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7718,8 +7730,8 @@ dependencies = [ [[package]] name = "reth-db-common" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7747,8 +7759,8 @@ dependencies = [ [[package]] name = "reth-db-models" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7762,8 +7774,8 @@ dependencies = [ [[package]] name = "reth-discv4" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7788,8 +7800,8 @@ dependencies = [ [[package]] name = "reth-discv5" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7812,8 +7824,8 @@ dependencies = [ [[package]] name = "reth-dns-discovery" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "data-encoding", @@ -7836,8 +7848,8 @@ dependencies = [ [[package]] name = "reth-downloaders" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7871,13 +7883,15 @@ dependencies = [ [[package]] name = "reth-e2e-test-utils" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-network", "alloy-primitives", + "alloy-provider", + "alloy-rlp", "alloy-rpc-types-engine", "alloy-rpc-types-eth", "alloy-signer", @@ -7887,9 +7901,15 @@ dependencies = [ "futures-util", "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "reth-chainspec", + "reth-cli-commands", + "reth-config", + "reth-consensus", "reth-db", + "reth-db-common", "reth-engine-local", + "reth-ethereum-consensus", "reth-ethereum-primitives", + "reth-evm", "reth-network-api", "reth-network-peers", "reth-node-api", @@ -7899,18 +7919,23 @@ dependencies = [ "reth-payload-builder", "reth-payload-builder-primitives", "reth-payload-primitives", + "reth-primitives", + "reth-primitives-traits", "reth-provider", + "reth-prune-types", "reth-rpc-api", "reth-rpc-builder", "reth-rpc-eth-api", - "reth-rpc-layer 1.5.0", + "reth-rpc-layer 1.5.1", "reth-rpc-server-types", "reth-stages-types", + "reth-static-file", "reth-tasks", "reth-tokio-util", "reth-tracing", "revm", "serde_json", + "tempfile", "tokio", "tokio-stream", "tracing", @@ -7919,8 +7944,8 @@ dependencies = [ [[package]] name = "reth-ecies" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "aes", "alloy-primitives", @@ -7950,8 +7975,8 @@ dependencies = [ [[package]] name = "reth-engine-local" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7974,8 +7999,8 @@ dependencies = [ [[package]] name = "reth-engine-primitives" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7999,8 +8024,8 @@ dependencies = [ [[package]] name = "reth-engine-service" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "futures", "pin-project", @@ -8022,8 +8047,8 @@ dependencies = [ [[package]] name = "reth-engine-tree" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8074,8 +8099,8 @@ dependencies = [ [[package]] name = "reth-engine-util" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -8101,8 +8126,8 @@ dependencies = [ [[package]] name = "reth-era" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8117,8 +8142,8 @@ dependencies = [ [[package]] name = "reth-era-downloader" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "bytes", @@ -8132,8 +8157,8 @@ dependencies = [ [[package]] name = "reth-era-utils" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8156,8 +8181,8 @@ dependencies = [ [[package]] name = "reth-errors" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "reth-consensus", "reth-execution-errors", @@ -8167,8 +8192,8 @@ dependencies = [ [[package]] name = "reth-eth-wire" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-chains", "alloy-primitives", @@ -8195,8 +8220,8 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8216,8 +8241,8 @@ dependencies = [ [[package]] name = "reth-ethereum" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -8254,8 +8279,8 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8313,8 +8338,8 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8329,8 +8354,8 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8347,8 +8372,8 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8360,8 +8385,8 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8387,8 +8412,8 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8405,8 +8430,8 @@ dependencies = [ [[package]] name = "reth-etl" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "rayon", "reth-db-api", @@ -8415,8 +8440,8 @@ dependencies = [ [[package]] name = "reth-evm" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8438,8 +8463,8 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8457,8 +8482,8 @@ dependencies = [ [[package]] name = "reth-execution-errors" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-evm", "alloy-primitives", @@ -8470,8 +8495,8 @@ dependencies = [ [[package]] name = "reth-execution-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8488,8 +8513,8 @@ dependencies = [ [[package]] name = "reth-exex" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8526,8 +8551,8 @@ dependencies = [ [[package]] name = "reth-exex-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8540,8 +8565,8 @@ dependencies = [ [[package]] name = "reth-fs-util" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "serde", "serde_json", @@ -8550,8 +8575,8 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8578,8 +8603,8 @@ dependencies = [ [[package]] name = "reth-ipc" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "bytes", "futures", @@ -8598,8 +8623,8 @@ dependencies = [ [[package]] name = "reth-libmdbx" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "bitflags 2.9.1", "byteorder", @@ -8615,8 +8640,8 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "bindgen 0.70.1", "cc", @@ -8624,8 +8649,8 @@ dependencies = [ [[package]] name = "reth-metrics" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "futures", "metrics", @@ -8636,16 +8661,16 @@ dependencies = [ [[package]] name = "reth-net-banlist" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", ] [[package]] name = "reth-net-nat" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "futures-util", "if-addrs", @@ -8658,8 +8683,8 @@ dependencies = [ [[package]] name = "reth-network" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8713,8 +8738,8 @@ dependencies = [ [[package]] name = "reth-network-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "alloy-rpc-types-admin", @@ -8736,8 +8761,8 @@ dependencies = [ [[package]] name = "reth-network-p2p" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8759,8 +8784,8 @@ dependencies = [ [[package]] name = "reth-network-peers" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8774,8 +8799,8 @@ dependencies = [ [[package]] name = "reth-network-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8788,8 +8813,8 @@ dependencies = [ [[package]] name = "reth-nippy-jar" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "anyhow", "bincode 1.3.3", @@ -8805,8 +8830,8 @@ dependencies = [ [[package]] name = "reth-node-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8829,8 +8854,8 @@ dependencies = [ [[package]] name = "reth-node-builder" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8878,7 +8903,7 @@ dependencies = [ "reth-rpc-builder", "reth-rpc-engine-api", "reth-rpc-eth-types", - "reth-rpc-layer 1.5.0", + "reth-rpc-layer 1.5.1", "reth-stages", "reth-static-file", "reth-tasks", @@ -8894,8 +8919,8 @@ dependencies = [ [[package]] name = "reth-node-core" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8945,8 +8970,8 @@ dependencies = [ [[package]] name = "reth-node-ethereum" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-rpc-types-engine", @@ -8981,8 +9006,8 @@ dependencies = [ [[package]] name = "reth-node-events" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9005,8 +9030,8 @@ dependencies = [ [[package]] name = "reth-node-metrics" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "eyre", "http", @@ -9026,8 +9051,8 @@ dependencies = [ [[package]] name = "reth-node-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "reth-chainspec", "reth-db-api", @@ -9039,8 +9064,8 @@ dependencies = [ [[package]] name = "reth-optimism-chainspec" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-chains", "alloy-consensus", @@ -9066,8 +9091,8 @@ dependencies = [ [[package]] name = "reth-optimism-cli" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9113,8 +9138,8 @@ dependencies = [ [[package]] name = "reth-optimism-consensus" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9138,8 +9163,8 @@ dependencies = [ [[package]] name = "reth-optimism-evm" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9163,8 +9188,8 @@ dependencies = [ [[package]] name = "reth-optimism-forks" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-op-hardforks", "alloy-primitives", @@ -9174,8 +9199,8 @@ dependencies = [ [[package]] name = "reth-optimism-node" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9221,8 +9246,8 @@ dependencies = [ [[package]] name = "reth-optimism-payload-builder" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9260,8 +9285,8 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9280,8 +9305,8 @@ dependencies = [ [[package]] name = "reth-optimism-rpc" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9340,8 +9365,8 @@ dependencies = [ [[package]] name = "reth-optimism-storage" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9356,8 +9381,8 @@ dependencies = [ [[package]] name = "reth-optimism-txpool" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9392,8 +9417,8 @@ dependencies = [ [[package]] name = "reth-payload-builder" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9413,8 +9438,8 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "pin-project", "reth-payload-primitives", @@ -9425,8 +9450,8 @@ dependencies = [ [[package]] name = "reth-payload-primitives" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9444,8 +9469,8 @@ dependencies = [ [[package]] name = "reth-payload-util" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9454,8 +9479,8 @@ dependencies = [ [[package]] name = "reth-payload-validator" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9464,8 +9489,8 @@ dependencies = [ [[package]] name = "reth-primitives" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "c-kzg", @@ -9478,8 +9503,8 @@ dependencies = [ [[package]] name = "reth-primitives-traits" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9511,8 +9536,8 @@ dependencies = [ [[package]] name = "reth-provider" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9556,8 +9581,8 @@ dependencies = [ [[package]] name = "reth-prune" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9584,8 +9609,8 @@ dependencies = [ [[package]] name = "reth-prune-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "arbitrary", @@ -9598,8 +9623,8 @@ dependencies = [ [[package]] name = "reth-ress-protocol" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9617,8 +9642,8 @@ dependencies = [ [[package]] name = "reth-ress-provider" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9644,8 +9669,8 @@ dependencies = [ [[package]] name = "reth-revm" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9657,8 +9682,8 @@ dependencies = [ [[package]] name = "reth-rpc" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9733,8 +9758,8 @@ dependencies = [ [[package]] name = "reth-rpc-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-genesis", @@ -9761,8 +9786,8 @@ dependencies = [ [[package]] name = "reth-rpc-builder" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-network", "alloy-provider", @@ -9783,7 +9808,7 @@ dependencies = [ "reth-rpc-api", "reth-rpc-eth-api", "reth-rpc-eth-types", - "reth-rpc-layer 1.5.0", + "reth-rpc-layer 1.5.1", "reth-rpc-server-types", "reth-storage-api", "reth-tasks", @@ -9799,8 +9824,8 @@ dependencies = [ [[package]] name = "reth-rpc-convert" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-json-rpc", @@ -9821,8 +9846,8 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9851,12 +9876,13 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-dyn-abi", "alloy-eips", + "alloy-evm", "alloy-json-rpc", "alloy-network", "alloy-primitives", @@ -9895,11 +9921,12 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", + "alloy-evm", "alloy-primitives", "alloy-rpc-types-eth", "alloy-sol-types", @@ -9951,8 +9978,8 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-rpc-types-engine", "http", @@ -9965,8 +9992,8 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9981,8 +10008,8 @@ dependencies = [ [[package]] name = "reth-stages" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10031,8 +10058,8 @@ dependencies = [ [[package]] name = "reth-stages-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -10058,8 +10085,8 @@ dependencies = [ [[package]] name = "reth-stages-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "arbitrary", @@ -10072,8 +10099,8 @@ dependencies = [ [[package]] name = "reth-static-file" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "parking_lot", @@ -10092,8 +10119,8 @@ dependencies = [ [[package]] name = "reth-static-file-types" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "clap", @@ -10104,8 +10131,8 @@ dependencies = [ [[package]] name = "reth-storage-api" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10128,8 +10155,8 @@ dependencies = [ [[package]] name = "reth-storage-errors" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -10144,8 +10171,8 @@ dependencies = [ [[package]] name = "reth-tasks" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "auto_impl", "dyn-clone", @@ -10162,8 +10189,8 @@ dependencies = [ [[package]] name = "reth-testing-utils" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10178,8 +10205,8 @@ dependencies = [ [[package]] name = "reth-tokio-util" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "tokio", "tokio-stream", @@ -10188,8 +10215,8 @@ dependencies = [ [[package]] name = "reth-tracing" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "clap", "eyre", @@ -10203,8 +10230,8 @@ dependencies = [ [[package]] name = "reth-transaction-pool" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10242,8 +10269,8 @@ dependencies = [ [[package]] name = "reth-trie" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10267,8 +10294,8 @@ dependencies = [ [[package]] name = "reth-trie-common" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10293,8 +10320,8 @@ dependencies = [ [[package]] name = "reth-trie-db" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "reth-db-api", @@ -10306,8 +10333,8 @@ dependencies = [ [[package]] name = "reth-trie-parallel" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10331,8 +10358,8 @@ dependencies = [ [[package]] name = "reth-trie-sparse" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10349,17 +10376,17 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" -version = "1.5.0" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.0#61e38f9af154fe91e776d8f5e449d20a1571e8cf" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "zstd", ] [[package]] name = "revm" -version = "26.0.1" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2a493c73054a0f6635bad6e840cdbef34838e6e6186974833c901dff7dd709" +checksum = "70a84455f03d3480d4ed2e7271c15f2ec95b758e86d57cb8d258a8ff1c22e9a4" dependencies = [ "revm-bytecode", "revm-context", @@ -10376,9 +10403,9 @@ dependencies = [ [[package]] name = "revm-bytecode" -version = "5.0.0" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b395ee2212d44fcde20e9425916fee685b5440c3f8e01fabae8b0f07a2fd7f08" +checksum = "7a685758a4f375ae9392b571014b9779cfa63f0d8eb91afb4626ddd958b23615" dependencies = [ "bitvec", "once_cell", @@ -10389,9 +10416,9 @@ dependencies = [ [[package]] name = "revm-context" -version = "7.0.1" +version = "8.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b97b69d05651509b809eb7215a6563dc64be76a941666c40aabe597ab544d38" +checksum = "a990abf66b47895ca3e915d5f3652bb7c6a4cff6e5351fdf0fc2795171fd411c" dependencies = [ "cfg-if", "derive-where", @@ -10405,9 +10432,9 @@ dependencies = [ [[package]] name = "revm-context-interface" -version = "7.0.1" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f8f4f06a1c43bf8e6148509aa06a6c4d28421541944842b9b11ea1a6e53468f" +checksum = "a303a93102fceccec628265efd550ce49f2817b38ac3a492c53f7d524f18a1ca" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -10421,9 +10448,9 @@ dependencies = [ [[package]] name = "revm-database" -version = "6.0.0" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763eb5867a109a85f8e47f548b9d88c9143c0e443ec056742052f059fa32f4f1" +checksum = "7db360729b61cc347f9c2f12adb9b5e14413aea58778cf9a3b7676c6a4afa115" dependencies = [ "alloy-eips", "revm-bytecode", @@ -10435,11 +10462,12 @@ dependencies = [ [[package]] name = "revm-database-interface" -version = "6.0.0" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf5ecd19a5b75b862841113b9abdd864ad4b22e633810e11e6d620e8207e361d" +checksum = "b8500194cad0b9b1f0567d72370795fd1a5e0de9ec719b1607fa1566a23f039a" dependencies = [ "auto_impl", + "either", "revm-primitives", "revm-state", "serde", @@ -10447,9 +10475,9 @@ dependencies = [ [[package]] name = "revm-handler" -version = "7.0.1" +version = "8.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b61f992beaa7a5fc3f5fcf79f1093624fa1557dc42d36baa42114c2d836b59" +checksum = "03c35a17a38203976f97109e20eccf6732447ce6c9c42973bae42732b2e957ff" dependencies = [ "auto_impl", "derive-where", @@ -10466,9 +10494,9 @@ dependencies = [ [[package]] name = "revm-inspector" -version = "7.0.1" +version = "8.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e4400a109a2264f4bf290888ac6d02432b6d5d070492b9dcf134b0c7d51354" +checksum = "e69abf6a076741bd5cd87b7d6c1b48be2821acc58932f284572323e81a8d4179" dependencies = [ "auto_impl", "either", @@ -10484,9 +10512,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.25.0" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aabdffc06bdb434d9163e2d63b6fae843559afd300ea3fbeb113b8a0d8ec728" +checksum = "c7b99a2332cf8eed9e9a22fffbf76dfadc99d2c45de6ae6431a1eb9f657dd97a" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -10504,9 +10532,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "22.0.1" +version = "23.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2481ef059708772cec0ce6bc4c84b796a40111612efb73b01adf1caed7ff9ac" +checksum = "d95c4a9a1662d10b689b66b536ddc2eb1e89f5debfcabc1a2d7b8417a2fa47cd" dependencies = [ "revm-bytecode", "revm-context-interface", @@ -10516,15 +10544,16 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "23.0.0" +version = "24.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d581e78c8f132832bd00854fb5bf37efd95a52582003da35c25cd2cbfc63849" +checksum = "b68d54a4733ac36bd29ee645c3c2e5e782fb63f199088d49e2c48c64a9fedc15" dependencies = [ "ark-bls12-381", "ark-bn254", "ark-ec", "ark-ff 0.5.0", "ark-serialize 0.5.0", + "arrayref", "aurora-engine-modexp", "blst", "c-kzg", @@ -10553,9 +10582,9 @@ dependencies = [ [[package]] name = "revm-state" -version = "6.0.0" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6274928dd78f907103740b10800d3c0db6caeca391e75a159c168a1e5c78f8" +checksum = "106fec5c634420118c7d07a6c37110186ae7f23025ceac3a5dbe182eea548363" dependencies = [ "bitflags 2.9.1", "revm-bytecode", @@ -10839,22 +10868,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "aws-lc-rs", "log", @@ -10926,9 +10955,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "aws-lc-rs", "ring", @@ -10998,9 +11027,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1375ba8ef45a6f15d83fa8748f1079428295d403d6ea991d09ab100155fbc06d" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" dependencies = [ "dyn-clone", "ref-cast", @@ -11249,7 +11278,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.10.0", "schemars 0.9.0", - "schemars 1.0.3", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -11751,7 +11780,7 @@ dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -11974,17 +12003,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -12286,8 +12317,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "futures", - "futures-task", "pin-project", "tracing", ] @@ -13465,9 +13494,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -13544,7 +13573,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", - "rustix 1.0.7", + "rustix 1.0.8", ] [[package]] From 7e3632482196e04d0a6095f10e1540010713052d Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 16 Jul 2025 19:41:47 -0700 Subject: [PATCH 036/114] chore: udeps --- Cargo.lock | 202 +---------------------------- Cargo.toml | 3 - crates/flashblocks-node/Cargo.toml | 1 - crates/flashblocks-p2p/Cargo.toml | 1 - crates/flashblocks-rpc/Cargo.toml | 5 - crates/websocket-proxy/Cargo.toml | 2 +- 6 files changed, 3 insertions(+), 211 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 91beb4de..aebb756d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -715,8 +715,6 @@ dependencies = [ "alloy-primitives", "alloy-signer", "async-trait", - "coins-bip32", - "coins-bip39", "k256", "rand 0.8.5", "thiserror 2.0.12", @@ -1631,12 +1629,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - [[package]] name = "bimap" version = "0.6.3" @@ -1652,26 +1644,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bincode" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" -dependencies = [ - "bincode_derive", - "serde", - "unty", -] - -[[package]] -name = "bincode_derive" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" -dependencies = [ - "virtue", -] - [[package]] name = "bindgen" version = "0.69.5" @@ -2049,7 +2021,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "sha2 0.10.9", "tinyvec", ] @@ -2316,57 +2287,6 @@ dependencies = [ "cc", ] -[[package]] -name = "coins-bip32" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2073678591747aed4000dd468b97b14d7007f7936851d3f2f01846899f5ebf08" -dependencies = [ - "bs58", - "coins-core", - "digest 0.10.7", - "hmac", - "k256", - "serde", - "sha2 0.10.9", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-bip39" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b169b26623ff17e9db37a539fe4f15342080df39f129ef7631df7683d6d9d4" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac", - "once_cell", - "pbkdf2", - "rand 0.8.5", - "sha2 0.10.9", - "thiserror 1.0.69", -] - -[[package]] -name = "coins-core" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b962ad8545e43a28e14e87377812ba9ae748dd4fd963f4c10e9fcc6d13475b" -dependencies = [ - "base64 0.21.7", - "bech32", - "bs58", - "const-hex", - "digest 0.10.7", - "generic-array", - "ripemd", - "serde", - "sha2 0.10.9", - "sha3", - "thiserror 1.0.69", -] - [[package]] name = "colorchoice" version = "1.0.4" @@ -3449,34 +3369,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "flashblocks-api" -version = "0.1.0" -dependencies = [ - "alloy-primitives", - "bincode 2.0.1", - "blake3", - "clap", - "ed25519-dalek", - "eyre", - "futures", - "reth", - "reth-eth-wire", - "reth-ethereum", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-provider", - "reth-transaction-pool", - "rollup-boost", - "serde", - "serde_json", - "thiserror 2.0.12", - "tokio", - "tokio-stream", - "tracing", -] - [[package]] name = "flashblocks-node" version = "0.1.0" @@ -3505,7 +3397,6 @@ dependencies = [ "op-alloy-network", "op-alloy-rpc-types", "reth-db", - "reth-e2e-test-utils", "reth-eth-wire", "reth-ethereum", "reth-network", @@ -3542,7 +3433,6 @@ version = "0.1.0" dependencies = [ "alloy-primitives", "alloy-rlp", - "bincode 2.0.1", "blake3", "clap", "ed25519-dalek", @@ -3584,7 +3474,6 @@ dependencies = [ "clap", "ed25519-dalek", "eyre", - "flashblocks-p2p", "futures-util", "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", @@ -3593,18 +3482,14 @@ dependencies = [ "op-alloy-network", "op-alloy-rpc-types", "reth-db", - "reth-e2e-test-utils", "reth-eth-wire", - "reth-ethereum", "reth-network", "reth-node-api", "reth-node-builder", "reth-node-core", "reth-optimism-chainspec", - "reth-optimism-cli", "reth-optimism-evm", "reth-optimism-forks", - "reth-optimism-node", "reth-optimism-primitives", "reth-optimism-rpc", "reth-primitives", @@ -6501,16 +6386,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - [[package]] name = "pem" version = "3.0.5" @@ -7881,67 +7756,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "reth-e2e-test-utils" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-network", - "alloy-primitives", - "alloy-provider", - "alloy-rlp", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-signer", - "alloy-signer-local", - "derive_more", - "eyre", - "futures-util", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "reth-chainspec", - "reth-cli-commands", - "reth-config", - "reth-consensus", - "reth-db", - "reth-db-common", - "reth-engine-local", - "reth-ethereum-consensus", - "reth-ethereum-primitives", - "reth-evm", - "reth-network-api", - "reth-network-peers", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-ethereum", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-prune-types", - "reth-rpc-api", - "reth-rpc-builder", - "reth-rpc-eth-api", - "reth-rpc-layer 1.5.1", - "reth-rpc-server-types", - "reth-stages-types", - "reth-static-file", - "reth-tasks", - "reth-tokio-util", - "reth-tracing", - "revm", - "serde_json", - "tempfile", - "tokio", - "tokio-stream", - "tracing", - "url", -] - [[package]] name = "reth-ecies" version = "1.5.1" @@ -8817,7 +8631,7 @@ version = "1.5.1" source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" dependencies = [ "anyhow", - "bincode 1.3.3", + "bincode", "derive_more", "lz4_flex", "memmap2", @@ -10014,7 +9828,7 @@ dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", - "bincode 1.3.3", + "bincode", "blake3", "eyre", "futures-util", @@ -12591,12 +12405,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "unty" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" - [[package]] name = "url" version = "2.5.4" @@ -12703,12 +12511,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "virtue" -version = "0.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" - [[package]] name = "visibility" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index b1006071..6ad2c140 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,11 @@ [workspace] resolver = "3" -edition = "2024" -license = "MIT" members = [ "crates/rollup-boost", "crates/websocket-proxy", "crates/flashblocks-rpc", "crates/flashblocks-p2p", - "crates/flashblocks-api", "crates/flashblocks-node", ] diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index 2a561176..9e14846f 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -23,7 +23,6 @@ reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ "test-utils", ] } -reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index a5055a44..75167162 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -17,7 +17,6 @@ reth-transaction-pool = { workspace = true } ed25519-dalek = { version = "2", features = ["serde"] } blake3 = "1" # fast hashing for payload IDs serde = { version = "1", features = ["derive"] } -bincode = "2" # stable, deterministic encoding tokio = { workspace = true } tokio-stream = { workspace = true } diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 8561ed80..51bde4ec 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -6,10 +6,7 @@ license = "MIT" [dependencies] rollup-boost.workspace = true -flashblocks-p2p.workspace = true -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } @@ -22,7 +19,6 @@ reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ "test-utils", ] } -reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } @@ -30,7 +26,6 @@ reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } reth-network = { workspace = true } ed25519-dalek = { version = "2", features = ["serde"] } diff --git a/crates/websocket-proxy/Cargo.toml b/crates/websocket-proxy/Cargo.toml index 14785f79..8c4c9e13 100644 --- a/crates/websocket-proxy/Cargo.toml +++ b/crates/websocket-proxy/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "flashblocks-websocket-proxy" version = "0.1.0" -edition = "2021" +edition = "2024" rust-version = "1.85" license = "MIT" From ad658fe8c2da8310829e27352c5142cc07565956 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 17 Jul 2025 15:10:23 -0700 Subject: [PATCH 037/114] feat: flashblock size metric --- Cargo.lock | 1 + crates/flashblocks-p2p/Cargo.toml | 1 + crates/flashblocks-p2p/src/protocol/handler.rs | 7 +++++-- crates/rollup-boost/src/flashblocks/p2p.rs | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aebb756d..27bc4b4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3438,6 +3438,7 @@ dependencies = [ "ed25519-dalek", "eyre", "futures", + "metrics", "parking_lot", "reth", "reth-eth-wire", diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index 75167162..f9b2b9fa 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -18,6 +18,7 @@ ed25519-dalek = { version = "2", features = ["serde"] } blake3 = "1" # fast hashing for payload IDs serde = { version = "1", features = ["derive"] } +metrics.workspace = true tokio = { workspace = true } tokio-stream = { workspace = true } eyre.workspace = true diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 60e2048d..8163a16e 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -140,7 +140,10 @@ impl FlashblocksP2PCtx { "queueing flashblock", ); let bytes = msg.encode(); - if bytes.len() > MAX_FRAME { + let len = bytes.len(); + metrics::histogram!("flashblock_size").record(len as f64); + + if len > MAX_FRAME { tracing::error!( target: "flashblocks", size = bytes.len(), @@ -149,7 +152,7 @@ impl FlashblocksP2PCtx { ); return; } - if bytes.len() > MAX_FRAME / 2 { + if len > MAX_FRAME / 2 { tracing::warn!( target = "flashblocks", size = bytes.len(), diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index 1b660c1a..3f260f67 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -22,8 +22,8 @@ pub struct Authorized { pub builder_sig: Signature, } -#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] #[repr(u8)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub enum FlashblocksP2PMsg { FlashblocksPayloadV1(Authorized) = 0x00, } From 69f50d3564aaac3e7381abb235af9d380ea4ba89 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 17 Jul 2025 15:14:39 -0700 Subject: [PATCH 038/114] fix: target in events --- crates/flashblocks-p2p/src/protocol/connection.rs | 12 ++++++------ crates/flashblocks-p2p/src/protocol/handler.rs | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 8668120f..81611aef 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -43,7 +43,7 @@ impl Stream for FlashblocksConnection { || this.received.get(flashblock_index) != Some(&true) { trace!( - target = "flashblocks", + target: "flashblocks", peer_id = %this.peer_id, %payload_id, %flashblock_index, @@ -54,7 +54,7 @@ impl Stream for FlashblocksConnection { } Err(error) => { tracing::error!( - target = "flashblocks", + target: "flashblocks", %error, "Failed to receive flashblocks message from peer_rx" ); @@ -71,7 +71,7 @@ impl Stream for FlashblocksConnection { Ok(msg) => msg, Err(error) => { tracing::warn!( - target = "flashblocks", + target: "flashblocks", peer_id = %this.peer_id, %error, "Failed to decode flashblocks message from peer", @@ -99,7 +99,7 @@ impl FlashblocksConnection { if let Err(error) = message.verify(self.handler.ctx.authorizer_vk) { tracing::warn!( - target = "flashblocks", + target: "flashblocks", peer_id = %self.peer_id, %error, "Failed to verify flashblock", @@ -113,7 +113,7 @@ impl FlashblocksConnection { if message.authorization.timestamp < state.payload_timestamp { tracing::warn!( - target = "flashblocks", + target: "flashblocks", peer_id = %self.peer_id, timestamp = message.authorization.timestamp, "Received flashblock with outdated timestamp", @@ -147,7 +147,7 @@ impl FlashblocksConnection { // We've already seen this index from this peer. // They could be trying to DOS us. tracing::warn!( - target = "flashblocks", + target: "flashblocks", peer_id = %self.peer_id, payload_id = %message.payload.payload_id, index = message.payload.index, diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 8163a16e..a0cbe605 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -134,7 +134,7 @@ impl FlashblocksP2PCtx { // Add the flashblock to our cache *flashblock = Some(message.clone().payload); tracing::trace!( - target = "flashblocks", + target: "flashblocks", payload_id = %message.payload.payload_id, flashblock_index = message.payload.index, "queueing flashblock", @@ -154,7 +154,7 @@ impl FlashblocksP2PCtx { } if len > MAX_FRAME / 2 { tracing::warn!( - target = "flashblocks", + target: "flashblocks", size = bytes.len(), max_size = MAX_FRAME, "FlashblocksP2PMsg almost too large", @@ -171,7 +171,7 @@ impl FlashblocksP2PCtx { while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { // Publish the flashblock debug!( - target = "flashblocks", + target: "flashblocks", payload_id = %flashblock_event.payload_id, flashblock_index = %state.flashblock_index, "publishing flashblock" From b40a313ab8ade4503a94a2d5d738caeb2c9d4247 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 17 Jul 2025 22:37:38 -0700 Subject: [PATCH 039/114] feat: flashblocks node args --- crates/flashblocks-node/src/{ => bin}/main.rs | 33 +++++----------- crates/flashblocks-node/src/lib.rs | 19 ++++++++++ crates/flashblocks-node/tests/p2p.rs | 6 +-- crates/flashblocks-p2p/src/net/mod.rs | 38 ++++++++++++------- 4 files changed, 57 insertions(+), 39 deletions(-) rename crates/flashblocks-node/src/{ => bin}/main.rs (74%) create mode 100644 crates/flashblocks-node/src/lib.rs diff --git a/crates/flashblocks-node/src/main.rs b/crates/flashblocks-node/src/bin/main.rs similarity index 74% rename from crates/flashblocks-node/src/main.rs rename to crates/flashblocks-node/src/bin/main.rs index 4c270a72..6f372c7d 100644 --- a/crates/flashblocks-node/src/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -1,33 +1,23 @@ #![allow(missing_docs, rustdoc::missing_crate_level_docs)] - use clap::Parser; use ed25519_dalek::VerifyingKey; +use flashblocks_node::FlashblocksNodeArgs; use flashblocks_p2p::protocol::handler::FlashblocksHandler; -use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay }; +use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; -use rollup_boost::parse_vk; -use tokio::sync::{broadcast, mpsc }; +use tokio::sync::{broadcast, mpsc}; use tracing::info; -#[derive(Debug, Clone, PartialEq, Eq, clap::Args)] +#[derive(Debug, Clone, clap::Args)] #[command(next_help_heading = "Rollup")] struct FlashblocksRollupArgs { #[command(flatten)] - rollup_args: RollupArgs, - - #[arg(long = "flashblocks.enabled", default_value = "false")] - flashblocks_enabled: bool, - - #[arg(long = "flashblocks.websocket-url", value_name = "WEBSOCKET_URL")] - websocket_url: url::Url, + pub rollup_args: RollupArgs, - #[arg(long, - env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk, - required = false, - )] - pub flashblocks_builder_vk: VerifyingKey, + #[command(flatten)] + pub flashblock_args: Option, } pub fn main() { @@ -38,16 +28,14 @@ pub fn main() { let (inbound_tx, inbound_rx) = broadcast::channel(100); let (_publish_tx, publish_rx) = mpsc::unbounded_channel(); - let flashblocks_overlay = - FlashblocksOverlay::new(chain_spec, inbound_rx); + let flashblocks_overlay = FlashblocksOverlay::new(chain_spec, inbound_rx); flashblocks_overlay.clone().start()?; info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); let handle = builder .node(OpNode::new(rollup_args)) .extend_rpc_modules(move |ctx| { - if args.flashblocks_enabled { - + if args.flashblock_args.is_some() { let eth_api = ctx.registry.eth_api().clone(); let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay); @@ -58,13 +46,12 @@ pub fn main() { .launch_with_debug_capabilities() .await?; - let custom_rlpx_handler = FlashblocksHandler::new( handle.node.network.clone(), VerifyingKey::default(), inbound_tx, publish_rx, - ); + ); handle .node diff --git a/crates/flashblocks-node/src/lib.rs b/crates/flashblocks-node/src/lib.rs new file mode 100644 index 00000000..bf5e7730 --- /dev/null +++ b/crates/flashblocks-node/src/lib.rs @@ -0,0 +1,19 @@ +use clap::Args; +use ed25519_dalek::VerifyingKey; +use rollup_boost::parse_vk; + +#[derive(Args, Clone, Debug)] +#[group(requires = "flashblocks")] +pub struct FlashblocksNodeArgs { + /// Enable Flashblocks client + #[arg(long, env, required = false)] + pub flashblocks: bool, + + #[arg( + long = "flashblocks.authorizor_vk", + env = "FLASHBLOCKS_AUTHORIZOR_VK", + value_parser = parse_vk, + required = false, + )] + pub authorizor_vk: VerifyingKey, +} diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 22334361..abbd3e27 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -29,7 +29,7 @@ use tokio::sync::{broadcast, mpsc}; use tracing::info; pub struct NodeContext { - inbound_tx: broadcast::Sender, + flashblocks_tx: broadcast::Sender, publish_tx: mpsc::UnboundedSender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, @@ -114,7 +114,7 @@ async fn setup_node( if let Some((peer_id, addr)) = trusted_peer { // If a trusted peer is provided, add it to the network - node.network.add_trusted_peer(peer_id, addr); + node.network.add_peer(peer_id, addr); } let http_api_addr = node @@ -126,7 +126,7 @@ async fn setup_node( let local_node_record = network_handle.local_node_record(); Ok(NodeContext { - inbound_tx, + flashblocks_tx: inbound_tx, publish_tx, local_node_record, http_api_addr, diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index eec0dff7..0f09a828 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -16,15 +16,19 @@ use tokio::sync::{broadcast, mpsc}; use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; #[derive(Debug)] -pub struct FlashblocksNetworkBuilder { - inner: T, +struct FlashblocksNetworkBuilderCtx { authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, publish_rx: mpsc::UnboundedReceiver, } +#[derive(Debug)] +pub struct FlashblocksNetworkBuilder { + inner: T, + ctx: Option, +} + impl FlashblocksNetworkBuilder { - /// Creates a new `FlashblocksNetworkBuilder` with the given inner builder and events channel. pub fn new( inner: T, authorizer_vk: VerifyingKey, @@ -33,11 +37,17 @@ impl FlashblocksNetworkBuilder { ) -> Self { Self { inner, - authorizer_vk, - flashblocks_receiver_tx, - publish_rx, + ctx: Some(FlashblocksNetworkBuilderCtx { + authorizer_vk, + flashblocks_receiver_tx, + publish_rx, + }), } } + + pub fn disabled(inner: T) -> Self { + Self { inner, ctx: None } + } } impl NetworkBuilder for FlashblocksNetworkBuilder @@ -59,13 +69,15 @@ where pool: Pool, ) -> eyre::Result { let handle = self.inner.build_network(ctx, pool).await?; - let handler = FlashblocksHandler::::new( - handle.clone(), - self.authorizer_vk, - self.flashblocks_receiver_tx, - self.publish_rx, - ); - handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); + if let Some(ctx) = self.ctx { + let handler = FlashblocksHandler::::new( + handle.clone(), + ctx.authorizer_vk, + ctx.flashblocks_receiver_tx, + ctx.publish_rx, + ); + handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); + } Ok(handle) } From 2f3a2100e077a521df32716d480816e863034f1a Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 18 Jul 2025 17:26:33 -0700 Subject: [PATCH 040/114] feat: check peer reputation --- crates/flashblocks-node/tests/p2p.rs | 24 +++++++++++++++++++-- crates/rollup-boost/src/cli.rs | 2 +- crates/rollup-boost/src/flashblocks/args.rs | 15 +++++++------ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index abbd3e27..4ee8a17b 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -7,8 +7,10 @@ use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::SigningKey; use flashblocks_p2p::protocol::handler::FlashblocksHandler; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; +use op_alloy_consensus::{OpPooledTransaction, OpTxEnvelope}; +use reth_eth_wire::BasicNetworkPrimitives; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; -use reth_network::{Peers, PeersInfo}; +use reth_network::{NetworkHandle, Peers, PeersInfo, events::NetworkPeersEvents}; use reth_network_peers::{NodeRecord, PeerId}; use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; use reth_node_core::{ @@ -17,7 +19,7 @@ use reth_node_core::{ }; use reth_optimism_chainspec::OpChainSpecBuilder; use reth_optimism_node::{OpNode, args::RollupArgs}; -use reth_optimism_primitives::OpReceipt; +use reth_optimism_primitives::{OpPrimitives, OpReceipt}; use reth_provider::providers::BlockchainProvider; use reth_tasks::{TaskExecutor, TaskManager}; use rollup_boost::{ @@ -28,6 +30,14 @@ use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::A use tokio::sync::{broadcast, mpsc}; use tracing::info; +type Network = NetworkHandle< + BasicNetworkPrimitives< + OpPrimitives, + OpPooledTransaction, + reth_network::types::NewBlock>, + >, +>; + pub struct NodeContext { flashblocks_tx: broadcast::Sender, publish_tx: mpsc::UnboundedSender, @@ -35,6 +45,7 @@ pub struct NodeContext { http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, _node: Box, + network_handle: Network, } impl NodeContext { @@ -132,6 +143,7 @@ async fn setup_node( http_api_addr, _node_exit_future: node_exit_future, _node: Box::new(node), + network_handle, }) } @@ -319,6 +331,11 @@ async fn test_peering() -> eyre::Result<()> { let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); node_1.publish_tx.send(proto_message)?; tokio::time::sleep(tokio::time::Duration::from_millis(10000)).await; + let peers = node_0.network_handle.get_all_peers().await?; + let peer_1 = &peers[1].remote_id; + + let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; + info!(?rep_1, "Peer reputation"); // Query pending block after sending the base payload with an empty delta let pending_block = provider_0 @@ -343,6 +360,9 @@ async fn test_peering() -> eyre::Result<()> { node_1.publish_tx.send(proto_message)?; tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; + let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; + info!(?rep_1, "Peer reputation"); + // Query pending block after sending the second payload with two transactions let block = provider_0 .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index 95834ac1..c0be9470 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -138,7 +138,7 @@ impl RollupBoostArgs { PayloadSource::Builder, self.flashblocks .as_ref() - .map(|fb| fb.flashblocks_authorization_sk.clone()), + .map(|fb| fb.flashblocks_authorizer_sk.clone()), self.flashblocks .as_ref() .map(|fb| fb.flashblocks_builder_vk.clone()), diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index 913662b8..b6773219 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -1,6 +1,5 @@ -use clap::{Args, Parser}; +use clap::Args; use ed25519_dalek::{SigningKey, VerifyingKey}; -use eyre::Context; use url::Url; use hex::FromHex; @@ -46,13 +45,15 @@ pub struct FlashblocksArgs { #[arg( long, - env = "FLASHBLOCKS_AUTHORIZATION_SK", value_parser = parse_sk, + env = "FLASHBLOCKS_AUTHORIZER_SK", + value_parser = parse_sk, required = false, )] - pub flashblocks_authorization_sk: SigningKey, + pub flashblocks_authorizer_sk: SigningKey, #[arg(long, - env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk, + env = "FLASHBLOCKS_BUILDER_VK", + value_parser = parse_vk, required = false, )] pub flashblocks_builder_vk: VerifyingKey, @@ -60,11 +61,11 @@ pub struct FlashblocksArgs { pub fn parse_sk(s: &str) -> eyre::Result { let bytes = - <[u8; 32]>::from_hex(s.trim()).context("failed parsing flashblocks_authorization_sk")?; + <[u8; 32]>::from_hex(s.trim())?; Ok(SigningKey::from_bytes(&bytes)) } pub fn parse_vk(s: &str) -> eyre::Result { - let bytes = <[u8; 32]>::from_hex(s.trim()).context("failed parsing flashblocks_builder_vk")?; + let bytes = <[u8; 32]>::from_hex(s.trim())?; Ok(VerifyingKey::from_bytes(&bytes)?) } From 05b6eba006ddfa6b26ddbbd090c4d22b476cfc56 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 21 Jul 2025 12:57:40 -0700 Subject: [PATCH 041/114] switch to broadcast --- crates/flashblocks-p2p/src/net/mod.rs | 6 +++--- crates/flashblocks-p2p/src/protocol/handler.rs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 0f09a828..ba2b8fa7 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -11,7 +11,7 @@ use reth_node_builder::{ }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; -use tokio::sync::{broadcast, mpsc}; +use tokio::sync::broadcast; use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; @@ -19,7 +19,7 @@ use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; struct FlashblocksNetworkBuilderCtx { authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - publish_rx: mpsc::UnboundedReceiver, + publish_rx: broadcast::Receiver, } #[derive(Debug)] @@ -33,7 +33,7 @@ impl FlashblocksNetworkBuilder { inner: T, authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - publish_rx: mpsc::UnboundedReceiver, + publish_rx: broadcast::Receiver, ) -> Self { Self { inner, diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index a0cbe605..50d8de6c 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -9,7 +9,7 @@ use reth_network::Peers; use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; use std::net::SocketAddr; use std::sync::Arc; -use tokio::sync::{broadcast, mpsc}; +use tokio::sync::broadcast; use tracing::debug; use reth_ethereum::network::{ @@ -74,7 +74,7 @@ impl FlashblocksHandler { network_handle: N, authorizer_vk: VerifyingKey, flashblock_tx: broadcast::Sender, - mut publish_rx: mpsc::UnboundedReceiver, + mut publish_rx: broadcast::Receiver, ) -> Self { let peer_tx = broadcast::Sender::new(100); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); @@ -89,7 +89,7 @@ impl FlashblocksHandler { let ctx_clone = ctx.clone(); tokio::spawn({ async move { - while let Some(msg) = publish_rx.recv().await { + while let Ok(msg) = publish_rx.recv().await { let mut state = state_clone.lock(); ctx_clone.publish(&mut state, msg); } From bf980dd8b46d1a3cf59683aa9fec097a95041265 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 21 Jul 2025 14:57:00 -0700 Subject: [PATCH 042/114] feat: switch to broadcast for publish chan --- crates/flashblocks-node/src/bin/main.rs | 4 ++-- crates/flashblocks-node/tests/p2p.rs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index 6f372c7d..d7278321 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -7,7 +7,7 @@ use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverla use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; -use tokio::sync::{broadcast, mpsc}; +use tokio::sync::broadcast; use tracing::info; #[derive(Debug, Clone, clap::Args)] @@ -26,7 +26,7 @@ pub fn main() { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); let (inbound_tx, inbound_rx) = broadcast::channel(100); - let (_publish_tx, publish_rx) = mpsc::unbounded_channel(); + let (_publish_tx, publish_rx) = broadcast::channel(100); let flashblocks_overlay = FlashblocksOverlay::new(chain_spec, inbound_rx); flashblocks_overlay.clone().start()?; diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 4ee8a17b..0384d397 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -10,7 +10,7 @@ use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverla use op_alloy_consensus::{OpPooledTransaction, OpTxEnvelope}; use reth_eth_wire::BasicNetworkPrimitives; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; -use reth_network::{NetworkHandle, Peers, PeersInfo, events::NetworkPeersEvents}; +use reth_network::{NetworkHandle, Peers, PeersInfo}; use reth_network_peers::{NodeRecord, PeerId}; use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; use reth_node_core::{ @@ -40,7 +40,7 @@ type Network = NetworkHandle< pub struct NodeContext { flashblocks_tx: broadcast::Sender, - publish_tx: mpsc::UnboundedSender, + publish_tx: broadcast::Sender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -62,7 +62,7 @@ async fn setup_node( authorizer: SigningKey, trusted_peer: Option<(PeerId, SocketAddr)>, ) -> eyre::Result { - let (publish_tx, publish_rx) = mpsc::unbounded_channel(); + let (publish_tx, publish_rx) = broadcast::channel(100); let (inbound_tx, inbound_rx) = broadcast::channel(100); let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); From 0abf5e82676756ce06ac69c9e8de5831c4faef56 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 21 Jul 2025 14:57:14 -0700 Subject: [PATCH 043/114] target: flashblocks::p2p --- crates/flashblocks-p2p/src/protocol/connection.rs | 12 ++++++------ crates/flashblocks-p2p/src/protocol/handler.rs | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 81611aef..53b656e2 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -43,7 +43,7 @@ impl Stream for FlashblocksConnection { || this.received.get(flashblock_index) != Some(&true) { trace!( - target: "flashblocks", + target: "flashblocks::p2p", peer_id = %this.peer_id, %payload_id, %flashblock_index, @@ -54,7 +54,7 @@ impl Stream for FlashblocksConnection { } Err(error) => { tracing::error!( - target: "flashblocks", + target: "flashblocks::p2p", %error, "Failed to receive flashblocks message from peer_rx" ); @@ -71,7 +71,7 @@ impl Stream for FlashblocksConnection { Ok(msg) => msg, Err(error) => { tracing::warn!( - target: "flashblocks", + target: "flashblocks::p2p", peer_id = %this.peer_id, %error, "Failed to decode flashblocks message from peer", @@ -99,7 +99,7 @@ impl FlashblocksConnection { if let Err(error) = message.verify(self.handler.ctx.authorizer_vk) { tracing::warn!( - target: "flashblocks", + target: "flashblocks::p2p", peer_id = %self.peer_id, %error, "Failed to verify flashblock", @@ -113,7 +113,7 @@ impl FlashblocksConnection { if message.authorization.timestamp < state.payload_timestamp { tracing::warn!( - target: "flashblocks", + target: "flashblocks::p2p", peer_id = %self.peer_id, timestamp = message.authorization.timestamp, "Received flashblock with outdated timestamp", @@ -147,7 +147,7 @@ impl FlashblocksConnection { // We've already seen this index from this peer. // They could be trying to DOS us. tracing::warn!( - target: "flashblocks", + target: "flashblocks::p2p", peer_id = %self.peer_id, payload_id = %message.payload.payload_id, index = message.payload.index, diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 50d8de6c..4e2c762d 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -114,7 +114,7 @@ impl FlashblocksP2PCtx { // Resize our array if needed if message.payload.index as usize > MAX_FLASHBLOCK_INDEX { tracing::error!( - target: "flashblocks", + target: "flashblocks::p2p", index = message.payload.index, max_index = MAX_FLASHBLOCK_INDEX, "Received flashblocks payload with index exceeding maximum" @@ -134,7 +134,7 @@ impl FlashblocksP2PCtx { // Add the flashblock to our cache *flashblock = Some(message.clone().payload); tracing::trace!( - target: "flashblocks", + target: "flashblocks::p2p", payload_id = %message.payload.payload_id, flashblock_index = message.payload.index, "queueing flashblock", @@ -145,7 +145,7 @@ impl FlashblocksP2PCtx { if len > MAX_FRAME { tracing::error!( - target: "flashblocks", + target: "flashblocks::p2p", size = bytes.len(), max_size = MAX_FRAME, "FlashblocksP2PMsg too large", @@ -154,7 +154,7 @@ impl FlashblocksP2PCtx { } if len > MAX_FRAME / 2 { tracing::warn!( - target: "flashblocks", + target: "flashblocks::p2p", size = bytes.len(), max_size = MAX_FRAME, "FlashblocksP2PMsg almost too large", @@ -171,7 +171,7 @@ impl FlashblocksP2PCtx { while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { // Publish the flashblock debug!( - target: "flashblocks", + target: "flashblocks::p2p", payload_id = %flashblock_event.payload_id, flashblock_index = %state.flashblock_index, "publishing flashblock" From d1f3ed140e72e75cbbad40ad2565afec8fa78f6c Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 22 Jul 2025 14:40:43 -0700 Subject: [PATCH 044/114] feat: Authorized Msg work --- crates/flashblocks-node/tests/p2p.rs | 20 +- crates/flashblocks-p2p/src/net/mod.rs | 6 +- .../src/protocol/connection.rs | 77 ++--- .../flashblocks-p2p/src/protocol/handler.rs | 36 +-- crates/rollup-boost/src/flashblocks/p2p.rs | 265 +++++++++++++++--- 5 files changed, 300 insertions(+), 104 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 0384d397..a29f1a30 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -23,11 +23,11 @@ use reth_optimism_primitives::{OpPrimitives, OpReceipt}; use reth_provider::providers::BlockchainProvider; use reth_tasks::{TaskExecutor, TaskManager}; use rollup_boost::{ - Authorization, Authorized, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, - FlashblocksP2PMsg, FlashblocksPayloadV1, + Authorization, AuthorizedPayload, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, + FlashblocksPayloadV1, }; use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; -use tokio::sync::{broadcast, mpsc}; +use tokio::sync::broadcast; use tracing::info; type Network = NetworkHandle< @@ -40,7 +40,7 @@ type Network = NetworkHandle< pub struct NodeContext { flashblocks_tx: broadcast::Sender, - publish_tx: broadcast::Sender, + publish_tx: broadcast::Sender>, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -327,9 +327,9 @@ async fn test_peering() -> eyre::Result<()> { &authorizer, builder.verifying_key(), ); - let authorized = Authorized::new(&builder, authorization, payload_0.clone()); - let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); - node_1.publish_tx.send(proto_message)?; + let msg = payload_0.clone(); + let authorized = AuthorizedPayload::new(&builder, authorization, msg); + node_1.publish_tx.send(authorized)?; tokio::time::sleep(tokio::time::Duration::from_millis(10000)).await; let peers = node_0.network_handle.get_all_peers().await?; let peer_1 = &peers[1].remote_id; @@ -354,10 +354,8 @@ async fn test_peering() -> eyre::Result<()> { &authorizer, builder.verifying_key(), ); - let authorized = Authorized::new(&builder, authorization, payload_1.clone()); - let proto_message = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized); - - node_1.publish_tx.send(proto_message)?; + let authorized = AuthorizedPayload::new(&builder, authorization, payload_1.clone()); + node_1.publish_tx.send(authorized)?; tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index ba2b8fa7..0d8b08b4 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -10,7 +10,7 @@ use reth_node_builder::{ node::{FullNodeTypes, NodeTypes}, }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; +use rollup_boost::{AuthorizedPayload, FlashblocksPayloadV1}; use tokio::sync::broadcast; use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; @@ -19,7 +19,7 @@ use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; struct FlashblocksNetworkBuilderCtx { authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - publish_rx: broadcast::Receiver, + publish_rx: broadcast::Receiver>, } #[derive(Debug)] @@ -33,7 +33,7 @@ impl FlashblocksNetworkBuilder { inner: T, authorizer_vk: VerifyingKey, flashblocks_receiver_tx: broadcast::Sender, - publish_rx: broadcast::Receiver, + publish_rx: broadcast::Receiver>, ) -> Self { Self { inner, diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 53b656e2..26ab10b5 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -4,7 +4,7 @@ use futures::{Stream, StreamExt}; use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use reth_network::types::ReputationChangeKind; -use rollup_boost::{Authorized, FlashblocksP2PMsg, FlashblocksPayloadV1}; +use rollup_boost::{AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1}; use std::{ pin::Pin, task::{Context, Poll, ready}, @@ -85,8 +85,30 @@ impl Stream for FlashblocksConnection { }; match msg { - FlashblocksP2PMsg::FlashblocksPayloadV1(authorized) => { - this.handle_flashblocks_payload_v1(authorized); + FlashblocksP2PMsg::Authorized(authorized) => { + if let Err(error) = authorized.verify(this.handler.ctx.authorizer_vk) { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %this.peer_id, + %error, + "Failed to verify flashblock", + ); + this.handler + .ctx + .network_handle + .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); + continue; + } + + match &authorized.msg { + rollup_boost::AuthorizedMsg::FlashblocksPayloadV1(_) => { + this.handle_flashblocks_payload_v1(authorized.into_unchecked()); + } + rollup_boost::AuthorizedMsg::InnitiateBuildReq(_) => todo!(), + rollup_boost::AuthorizedMsg::InnitiateBuildRes(_initiate_build_res) => { + todo!() + } + } } } } @@ -94,28 +116,19 @@ impl Stream for FlashblocksConnection { } impl FlashblocksConnection { - fn handle_flashblocks_payload_v1(&mut self, message: Authorized) { + fn handle_flashblocks_payload_v1( + &mut self, + authorized: AuthorizedPayload, + ) { let mut state = self.handler.state.lock(); + let authorization = &authorized.authorized.authorization; + let msg = authorized.msg(); - if let Err(error) = message.verify(self.handler.ctx.authorizer_vk) { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - %error, - "Failed to verify flashblock", - ); - self.handler - .ctx - .network_handle - .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); - return; - } - - if message.authorization.timestamp < state.payload_timestamp { + if authorization.timestamp < state.payload_timestamp { tracing::warn!( target: "flashblocks::p2p", peer_id = %self.peer_id, - timestamp = message.authorization.timestamp, + timestamp = authorization.timestamp, "Received flashblock with outdated timestamp", ); self.handler @@ -126,31 +139,31 @@ impl FlashblocksConnection { } // Check if this is a globally new payload - if message.authorization.timestamp > state.payload_timestamp { + if authorization.timestamp > state.payload_timestamp { state.flashblock_index = 0; - state.payload_timestamp = message.authorization.timestamp; - state.payload_id = message.payload.payload_id; + state.payload_timestamp = authorization.timestamp; + state.payload_id = msg.payload_id; state.flashblocks.fill(None); } // Check if this is a new payload from this peer - if self.payload_id != message.payload.payload_id { - self.payload_id = message.payload.payload_id; + if self.payload_id != msg.payload_id { + self.payload_id = msg.payload_id; self.received.fill(false); } // Check if this peer is spamming us with the same payload index let len = self.received.len(); self.received - .resize_with(len.max(message.payload.index as usize + 1), || false); - if self.received[message.payload.index as usize] { + .resize_with(len.max(msg.index as usize + 1), || false); + if self.received[msg.index as usize] { // We've already seen this index from this peer. // They could be trying to DOS us. tracing::warn!( target: "flashblocks::p2p", peer_id = %self.peer_id, - payload_id = %message.payload.payload_id, - index = message.payload.index, + payload_id = %msg.payload_id, + index = msg.index, "Received duplicate flashblock from peer", ); self.handler @@ -159,10 +172,8 @@ impl FlashblocksConnection { .reputation_change(self.peer_id, ReputationChangeKind::AlreadySeenTransaction); return; } - self.received[message.payload.index as usize] = true; + self.received[msg.index as usize] = true; - self.handler - .ctx - .publish(&mut state, FlashblocksP2PMsg::FlashblocksPayloadV1(message)); + self.handler.ctx.publish(&mut state, authorized); } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 4e2c762d..d8de69ec 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -6,7 +6,7 @@ use reth::payload::PayloadId; use reth_eth_wire::Capability; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; use reth_network::Peers; -use rollup_boost::{FlashblocksP2PMsg, FlashblocksPayloadV1}; +use rollup_boost::{AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1}; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::broadcast; @@ -74,7 +74,7 @@ impl FlashblocksHandler { network_handle: N, authorizer_vk: VerifyingKey, flashblock_tx: broadcast::Sender, - mut publish_rx: broadcast::Receiver, + mut publish_rx: broadcast::Receiver>, ) -> Self { let peer_tx = broadcast::Sender::new(100); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); @@ -108,14 +108,18 @@ impl FlashblocksHandler { impl FlashblocksP2PCtx { /// Commit new and already verified flashblocks payloads to the state /// broadcast them to peers, and publish them to the stream. - pub fn publish(&self, state: &mut FlashblocksP2PState, msg: FlashblocksP2PMsg) { - let FlashblocksP2PMsg::FlashblocksPayloadV1(ref message) = msg; + pub fn publish( + &self, + state: &mut FlashblocksP2PState, + authorized_payload: AuthorizedPayload, + ) { + let payload = authorized_payload.msg(); // Resize our array if needed - if message.payload.index as usize > MAX_FLASHBLOCK_INDEX { + if payload.index as usize > MAX_FLASHBLOCK_INDEX { tracing::error!( target: "flashblocks::p2p", - index = message.payload.index, + index = payload.index, max_index = MAX_FLASHBLOCK_INDEX, "Received flashblocks payload with index exceeding maximum" ); @@ -124,22 +128,24 @@ impl FlashblocksP2PCtx { let len = state.flashblocks.len(); state .flashblocks - .resize_with(len.max(message.payload.index as usize + 1), || None); - let flashblock = &mut state.flashblocks[message.payload.index as usize]; + .resize_with(len.max(payload.index as usize + 1), || None); + let flashblock = &mut state.flashblocks[payload.index as usize]; // If we've already seen this index, skip it // Otherwise, add it to the list if flashblock.is_none() { // We haven't seen this index yet // Add the flashblock to our cache - *flashblock = Some(message.clone().payload); + *flashblock = Some(payload.clone()); tracing::trace!( target: "flashblocks::p2p", - payload_id = %message.payload.payload_id, - flashblock_index = message.payload.index, + payload_id = %payload.payload_id, + flashblock_index = payload.index, "queueing flashblock", ); - let bytes = msg.encode(); + + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload.authorized.clone()); + let bytes = p2p_msg.encode(); let len = bytes.len(); metrics::histogram!("flashblock_size").record(len as f64); @@ -161,11 +167,7 @@ impl FlashblocksP2PCtx { ); } self.peer_tx - .send(( - message.payload.payload_id, - message.payload.index as usize, - bytes, - )) + .send((payload.payload_id, payload.index as usize, bytes)) .ok(); // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index 3f260f67..1b3ae5fc 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -1,3 +1,5 @@ +use std::marker::PhantomData; + use alloy_primitives::{B64, Bytes}; use alloy_rlp::{Decodable, Encodable, Header}; use alloy_rpc_types_engine::PayloadId; @@ -15,17 +17,47 @@ pub struct Authorization { pub authorizer_sig: Signature, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct Authorized { - pub payload: T, - pub authorization: Authorization, - pub builder_sig: Signature, +#[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] +pub struct InitiateBuildReq; + +#[repr(u8)] +#[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] +pub enum InitiateBuildRes { + Granted = 0x00, + Denied = 0x01, } +/// A message that can be sent over the Flashblocks P2P network. #[repr(u8)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub enum FlashblocksP2PMsg { - FlashblocksPayloadV1(Authorized) = 0x00, + Authorized(Authorized) = 0x00, +} + +#[repr(u8)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] +pub enum AuthorizedMsg { + FlashblocksPayloadV1(FlashblocksPayloadV1) = 0x00, + InnitiateBuildReq(InitiateBuildReq) = 0x01, + InnitiateBuildRes(InitiateBuildRes) = 0x02, +} + +impl From for AuthorizedMsg { + fn from(payload: FlashblocksPayloadV1) -> Self { + Self::FlashblocksPayloadV1(payload) + } +} + +impl From for AuthorizedMsg { + fn from(req: InitiateBuildReq) -> Self { + Self::InnitiateBuildReq(req) + } +} + +impl From for AuthorizedMsg { + fn from(res: InitiateBuildRes) -> Self { + Self::InnitiateBuildRes(res) + } } impl Authorization { @@ -141,38 +173,92 @@ impl Decodable for Authorization { } } -impl Authorized { - pub fn new(builder_sk: &SigningKey, authorization: Authorization, payload: T) -> Self { - let hash = blake3::hash(&serde_json::to_vec(&payload).unwrap()); - let builder_sig = builder_sk.sign(hash.as_bytes()); +/// A signed and authorized message that can be sent over the Flashblocks P2P network. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct AuthorizedPayload { + pub authorized: Authorized, + /// The underlying message type + pub _marker: PhantomData, +} + +impl AuthorizedPayload +where + T: Into, +{ + pub fn new(actor_sk: &SigningKey, authorization: Authorization, msg: T) -> Self { + let msg = msg.into(); + let authorized = Authorized::new(actor_sk, authorization, msg); Self { - payload, + authorized, + _marker: PhantomData, + } + } +} + +/// A signed and authorized message that can be sent over the Flashblocks P2P network. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Authorized { + /// The msg that is being authorized and signed over. + pub msg: AuthorizedMsg, + /// The authorization that grants permission to send this message. + pub authorization: Authorization, + /// The signature of the actor, made over the hash of the message and authorization. + pub actor_sig: Signature, +} + +impl Authorized { + pub fn new(actor_sk: &SigningKey, authorization: Authorization, msg: AuthorizedMsg) -> Self { + let mut encoded = Vec::new(); + msg.encode(&mut encoded); + authorization.encode(&mut encoded); + + let hash = blake3::hash(&encoded); + let actor_sig = actor_sk.sign(hash.as_bytes()); + + Self { + msg, authorization, - builder_sig, + actor_sig, } } pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { self.authorization.verify(authorizer_pub)?; - let hash = blake3::hash(&serde_json::to_vec(&self.payload).unwrap()); + let mut encoded = Vec::new(); + self.msg.encode(&mut encoded); + self.authorization.encode(&mut encoded); + let hash = blake3::hash(&encoded); self.authorization .builder_pub - .verify(hash.as_bytes(), &self.builder_sig) + .verify(hash.as_bytes(), &self.actor_sig) .map_err(|_| FlashblocksP2PError::InvalidBuilderSig) } + + pub fn into_unchecked(self) -> AuthorizedPayload { + AuthorizedPayload:: { + authorized: self, + _marker: PhantomData, + } + } } -impl Encodable for Authorized +impl AuthorizedPayload where - T: Encodable + Serialize, + AuthorizedMsg: AsRef, { + pub fn msg(&self) -> &T { + self.authorized.msg.as_ref() + } +} + +impl Encodable for Authorized { fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { // encode once so we know the length beforehand - let sig_bytes = Bytes::copy_from_slice(&self.builder_sig.to_bytes()); - let payload_len = self.payload.length() + self.authorization.length() + sig_bytes.length(); + let sig_bytes = Bytes::copy_from_slice(&self.actor_sig.to_bytes()); + let payload_len = self.msg.length() + self.authorization.length() + sig_bytes.length(); Header { list: true, @@ -181,7 +267,7 @@ where .encode(out); // 1. payload - self.payload.encode(out); + self.msg.encode(out); // 2. authorization self.authorization.encode(out); // 3. builder signature @@ -189,8 +275,8 @@ where } fn length(&self) -> usize { - let sig_bytes = Bytes::copy_from_slice(&self.builder_sig.to_bytes()); - let payload_len = self.payload.length() + self.authorization.length() + sig_bytes.length(); + let sig_bytes = Bytes::copy_from_slice(&self.actor_sig.to_bytes()); + let payload_len = self.msg.length() + self.authorization.length() + sig_bytes.length(); Header { list: true, @@ -201,10 +287,7 @@ where } } -impl Decodable for Authorized -where - T: Decodable + Serialize, -{ +impl Decodable for Authorized { fn decode(buf: &mut &[u8]) -> Result { let header = Header::decode(buf)?; if !header.list { @@ -214,7 +297,7 @@ where let mut body = &buf[..header.payload_length as usize]; // 1. payload - let payload = T::decode(&mut body)?; + let payload = AuthorizedMsg::decode(&mut body)?; // 2. authorization let authorization = Authorization::decode(&mut body)?; // 3. builder signature @@ -226,9 +309,9 @@ where *buf = &buf[header.payload_length as usize..]; Ok(Self { - payload, + msg: payload, authorization, - builder_sig, + actor_sig: builder_sig, }) } } @@ -238,7 +321,7 @@ impl FlashblocksP2PMsg { pub fn encode(&self) -> BytesMut { let mut buf = BytesMut::new(); match self { - FlashblocksP2PMsg::FlashblocksPayloadV1(payload) => { + FlashblocksP2PMsg::Authorized(payload) => { buf.put_u8(0x00); payload.encode(&mut buf); } @@ -255,14 +338,113 @@ impl FlashblocksP2PMsg { buf.advance(1); match id { 0x00 => { - let payload = Authorized::::decode(&mut &buf[..])?; - Ok(FlashblocksP2PMsg::FlashblocksPayloadV1(payload)) + let payload = Authorized::decode(&mut &buf[..])?; + Ok(FlashblocksP2PMsg::Authorized(payload)) } _ => Err(FlashblocksP2PError::UnknownMessageType), } } } +impl AsRef for AuthorizedMsg { + fn as_ref(&self) -> &FlashblocksPayloadV1 { + match self { + Self::FlashblocksPayloadV1(p) => p, + _ => panic!("not a FlashblocksPayloadV1 message"), + } + } +} + +impl Encodable for AuthorizedMsg { + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { + match self { + Self::FlashblocksPayloadV1(p) => { + Header { + list: true, + payload_length: 1 + p.length(), + } + .encode(out); + 0u32.encode(out); + p.encode(out); + } + Self::InnitiateBuildReq(_) => { + Header { + list: true, + payload_length: 1, + } + .encode(out); + 1u32.encode(out); + } + Self::InnitiateBuildRes(r) => { + Header { + list: true, + payload_length: 1 + r.length(), + } + .encode(out); + 2u32.encode(out); + r.encode(out); + } + }; + } + + fn length(&self) -> usize { + let body_len = match self { + Self::FlashblocksPayloadV1(p) => 1 + p.length(), + Self::InnitiateBuildReq(_) => 1, + Self::InnitiateBuildRes(r) => 1 + r.length(), + }; + + Header { + list: true, + payload_length: body_len, + } + .length() + + body_len + } +} + +impl Decodable for AuthorizedMsg { + fn decode(buf: &mut &[u8]) -> Result { + let hdr = Header::decode(buf)?; + if !hdr.list { + return Err(alloy_rlp::Error::Custom( + "AuthorizedMsg must be an RLP list", + )); + } + + let tag = u8::decode(buf)?; + let value = match tag { + 0 => Self::FlashblocksPayloadV1(FlashblocksPayloadV1::decode(buf)?), + 1 => Self::InnitiateBuildReq(InitiateBuildReq), + 2 => Self::InnitiateBuildRes(InitiateBuildRes::decode(buf)?), + _ => return Err(alloy_rlp::Error::Custom("unknown tag")), + }; + + Ok(value) + } +} + +impl Encodable for InitiateBuildRes { + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { + (*self as u32).encode(out); + } + + fn length(&self) -> usize { + 1 + } +} + +impl Decodable for InitiateBuildRes { + fn decode(buf: &mut &[u8]) -> Result { + let tag = u8::decode(buf)?; + match tag { + 0x00 => Ok(InitiateBuildRes::Granted), + 0x01 => Ok(InitiateBuildRes::Denied), + _ => Err(alloy_rlp::Error::Custom("unknown tag")), + } + } +} + #[cfg(test)] mod tests { use crate::{ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1}; @@ -373,15 +555,16 @@ mod tests { let (builder_sk, builder_vk) = sample_keys(); let authorization = sample_authorization(); let payload = sample_flashblocks_payload(); + let msg = AuthorizedMsg::FlashblocksPayloadV1(payload.clone()); - let authorized = Authorized::new(&builder_sk, authorization.clone(), payload.clone()); + let authorized = Authorized::new(&builder_sk, authorization.clone(), msg); // RLP round-trip let encoded = encode(&authorized); assert_eq!(encoded.len(), authorized.length()); let mut slice = encoded.as_ref(); - let decoded = Authorized::::decode(&mut slice).expect("decode ok"); + let decoded = Authorized::decode(&mut slice).expect("decode ok"); assert_eq!(decoded, authorized); assert!(slice.is_empty(), "decoder consumed all input"); @@ -391,7 +574,7 @@ mod tests { let hash = blake3::hash(&serde_json::to_vec(&payload).unwrap()); builder_vk - .verify(hash.as_bytes(), &decoded.builder_sig) + .verify(hash.as_bytes(), &decoded.actor_sig) .expect("builder sig valid"); } @@ -400,12 +583,13 @@ mod tests { let (builder_sk, _) = sample_keys(); let authorization = sample_authorization(); let payload = sample_flashblocks_payload(); + let msg = AuthorizedMsg::FlashblocksPayloadV1(payload.clone()); - let mut authorized = Authorized::new(&builder_sk, authorization, payload); + let mut authorized = Authorized::new(&builder_sk, authorization, msg); // flip one bit - let mut authorized_sig_bytes = authorized.builder_sig.to_bytes(); + let mut authorized_sig_bytes = authorized.actor_sig.to_bytes(); authorized_sig_bytes[0] ^= 0x01; - authorized.builder_sig = + authorized.actor_sig = Signature::try_from(authorized_sig_bytes.as_ref()).expect("valid signature bytes"); assert!( authorized @@ -420,16 +604,17 @@ mod tests { let (builder_sk, _) = sample_keys(); let authorization = sample_authorization(); let payload = sample_flashblocks_payload(); - let authorized = Authorized::new(&builder_sk, authorization, payload); + let msg = AuthorizedMsg::FlashblocksPayloadV1(payload.clone()); + let authorized = Authorized::new(&builder_sk, authorization, msg); - let msg = FlashblocksP2PMsg::FlashblocksPayloadV1(authorized.clone()); + let msg = FlashblocksP2PMsg::Authorized(authorized.clone()); let encoded = msg.encode(); let decoded = FlashblocksP2PMsg::decode(&mut &encoded[..]).expect("decode ok"); match decoded { - FlashblocksP2PMsg::FlashblocksPayloadV1(inner) => { + FlashblocksP2PMsg::Authorized(inner) => { assert_eq!(inner, authorized, "inner payload round-trips"); } } From 36559b83afc275f77aa9dffdfa428430e54360ab Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 22 Jul 2025 15:04:33 -0700 Subject: [PATCH 045/114] feat: improve rlp testing --- crates/flashblocks-node/tests/p2p.rs | 2 +- crates/rollup-boost/src/flashblocks/error.rs | 2 +- crates/rollup-boost/src/flashblocks/p2p.rs | 183 +++++++++++-------- 3 files changed, 111 insertions(+), 76 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index a29f1a30..88d54a12 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -332,7 +332,7 @@ async fn test_peering() -> eyre::Result<()> { node_1.publish_tx.send(authorized)?; tokio::time::sleep(tokio::time::Duration::from_millis(10000)).await; let peers = node_0.network_handle.get_all_peers().await?; - let peer_1 = &peers[1].remote_id; + let peer_1 = &peers[0].remote_id; let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; info!(?rep_1, "Peer reputation"); diff --git a/crates/rollup-boost/src/flashblocks/error.rs b/crates/rollup-boost/src/flashblocks/error.rs index c94c4327..33b2fc8d 100644 --- a/crates/rollup-boost/src/flashblocks/error.rs +++ b/crates/rollup-boost/src/flashblocks/error.rs @@ -1,6 +1,6 @@ use thiserror::Error; -#[derive(Error, Debug)] +#[derive(Error, Debug, Eq, PartialEq)] pub enum FlashblocksP2PError { #[error("invalid authorizer signature")] InvalidAuthorizerSig, diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index 1b3ae5fc..b33a0570 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -338,7 +338,7 @@ impl FlashblocksP2PMsg { buf.advance(1); match id { 0x00 => { - let payload = Authorized::decode(&mut &buf[..])?; + let payload = Authorized::decode(buf)?; Ok(FlashblocksP2PMsg::Authorized(payload)) } _ => Err(FlashblocksP2PError::UnknownMessageType), @@ -447,29 +447,32 @@ impl Decodable for InitiateBuildRes { #[cfg(test)] mod tests { - use crate::{ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1}; - use super::*; + use crate::{ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1}; use alloy_primitives::{Address, B256, Bloom, U256}; - use alloy_rlp::{Decodable, encode}; + use alloy_rlp::{Decodable, Encodable, encode}; use alloy_rpc_types_eth::Withdrawal; + use bytes::{BufMut, BytesMut}; - fn sample_keys() -> (SigningKey, VerifyingKey) { - // deterministic keys for reproducible tests - let bytes = [0u8; 32]; + fn key_pair(seed: u8) -> (SigningKey, VerifyingKey) { + let bytes = [seed; 32]; let sk = SigningKey::from_bytes(&bytes); let vk = sk.verifying_key(); (sk, vk) } - fn sample_authorization() -> Authorization { - let (authorizer_sk, _) = sample_keys(); - let (_, builder_vk) = sample_keys(); - Authorization::new( - alloy_rpc_types_engine::PayloadId::default(), - 1_700_000_321, - &authorizer_sk, - builder_vk, + fn sample_authorization() -> (Authorization, VerifyingKey) { + let (authorizer_sk, authorizer_vk) = key_pair(1); + let (_, builder_vk) = key_pair(2); + + ( + Authorization::new( + PayloadId::default(), + 1_700_000_001, + &authorizer_sk, + builder_vk, + ), + authorizer_vk, ) } @@ -503,7 +506,7 @@ mod tests { fn sample_flashblocks_payload() -> FlashblocksPayloadV1 { FlashblocksPayloadV1 { payload_id: PayloadId::default(), - index: 7, + index: 42, diff: sample_diff(), metadata: serde_json::json!({ "ok": true }), base: Some(sample_base()), @@ -511,9 +514,9 @@ mod tests { } #[test] - fn authorization_roundtrip() { - let (authorizer_sk, authorizer_vk) = sample_keys(); - let (_, builder_vk) = sample_keys(); + fn authorization_rlp_roundtrip_and_verify() { + let (authorizer_sk, authorizer_vk) = key_pair(1); + let (_, builder_vk) = key_pair(2); let auth = Authorization::new( PayloadId::default(), @@ -522,102 +525,134 @@ mod tests { builder_vk, ); - // RLP encode-then-decode let encoded = encode(&auth); - assert_eq!(encoded.len(), auth.length()); + assert_eq!(encoded.len(), auth.length(), "length impl correct"); let mut slice = encoded.as_ref(); - let decoded = Authorization::decode(&mut slice).expect("decode succeeds"); - assert_eq!(auth, decoded); - assert!(slice.is_empty()); + let decoded = Authorization::decode(&mut slice).expect("decoding succeeds"); + assert!(slice.is_empty(), "decoder consumed all bytes"); + assert_eq!(decoded, auth, "round-trip preserves value"); - // signature verifies - decoded.verify(authorizer_vk).expect("sig valid"); + // Signature is valid + decoded.verify(authorizer_vk).expect("signature verifies"); } #[test] - fn tampered_sig_is_rejected() { - let (authorizer_sk, authorizer_vk) = sample_keys(); - let (_, builder_vk) = sample_keys(); + fn authorization_signature_tamper_is_detected() { + let (authorizer_sk, authorizer_vk) = key_pair(1); + let (_, builder_vk) = key_pair(2); let mut auth = Authorization::new(PayloadId::default(), 42, &authorizer_sk, builder_vk); - // flip one bit in the signature - let mut auth_sig_bytes = auth.authorizer_sig.to_bytes(); - auth_sig_bytes[0] ^= 0x01; - auth.authorizer_sig = - Signature::try_from(auth_sig_bytes.as_ref()).expect("valid signature bytes"); + let mut sig_bytes = auth.authorizer_sig.to_bytes(); + sig_bytes[0] ^= 1; + auth.authorizer_sig = Signature::try_from(sig_bytes.as_ref()).unwrap(); + assert!(auth.verify(authorizer_vk).is_err()); } #[test] - fn authorized_roundtrip_and_verify() { - let (builder_sk, builder_vk) = sample_keys(); - let authorization = sample_authorization(); + fn authorized_rlp_roundtrip_and_verify() { + let (builder_sk, _builder_vk) = key_pair(2); + let (authorization, authorizer_vk) = sample_authorization(); + let payload = sample_flashblocks_payload(); - let msg = AuthorizedMsg::FlashblocksPayloadV1(payload.clone()); + let msg = AuthorizedMsg::FlashblocksPayloadV1(payload); let authorized = Authorized::new(&builder_sk, authorization.clone(), msg); - // RLP round-trip + // Encode → decode let encoded = encode(&authorized); assert_eq!(encoded.len(), authorized.length()); let mut slice = encoded.as_ref(); - let decoded = Authorized::decode(&mut slice).expect("decode ok"); + let decoded = Authorized::decode(&mut slice).expect("decoding succeeds"); + assert!(slice.is_empty()); assert_eq!(decoded, authorized); - assert!(slice.is_empty(), "decoder consumed all input"); decoded - .verify(authorization.builder_pub) - .expect("verify succeeds"); - - let hash = blake3::hash(&serde_json::to_vec(&payload).unwrap()); - builder_vk - .verify(hash.as_bytes(), &decoded.actor_sig) - .expect("builder sig valid"); + .verify(authorizer_vk) + .expect("composite verification succeeds"); } #[test] - fn builder_sig_tamper_fails() { - let (builder_sk, _) = sample_keys(); - let authorization = sample_authorization(); + fn authorized_builder_signature_tamper_is_detected() { + let (builder_sk, _) = key_pair(2); + let (authorization, authorizer_vk) = sample_authorization(); let payload = sample_flashblocks_payload(); - let msg = AuthorizedMsg::FlashblocksPayloadV1(payload.clone()); + let msg = AuthorizedMsg::FlashblocksPayloadV1(payload); let mut authorized = Authorized::new(&builder_sk, authorization, msg); - // flip one bit - let mut authorized_sig_bytes = authorized.actor_sig.to_bytes(); - authorized_sig_bytes[0] ^= 0x01; - authorized.actor_sig = - Signature::try_from(authorized_sig_bytes.as_ref()).expect("valid signature bytes"); - assert!( - authorized - .verify(authorized.authorization.builder_pub) - .is_err(), - "tampered sig must be rejected" - ); + + let mut sig_bytes = authorized.actor_sig.to_bytes(); + sig_bytes[0] ^= 1; + authorized.actor_sig = Signature::try_from(sig_bytes.as_ref()).unwrap(); + + assert!(authorized.verify(authorizer_vk).is_err()); + } + + #[test] + fn authorized_msg_variants_rlp_roundtrip() { + let variants = [ + AuthorizedMsg::FlashblocksPayloadV1(sample_flashblocks_payload()), + AuthorizedMsg::InnitiateBuildReq(InitiateBuildReq), + AuthorizedMsg::InnitiateBuildRes(InitiateBuildRes::Granted), + AuthorizedMsg::InnitiateBuildRes(InitiateBuildRes::Denied), + ]; + + for msg in variants { + let encoded = encode(&msg); + assert_eq!(encoded.len(), msg.length()); + + let mut slice = encoded.as_ref(); + let decoded = AuthorizedMsg::decode(&mut slice).expect("decodes"); + assert!(slice.is_empty()); + assert_eq!(decoded, msg); + } + } + + #[test] + fn initiate_build_res_rlp_roundtrip() { + for res in [InitiateBuildRes::Granted, InitiateBuildRes::Denied] { + let encoded = encode(res); + assert_eq!(encoded.len(), res.length()); + + let mut slice = encoded.as_ref(); + let decoded = InitiateBuildRes::decode(&mut slice).expect("decodes"); + assert_eq!(decoded, res); + assert!(slice.is_empty()); + } } #[test] fn p2p_msg_roundtrip() { - let (builder_sk, _) = sample_keys(); - let authorization = sample_authorization(); + let (builder_sk, _) = key_pair(2); + let (authorization, _authorizer_vk) = sample_authorization(); let payload = sample_flashblocks_payload(); - let msg = AuthorizedMsg::FlashblocksPayloadV1(payload.clone()); - let authorized = Authorized::new(&builder_sk, authorization, msg); + let msg = AuthorizedMsg::FlashblocksPayloadV1(payload); - let msg = FlashblocksP2PMsg::Authorized(authorized.clone()); + let authorized = Authorized::new(&builder_sk, authorization, msg); + let p2p = FlashblocksP2PMsg::Authorized(authorized.clone()); - let encoded = msg.encode(); + let encoded = p2p.encode(); - let decoded = FlashblocksP2PMsg::decode(&mut &encoded[..]).expect("decode ok"); + let mut view: &[u8] = &encoded; + let decoded = FlashblocksP2PMsg::decode(&mut view).expect("decoding succeeds"); + assert!(view.is_empty(), "all bytes consumed"); match decoded { - FlashblocksP2PMsg::Authorized(inner) => { - assert_eq!(inner, authorized, "inner payload round-trips"); - } + FlashblocksP2PMsg::Authorized(inner) => assert_eq!(inner, authorized), } - assert_eq!(encoded.remaining(), 0, "decoder consumed all input"); + } + + #[test] + fn p2p_msg_unknown_type_errors() { + let mut buf = BytesMut::new(); + buf.put_u8(0xFF); // unknown discriminator + + let mut slice: &[u8] = &buf; + let err = + FlashblocksP2PMsg::decode(&mut slice).expect_err("should fail on unknown message type"); + assert_eq!(err, FlashblocksP2PError::UnknownMessageType); } } From dd3db0fcb814503365adc009085d097f85696ca3 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 13:21:10 -0700 Subject: [PATCH 046/114] wip --- crates/flashblocks-node/src/bin/main.rs | 3 +- crates/flashblocks-p2p/src/net/mod.rs | 6 +- .../src/protocol/connection.rs | 231 ++++++++++++--- .../flashblocks-p2p/src/protocol/handler.rs | 277 ++++++++++++++++-- crates/rollup-boost/src/flashblocks/p2p.rs | 80 ++--- 5 files changed, 474 insertions(+), 123 deletions(-) diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index d7278321..d83e9646 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -1,6 +1,6 @@ #![allow(missing_docs, rustdoc::missing_crate_level_docs)] use clap::Parser; -use ed25519_dalek::VerifyingKey; +use ed25519_dalek::{SigningKey, VerifyingKey}; use flashblocks_node::FlashblocksNodeArgs; use flashblocks_p2p::protocol::handler::FlashblocksHandler; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; @@ -49,6 +49,7 @@ pub fn main() { let custom_rlpx_handler = FlashblocksHandler::new( handle.node.network.clone(), VerifyingKey::default(), + SigningKey::default(), inbound_tx, publish_rx, ); diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 0d8b08b4..5f14cfea 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -1,4 +1,4 @@ -use ed25519_dalek::VerifyingKey; +use ed25519_dalek::{SigningKey, VerifyingKey}; use reth::chainspec::Hardforks; use reth_eth_wire::NetPrimitivesFor; use reth_ethereum::network::api::FullNetwork; @@ -18,6 +18,7 @@ use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; #[derive(Debug)] struct FlashblocksNetworkBuilderCtx { authorizer_vk: VerifyingKey, + builder_sk: SigningKey, flashblocks_receiver_tx: broadcast::Sender, publish_rx: broadcast::Receiver>, } @@ -32,6 +33,7 @@ impl FlashblocksNetworkBuilder { pub fn new( inner: T, authorizer_vk: VerifyingKey, + builder_sk: SigningKey, flashblocks_receiver_tx: broadcast::Sender, publish_rx: broadcast::Receiver>, ) -> Self { @@ -39,6 +41,7 @@ impl FlashblocksNetworkBuilder { inner, ctx: Some(FlashblocksNetworkBuilderCtx { authorizer_vk, + builder_sk, flashblocks_receiver_tx, publish_rx, }), @@ -73,6 +76,7 @@ where let handler = FlashblocksHandler::::new( handle.clone(), ctx.authorizer_vk, + ctx.builder_sk, ctx.flashblocks_receiver_tx, ctx.publish_rx, ); diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 26ab10b5..dd52eb2d 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,10 +1,15 @@ -use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; +use crate::protocol::handler::{ + FlashblocksHandler, FlashblocksP2PNetworHandle, PeerMsg, PublishingStatus, +}; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use reth_network::types::ReputationChangeKind; -use rollup_boost::{AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1}; +use rollup_boost::{ + Authorized, AuthorizedMsg, AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1, + StartPublish, StopPublish, +}; use std::{ pin::Pin, task::{Context, Poll, ready}, @@ -12,14 +17,15 @@ use std::{ use tokio_stream::wrappers::BroadcastStream; use tracing::trace; +pub const INNITIATE_BUILD_TIMOUT: u64 = 8; // seconds + pub struct FlashblocksConnection { pub handler: FlashblocksHandler, pub conn: ProtocolConnection, pub peer_id: PeerId, - /// Receiver for newly created or received and validated flashblocks payloads - /// which will be broadcasted to all peers. May not be strictly ordered. + /// Receiver for peer messages to be sent to all peers. /// We send bytes over this stream to avoid repeatedly having to serialize the payloads. - pub peer_rx: BroadcastStream<(PayloadId, usize, BytesMut)>, + pub peer_rx: BroadcastStream, /// Most recent payload received from this peer. pub payload_id: PayloadId, /// A list of flashblocks indices that we have already received from @@ -37,26 +43,38 @@ impl Stream for FlashblocksConnection { // Check if there are any flashblocks ready to broadcast to our peers. if let Poll::Ready(Some(res)) = this.peer_rx.poll_next_unpin(cx) { match res { - Ok((payload_id, flashblock_index, bytes)) => { - // Check if this flashblock actually originated from this peer. - if this.payload_id != payload_id - || this.received.get(flashblock_index) != Some(&true) - { - trace!( - target: "flashblocks::p2p", - peer_id = %this.peer_id, - %payload_id, - %flashblock_index, - "Broadcasting flashblock message to peer" - ); - return Poll::Ready(Some(bytes)); + Ok(peer_msg) => { + match peer_msg { + PeerMsg::FlashblocksPayload((payload_id, flashblock_index, bytes)) => { + // Check if this flashblock actually originated from this peer. + if this.payload_id != payload_id + || this.received.get(flashblock_index) != Some(&true) + { + trace!( + target: "flashblocks::p2p", + peer_id = %this.peer_id, + %payload_id, + %flashblock_index, + "Broadcasting flashblock message to peer" + ); + return Poll::Ready(Some(bytes)); + } + } + PeerMsg::Other(bytes_mut) => { + trace!( + target: "flashblocks::p2p", + peer_id = %this.peer_id, + "Broadcasting message to peer" + ); + return Poll::Ready(Some(bytes_mut)); + } } } Err(error) => { tracing::error!( target: "flashblocks::p2p", %error, - "Failed to receive flashblocks message from peer_rx" + "failed to receive flashblocks message from peer_rx" ); } } @@ -74,7 +92,7 @@ impl Stream for FlashblocksConnection { target: "flashblocks::p2p", peer_id = %this.peer_id, %error, - "Failed to decode flashblocks message from peer", + "failed to decode flashblocks message from peer", ); this.handler .ctx @@ -91,7 +109,7 @@ impl Stream for FlashblocksConnection { target: "flashblocks::p2p", peer_id = %this.peer_id, %error, - "Failed to verify flashblock", + "failed to verify flashblock", ); this.handler .ctx @@ -104,9 +122,11 @@ impl Stream for FlashblocksConnection { rollup_boost::AuthorizedMsg::FlashblocksPayloadV1(_) => { this.handle_flashblocks_payload_v1(authorized.into_unchecked()); } - rollup_boost::AuthorizedMsg::InnitiateBuildReq(_) => todo!(), - rollup_boost::AuthorizedMsg::InnitiateBuildRes(_initiate_build_res) => { - todo!() + rollup_boost::AuthorizedMsg::StartPublish(_) => { + this.handle_start_publish(authorized.into_unchecked()); + } + rollup_boost::AuthorizedMsg::StopPublish(_) => { + this.handle_stop_publish(authorized.into_unchecked()); } } } @@ -118,18 +138,18 @@ impl Stream for FlashblocksConnection { impl FlashblocksConnection { fn handle_flashblocks_payload_v1( &mut self, - authorized: AuthorizedPayload, + authorized_payload: AuthorizedPayload, ) { let mut state = self.handler.state.lock(); - let authorization = &authorized.authorized.authorization; - let msg = authorized.msg(); + let authorization = &authorized_payload.authorized.authorization; + let msg = authorized_payload.msg(); if authorization.timestamp < state.payload_timestamp { tracing::warn!( target: "flashblocks::p2p", peer_id = %self.peer_id, timestamp = authorization.timestamp, - "Received flashblock with outdated timestamp", + "received flashblock with outdated timestamp", ); self.handler .ctx @@ -138,14 +158,6 @@ impl FlashblocksConnection { return; } - // Check if this is a globally new payload - if authorization.timestamp > state.payload_timestamp { - state.flashblock_index = 0; - state.payload_timestamp = authorization.timestamp; - state.payload_id = msg.payload_id; - state.flashblocks.fill(None); - } - // Check if this is a new payload from this peer if self.payload_id != msg.payload_id { self.payload_id = msg.payload_id; @@ -164,7 +176,7 @@ impl FlashblocksConnection { peer_id = %self.peer_id, payload_id = %msg.payload_id, index = msg.index, - "Received duplicate flashblock from peer", + "received duplicate flashblock from peer", ); self.handler .ctx @@ -174,6 +186,149 @@ impl FlashblocksConnection { } self.received[msg.index as usize] = true; - self.handler.ctx.publish(&mut state, authorized); + let active_publishers = match &mut state.publishing_status { + PublishingStatus::Publishing { .. } => { + // We are currently building, so we should not be seeing any new flashblocks + // over the p2p network. + tracing::error!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "received flashblock while already building", + ); + return; + } + PublishingStatus::WaitingToPublish { + active_publishers, .. + } => active_publishers, + PublishingStatus::NotPublishing { active_publishers } => active_publishers, + }; + + if let Some(base) = &msg.base { + if let Some((_, block_number)) = active_publishers + .iter_mut() + .find(|(publisher, _)| *publisher == authorization.builder_pub) + { + // This is an existing publisher, we should update their block number + *block_number = base.block_number; + } else { + // This is a new publisher, we should add them to the list of active publishers + active_publishers.push((authorization.builder_pub, base.block_number)); + } + } + + self.handler.ctx.publish(&mut state, authorized_payload); + } + + // TODO: handle propogating this if we care + fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { + let state = self.handler.state.lock(); + + // Check if the request is expired for dos protection + if state.payload_timestamp + > authorized_payload.authorized.authorization.timestamp + INNITIATE_BUILD_TIMOUT + { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + current_timestamp = state.payload_timestamp, + timestamp = authorized_payload.authorized.authorization.timestamp, + "received initiate build request with outdated timestamp", + ); + self.handler + .ctx + .network_handle + .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); + return; + } + + let Some(authorization) = &state.authorization else { + // We have no intention to build, so we ignore this request + return; + }; + + match &state.innitiate_build_height { + Some(_) => { + // We are currently waiting to build, but someone else is requesting to build + // This could happen during a double failover. + // We should not give permission to build unless we're the builder. + // We have a potential race condition here so we'll just wait for the + // build request override to kick in next block. + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "received initiate build request while already waiting to build", + ); + } + None => { + // We are currently the builder + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received initiate build request, stopping" + ); + + let authorized_msg = AuthorizedMsg::StopPublish(StopPublish::Granted); + let authorized = Authorized::new( + &self.handler.ctx.builder_sk, + authorization.clone(), + authorized_msg, + ); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); + let peer_msg = PeerMsg::Other(p2p_msg.encode()); + self.handler.ctx.peer_tx.send(peer_msg).ok(); + } + } + } + + // TODO: handle propogating this if we care + fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { + let mut state = self.handler.state.lock(); + if state.payload_timestamp + > authorized_payload.authorized.authorization.timestamp + INNITIATE_BUILD_TIMOUT + { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + current_timestamp = state.payload_timestamp, + timestamp = authorized_payload.authorized.authorization.timestamp, + "Received initiate build response with outdated timestamp", + ); + self.handler + .ctx + .network_handle + .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); + return; + } + + let Some(_authorization) = &state.authorization else { + // We have no intention to build + return; + }; + + match &state.innitiate_build_height { + Some(_innitiate_build_time) => { + // It's now safe to start building + state.innitiate_build_height = None; + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received initiate build response, starting build", + ); + } + None => { + // We are already building, we should never have received this message + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received initiate build response while already building", + ); + } + } + + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received initiate build response, stopping" + ); } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index d8de69ec..241189df 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,12 +1,16 @@ use crate::protocol::connection::FlashblocksConnection; use alloy_rlp::BytesMut; -use ed25519_dalek::VerifyingKey; +use ed25519_dalek::{SigningKey, VerifyingKey}; +use eyre::bail; use parking_lot::Mutex; use reth::payload::PayloadId; use reth_eth_wire::Capability; use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; use reth_network::Peers; -use rollup_boost::{AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1}; +use rollup_boost::{ + Authorization, Authorized, AuthorizedMsg, AuthorizedPayload, FlashblocksP2PMsg, + FlashblocksPayloadV1, StartPublish, StopPublish, +}; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::broadcast; @@ -27,23 +31,76 @@ const MAX_FRAME: usize = 1 << 24; // 16 MiB /// this is just a sanity check to prevent excessive memory usage. const MAX_FLASHBLOCK_INDEX: usize = 100; +/// The maximum number of blocks we will wait for a previous publisher to stop +const MAX_PUBLISH_WAIT_BLOCKS: u64 = 1; + pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} impl FlashblocksP2PNetworHandle for N {} +#[derive(Clone, Debug)] +pub enum PeerMsg { + /// Send an already serialized flashblock to all peers. + FlashblocksPayload((PayloadId, usize, BytesMut)), + /// Send a previously serialized p2p message to all peers. + Other(BytesMut), +} + +#[derive(Clone, Debug)] +pub enum PublishingStatus { + /// We are currently publishing flashblocks. + Publishing { authorization: Authorization }, + /// We are waiting for the previous publisher to stop. + WaitingToPublish { + authorization: Authorization, + /// The block number at which we requested to start publishing. + wait_block_number: u64, + /// A map of active publishers (excluding ourselves) to their most recently published + /// or requested to publish block number. + active_publishers: Vec<(VerifyingKey, u64)>, + }, + /// We are not currently publishing flashblocks. + NotPublishing { + /// A map of previous publishers to their most recently published + /// or requested to publish block number. + active_publishers: Vec<(VerifyingKey, u64)>, + }, +} + +impl Default for PublishingStatus { + fn default() -> Self { + Self::NotPublishing { + active_publishers: Vec::new(), + } + } +} + /// Protocol state is an helper struct to store the protocol events. #[derive(Debug, Default)] pub struct FlashblocksP2PState { - /// The index of the next flashblock to emit over the flashblocks_stream. - pub flashblock_index: usize, - /// Timestamp of the most recent flashblocks payload. - pub payload_timestamp: u64, + pub publishing_status: PublishingStatus, /// Most recent payload id. pub payload_id: PayloadId, + /// Block number of the most recent flashblocks payload. + /// We only recieve the block bumber from `ExecutionPayloadBaseV1` + /// so this may be set to `None` in the even that we receive the flashblocks payloads + /// out of order. + pub block_number: Option, + /// Timestamp of the most recent flashblocks payload. + pub payload_timestamp: u64, + /// The index of the next flashblock to emit over the flashblocks_stream. + pub flashblock_index: usize, /// Buffer of flashblocks for the current payload. pub flashblocks: Vec>, } +impl FlashblocksP2PState { + /// Returns wether or now we are currently allowed to publish flashblocks. + pub fn publishing_status(&self) -> PublishingStatus { + self.publishing_status.clone() + } +} + /// The protocol handler takes care of incoming and outgoing connections. #[derive(Clone, Debug)] pub struct FlashblocksP2PCtx { @@ -51,15 +108,17 @@ pub struct FlashblocksP2PCtx { pub network_handle: N, /// Authorizer verifying, used to verify flashblocks payloads. pub authorizer_vk: VerifyingKey, + /// Builder signing key, used to sign authorized p2p messages. + pub builder_sk: SigningKey, /// Sender for flashblocks payloads which will be broadcasted to all peers. /// May not be strictly ordered. - pub peer_tx: broadcast::Sender<(PayloadId, usize, BytesMut)>, + pub peer_tx: broadcast::Sender, /// Receiver of verified and strictly ordered flashbloacks payloads. /// For consumption by the rpc overlay. pub flashblock_tx: broadcast::Sender, } -/// The protocol handler takes care of incoming and outgoing connections. +/// A cloneable protocol handler that takes care of incoming and outgoing connections. #[derive(Clone, Debug)] pub struct FlashblocksHandler { /// Network handle, used to update peer state. @@ -73,29 +132,19 @@ impl FlashblocksHandler { pub fn new( network_handle: N, authorizer_vk: VerifyingKey, + builder_sk: SigningKey, flashblock_tx: broadcast::Sender, - mut publish_rx: broadcast::Receiver>, ) -> Self { let peer_tx = broadcast::Sender::new(100); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); let ctx = FlashblocksP2PCtx { network_handle: network_handle.clone(), authorizer_vk, + builder_sk, peer_tx, flashblock_tx, }; - let state_clone = state.clone(); - let ctx_clone = ctx.clone(); - tokio::spawn({ - async move { - while let Ok(msg) = publish_rx.recv().await { - let mut state = state_clone.lock(); - ctx_clone.publish(&mut state, msg); - } - } - }); - Self { ctx, state } } @@ -103,6 +152,165 @@ impl FlashblocksHandler { pub fn capability() -> Capability { Capability::new_static("flblk", 1) } + + /// Publishes a newly created flashblock from the payload builder to the state and to the p2p network. + /// Returns an error if we don't have clearance to publish flashblocks. + /// You must call `start_publishing` on the current block before publishing any payloads for + /// this block. + /// + /// TODO: We should eventually assert that flashblocks are consecutive have the correct parrent + pub fn publish_new( + &self, + authorized_payload: AuthorizedPayload, + ) -> eyre::Result<()> { + let mut state = self.state.lock(); + let PublishingStatus::Publishing { authorization } = &state.publishing_status else { + bail!("attempt to publish flashblocks without clearance"); + }; + + if authorization != &authorized_payload.authorized.authorization { + bail!( + "attempt to publish flashblocks with a previous authorization. Make sure to call `start_publishing` first." + ); + } + self.ctx.publish(&mut state, authorized_payload); + Ok(()) + } + + /// Returns the current publishing status. + /// You must call `start_publishing` on the current block before this will return the current + /// status. + pub fn publishing_status(&self) -> PublishingStatus { + self.state.lock().publishing_status.clone() + } + + /// This should be called immediately after we receive a ForkChoiceUpdated + /// with attributes, and the included Auhorization for each block. It's important to + /// note that calling this does not guarantee that we will immediately have clearance + /// to publish. + pub fn start_publishing( + &self, + new_authorization: Authorization, + new_block_number: u64, + new_payload_id: PayloadId, + ) { + let mut state = self.state.lock(); + match &mut state.publishing_status { + PublishingStatus::Publishing { authorization } => { + // We are already publishing, so we just update the authorization. + *authorization = new_authorization; + } + PublishingStatus::WaitingToPublish { + authorization, + wait_block_number, + .. + } => { + // We are waiting to publish, so we update the authorization and + // the block number at which we requested to start publishing. + if new_block_number > *wait_block_number { + // If the block number is greater than the one we requested to start publishing, + // we will update it. + tracing::warn!( + target: "flashblocks::p2p", + %new_payload_id, + %new_block_number, + "waiting to publish timed out, starting to publish", + ); + state.publishing_status = PublishingStatus::Publishing { + authorization: new_authorization, + }; + } else { + // Continue to wait for the previous builder to stop. + *authorization = new_authorization; + } + } + PublishingStatus::NotPublishing { active_publishers } => { + // Send an authorized message to the network + let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); + let peer_msg = PeerMsg::Other(p2p_msg.encode()); + self.ctx.peer_tx.send(peer_msg).ok(); + + if active_publishers.is_empty() { + // If we have no previous publishers, we can start publishing immediately. + tracing::info!( + target: "flashblocks::p2p", + payload_id = %new_payload_id, + "starting to publish flashblocks", + ); + state.publishing_status = PublishingStatus::Publishing { + authorization: new_authorization, + }; + } else { + // If we have previous publishers, we will wait for them to stop. + tracing::info!( + target: "flashblocks::p2p", + payload_id = %new_payload_id, + "waiting to publish flashblocks", + ); + state.publishing_status = PublishingStatus::WaitingToPublish { + authorization: new_authorization, + wait_block_number: new_block_number, + active_publishers: active_publishers.clone(), + }; + } + } + } + } + + /// Sends a message over the p2p network letting other peers know that we are stopping + /// This should be called whenever we receive a ForkChoiceUpdated without attributes + /// or without and `Authorization`. + pub fn stop_publishing(&self, block_height: u64) { + let mut state = self.state.lock(); + match &mut state.publishing_status { + PublishingStatus::Publishing { authorization } => { + // We are currently publishing, so we send a stop message. + tracing::info!( + target: "flashblocks::p2p", + %block_height, + "stopping to publish flashblocks", + ); + let authorized_payload = Authorized::new( + &self.ctx.builder_sk, + authorization.clone(), + StopPublish.into(), + ); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); + let peer_msg = PeerMsg::Other(p2p_msg.encode()); + self.ctx.peer_tx.send(peer_msg).ok(); + state.publishing_status = PublishingStatus::NotPublishing { + active_publishers: Vec::new(), + }; + } + PublishingStatus::WaitingToPublish { + authorization, + active_publishers, + .. + } => { + // We are waiting to publish, so we just update the status. + tracing::info!( + target: "flashblocks::p2p", + %block_height, + "aborting wait to publish flashblocks", + ); + let authorized_payload = Authorized::new( + &self.ctx.builder_sk, + authorization.clone(), + StopPublish.into(), + ); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); + let peer_msg = PeerMsg::Other(p2p_msg.encode()); + self.ctx.peer_tx.send(peer_msg).ok(); + state.publishing_status = PublishingStatus::NotPublishing { + active_publishers: active_publishers.clone(), + }; + } + PublishingStatus::NotPublishing { .. } => {} + } + } } impl FlashblocksP2PCtx { @@ -114,6 +322,27 @@ impl FlashblocksP2PCtx { authorized_payload: AuthorizedPayload, ) { let payload = authorized_payload.msg(); + let authorization = authorized_payload.authorized.authorization; + + // Do some basic validation + if authorization.payload_id != payload.payload_id { + // Since the builders are trusted, the only reason this should happen is a bug. + tracing::error!( + target: "flashblocks::p2p", + authorization_payload_id = %authorization.payload_id, + flashblock_payload_id = %payload.payload_id, + "Authorization payload id does not match flashblocks payload id" + ); + return; + } + + // Check if this is a globally new payload + if authorization.timestamp > state.payload_timestamp { + state.flashblock_index = 0; + state.payload_timestamp = authorization.timestamp; + state.payload_id = authorization.payload_id; + state.flashblocks.fill(None); + } // Resize our array if needed if payload.index as usize > MAX_FLASHBLOCK_INDEX { @@ -166,9 +395,11 @@ impl FlashblocksP2PCtx { "FlashblocksP2PMsg almost too large", ); } - self.peer_tx - .send((payload.payload_id, payload.index as usize, bytes)) - .ok(); + + let peer_msg = + PeerMsg::FlashblocksPayload((payload.payload_id, payload.index as usize, bytes)); + + self.peer_tx.send(peer_msg).ok(); // Broadcast any flashblocks in the cache that are in order while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { // Publish the flashblock diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index b33a0570..2d3ca876 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use crate::{FlashblocksP2PError, FlashblocksPayloadV1}; -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Authorization { pub payload_id: PayloadId, pub timestamp: u64, @@ -18,14 +18,10 @@ pub struct Authorization { } #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub struct InitiateBuildReq; +pub struct StartPublish; -#[repr(u8)] #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub enum InitiateBuildRes { - Granted = 0x00, - Denied = 0x01, -} +pub struct StopPublish; /// A message that can be sent over the Flashblocks P2P network. #[repr(u8)] @@ -38,8 +34,8 @@ pub enum FlashblocksP2PMsg { #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub enum AuthorizedMsg { FlashblocksPayloadV1(FlashblocksPayloadV1) = 0x00, - InnitiateBuildReq(InitiateBuildReq) = 0x01, - InnitiateBuildRes(InitiateBuildRes) = 0x02, + StartPublish(StartPublish) = 0x01, + StopPublish(StopPublish) = 0x02, } impl From for AuthorizedMsg { @@ -48,15 +44,15 @@ impl From for AuthorizedMsg { } } -impl From for AuthorizedMsg { - fn from(req: InitiateBuildReq) -> Self { - Self::InnitiateBuildReq(req) +impl From for AuthorizedMsg { + fn from(req: StartPublish) -> Self { + Self::StartPublish(req) } } -impl From for AuthorizedMsg { - fn from(res: InitiateBuildRes) -> Self { - Self::InnitiateBuildRes(res) +impl From for AuthorizedMsg { + fn from(res: StopPublish) -> Self { + Self::StopPublish(res) } } @@ -367,7 +363,7 @@ impl Encodable for AuthorizedMsg { 0u32.encode(out); p.encode(out); } - Self::InnitiateBuildReq(_) => { + Self::StartPublish(_) => { Header { list: true, payload_length: 1, @@ -375,14 +371,13 @@ impl Encodable for AuthorizedMsg { .encode(out); 1u32.encode(out); } - Self::InnitiateBuildRes(r) => { + Self::StopPublish(_) => { Header { list: true, - payload_length: 1 + r.length(), + payload_length: 1, } .encode(out); 2u32.encode(out); - r.encode(out); } }; } @@ -390,8 +385,8 @@ impl Encodable for AuthorizedMsg { fn length(&self) -> usize { let body_len = match self { Self::FlashblocksPayloadV1(p) => 1 + p.length(), - Self::InnitiateBuildReq(_) => 1, - Self::InnitiateBuildRes(r) => 1 + r.length(), + Self::StartPublish(_) => 1, + Self::StopPublish(_) => 1, }; Header { @@ -415,8 +410,8 @@ impl Decodable for AuthorizedMsg { let tag = u8::decode(buf)?; let value = match tag { 0 => Self::FlashblocksPayloadV1(FlashblocksPayloadV1::decode(buf)?), - 1 => Self::InnitiateBuildReq(InitiateBuildReq), - 2 => Self::InnitiateBuildRes(InitiateBuildRes::decode(buf)?), + 1 => Self::StartPublish(StartPublish), + 2 => Self::StopPublish(StopPublish), _ => return Err(alloy_rlp::Error::Custom("unknown tag")), }; @@ -424,27 +419,6 @@ impl Decodable for AuthorizedMsg { } } -impl Encodable for InitiateBuildRes { - fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { - (*self as u32).encode(out); - } - - fn length(&self) -> usize { - 1 - } -} - -impl Decodable for InitiateBuildRes { - fn decode(buf: &mut &[u8]) -> Result { - let tag = u8::decode(buf)?; - match tag { - 0x00 => Ok(InitiateBuildRes::Granted), - 0x01 => Ok(InitiateBuildRes::Denied), - _ => Err(alloy_rlp::Error::Custom("unknown tag")), - } - } -} - #[cfg(test)] mod tests { use super::*; @@ -595,9 +569,8 @@ mod tests { fn authorized_msg_variants_rlp_roundtrip() { let variants = [ AuthorizedMsg::FlashblocksPayloadV1(sample_flashblocks_payload()), - AuthorizedMsg::InnitiateBuildReq(InitiateBuildReq), - AuthorizedMsg::InnitiateBuildRes(InitiateBuildRes::Granted), - AuthorizedMsg::InnitiateBuildRes(InitiateBuildRes::Denied), + AuthorizedMsg::StartPublish(StartPublish), + AuthorizedMsg::StopPublish(StopPublish), ]; for msg in variants { @@ -611,19 +584,6 @@ mod tests { } } - #[test] - fn initiate_build_res_rlp_roundtrip() { - for res in [InitiateBuildRes::Granted, InitiateBuildRes::Denied] { - let encoded = encode(res); - assert_eq!(encoded.len(), res.length()); - - let mut slice = encoded.as_ref(); - let decoded = InitiateBuildRes::decode(&mut slice).expect("decodes"); - assert_eq!(decoded, res); - assert!(slice.is_empty()); - } - } - #[test] fn p2p_msg_roundtrip() { let (builder_sk, _) = key_pair(2); From ffb966e00fde1bdc4f87cbc437b743ca6c4626ab Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 15:17:09 -0700 Subject: [PATCH 047/114] wip --- .../src/protocol/connection.rs | 68 ++++++++------ .../flashblocks-p2p/src/protocol/handler.rs | 4 +- crates/rollup-boost/src/flashblocks/p2p.rs | 90 +++++++++++++++---- 3 files changed, 115 insertions(+), 47 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index dd52eb2d..7e6d517c 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -206,22 +206,24 @@ impl FlashblocksConnection { if let Some(base) = &msg.base { if let Some((_, block_number)) = active_publishers .iter_mut() - .find(|(publisher, _)| *publisher == authorization.builder_pub) + .find(|(publisher, _)| *publisher == authorization.builder_vk) { // This is an existing publisher, we should update their block number *block_number = base.block_number; } else { // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_pub, base.block_number)); + active_publishers.push((authorization.builder_vk, base.block_number)); } } self.handler.ctx.publish(&mut state, authorized_payload); } - // TODO: handle propogating this if we care + // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { - let state = self.handler.state.lock(); + let mut state = self.handler.state.lock(); + let authorization = &authorized_payload.authorized.authorization; + let msg = authorized_payload.msg(); // Check if the request is expired for dos protection if state.payload_timestamp @@ -241,46 +243,56 @@ impl FlashblocksConnection { return; } - let Some(authorization) = &state.authorization else { - // We have no intention to build, so we ignore this request - return; - }; - - match &state.innitiate_build_height { - Some(_) => { - // We are currently waiting to build, but someone else is requesting to build - // This could happen during a double failover. - // We should not give permission to build unless we're the builder. - // We have a potential race condition here so we'll just wait for the - // build request override to kick in next block. - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "received initiate build request while already waiting to build", - ); - } - None => { - // We are currently the builder + match &mut state.publishing_status { + PublishingStatus::Publishing { authorization } => { tracing::info!( target: "flashblocks::p2p", peer_id = %self.peer_id, - "Received initiate build request, stopping" + "Received StartPublish over p2p, stopping publishing flashblocks" ); - let authorized_msg = AuthorizedMsg::StopPublish(StopPublish::Granted); let authorized = Authorized::new( &self.handler.ctx.builder_sk, authorization.clone(), - authorized_msg, + StopPublish.into(), ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); let peer_msg = PeerMsg::Other(p2p_msg.encode()); self.handler.ctx.peer_tx.send(peer_msg).ok(); + + state.publishing_status = PublishingStatus::NotPublishing { + active_publishers: vec![(authorization.builder_vk, msg.block_number)], + }; + } + PublishingStatus::WaitingToPublish { + active_publishers, .. + } => { + // We are currently waiting to build, but someone else is requesting to build + // This could happen during a double failover. + // We have a potential race condition here so we'll just wait for the + // build request override to kick in next block. + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received StartPublish over p2p while already waiting to publish, ignoring", + ); + + if let Some((_, block_number)) = active_publishers + .iter_mut() + .find(|(publisher, _)| *publisher == authorization.builder_vk) + { + // This is an existing publisher, we should update their block number + *block_number = msg.block_number; + } else { + // This is a new publisher, we should add them to the list of active publishers + active_publishers.push((authorization.builder_vk, msg.block_number)); + } } + PublishingStatus::NotPublishing { active_publishers } => {} } } - // TODO: handle propogating this if we care + // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { let mut state = self.handler.state.lock(); if state.payload_timestamp diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 241189df..2baee93a 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -226,7 +226,9 @@ impl FlashblocksHandler { } PublishingStatus::NotPublishing { active_publishers } => { // Send an authorized message to the network - let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); + let authorized_msg = AuthorizedMsg::StartPublish(StartPublish { + block_number: new_block_number, + }); let authorized_payload = Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index 2d3ca876..c671392c 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -13,12 +13,14 @@ use crate::{FlashblocksP2PError, FlashblocksPayloadV1}; pub struct Authorization { pub payload_id: PayloadId, pub timestamp: u64, - pub builder_pub: VerifyingKey, + pub builder_vk: VerifyingKey, pub authorizer_sig: Signature, } #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub struct StartPublish; +pub struct StartPublish { + pub block_number: u64, +} #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub struct StopPublish; @@ -72,7 +74,7 @@ impl Authorization { Self { payload_id, timestamp, - builder_pub, + builder_vk: builder_pub, authorizer_sig: sig, } } @@ -80,7 +82,7 @@ impl Authorization { pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { let mut msg = self.payload_id.0.to_vec(); msg.extend_from_slice(&self.timestamp.to_le_bytes()); - msg.extend_from_slice(self.builder_pub.as_bytes()); + msg.extend_from_slice(self.builder_vk.as_bytes()); let hash = blake3::hash(&msg); authorizer_pub .verify(hash.as_bytes(), &self.authorizer_sig) @@ -91,7 +93,7 @@ impl Authorization { impl Encodable for Authorization { fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { // pre-serialize the key & sig once so we can reuse the bytes & lengths - let pub_bytes = Bytes::copy_from_slice(self.builder_pub.as_bytes()); // 33 bytes + let pub_bytes = Bytes::copy_from_slice(self.builder_vk.as_bytes()); // 33 bytes let sig_bytes = Bytes::copy_from_slice(&self.authorizer_sig.to_bytes()); // 64 bytes let payload_len = self.payload_id.0.length() @@ -116,7 +118,7 @@ impl Encodable for Authorization { } fn length(&self) -> usize { - let pub_bytes = Bytes::copy_from_slice(self.builder_pub.as_bytes()); + let pub_bytes = Bytes::copy_from_slice(self.builder_vk.as_bytes()); let sig_bytes = Bytes::copy_from_slice(&self.authorizer_sig.to_bytes()); let payload_len = self.payload_id.0.length() @@ -163,7 +165,7 @@ impl Decodable for Authorization { Ok(Self { payload_id, timestamp, - builder_pub, + builder_vk: builder_pub, authorizer_sig, }) } @@ -228,7 +230,7 @@ impl Authorized { let hash = blake3::hash(&encoded); self.authorization - .builder_pub + .builder_vk .verify(hash.as_bytes(), &self.actor_sig) .map_err(|_| FlashblocksP2PError::InvalidBuilderSig) } @@ -351,33 +353,85 @@ impl AsRef for AuthorizedMsg { } } +impl AsRef for AuthorizedMsg { + fn as_ref(&self) -> &StartPublish { + match self { + Self::StartPublish(req) => req, + _ => panic!("not a StartPublish message"), + } + } +} + +impl AsRef for AuthorizedMsg { + fn as_ref(&self) -> &StopPublish { + match self { + Self::StopPublish(res) => res, + _ => panic!("not a StopPublish message"), + } + } +} + +impl Encodable for StartPublish { + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { + self.block_number.encode(out); + } + + fn length(&self) -> usize { + self.block_number.length() + } +} + +impl Decodable for StartPublish { + fn decode(buf: &mut &[u8]) -> Result { + Ok(StartPublish { + block_number: u64::decode(buf)?, + }) + } +} + +impl Encodable for StopPublish { + fn encode(&self, out: &mut dyn alloy_rlp::BufMut) {} + + fn length(&self) -> usize { + 0 + } +} + +impl Decodable for StopPublish { + fn decode(buf: &mut &[u8]) -> Result { + Ok(StopPublish) + } +} + impl Encodable for AuthorizedMsg { fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { match self { - Self::FlashblocksPayloadV1(p) => { + Self::FlashblocksPayloadV1(payload) => { Header { list: true, - payload_length: 1 + p.length(), + payload_length: 1 + payload.length(), } .encode(out); 0u32.encode(out); - p.encode(out); + payload.encode(out); } - Self::StartPublish(_) => { + Self::StartPublish(start) => { Header { list: true, - payload_length: 1, + payload_length: 1 + start.length(), } .encode(out); 1u32.encode(out); + start.encode(out); } - Self::StopPublish(_) => { + Self::StopPublish(stop) => { Header { list: true, - payload_length: 1, + payload_length: 1 + stop.length(), } .encode(out); 2u32.encode(out); + stop.encode(out); } }; } @@ -410,8 +464,8 @@ impl Decodable for AuthorizedMsg { let tag = u8::decode(buf)?; let value = match tag { 0 => Self::FlashblocksPayloadV1(FlashblocksPayloadV1::decode(buf)?), - 1 => Self::StartPublish(StartPublish), - 2 => Self::StopPublish(StopPublish), + 1 => Self::StartPublish(StartPublish::decode(buf)?), + 2 => Self::StopPublish(StopPublish::decode(buf)?), _ => return Err(alloy_rlp::Error::Custom("unknown tag")), }; @@ -569,7 +623,7 @@ mod tests { fn authorized_msg_variants_rlp_roundtrip() { let variants = [ AuthorizedMsg::FlashblocksPayloadV1(sample_flashblocks_payload()), - AuthorizedMsg::StartPublish(StartPublish), + AuthorizedMsg::StartPublish(StartPublish { block_number: 100 }), AuthorizedMsg::StopPublish(StopPublish), ]; From 6f4ab14d33d304b84b14740cde3a7b753832660e Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 15:32:54 -0700 Subject: [PATCH 048/114] finish change to p2p leader protocol --- crates/flashblocks-node/src/bin/main.rs | 4 +- crates/flashblocks-p2p/src/net/mod.rs | 6 +- .../src/protocol/connection.rs | 110 ++++++++++++------ .../flashblocks-p2p/src/protocol/handler.rs | 14 +-- 4 files changed, 79 insertions(+), 55 deletions(-) diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index d83e9646..d5ea1b2c 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -26,7 +26,6 @@ pub fn main() { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); let (inbound_tx, inbound_rx) = broadcast::channel(100); - let (_publish_tx, publish_rx) = broadcast::channel(100); let flashblocks_overlay = FlashblocksOverlay::new(chain_spec, inbound_rx); flashblocks_overlay.clone().start()?; @@ -49,9 +48,8 @@ pub fn main() { let custom_rlpx_handler = FlashblocksHandler::new( handle.node.network.clone(), VerifyingKey::default(), - SigningKey::default(), + SigningKey::from_bytes(&[0u8; 32]), inbound_tx, - publish_rx, ); handle diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 5f14cfea..e3273b50 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -10,7 +10,7 @@ use reth_node_builder::{ node::{FullNodeTypes, NodeTypes}, }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use rollup_boost::{AuthorizedPayload, FlashblocksPayloadV1}; +use rollup_boost::FlashblocksPayloadV1; use tokio::sync::broadcast; use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; @@ -20,7 +20,6 @@ struct FlashblocksNetworkBuilderCtx { authorizer_vk: VerifyingKey, builder_sk: SigningKey, flashblocks_receiver_tx: broadcast::Sender, - publish_rx: broadcast::Receiver>, } #[derive(Debug)] @@ -35,7 +34,6 @@ impl FlashblocksNetworkBuilder { authorizer_vk: VerifyingKey, builder_sk: SigningKey, flashblocks_receiver_tx: broadcast::Sender, - publish_rx: broadcast::Receiver>, ) -> Self { Self { inner, @@ -43,7 +41,6 @@ impl FlashblocksNetworkBuilder { authorizer_vk, builder_sk, flashblocks_receiver_tx, - publish_rx, }), } } @@ -78,7 +75,6 @@ where ctx.authorizer_vk, ctx.builder_sk, ctx.flashblocks_receiver_tx, - ctx.publish_rx, ); handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); } diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 7e6d517c..021713fb 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -7,8 +7,8 @@ use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use reth_network::types::ReputationChangeKind; use rollup_boost::{ - Authorized, AuthorizedMsg, AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1, - StartPublish, StopPublish, + Authorized, AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1, StartPublish, + StopPublish, }; use std::{ pin::Pin, @@ -243,7 +243,7 @@ impl FlashblocksConnection { return; } - match &mut state.publishing_status { + let active_publishers = match &mut state.publishing_status { PublishingStatus::Publishing { authorization } => { tracing::info!( target: "flashblocks::p2p", @@ -253,7 +253,7 @@ impl FlashblocksConnection { let authorized = Authorized::new( &self.handler.ctx.builder_sk, - authorization.clone(), + *authorization, StopPublish.into(), ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); @@ -263,6 +263,8 @@ impl FlashblocksConnection { state.publishing_status = PublishingStatus::NotPublishing { active_publishers: vec![(authorization.builder_vk, msg.block_number)], }; + + return; } PublishingStatus::WaitingToPublish { active_publishers, .. @@ -276,19 +278,20 @@ impl FlashblocksConnection { peer_id = %self.peer_id, "Received StartPublish over p2p while already waiting to publish, ignoring", ); - - if let Some((_, block_number)) = active_publishers - .iter_mut() - .find(|(publisher, _)| *publisher == authorization.builder_vk) - { - // This is an existing publisher, we should update their block number - *block_number = msg.block_number; - } else { - // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_vk, msg.block_number)); - } + active_publishers } - PublishingStatus::NotPublishing { active_publishers } => {} + PublishingStatus::NotPublishing { active_publishers } => active_publishers, + }; + + if let Some((_, block_number)) = active_publishers + .iter_mut() + .find(|(publisher, _)| *publisher == authorization.builder_vk) + { + // This is an existing publisher, we should update their block number + *block_number = msg.block_number; + } else { + // This is a new publisher, we should add them to the list of active publishers + active_publishers.push((authorization.builder_vk, msg.block_number)); } } @@ -312,35 +315,68 @@ impl FlashblocksConnection { return; } - let Some(_authorization) = &state.authorization else { - // We have no intention to build - return; - }; - - match &state.innitiate_build_height { - Some(_innitiate_build_time) => { - // It's now safe to start building - state.innitiate_build_height = None; - tracing::info!( + match &mut state.publishing_status { + PublishingStatus::Publishing { .. } => { + tracing::warn!( target: "flashblocks::p2p", peer_id = %self.peer_id, - "Received initiate build response, starting build", + "Received StopPublish over p2p while we are the publisher" ); } - None => { - // We are already building, we should never have received this message - tracing::warn!( + PublishingStatus::WaitingToPublish { + active_publishers, + authorization, + .. + } => { + // We are currently waiting to build, but someone else is requesting to build + // This could happen during a double failover. + // We have a potential race condition here so we'll just wait for the + // build request override to kick in next block. + tracing::info!( target: "flashblocks::p2p", peer_id = %self.peer_id, - "Received initiate build response while already building", + "Received StopPublish over p2p while waiting to publish", ); + + // Remove the publisher from the list of active publishers + if let Some(index) = active_publishers.iter().position(|(publisher, _)| { + *publisher == authorized_payload.authorized.authorization.builder_vk + }) { + active_publishers.remove(index); + } else { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received StopPublish for unknown publisher", + ); + } + + if active_publishers.is_empty() { + // If there are no active publishers left, we should stop waiting to publish + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "starting to publish" + ); + state.publishing_status = PublishingStatus::Publishing { + authorization: *authorization, + }; + } + } + PublishingStatus::NotPublishing { active_publishers } => { + // Remove the publisher from the list of active publishers + if let Some(index) = active_publishers.iter().position(|(publisher, _)| { + *publisher == authorized_payload.authorized.authorization.builder_vk + }) { + active_publishers.remove(index); + } else { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received StopPublish for unknown publisher", + ); + } } } - - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received initiate build response, stopping" - ); } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 2baee93a..2fac3057 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -275,11 +275,8 @@ impl FlashblocksHandler { %block_height, "stopping to publish flashblocks", ); - let authorized_payload = Authorized::new( - &self.ctx.builder_sk, - authorization.clone(), - StopPublish.into(), - ); + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::Other(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -298,11 +295,8 @@ impl FlashblocksHandler { %block_height, "aborting wait to publish flashblocks", ); - let authorized_payload = Authorized::new( - &self.ctx.builder_sk, - authorization.clone(), - StopPublish.into(), - ); + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::Other(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); From 80f24e14860767913405770d9088b2987efc613c Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 15:56:46 -0700 Subject: [PATCH 049/114] wip: fix rlp encoding --- crates/flashblocks-node/tests/p2p.rs | 28 +++++++++++++--------- crates/rollup-boost/src/flashblocks/p2p.rs | 6 ++--- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 88d54a12..373ce4cc 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -39,8 +39,8 @@ type Network = NetworkHandle< >; pub struct NodeContext { + p2p_handle: FlashblocksHandler, flashblocks_tx: broadcast::Sender, - publish_tx: broadcast::Sender>, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -59,10 +59,10 @@ impl NodeContext { async fn setup_node( exec: TaskExecutor, - authorizer: SigningKey, + authorizer_sk: SigningKey, + builder_sk: SigningKey, trusted_peer: Option<(PeerId, SocketAddr)>, ) -> eyre::Result { - let (publish_tx, publish_rx) = broadcast::channel(100); let (inbound_tx, inbound_rx) = broadcast::channel(100); let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); @@ -113,15 +113,15 @@ async fn setup_node( .launch() .await?; - let custom_rlpx_handler = FlashblocksHandler::new( + let p2p_handle = FlashblocksHandler::new( node.network.clone(), - authorizer.verifying_key(), + authorizer_sk.verifying_key(), + builder_sk, inbound_tx.clone(), - publish_rx, ); node.network - .add_rlpx_sub_protocol(custom_rlpx_handler.into_rlpx_sub_protocol()); + .add_rlpx_sub_protocol(p2p_handle.clone().into_rlpx_sub_protocol()); if let Some((peer_id, addr)) = trusted_peer { // If a trusted peer is provided, add it to the network @@ -137,8 +137,8 @@ async fn setup_node( let local_node_record = network_handle.local_node_record(); Ok(NodeContext { + p2p_handle, flashblocks_tx: inbound_tx, - publish_tx, local_node_record, http_api_addr, _node_exit_future: node_exit_future, @@ -293,13 +293,14 @@ async fn test_peering() -> eyre::Result<()> { let tasks = TaskManager::current(); let exec = tasks.executor(); // let exec = TaskExecutor::current(); - let node_0 = setup_node(exec, authorizer.clone(), None).await?; + let node_0 = setup_node(exec, authorizer.clone(), builder.clone(), None).await?; let provider_0 = node_0.provider().await?; let enr_0 = node_0.local_node_record; let node_1 = setup_node( TaskExecutor::current(), authorizer.clone(), + builder.clone(), Some((enr_0.id, enr_0.tcp_addr())), ) .await?; @@ -329,7 +330,12 @@ async fn test_peering() -> eyre::Result<()> { ); let msg = payload_0.clone(); let authorized = AuthorizedPayload::new(&builder, authorization, msg); - node_1.publish_tx.send(authorized)?; + node_1.p2p_handle.start_publishing( + authorization, + payload_0.base.unwrap().block_number, + payload_0.payload_id, + ); + node_1.p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(10000)).await; let peers = node_0.network_handle.get_all_peers().await?; let peer_1 = &peers[0].remote_id; @@ -355,7 +361,7 @@ async fn test_peering() -> eyre::Result<()> { builder.verifying_key(), ); let authorized = AuthorizedPayload::new(&builder, authorization, payload_1.clone()); - node_1.publish_tx.send(authorized)?; + node_1.p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index c671392c..851d4714 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -438,9 +438,9 @@ impl Encodable for AuthorizedMsg { fn length(&self) -> usize { let body_len = match self { - Self::FlashblocksPayloadV1(p) => 1 + p.length(), - Self::StartPublish(_) => 1, - Self::StopPublish(_) => 1, + Self::FlashblocksPayloadV1(payload) => 1 + payload.length(), + Self::StartPublish(start) => 1 + start.length(), + Self::StopPublish(stop) => 1 + stop.length(), }; Header { From 70d37d73bd2f12a2167692e8ac81696f60091a4c Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 16:20:54 -0700 Subject: [PATCH 050/114] set block_number --- crates/flashblocks-p2p/src/protocol/connection.rs | 2 ++ crates/flashblocks-p2p/src/protocol/handler.rs | 9 +++++---- crates/rollup-boost/src/flashblocks/p2p.rs | 7 ++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 021713fb..005867f5 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -144,6 +144,7 @@ impl FlashblocksConnection { let authorization = &authorized_payload.authorized.authorization; let msg = authorized_payload.msg(); + // check if this is an old payload if authorization.timestamp < state.payload_timestamp { tracing::warn!( target: "flashblocks::p2p", @@ -203,6 +204,7 @@ impl FlashblocksConnection { PublishingStatus::NotPublishing { active_publishers } => active_publishers, }; + // Update the list of active publishers if let Some(base) = &msg.base { if let Some((_, block_number)) = active_publishers .iter_mut() diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 2fac3057..f2bff079 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -79,13 +79,13 @@ impl Default for PublishingStatus { #[derive(Debug, Default)] pub struct FlashblocksP2PState { pub publishing_status: PublishingStatus, - /// Most recent payload id. - pub payload_id: PayloadId, /// Block number of the most recent flashblocks payload. /// We only recieve the block bumber from `ExecutionPayloadBaseV1` /// so this may be set to `None` in the even that we receive the flashblocks payloads /// out of order. pub block_number: Option, + /// Most recent payload id. + pub payload_id: PayloadId, /// Timestamp of the most recent flashblocks payload. pub payload_timestamp: u64, /// The index of the next flashblock to emit over the flashblocks_stream. @@ -334,9 +334,10 @@ impl FlashblocksP2PCtx { // Check if this is a globally new payload if authorization.timestamp > state.payload_timestamp { - state.flashblock_index = 0; - state.payload_timestamp = authorization.timestamp; + state.block_number = payload.base.as_ref().map(|b| b.block_number); state.payload_id = authorization.payload_id; + state.payload_timestamp = authorization.timestamp; + state.flashblock_index = 0; state.flashblocks.fill(None); } diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index 851d4714..d550de94 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -32,6 +32,7 @@ pub enum FlashblocksP2PMsg { Authorized(Authorized) = 0x00, } +#[allow(clippy::large_enum_variant)] #[repr(u8)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub enum AuthorizedMsg { @@ -390,7 +391,7 @@ impl Decodable for StartPublish { } impl Encodable for StopPublish { - fn encode(&self, out: &mut dyn alloy_rlp::BufMut) {} + fn encode(&self, _out: &mut dyn alloy_rlp::BufMut) {} fn length(&self) -> usize { 0 @@ -398,7 +399,7 @@ impl Encodable for StopPublish { } impl Decodable for StopPublish { - fn decode(buf: &mut &[u8]) -> Result { + fn decode(_buf: &mut &[u8]) -> Result { Ok(StopPublish) } } @@ -553,7 +554,7 @@ mod tests { builder_vk, ); - let encoded = encode(&auth); + let encoded = encode(auth); assert_eq!(encoded.len(), auth.length(), "length impl correct"); let mut slice = encoded.as_ref(); From 72b2bc6bca0b4edfffa6c494942cc988dbcff90d Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 18:51:42 -0700 Subject: [PATCH 051/114] feat: working demo! --- crates/flashblocks-node/tests/p2p.rs | 187 ++++++++++++------ .../src/protocol/connection.rs | 28 ++- .../flashblocks-p2p/src/protocol/handler.rs | 14 +- 3 files changed, 163 insertions(+), 66 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 373ce4cc..7daa9cd9 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -61,7 +61,7 @@ async fn setup_node( exec: TaskExecutor, authorizer_sk: SigningKey, builder_sk: SigningKey, - trusted_peer: Option<(PeerId, SocketAddr)>, + peers: Vec<(PeerId, SocketAddr)>, ) -> eyre::Result { let (inbound_tx, inbound_rx) = broadcast::channel(100); @@ -123,7 +123,7 @@ async fn setup_node( node.network .add_rlpx_sub_protocol(p2p_handle.clone().into_rlpx_sub_protocol()); - if let Some((peer_id, addr)) = trusted_peer { + for (peer_id, addr) in peers { // If a trusted peer is provided, add it to the network node.network.add_peer(peer_id, addr); } @@ -147,16 +147,16 @@ async fn setup_node( }) } -fn payload_0() -> FlashblocksPayloadV1 { +fn payload_base(block_number: u64, payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { FlashblocksPayloadV1 { - payload_id: PayloadId::new([0; 8]), - index: 0, + payload_id, + index, base: Some(ExecutionPayloadBaseV1 { parent_beacon_block_root: B256::default(), parent_hash: B256::default(), fee_recipient: Address::ZERO, prev_randao: B256::default(), - block_number: 1, + block_number, gas_limit: 0, timestamp: 0, extra_data: Bytes::new(), @@ -180,7 +180,7 @@ const TX1_HASH: TxHash = const TX2_HASH: TxHash = b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); -fn payload_2() -> FlashblocksPayloadV1 { +fn payload_next(payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { // Create second payload (index 1) with transactions // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 @@ -189,8 +189,8 @@ fn payload_2() -> FlashblocksPayloadV1 { // Send another test flashblock payload FlashblocksPayloadV1 { - payload_id: PayloadId::new([0; 8]), - index: 1, + payload_id, + index, base: None, diff: ExecutionPayloadFlashblockDeltaV1 { state_root: B256::default(), @@ -283,99 +283,176 @@ fn payload_2() -> FlashblocksPayloadV1 { // // Ok(()) // } +// +async fn setup_nodes(n: u8) -> eyre::Result<(Vec, SigningKey)> { + let mut nodes = Vec::new(); + let mut peers = Vec::new(); + let tasks = Box::leak(Box::new(TaskManager::current())); + let exec = Box::leak(Box::new(tasks.executor())); + let authorizer = SigningKey::from_bytes(&[0; 32]); + + for i in 0..n { + let builder = SigningKey::from_bytes(&[(i + 1) % n; 32]); + let node = setup_node(exec.clone(), authorizer.clone(), builder, peers.clone()).await?; + let enr = node.local_node_record; + peers.push((enr.id, enr.tcp_addr())); + nodes.push(node); + } + + tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; + + Ok((nodes, authorizer)) +} #[tokio::test] async fn test_peering() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let authorizer = SigningKey::from_bytes(&[0u8; 32]); - let builder = SigningKey::from_bytes(&[1u8; 32]); - - let tasks = TaskManager::current(); - let exec = tasks.executor(); - // let exec = TaskExecutor::current(); - let node_0 = setup_node(exec, authorizer.clone(), builder.clone(), None).await?; - let provider_0 = node_0.provider().await?; - let enr_0 = node_0.local_node_record; - - let node_1 = setup_node( - TaskExecutor::current(), - authorizer.clone(), - builder.clone(), - Some((enr_0.id, enr_0.tcp_addr())), - ) - .await?; - let provider_1 = node_1.provider().await?; - - let latest_block = provider_1 + let (nodes, authorizer) = setup_nodes(3).await?; + + let mut publish_flashblocks = nodes[0].p2p_handle.ctx.flashblock_tx.subscribe(); + tokio::spawn(async move { + while let Ok(payload) = publish_flashblocks.recv().await { + println!("\n////////////////////////////////////////////////////////////////////\n"); + println!( + "Received flashblock, payload_id: {}, index: {}", + payload.payload_id, payload.index + ); + println!("\n////////////////////////////////////////////////////////////////////\n"); + } + }); + + let latest_block = nodes[0] + .provider() + .await? .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) .await? .expect("latest block expected"); assert_eq!(latest_block.number(), 0); // Querying pending block when it does not exists yet - let pending_block = provider_1 + let pending_block = nodes[0] + .provider() + .await? .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) .await?; assert!(pending_block.is_none()); - tokio::time::sleep(tokio::time::Duration::from_millis(15000)).await; - - let payload_0 = payload_0(); - info!("Sending base payload"); + let payload_0 = payload_base(0, PayloadId::new([0; 8]), 0); + info!("Sending payload 0, index 0"); let authorization = Authorization::new( payload_0.payload_id, 0, &authorizer, - builder.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); let msg = payload_0.clone(); - let authorized = AuthorizedPayload::new(&builder, authorization, msg); - node_1.p2p_handle.start_publishing( + let authorized = + AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization, msg); + nodes[0].p2p_handle.start_publishing( authorization, payload_0.base.unwrap().block_number, payload_0.payload_id, ); - node_1.p2p_handle.publish_new(authorized).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(10000)).await; - let peers = node_0.network_handle.get_all_peers().await?; - let peer_1 = &peers[0].remote_id; + nodes[0].p2p_handle.publish_new(authorized).unwrap(); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; - info!(?rep_1, "Peer reputation"); + // let peers = node_0.network_handle.get_all_peers().await?; + // let peer_1 = &peers[0].remote_id; + // + // let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; + // info!(?rep_1, "Peer reputation"); // Query pending block after sending the base payload with an empty delta - let pending_block = provider_0 + let pending_block = nodes[1] + .provider() + .await? .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) .await? .expect("pending block expected"); - assert_eq!(pending_block.number(), 1); + assert_eq!(pending_block.number(), 0); assert_eq!(pending_block.transactions.hashes().len(), 0); - let payload_1 = payload_2(); - info!("Sending base payload"); + info!("Sending payload 0, index 1"); + let payload_1 = payload_next(payload_0.payload_id, 1); let authorization = Authorization::new( payload_1.payload_id, 0, &authorizer, - builder.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); - let authorized = AuthorizedPayload::new(&builder, authorization, payload_1.clone()); - node_1.p2p_handle.publish_new(authorized).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; + let authorized = AuthorizedPayload::new( + &nodes[0].p2p_handle.ctx.builder_sk, + authorization, + payload_1.clone(), + ); + nodes[0].p2p_handle.publish_new(authorized).unwrap(); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; - info!(?rep_1, "Peer reputation"); + // let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; + // info!(?rep_1, "Peer reputation"); // Query pending block after sending the second payload with two transactions - let block = provider_0 + let block = nodes[1] + .provider() + .await? .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) .await? .expect("pending block expected"); - assert_eq!(block.number(), 1); + assert_eq!(block.number(), 0); assert_eq!(block.transactions.hashes().len(), 2); + // Send a new block, this time from node 1 + let payload_2 = payload_base(1, PayloadId::new([1; 8]), 0); + info!("Sending payload 1, index 0"); + let authorization_1 = Authorization::new( + payload_2.payload_id, + 1, + &authorizer, + nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), + ); + let authorization_2 = Authorization::new( + payload_2.payload_id, + 1, + &authorizer, + nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), + ); + let msg = payload_2.clone(); + let authorized_1 = AuthorizedPayload::new( + &nodes[1].p2p_handle.ctx.builder_sk, + authorization_1, + msg.clone(), + ); + nodes[1].p2p_handle.start_publishing( + authorization_1, + payload_2.base.clone().unwrap().block_number, + payload_2.payload_id, + ); + nodes[2].p2p_handle.start_publishing( + authorization_2, + payload_2.base.clone().unwrap().block_number, + payload_2.payload_id, + ); + // Wait for clearance to go through + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + tracing::error!( + "{}", + nodes[1] + .p2p_handle + .publish_new(authorized_1.clone()) + .unwrap_err() + ); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + nodes[2] + .p2p_handle + .stop_publishing(payload_2.base.unwrap().block_number); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + nodes[1].p2p_handle.publish_new(authorized_1)?; + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + Ok(()) } diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 005867f5..103095b0 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -45,7 +45,11 @@ impl Stream for FlashblocksConnection { match res { Ok(peer_msg) => { match peer_msg { - PeerMsg::FlashblocksPayload((payload_id, flashblock_index, bytes)) => { + PeerMsg::FlashblocksPayloadV1(( + payload_id, + flashblock_index, + bytes, + )) => { // Check if this flashblock actually originated from this peer. if this.payload_id != payload_id || this.received.get(flashblock_index) != Some(&true) @@ -55,16 +59,24 @@ impl Stream for FlashblocksConnection { peer_id = %this.peer_id, %payload_id, %flashblock_index, - "Broadcasting flashblock message to peer" + "Broadcasting `FlashblocksPayloadV1` message to peer" ); return Poll::Ready(Some(bytes)); } } - PeerMsg::Other(bytes_mut) => { + PeerMsg::StartPublishing(bytes_mut) => { trace!( target: "flashblocks::p2p", peer_id = %this.peer_id, - "Broadcasting message to peer" + "Broadcasting `StartPublishing` to peer" + ); + return Poll::Ready(Some(bytes_mut)); + } + PeerMsg::StopPublishing(bytes_mut) => { + trace!( + target: "flashblocks::p2p", + peer_id = %this.peer_id, + "Broadcasting `StopPublishing` to peer" ); return Poll::Ready(Some(bytes_mut)); } @@ -259,7 +271,7 @@ impl FlashblocksConnection { StopPublish.into(), ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); - let peer_msg = PeerMsg::Other(p2p_msg.encode()); + let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.handler.ctx.peer_tx.send(peer_msg).ok(); state.publishing_status = PublishingStatus::NotPublishing { @@ -363,6 +375,12 @@ impl FlashblocksConnection { state.publishing_status = PublishingStatus::Publishing { authorization: *authorization, }; + } else { + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "still waiting on active publishers", + ); } } PublishingStatus::NotPublishing { active_publishers } => { diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index f2bff079..a7ab4b4e 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -41,9 +41,11 @@ impl FlashblocksP2PNetworH #[derive(Clone, Debug)] pub enum PeerMsg { /// Send an already serialized flashblock to all peers. - FlashblocksPayload((PayloadId, usize, BytesMut)), + FlashblocksPayloadV1((PayloadId, usize, BytesMut)), /// Send a previously serialized p2p message to all peers. - Other(BytesMut), + StartPublishing(BytesMut), + /// Send a previously serialized p2p message to all peers. + StopPublishing(BytesMut), } #[derive(Clone, Debug)] @@ -232,7 +234,7 @@ impl FlashblocksHandler { let authorized_payload = Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::Other(p2p_msg.encode()); + let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); if active_publishers.is_empty() { @@ -278,7 +280,7 @@ impl FlashblocksHandler { let authorized_payload = Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::Other(p2p_msg.encode()); + let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); state.publishing_status = PublishingStatus::NotPublishing { active_publishers: Vec::new(), @@ -298,7 +300,7 @@ impl FlashblocksHandler { let authorized_payload = Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::Other(p2p_msg.encode()); + let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); state.publishing_status = PublishingStatus::NotPublishing { active_publishers: active_publishers.clone(), @@ -394,7 +396,7 @@ impl FlashblocksP2PCtx { } let peer_msg = - PeerMsg::FlashblocksPayload((payload.payload_id, payload.index as usize, bytes)); + PeerMsg::FlashblocksPayloadV1((payload.payload_id, payload.index as usize, bytes)); self.peer_tx.send(peer_msg).ok(); // Broadcast any flashblocks in the cache that are in order From d6d129e91a29bde9096afaa7f819623f9afe2fcb Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 19:11:49 -0700 Subject: [PATCH 052/114] feat: authorized verification --- .../flashblocks-p2p/src/protocol/connection.rs | 15 +++++++++++++++ crates/flashblocks-p2p/src/protocol/handler.rs | 17 +++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 103095b0..30926a7d 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -116,6 +116,21 @@ impl Stream for FlashblocksConnection { match msg { FlashblocksP2PMsg::Authorized(authorized) => { + if authorized.authorization.builder_vk + == this.handler.ctx.builder_sk.verifying_key() + { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %this.peer_id, + "received our own message from peer", + ); + this.handler + .ctx + .network_handle + .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); + continue; + } + if let Err(error) = authorized.verify(this.handler.ctx.authorizer_vk) { tracing::warn!( target: "flashblocks::p2p", diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index a7ab4b4e..9b9c402b 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -55,8 +55,6 @@ pub enum PublishingStatus { /// We are waiting for the previous publisher to stop. WaitingToPublish { authorization: Authorization, - /// The block number at which we requested to start publishing. - wait_block_number: u64, /// A map of active publishers (excluding ourselves) to their most recently published /// or requested to publish block number. active_publishers: Vec<(VerifyingKey, u64)>, @@ -160,7 +158,7 @@ impl FlashblocksHandler { /// You must call `start_publishing` on the current block before publishing any payloads for /// this block. /// - /// TODO: We should eventually assert that flashblocks are consecutive have the correct parrent + /// TODO: We should eventually assert that flashblocks are consecutive and have the correct parrent pub fn publish_new( &self, authorized_payload: AuthorizedPayload, @@ -204,12 +202,16 @@ impl FlashblocksHandler { } PublishingStatus::WaitingToPublish { authorization, - wait_block_number, - .. + active_publishers, } => { + let most_recent_publisher = active_publishers + .iter() + .map(|(_, block_number)| *block_number) + .max() + .unwrap_or_default(); // We are waiting to publish, so we update the authorization and // the block number at which we requested to start publishing. - if new_block_number > *wait_block_number { + if new_block_number >= most_recent_publisher + MAX_PUBLISH_WAIT_BLOCKS { // If the block number is greater than the one we requested to start publishing, // we will update it. tracing::warn!( @@ -227,7 +229,7 @@ impl FlashblocksHandler { } } PublishingStatus::NotPublishing { active_publishers } => { - // Send an authorized message to the network + // Send an authorized `StartPublish` message to the network let authorized_msg = AuthorizedMsg::StartPublish(StartPublish { block_number: new_block_number, }); @@ -256,7 +258,6 @@ impl FlashblocksHandler { ); state.publishing_status = PublishingStatus::WaitingToPublish { authorization: new_authorization, - wait_block_number: new_block_number, active_publishers: active_publishers.clone(), }; } From 9a8b031291eed7474d75791ddef68cbaa4c6b98e Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 21:36:37 -0700 Subject: [PATCH 053/114] feat: flashblocks_p2p spec --- specs/flashblocks-p2p.md | 197 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 specs/flashblocks-p2p.md diff --git a/specs/flashblocks-p2p.md b/specs/flashblocks-p2p.md new file mode 100644 index 00000000..eae23474 --- /dev/null +++ b/specs/flashblocks-p2p.md @@ -0,0 +1,197 @@ +# Flashblocks P2P Extension + +*This document is an extension to the original Flashblocks specification, modifying the flashblock propagation mechanism to use a peer-to-peer (P2P) network instead of WebSockets. It highlights the new P2P protocol and the changes in Rollup-Boost and builder interactions, aimed at simplifying distribution and improving fault tolerance in High Availability (HA) sequencer setups.* + +**Table of Contents** + +* [Abstract](#abstract) +* [Motivation](#motivation) +* [Specification](#specification) + + * [Terminology](#terminology) + * [Data Structures](#data-structures) + + * [**`Authorization`**](#authorization) + * [**`Authorized Message`**](#authorized-message) + * [**`StartPublish`**](#startpublish) + * [**`StopPublish`**](#stoppublish) + * [Flashblocks P2P Protocol](#flashblocks-p2p-protocol) + + * [Protocol Overview](#protocol-overview) + * [Message Types](#message-types) + * [Authorization and Security](#authorization-and-security) + * [Multi-Builder Coordination](#multi-builder-coordination) + * [Rollup-Boost and Builder Communication](#rollup-boost-and-builder-communication) + +# Abstract + +This document introduces an enhancement to Flashblocks where the propagation of partial blocks (“flashblocks”) is done over an Ethereum P2P subprotocol instead of a WebSocket broadcast. By integrating flashblock distribution into the peer-to-peer network, we eliminate the need for a dedicated WebSocket proxy and enable more robust, decentralized propagation of flashblock data. Crucially, this P2P approach uses cryptographic authorization to ensure that only an **authorized** block builder (and its designated successors in an HA setup) can publish flashblocks, improving fault tolerance during sequencer failovers. The end result is a simpler and more resilient system for delivering rapid preconfirmation data to users, without altering the core OP Stack protocol. + +# Motivation + +The original Flashblocks design relied on a centralized broadcast (via Rollup-Boost and a WebSocket proxy) to propagate flashblocks to RPC providers. While effective, that design introduced operational complexity and potential single points of failure: + +* **Operational Complexity:** Sequencer operators had to manage a WebSocket broadcasting service (e.g. Rollup-Boost’s WebSocket proxy) to fan-out flashblocks to providers. In multi-sequencer (HA) configurations, handing off this connection or migrating subscribers was cumbersome. +* **Failover Challenges:** In a High Availability sequencer setup, if the active sequencer failed the act of switching to a new sequencer/rollup-boost/builder combo would mean that already published flashblocks would not make it in the new block produced by the new builder. This breaks the promise that flashblocks makes to its consumers. +* **Scalability and Decentralization:** Relying on a single hub (the sequencer’s Rollup-Boost) to redistribute flashblocks could become a bottleneck. A P2P approach can naturally scale out to many peers and align with Ethereum’s existing propagation model for blocks and transactions. + +**P2P Propagation** addresses these issues by leveraging a gossip network for flashblocks. In this model, any number of RPC provider nodes (or other interested parties) can connect to the flashblock P2P network to receive preconfirmation updates. Failover is handled gracefully through the RLPx protocol: if a new sequencer takes over, its builder is already aware of previously published flashblocks, and so it can build on top of what has already been promised to the network. + +# Specification + +## Terminology + +We inherit all terminology from the original Flashblocks spec (Sequencer, Block Builder, Rollup-Boost, etc.), with a few new terms introduced: + +* **Authorizer** – The entity that vouches for a block builder’s legitimacy to produce flashblocks. In practice, this is rollup-boost who signs an authorization for a given builder each block cycle. +* **Builder Public Key** – A cryptographic public key identifying a builder on the flashblocks P2P network. This is distinct from an Ethereum address; it’s used for signing/validating flashblock messages. +* **Flashblocks P2P Network** – The peer-to-peer overlay network (using Ethereum’s devp2p protocols) through which flashblock messages are gossiped. Participants include all builders and one or more subscribing nodes (e.g. RPC providers, possibly other sequencer nodes in standby). +* **Publisher** – The current active builder that is publishing flashblocks for the ongoing L2 block. In an HA setup, the role of publisher can transfer to a new builder if the sequencer fails over. + +## Data Structures + +The fundamental flashblock data structures (`FlashblocksPayloadV1`, `ExecutionPayloadFlashblockResultV1`, `ExecutionPayloadStaticV1`, and the various Metadata containers) remain unchanged. Flashblocks are still represented as a sequence of incremental payloads culminating in a full block. + +To support P2P propagation and authorization, we introduce several new structures: + +### **`Authorization`** + +Represents a sequencer’s cryptographic authorization for a specific builder to produce a block with a given payload context. This is essentially a signed token from the sequencer (authorizer) that the builder includes with its flashblocks. + +```rust +pub struct Authorization { + pub payload_id: PayloadId, + pub timestamp: u64, + pub builder_vk: VerifyingKey, + pub authorizer_sig: Signature, +} +``` + +* `payload_id`: The unique ID for this block’s payload (as provided by `engine_forkchoiceUpdated` in the OP Stack Engine API). All flashblocks for the block share this ID. +* `timestamp`: The timestamp associated with this payload +* `builder_vk`: The verifying key identifying the builder authorized to publish this block’s flashblocks. Peers will use this to verify the builder’s signatures on messages. +* `authorizer_sig`: A signature produced by the sequencer (authorizer) over the concatenation of `payload_id`, `timestamp`, and `builder_vk`. This proves that the sequencer has approved the given builder (and key) to act for this block. Only one authorizer key (controlled by the rollup-boost operator) is recognized by the network, and all peers are configured with its public key for verification. + +### **`Authorized Message`** + +Container for any flashblocks P2P message that requires authorization. It bundles a payload (one of the message types defined below) with the authorization and a builder’s signature. + +```rust +pub struct Authorized { + pub msg: AuthorizedMsg, + pub authorization: Authorization, + pub actor_sig: Signature, +} +``` + +```rust +pub enum AuthorizedMsg { + FlashblocksPayloadV1(FlashblocksPayloadV1) = 0x00, + StartPublish(StartPublish) = 0x01, + StopPublish(StopPublish) = 0x02, +} +``` + +* `authorization`: The Authorization object, as described above. +* `msg`: The message content. This is a tagged union that can be one of: + + * A **Flashblock Payload** – Contains a `FlashblocksPayloadV1` (partial block delta), see below. + * A **StartPublish** signal – Indicates the builder is starting to publish a new block (detailed in [StartPublish](#startpublish)). + * A **StopPublish** signal – Indicates the builder is stopping publication (detailed in [StopPublish](#stoppublish)). + +* `actor_sig`: The builder’s signature over the combination of the `msg` and the `authorization`. This attests that the message indeed comes from the holder of the `builder_sk` in the Authorization, and that it hasn’t been tampered with in transit. + +Every P2P message in the Flashblocks protocol is sent as an `AuthorizedMessage`. This double-signature scheme (authorizer + builder) provides two layers of security: + +1. Only a builder with a valid Authorization (signed by the sequencer) can get its messages accepted by peers. +2. Only the genuine builder (holding the private key corresponding to `builder_sk`) can produce a valid `builder_signature` on the message content. + +### **`StartPublish`** + +A small message indicating the intention to begin publishing flashblocks for a new L2 block. + +```rust +pub struct StartPublish { + pub block_number: u64, +} +``` + +* `block_number`: The L2 block number that the builder is starting to construct/publish. This allows peers (and other potential builders) to coordinate and avoid conflicts (only one builder should publish for a given block number at a time). + +The `StartPublish` message is always sent wrapped in an `AuthorizedMessage` (with the appropriate authorization and signatures). It serves as an announcement to the network that *“Builder X is about to start building block N.”* + +### **`StopPublish`** + +An authorized message indicating that the builder will no longer publish any flashblocks + +```rust +pub struct StopPublish; +``` + +**Note:** A builder will typically send a `StopPublish` when it receives a `ForkChoiceUpdated` without an accompanying `Authorization` from rollup-boost or upon handing off flashblock production to a new builder. + +## Flashblocks P2P Protocol + +### Protocol Overview + +Flashblocks P2P communication is implemented as a custom Ethereum subprotocol. Specifically, it defines a new devp2p capability: + +* **Protocol Name:** `flblk` (flashblocks) +* **Version:** `1` + +Nodes that support flashblocks will advertise this capability when establishing devp2p connections. Once connected, they can exchange flashblock messages as defined in this spec. + +All flashblock messages are encoded in a compact binary format (analogous to Ethereum block gossip). Each message begins with a one-byte type discriminator, followed by the serialized content. The primary message type is an `AuthorizedMessage` (discriminator `0x00`), which, as described, contains a nested payload type. + +**Key design features of the P2P protocol:** + +* **Multipeer Gossip:** A builder’s flashblock is forwarded to all connected peers, who in turn may forward it to their peers, etc., ensuring the payload reaches all participants without needing a single central broadcaster. The protocol includes basic duplicate suppression so that flashblocks aren’t endlessly propagated in loops. +* **Real-time Coordination:** Using `StartPublish` and `StopPublish` signals, multiple potential publishers (builders) can coordinate access to the network. This prevents conflicts where two builders might try to publish simultaneously, and allows a smooth handoff in failover scenarios (detailed below). + +### Message Types + +Within the `AuthorizedMsg` union, we define the following variants and their semantics: + +* **Flashblock Payload Message:** Carries a `FlashblocksPayloadV1` (as defined in the original spec) for a specific partial block. This includes the incremental transactions, updated state root, receipts root, logs bloom, etc., up through that flashblock. Peers receiving this message will apply the included state updates to their preconfirmation cache. Each Flashblock message has an `index` (the flashblock sequence number) and may include the `base` section if it’s the first flashblock (index 0) for that block. +* **StartPublish Message:** Announces the start of a new publishers flashblock sequence. Peers use this to note which builder is now active for a given L2 block number, possibly resetting any previous state or halting their own publishing. +* **StopPublish Message:** Indicates the end of the flashblock sequence for the current publisher. After this message, no further flashblocks from that publisher should arrive. Inactive or waiting publishers use this as a cue that they may now take over for subsequent flashblocks. + +All these are encapsulated in `AuthorizedMsg` with the requisite signatures. + +### Authorization and Security + +The P2P protocol introduces a trust model wherein peers accept flashblocks only from an **authorized builder**. The security measures include: + +* **Authorizer Signature Verification:** Upon receiving any `AuthorizedMessage`, a peer will first verify the `authorizer_sig` in the `Authorization` against the known authorizer public key. This confirms that rollup-boost has indeed permitted the stated builder to produce the block with the given `payload_id` and timestamp. If this signature is missing or invalid, the message is discarded as untrusted. +* **Builder Signature Verification:** Next, the peer verifies the `builder_signature` on the message content using the `builder_vk` provided in the Authorization. This ensures the message was genuinely produced by the authorized builder and not altered. If this check fails, the message is rejected. +* **Payload Consistency Checks:** Peers also check that the fields in the message are self-consistent and match expectations: + + * The `payload_id` in the Authorization must match the `FlashblocksPayloadV1.payload_id` (for flashblock messages). Each builder’s flashblock messages carry the same payload\_id that was authorized, ensuring they all belong to the same block-building session. + * **Freshness:** The `timestamp` in Authorization helps guard against replay of old messages. If a flashblock or StartPublish arrives with a significantly older timestamp (or for an already completed block), peers will ignore it and decrement the sender's reputation. + +These measures ensure that **only** the rollup-boost sanctioned builder’s data is propagated and that it’s cryptographically sound. Unauthorized parties cannot inject false flashblocks or tamper with content without detection. This design also allows dynamic builder changes: as long as the sequencer signs a new Authorization, the peers will accept the new builder’s messages even if they have never seen that builder before, because trust is transitive from the authorizers’s key. + +### Multi-Builder Coordination + +A major benefit of the P2P approach is the ability to coordinate multiple builders in an HA (High Availability) setting. The `StartPublish` and `StopPublish` messages, in conjunction with a small amount of logic in Rollup-Boost and the network, handle the arbitration: + +* **Single Publisher Rule:** The network expects at most one builder to be actively publishing flashblocks for a given L2 block number at any time. If two different builders both attempt to publish for the same block, the conflict must be resolved to maintain a consistent preconfirmation state. +* **Announcing Intent – `StartPublish`:** When Rollup-Boost (sequencer) initiates a new block with an external builder, it immediately broadcasts a `StartPublish` message (as an AuthorizedMessage) from that builder. This tells all peers: “Builder X is about to start publishing” If any other builder was thinking of building block N (perhaps there was a recent failover), it will see this and **stand down**. +* **Graceful Yield – reacting to `StartPublish`:** If a builder is currently publishing and receives a `StartPublish` from a *different* builder for the same or next block, it means a failover or override is happening. The expected behavior is that the current publisher will cease publishing (and issue a `StopPublish`). The protocol is designed such that the honest builder who is not supposed to publish will yield to the authorized one. The reference implementation will automatically send a `StopPublish` if it is publishing and learns that another builder has taken over authority for the block. The new builder will wait until it receives the `StopPublish` before continuing. +* **Completion – `StopPublish`:** When a builder receives the next FCU _without_ an accompanying `Authorization`, it will send out a `StopPublish`. This removes the builder from the “active publisher” role in the eyes of the network. If there was another builder in waiting (perhaps one that had attempted to start earlier but was told to wait), that waiting builder will now see that the coast is clear. +* **Timeouts and Fallback:** There is an implicit timeout in the coordination. If a builder is in a waiting state after announcing `StartPublish` but for some reason the previous publisher fails to produce a `StopPublish` (for example, if it crashed mid-block), other participants will not wait indefinitely. In our design, if a new block number is reached and the previous publisher hasn’t stopped we assume the previous builder is incapacitated and proceed with the new publisher. + +This coordination ensures that in an HA setup with multiple sequencer instances and multiple builders, **preconfirmation data remains consistent**: only one set of flashblocks is ever in flight for a given block. If a sequencer failover occurs, the worst-case scenario (which occurs only during a very rare race condition) is a single block publication gap or discontinuity at a block boundary. In the far more likely case, there will be exactly no flashblock disruption. The next publisher will simply start where the last publisher left off, even if that is mid block. + +## Rollup-Boost and Builder Communication + +In the P2P-enhanced design, Rollup-Boost’s interaction with the external block builder is slightly adjusted: + +* **Authorization Delivery:** When the sequencer (op-node) triggers a new block proposal via `engine_forkchoiceUpdated` (with payload attributes), Rollup-Boost creates an `Authorization` for the chosen builder. This requires that Rollup-Boost knows the builder’s public key in advance. In practice, the builder can be configured or registered with Rollup-Boost, providing its long-term public key. Rollup-Boost uses its **authorizer private key** (associated with the L2 chain or sequencer) to sign the authorization (covering payload\_id, timestamp, builder’s key). +* **Forkchoice Updated Forwarding:** Rollup-Boost forwards the fork choice update to the builder as usual (so the builder can start building the block). In this modified protocol, the fork choice update (or a parallel communication) includes the newly created `Authorization`. For example, a custom field or side-channel could convey the authorizer’s signature to the builder. **(Implementation-wise, this might be an extension of the Engine API or an internal call – the key point is the builder receives the Authorization token before it begins sending flashblocks.)** +* **StartPublish Broadcast:** If the builder was not previously publishing, then immediately after receiving the authorization it will emit a `StartPublish` message over the P2P network. This tells all listening nodes that the authorized builder will begin flashblock publication. +* **Streaming Flashblocks:** The builder executes transactions and produces flashblocks incrementally just as described in the original spec’s Flashblock Construction Process. However, instead of returning these payloads to Rollup-Boost, the builder now signs each flashblock with its key and directly broadcasts an Authorized Flashblock message to the P2P network. +* **No Inline Validation by Sequencer:** In the original design, Rollup-Boost would validate each flashblock against the local execution engine before propagating it. In the P2P model, this is not done synchronously for each flashblock (it would negate some latency benefits). Instead, trust is managed via the Authorization. The sequencer trusts its chosen builder to only send valid blocks (and will ultimately verify the final block when `engine_getPayload` is called). Peers trust the flashblocks because they trust the Rollup-Boost’s signature. + +In summary, Rollup-Boost’s role shifts from being a **middleman for data** to being a **controller and coordinator**. It authorizes the builder and informs the network about which builder is active, but it doesn’t need to ferry every flashblock through itself. This streamlines the path from builder to RPC providers. + From aa2f722f25383fe482889030f6326e51791b6435 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 21:37:24 -0700 Subject: [PATCH 054/114] chore: rename --- specs/{flashblocks-p2p.md => flashblocks_p2p.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename specs/{flashblocks-p2p.md => flashblocks_p2p.md} (100%) diff --git a/specs/flashblocks-p2p.md b/specs/flashblocks_p2p.md similarity index 100% rename from specs/flashblocks-p2p.md rename to specs/flashblocks_p2p.md From 83cb7ef18784738eee7a53b8fefc1b63a5efa533 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 22:06:54 -0700 Subject: [PATCH 055/114] todo: handle replay attacks --- crates/flashblocks-p2p/src/protocol/connection.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 30926a7d..5f3120b9 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -248,6 +248,7 @@ impl FlashblocksConnection { self.handler.ctx.publish(&mut state, authorized_payload); } + // TODO: Handle replay attacks with StartPublish messages. // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { let mut state = self.handler.state.lock(); @@ -324,6 +325,7 @@ impl FlashblocksConnection { } } + // TODO: Handle replay attacks with StopPublish messages. // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { let mut state = self.handler.state.lock(); From d24dcb5a0965629fe988e15d48df61b2da821de0 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 23 Jul 2025 22:18:17 -0700 Subject: [PATCH 056/114] feat: mitigate Start/StopPublish replay attacks --- .../src/protocol/connection.rs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 5f3120b9..a3d8cdd9 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -17,8 +17,6 @@ use std::{ use tokio_stream::wrappers::BroadcastStream; use tracing::trace; -pub const INNITIATE_BUILD_TIMOUT: u64 = 8; // seconds - pub struct FlashblocksConnection { pub handler: FlashblocksHandler, pub conn: ProtocolConnection, @@ -248,17 +246,16 @@ impl FlashblocksConnection { self.handler.ctx.publish(&mut state, authorized_payload); } - // TODO: Handle replay attacks with StartPublish messages. // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { let mut state = self.handler.state.lock(); let authorization = &authorized_payload.authorized.authorization; let msg = authorized_payload.msg(); - // Check if the request is expired for dos protection - if state.payload_timestamp - > authorized_payload.authorized.authorization.timestamp + INNITIATE_BUILD_TIMOUT - { + // Check if the request is expired for dos protection. + // It's important to ensure that this `StartPublish` request + // is very recent, or it could be used in a replay attack. + if state.payload_timestamp > authorization.timestamp { tracing::warn!( target: "flashblocks::p2p", peer_id = %self.peer_id, @@ -325,13 +322,15 @@ impl FlashblocksConnection { } } - // TODO: Handle replay attacks with StopPublish messages. // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { let mut state = self.handler.state.lock(); - if state.payload_timestamp - > authorized_payload.authorized.authorization.timestamp + INNITIATE_BUILD_TIMOUT - { + let authorization = &authorized_payload.authorized.authorization; + + // Check if the request is expired for dos protection. + // It's important to ensure that this `StartPublish` request + // is very recent, or it could be used in a replay attack. + if state.payload_timestamp > authorization.timestamp { tracing::warn!( target: "flashblocks::p2p", peer_id = %self.peer_id, From 6b453363d5e14ac4cd2a3c306abc2140be8db09b Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 24 Jul 2025 10:59:28 -0700 Subject: [PATCH 057/114] add doc commends to p2p.rs --- crates/rollup-boost/src/flashblocks/p2p.rs | 147 +++++++++++++++++++-- 1 file changed, 136 insertions(+), 11 deletions(-) diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index d550de94..01741f4e 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -9,35 +9,66 @@ use serde::{Deserialize, Serialize}; use crate::{FlashblocksP2PError, FlashblocksPayloadV1}; +/// An authorization token that grants a builder permission to publish flashblocks for a specific payload. +/// +/// The `authorizer_sig` is made over the `payload_id`, `timestamp`, and `builder_vk`. This is +/// useful because it allows the authorizer to control which builders can publish flashblocks in +/// real time, without relying on consumers to verify the builder's public key against a +/// pre-defined list. #[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Authorization { + /// The unique identifier of the payload this authorization applies to pub payload_id: PayloadId, + /// Unix timestamp when this authorization was created pub timestamp: u64, + /// The public key of the builder who is authorized to sign messages pub builder_vk: VerifyingKey, + /// The authorizer's signature over the payload_id, timestamp, and builder_vk pub authorizer_sig: Signature, } +/// A message requesting to start publishing flashblock payloads at a specific block number. +/// +/// This message is sent to indicate that the sender wants to begin publishing flashblock +/// payloads starting from the specified block number. #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub struct StartPublish { + /// The block number from which to start publishing flashblock payloads pub block_number: u64, } +/// A message requesting to stop publishing flashblock payloads. +/// +/// This is a simple marker message with no fields that indicates the sender +/// wants to stop publishing flashblock payloads. #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub struct StopPublish; /// A message that can be sent over the Flashblocks P2P network. +/// +/// This enum represents the top-level message types that can be transmitted +/// over the P2P network. Currently all messages are wrapped in authorization to ensure +/// only authorized builders can create new messages. #[repr(u8)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub enum FlashblocksP2PMsg { + /// An authorized message containing a signed and authorized payload Authorized(Authorized) = 0x00, } +/// The different types of authorized messages that can be sent over the Flashblocks P2P network. +/// +/// This enum represents the actual payload types that can be wrapped in authorization. +/// Each variant corresponds to a specific type of operation or data transmission. #[allow(clippy::large_enum_variant)] #[repr(u8)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] pub enum AuthorizedMsg { + /// A flashblock payload containing a list of transactions and associated metadata FlashblocksPayloadV1(FlashblocksPayloadV1) = 0x00, + /// A declaration to start publishing flashblock payloads from a specific block number StartPublish(StartPublish) = 0x01, + /// A declaration to stop publishing flashblock payloads StopPublish(StopPublish) = 0x02, } @@ -60,32 +91,60 @@ impl From for AuthorizedMsg { } impl Authorization { + /// Creates a new authorization token for a builder to publish messages for a specific payload. + /// + /// This function creates a cryptographic authorization by signing a message containing the + /// payload ID, timestamp, and builder's public key using the authorizer's signing key. + /// + /// # Arguments + /// + /// * `payload_id` - The unique identifier of the payload this authorization applies to + /// * `timestamp` - Unix timestamp associated with this `payload_id` + /// * `authorizer_sk` - The authorizer's signing key used to create the signature + /// * `actor_vk` - The verifying key of the actor being authorized + /// + /// # Returns + /// + /// A new `Authorization` instance with the generated signature pub fn new( payload_id: PayloadId, timestamp: u64, authorizer_sk: &SigningKey, - builder_pub: VerifyingKey, + actor_vk: VerifyingKey, ) -> Self { let mut msg = payload_id.0.to_vec(); msg.extend_from_slice(×tamp.to_le_bytes()); - msg.extend_from_slice(builder_pub.as_bytes()); + msg.extend_from_slice(actor_vk.as_bytes()); let hash = blake3::hash(&msg); let sig = authorizer_sk.sign(hash.as_bytes()); Self { payload_id, timestamp, - builder_vk: builder_pub, + builder_vk: actor_vk, authorizer_sig: sig, } } - pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { + /// Verifies the authorization signature against the provided authorizer's verifying key. + /// + /// This function reconstructs the signed message from the authorization data and verifies + /// that the signature was created by the holder of the authorizer's private key. + /// + /// # Arguments + /// + /// * `authorizer_sk` - The verifying key of the authorizer to verify against + /// + /// # Returns + /// + /// * `Ok(())` if the signature is valid + /// * `Err(FlashblocksP2PError::InvalidAuthorizerSig)` if the signature is invalid + pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksP2PError> { let mut msg = self.payload_id.0.to_vec(); msg.extend_from_slice(&self.timestamp.to_le_bytes()); msg.extend_from_slice(self.builder_vk.as_bytes()); let hash = blake3::hash(&msg); - authorizer_pub + authorizer_sk .verify(hash.as_bytes(), &self.authorizer_sig) .map_err(|_| FlashblocksP2PError::InvalidAuthorizerSig) } @@ -172,11 +231,16 @@ impl Decodable for Authorization { } } -/// A signed and authorized message that can be sent over the Flashblocks P2P network. +/// A type-safe wrapper around an authorized message for the Flashblocks P2P network. +/// +/// This struct provides type safety by encoding the specific message type `T` +/// at the type level while wrapping the underlying `Authorized` message. It uses a +/// phantom type marker to maintain type information without runtime overhead. #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct AuthorizedPayload { + /// The underlying authorized message containing the actual payload and signatures pub authorized: Authorized, - /// The underlying message type + /// Phantom type marker to maintain type safety for the specific message type pub _marker: PhantomData, } @@ -184,6 +248,20 @@ impl AuthorizedPayload where T: Into, { + /// Creates a new type-safe authorized payload. + /// + /// This constructor creates an authorized message by wrapping the provided message + /// with authorization and signing it with the actor's signing key. + /// + /// # Arguments + /// + /// * `actor_sk` - The signing key of the actor (builder) creating the message + /// * `authorization` - The authorization token granting permission to send this message + /// * `msg` - The message payload to be authorized and signed + /// + /// # Returns + /// + /// A new `AuthorizedPayload` instance with type safety for the message type pub fn new(actor_sk: &SigningKey, authorization: Authorization, msg: T) -> Self { let msg = msg.into(); let authorized = Authorized::new(actor_sk, authorization, msg); @@ -207,6 +285,20 @@ pub struct Authorized { } impl Authorized { + /// Creates a new authorized message by combining a message with authorization and signing it. + /// + /// This function takes a message and authorization token, encodes them together, creates + /// a hash of the combined data, and signs it with the actor's signing key. + /// + /// # Arguments + /// + /// * `actor_sk` - The signing key of the actor (builder) creating the message + /// * `authorization` - The authorization token granting permission to send this message + /// * `msg` - The message to be authorized and signed + /// + /// # Returns + /// + /// A new `Authorized` instance containing the message, authorization, and signature pub fn new(actor_sk: &SigningKey, authorization: Authorization, msg: AuthorizedMsg) -> Self { let mut encoded = Vec::new(); msg.encode(&mut encoded); @@ -222,8 +314,23 @@ impl Authorized { } } - pub fn verify(&self, authorizer_pub: VerifyingKey) -> Result<(), FlashblocksP2PError> { - self.authorization.verify(authorizer_pub)?; + /// Verifies both the authorization and actor signatures. + /// + /// This function performs a two-step verification process: + /// 1. Verifies that the authorization signature is valid for the given authorizer + /// 2. Verifies that the actor signature is valid for the message and authorization + /// + /// # Arguments + /// + /// * `authorizer_sk` - The public key of the authorizer to verify against + /// + /// # Returns + /// + /// * `Ok(())` if both signatures are valid + /// * `Err(FlashblocksP2PError::InvalidAuthorizerSig)` if the authorization signature is invalid + /// * `Err(FlashblocksP2PError::InvalidBuilderSig)` if the actor signature is invalid + pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksP2PError> { + self.authorization.verify(authorizer_sk)?; let mut encoded = Vec::new(); self.msg.encode(&mut encoded); @@ -236,6 +343,18 @@ impl Authorized { .map_err(|_| FlashblocksP2PError::InvalidBuilderSig) } + /// Converts this `Authorized` message into a type-safe `AuthorizedPayload` without verification. + /// + /// This is an unchecked conversion that bypasses type checking. The caller must ensure + /// that the contained message is actually of type `T`. + /// + /// # Type Parameters + /// + /// * `T` - The expected type of the contained message + /// + /// # Returns + /// + /// An `AuthorizedPayload` wrapper around this authorized message pub fn into_unchecked(self) -> AuthorizedPayload { AuthorizedPayload:: { authorized: self, @@ -248,6 +367,14 @@ impl AuthorizedPayload where AuthorizedMsg: AsRef, { + /// Returns a reference to the underlying message of type `T`. + /// + /// This method provides type-safe access to the contained message by leveraging + /// the `AsRef` trait implementation to extract the specific message type. + /// + /// # Returns + /// + /// A reference to the message of type `T` pub fn msg(&self) -> &T { self.authorized.msg.as_ref() } @@ -316,7 +443,6 @@ impl Decodable for Authorized { } impl FlashblocksP2PMsg { - /// Creates a new `FlashblocksP2PError` with the given message ID and payload. pub fn encode(&self) -> BytesMut { let mut buf = BytesMut::new(); match self { @@ -328,7 +454,6 @@ impl FlashblocksP2PMsg { buf } - /// Decodes a `FlashblocksP2PError` from the given message buffer. pub fn decode(buf: &mut &[u8]) -> Result { if buf.is_empty() { return Err(FlashblocksP2PError::InputTooShort); From 7680cb792e0d40082d9f5a56320cc1fb9e6fac88 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 24 Jul 2025 10:59:50 -0700 Subject: [PATCH 058/114] add failover tests --- crates/flashblocks-node/tests/p2p.rs | 111 ++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 7daa9cd9..7f255bed 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -22,6 +22,7 @@ use reth_optimism_node::{OpNode, args::RollupArgs}; use reth_optimism_primitives::{OpPrimitives, OpReceipt}; use reth_provider::providers::BlockchainProvider; use reth_tasks::{TaskExecutor, TaskManager}; +use reth_tracing::tracing_subscriber; use rollup_boost::{ Authorization, AuthorizedPayload, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, @@ -305,8 +306,114 @@ async fn setup_nodes(n: u8) -> eyre::Result<(Vec, SigningKey)> { } #[tokio::test] -async fn test_peering() -> eyre::Result<()> { - reth_tracing::init_test_tracing(); +async fn test_double_failover() -> eyre::Result<()> { + tracing_subscriber::fmt() + .with_env_filter("warn,flashblocks=trace") + .with_target(false) + .with_target(false) + .without_time() + .init(); + + let (nodes, authorizer) = setup_nodes(3).await?; + + let mut publish_flashblocks = nodes[0].p2p_handle.ctx.flashblock_tx.subscribe(); + tokio::spawn(async move { + while let Ok(payload) = publish_flashblocks.recv().await { + println!("\n////////////////////////////////////////////////////////////////////\n"); + println!( + "Received flashblock, payload_id: {}, index: {}", + payload.payload_id, payload.index + ); + println!("\n////////////////////////////////////////////////////////////////////\n"); + } + }); + + let latest_block = nodes[0] + .provider() + .await? + .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) + .await? + .expect("latest block expected"); + assert_eq!(latest_block.number(), 0); + + // Querying pending block when it does not exists yet + let pending_block = nodes[0] + .provider() + .await? + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await?; + assert!(pending_block.is_none()); + + let payload_0 = payload_base(0, PayloadId::new([0; 8]), 0); + let authorization_0 = Authorization::new( + payload_0.payload_id, + 0, + &authorizer, + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + ); + let msg = payload_0.clone(); + let authorized_0 = + AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization_0, msg); + nodes[0].p2p_handle.start_publishing( + authorization_0, + payload_0.base.unwrap().block_number, + payload_0.payload_id, + ); + nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + let payload_1 = payload_next(payload_0.payload_id, 1); + let authorization_1 = Authorization::new( + payload_1.payload_id, + 0, + &authorizer, + nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), + ); + let authorized_1 = AuthorizedPayload::new( + &nodes[1].p2p_handle.ctx.builder_sk, + authorization_1, + payload_1.clone(), + ); + nodes[1] + .p2p_handle + .start_publishing(authorization_1, 0, payload_1.payload_id); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + nodes[1].p2p_handle.publish_new(authorized_1).unwrap(); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + // Send a new block, this time from node 1 + let payload_2 = payload_next(payload_0.payload_id, 2); + let msg = payload_2.clone(); + let authorization_2 = Authorization::new( + payload_2.payload_id, + 0, + &authorizer, + nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), + ); + let authorized_2 = AuthorizedPayload::new( + &nodes[2].p2p_handle.ctx.builder_sk, + authorization_2, + msg.clone(), + ); + nodes[2] + .p2p_handle + .start_publishing(authorization_2, 0, payload_2.payload_id); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + nodes[2].p2p_handle.publish_new(authorized_2).unwrap(); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + Ok(()) +} + +#[tokio::test] +async fn test_force_race_condition() -> eyre::Result<()> { + tracing_subscriber::fmt() + .with_env_filter("warn,flashblocks=trace") + .with_target(false) + .with_target(false) + .without_time() + .init(); + let (nodes, authorizer) = setup_nodes(3).await?; let mut publish_flashblocks = nodes[0].p2p_handle.ctx.flashblock_tx.subscribe(); From bd451a16d2e76dac54bfc2e8f553d91d42b2dfd1 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 24 Jul 2025 13:06:22 -0700 Subject: [PATCH 059/114] feat: Add doc comments --- .../src/protocol/connection.rs | 32 +++- .../flashblocks-p2p/src/protocol/handler.rs | 174 ++++++++++++++---- 2 files changed, 163 insertions(+), 43 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index a3d8cdd9..633e413f 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -17,17 +17,28 @@ use std::{ use tokio_stream::wrappers::BroadcastStream; use tracing::trace; +/// Represents a single P2P connection for the flashblocks protocol. +/// +/// This struct manages the bidirectional communication with a single peer in the flashblocks +/// P2P network. It handles incoming messages from the peer, validates and processes them, +/// and also streams outgoing messages that need to be broadcast. +/// +/// The connection implements the `Stream` trait to provide outgoing message bytes that +/// should be sent to the connected peer over the underlying protocol connection. pub struct FlashblocksConnection { + /// The flashblocks protocol handler that manages the overall protocol state. pub handler: FlashblocksHandler, + /// The underlying protocol connection for sending and receiving raw bytes. pub conn: ProtocolConnection, + /// The unique identifier of the connected peer. pub peer_id: PeerId, /// Receiver for peer messages to be sent to all peers. /// We send bytes over this stream to avoid repeatedly having to serialize the payloads. pub peer_rx: BroadcastStream, - /// Most recent payload received from this peer. + /// Most recent payload ID received from this peer to track payload transitions. pub payload_id: PayloadId, - /// A list of flashblocks indices that we have already received from - /// this peer for the current payload. + /// A list of flashblock indices that we have already received from + /// this peer for the current payload, used to detect duplicate messages. pub received: Vec, } @@ -161,6 +172,21 @@ impl Stream for FlashblocksConnection { } impl FlashblocksConnection { + /// Handles incoming flashblock payload messages from a peer. + /// + /// This method validates the flashblock payload, checks for duplicates and ordering, + /// updates the active publisher tracking, and forwards valid payloads for processing. + /// It also manages peer reputation based on message validity and prevents spam attacks. + /// + /// # Arguments + /// * `authorized_payload` - The authorized flashblock payload received from the peer + /// + /// # Behavior + /// - Validates timestamp to prevent replay attacks + /// - Tracks payload transitions and resets duplicate detection + /// - Prevents duplicate flashblock spam from the same peer + /// - Updates active publisher information from base payload data + /// - Forwards valid payloads to the protocol handler for processing fn handle_flashblocks_payload_v1( &mut self, authorized_payload: AuthorizedPayload, diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 9b9c402b..530c5b62 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -34,26 +34,43 @@ const MAX_FLASHBLOCK_INDEX: usize = 100; /// The maximum number of blocks we will wait for a previous publisher to stop const MAX_PUBLISH_WAIT_BLOCKS: u64 = 1; +/// Trait bound for network handles that can be used with the flashblocks P2P protocol. +/// +/// This trait combines all the necessary bounds for a network handle to be used +/// in the flashblocks P2P system, including peer management capabilities. pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} impl FlashblocksP2PNetworHandle for N {} +/// Messages that can be broadcast over a channel to each internal peer connection. +/// +/// These messages are used internally to coordinate the broadcasting of flashblocks +/// and publishing status changes to all connected peers. #[derive(Clone, Debug)] pub enum PeerMsg { /// Send an already serialized flashblock to all peers. FlashblocksPayloadV1((PayloadId, usize, BytesMut)), - /// Send a previously serialized p2p message to all peers. + /// Send a previously serialized StartPublish message to all peers. StartPublishing(BytesMut), - /// Send a previously serialized p2p message to all peers. + /// Send a previously serialized StopPublish message to all peers. StopPublishing(BytesMut), } +/// The current publishing status of this node in the flashblocks P2P network. +/// +/// This enum tracks whether we are actively publishing flashblocks, waiting to publish, +/// or not publishing at all. It also maintains information about other active publishers +/// to coordinate multi-builder scenarios and handle failover situations. #[derive(Clone, Debug)] pub enum PublishingStatus { /// We are currently publishing flashblocks. - Publishing { authorization: Authorization }, + Publishing { + /// The authorization token that grants us permission to publish. + authorization: Authorization, + }, /// We are waiting for the previous publisher to stop. WaitingToPublish { + /// The authorization token we will use once we start publishing. authorization: Authorization, /// A map of active publishers (excluding ourselves) to their most recently published /// or requested to publish block number. @@ -75,60 +92,89 @@ impl Default for PublishingStatus { } } -/// Protocol state is an helper struct to store the protocol events. +/// Protocol state that stores the flashblocks P2P protocol events and coordination data. +/// +/// This struct maintains the current state of flashblock publishing, including coordination +/// with other publishers, payload buffering, and ordering information. It serves as the +/// central state management for the flashblocks P2P protocol handler. #[derive(Debug, Default)] pub struct FlashblocksP2PState { + /// Current publishing status indicating whether we're publishing, waiting, or not publishing. pub publishing_status: PublishingStatus, /// Block number of the most recent flashblocks payload. - /// We only recieve the block bumber from `ExecutionPayloadBaseV1` - /// so this may be set to `None` in the even that we receive the flashblocks payloads + /// We only receive the block number from `ExecutionPayloadBaseV1` + /// so this may be set to `None` in the event that we receive the flashblocks payloads /// out of order. pub block_number: Option, - /// Most recent payload id. + /// Most recent payload ID for the current block being processed. pub payload_id: PayloadId, /// Timestamp of the most recent flashblocks payload. pub payload_timestamp: u64, - /// The index of the next flashblock to emit over the flashblocks_stream. + /// The index of the next flashblock to emit over the flashblocks stream. + /// Used to maintain strict ordering of flashblock delivery. pub flashblock_index: usize, - /// Buffer of flashblocks for the current payload. + /// Buffer of flashblocks for the current payload, indexed by flashblock sequence number. + /// Contains `None` for flashblocks not yet received, enabling out-of-order receipt + /// while maintaining in-order delivery. pub flashblocks: Vec>, } impl FlashblocksP2PState { - /// Returns wether or now we are currently allowed to publish flashblocks. + /// Returns the current publishing status of this node. + /// + /// This indicates whether the node is actively publishing flashblocks, + /// waiting to publish, or not publishing at all. pub fn publishing_status(&self) -> PublishingStatus { self.publishing_status.clone() } } -/// The protocol handler takes care of incoming and outgoing connections. +/// Context struct containing shared resources for the flashblocks P2P protocol. +/// +/// This struct holds the network handle, cryptographic keys, and communication channels +/// used across all connections in the flashblocks P2P protocol. It provides the shared +/// infrastructure needed for message verification, signing, and broadcasting. #[derive(Clone, Debug)] pub struct FlashblocksP2PCtx { - /// Network handle, used to update peer state. + /// Network handle used to update peer reputation and manage connections. pub network_handle: N, - /// Authorizer verifying, used to verify flashblocks payloads. + /// Authorizer's verifying key used to verify authorization signatures from rollup-boost. pub authorizer_vk: VerifyingKey, - /// Builder signing key, used to sign authorized p2p messages. + /// Builder's signing key used to sign outgoing authorized P2P messages. pub builder_sk: SigningKey, - /// Sender for flashblocks payloads which will be broadcasted to all peers. - /// May not be strictly ordered. + /// Broadcast sender for peer messages that will be sent to all connected peers. + /// Messages may not be strictly ordered due to network conditions. pub peer_tx: broadcast::Sender, - /// Receiver of verified and strictly ordered flashbloacks payloads. - /// For consumption by the rpc overlay. + /// Broadcast sender for verified and strictly ordered flashblock payloads. + /// Used by RPC overlays and other consumers of flashblock data. pub flashblock_tx: broadcast::Sender, } -/// A cloneable protocol handler that takes care of incoming and outgoing connections. +/// Main protocol handler for the flashblocks P2P protocol. +/// +/// This handler manages incoming and outgoing connections, coordinates flashblock publishing, +/// and maintains the protocol state across all peer connections. It implements the core +/// logic for multi-builder coordination and failover scenarios in HA sequencer setups. #[derive(Clone, Debug)] pub struct FlashblocksHandler { - /// Network handle, used to update peer state. + /// Shared context containing network handle, keys, and communication channels. pub ctx: FlashblocksP2PCtx, - /// Mutable state of the flashblocks protocol. + /// Thread-safe mutable state of the flashblocks protocol. + /// Protected by a mutex to allow concurrent access from multiple connections. pub state: Arc>, } impl FlashblocksHandler { - /// Creates a new protocol handler with the given state. + /// Creates a new flashblocks P2P protocol handler. + /// + /// Initializes the handler with the necessary cryptographic keys, network handle, + /// and communication channels. The handler starts in a non-publishing state. + /// + /// # Arguments + /// * `network_handle` - Network handle for peer management and reputation updates + /// * `authorizer_vk` - Verifying key for validating authorization signatures from rollup-boost + /// * `builder_sk` - Signing key for this builder to sign outgoing messages + /// * `flashblock_tx` - Broadcast channel for publishing verified flashblocks to consumers pub fn new( network_handle: N, authorizer_vk: VerifyingKey, @@ -148,17 +194,30 @@ impl FlashblocksHandler { Self { ctx, state } } - /// Returns the capability for the `flashblocks v1` p2p rotocol. + /// Returns the P2P capability for the flashblocks v1 protocol. + /// + /// This capability is used during devp2p handshake to advertise support + /// for the flashblocks protocol with protocol name "flblk" and version 1. pub fn capability() -> Capability { Capability::new_static("flblk", 1) } - /// Publishes a newly created flashblock from the payload builder to the state and to the p2p network. - /// Returns an error if we don't have clearance to publish flashblocks. - /// You must call `start_publishing` on the current block before publishing any payloads for - /// this block. + /// Publishes a newly created flashblock from the payload builder to the P2P network. + /// + /// This method validates that the builder has authorization to publish and that + /// the authorization matches the current publishing session. The flashblock is + /// then processed, cached, and broadcast to all connected peers. + /// + /// # Arguments + /// * `authorized_payload` - The signed flashblock payload with authorization /// - /// TODO: We should eventually assert that flashblocks are consecutive and have the correct parrent + /// # Returns + /// * `Ok(())` if the flashblock was successfully published + /// * `Err` if the builder lacks authorization or the authorization is outdated + /// + /// # Note + /// You must call `start_publishing` before calling this method to establish + /// authorization for the current block. pub fn publish_new( &self, authorized_payload: AuthorizedPayload, @@ -177,17 +236,34 @@ impl FlashblocksHandler { Ok(()) } - /// Returns the current publishing status. - /// You must call `start_publishing` on the current block before this will return the current - /// status. + /// Returns the current publishing status of this node. + /// + /// The status indicates whether the node is actively publishing flashblocks, + /// waiting for another publisher to stop, or not publishing at all. + /// + /// # Returns + /// The current `PublishingStatus` enum value pub fn publishing_status(&self) -> PublishingStatus { self.state.lock().publishing_status.clone() } - /// This should be called immediately after we receive a ForkChoiceUpdated - /// with attributes, and the included Auhorization for each block. It's important to - /// note that calling this does not guarantee that we will immediately have clearance - /// to publish. + /// Initiates flashblock publishing for a new block. + /// + /// This method should be called immediately after receiving a ForkChoiceUpdated + /// with payload attributes and the corresponding Authorization token. It coordinates + /// with other potential publishers to ensure only one builder publishes at a time. + /// + /// The method may transition the node to either Publishing or WaitingToPublish state + /// depending on whether other builders are currently active. + /// + /// # Arguments + /// * `new_authorization` - Authorization token signed by rollup-boost for this block + /// * `new_block_number` - L2 block number being built + /// * `new_payload_id` - Unique identifier for this block's payload + /// + /// # Note + /// Calling this method does not guarantee immediate publishing clearance. + /// The node may need to wait for other publishers to stop first. pub fn start_publishing( &self, new_authorization: Authorization, @@ -265,9 +341,14 @@ impl FlashblocksHandler { } } - /// Sends a message over the p2p network letting other peers know that we are stopping - /// This should be called whenever we receive a ForkChoiceUpdated without attributes - /// or without and `Authorization`. + /// Stops flashblock publishing and notifies the P2P network. + /// + /// This method broadcasts a StopPublish message to all connected peers and transitions + /// the node to a non-publishing state. It should be called when receiving a + /// ForkChoiceUpdated without payload attributes or without an Authorization token. + /// + /// # Arguments + /// * `block_height` - The L2 block number at which publishing is being stopped pub fn stop_publishing(&self, block_height: u64) { let mut state = self.state.lock(); match &mut state.publishing_status { @@ -313,8 +394,21 @@ impl FlashblocksHandler { } impl FlashblocksP2PCtx { - /// Commit new and already verified flashblocks payloads to the state - /// broadcast them to peers, and publish them to the stream. + /// Processes and publishes a verified flashblock payload to the P2P network and local stream. + /// + /// This method handles the core logic of flashblock processing, including validation, + /// caching, and broadcasting. It ensures flashblocks are delivered in order while + /// allowing out-of-order receipt from the network. + /// + /// # Arguments + /// * `state` - Mutable reference to the protocol state for updating flashblock cache + /// * `authorized_payload` - The authorized flashblock payload to process and publish + /// + /// # Behavior + /// - Validates payload consistency with authorization + /// - Updates global state for new payloads with newer timestamps + /// - Caches flashblocks and maintains ordering for sequential delivery + /// - Broadcasts to peers and publishes ordered flashblocks to the stream pub fn publish( &self, state: &mut FlashblocksP2PState, From fd99315553e9700b5fb7b60b5b814311f04bf667 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 24 Jul 2025 16:11:50 -0700 Subject: [PATCH 060/114] feat: remove block_number in favour of timestamp --- crates/flashblocks-node/tests/p2p.rs | 14 ++---- .../src/protocol/connection.rs | 38 +++++++-------- .../flashblocks-p2p/src/protocol/handler.rs | 46 ++++++------------- crates/rollup-boost/src/flashblocks/p2p.rs | 25 +++------- specs/flashblocks_p2p.md | 8 +--- 5 files changed, 47 insertions(+), 84 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 7f255bed..ec7e7c36 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -356,8 +356,6 @@ async fn test_double_failover() -> eyre::Result<()> { AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization_0, msg); nodes[0].p2p_handle.start_publishing( authorization_0, - payload_0.base.unwrap().block_number, - payload_0.payload_id, ); nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -376,7 +374,7 @@ async fn test_double_failover() -> eyre::Result<()> { ); nodes[1] .p2p_handle - .start_publishing(authorization_1, 0, payload_1.payload_id); + .start_publishing(authorization_1); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[1].p2p_handle.publish_new(authorized_1).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -397,7 +395,7 @@ async fn test_double_failover() -> eyre::Result<()> { ); nodes[2] .p2p_handle - .start_publishing(authorization_2, 0, payload_2.payload_id); + .start_publishing(authorization_2); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[2].p2p_handle.publish_new(authorized_2).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -457,8 +455,6 @@ async fn test_force_race_condition() -> eyre::Result<()> { AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization, msg); nodes[0].p2p_handle.start_publishing( authorization, - payload_0.base.unwrap().block_number, - payload_0.payload_id, ); nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -533,13 +529,9 @@ async fn test_force_race_condition() -> eyre::Result<()> { ); nodes[1].p2p_handle.start_publishing( authorization_1, - payload_2.base.clone().unwrap().block_number, - payload_2.payload_id, ); nodes[2].p2p_handle.start_publishing( authorization_2, - payload_2.base.clone().unwrap().block_number, - payload_2.payload_id, ); // Wait for clearance to go through tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -554,7 +546,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { nodes[2] .p2p_handle - .stop_publishing(payload_2.base.unwrap().block_number); + .stop_publishing(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[1].p2p_handle.publish_new(authorized_1)?; diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 633e413f..69f0cc53 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -256,17 +256,15 @@ impl FlashblocksConnection { }; // Update the list of active publishers - if let Some(base) = &msg.base { - if let Some((_, block_number)) = active_publishers - .iter_mut() - .find(|(publisher, _)| *publisher == authorization.builder_vk) - { - // This is an existing publisher, we should update their block number - *block_number = base.block_number; - } else { - // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_vk, base.block_number)); - } + if let Some((_, timestamp)) = active_publishers + .iter_mut() + .find(|(publisher, _)| *publisher == authorization.builder_vk) + { + // This is an existing publisher, we should update their block number + *timestamp = authorization.timestamp; + } else { + // This is a new publisher, we should add them to the list of active publishers + active_publishers.push((authorization.builder_vk, authorization.timestamp)); } self.handler.ctx.publish(&mut state, authorized_payload); @@ -276,7 +274,6 @@ impl FlashblocksConnection { fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { let mut state = self.handler.state.lock(); let authorization = &authorized_payload.authorized.authorization; - let msg = authorized_payload.msg(); // Check if the request is expired for dos protection. // It's important to ensure that this `StartPublish` request @@ -297,7 +294,9 @@ impl FlashblocksConnection { } let active_publishers = match &mut state.publishing_status { - PublishingStatus::Publishing { authorization } => { + PublishingStatus::Publishing { + authorization: our_authorization, + } => { tracing::info!( target: "flashblocks::p2p", peer_id = %self.peer_id, @@ -306,7 +305,7 @@ impl FlashblocksConnection { let authorized = Authorized::new( &self.handler.ctx.builder_sk, - *authorization, + *our_authorization, StopPublish.into(), ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); @@ -314,7 +313,10 @@ impl FlashblocksConnection { self.handler.ctx.peer_tx.send(peer_msg).ok(); state.publishing_status = PublishingStatus::NotPublishing { - active_publishers: vec![(authorization.builder_vk, msg.block_number)], + active_publishers: vec![( + our_authorization.builder_vk, + authorization.timestamp, + )], }; return; @@ -336,15 +338,15 @@ impl FlashblocksConnection { PublishingStatus::NotPublishing { active_publishers } => active_publishers, }; - if let Some((_, block_number)) = active_publishers + if let Some((_, timestamp)) = active_publishers .iter_mut() .find(|(publisher, _)| *publisher == authorization.builder_vk) { // This is an existing publisher, we should update their block number - *block_number = msg.block_number; + *timestamp = authorization.timestamp; } else { // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_vk, msg.block_number)); + active_publishers.push((authorization.builder_vk, authorization.timestamp)); } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 530c5b62..ff673a5d 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -31,8 +31,8 @@ const MAX_FRAME: usize = 1 << 24; // 16 MiB /// this is just a sanity check to prevent excessive memory usage. const MAX_FLASHBLOCK_INDEX: usize = 100; -/// The maximum number of blocks we will wait for a previous publisher to stop -const MAX_PUBLISH_WAIT_BLOCKS: u64 = 1; +/// The maximum number of seconds we will wait for a previous publisher to stop +const MAX_PUBLISH_WAIT_SEC: u64 = 2; /// Trait bound for network handles that can be used with the flashblocks P2P protocol. /// @@ -101,11 +101,6 @@ impl Default for PublishingStatus { pub struct FlashblocksP2PState { /// Current publishing status indicating whether we're publishing, waiting, or not publishing. pub publishing_status: PublishingStatus, - /// Block number of the most recent flashblocks payload. - /// We only receive the block number from `ExecutionPayloadBaseV1` - /// so this may be set to `None` in the event that we receive the flashblocks payloads - /// out of order. - pub block_number: Option, /// Most recent payload ID for the current block being processed. pub payload_id: PayloadId, /// Timestamp of the most recent flashblocks payload. @@ -258,18 +253,11 @@ impl FlashblocksHandler { /// /// # Arguments /// * `new_authorization` - Authorization token signed by rollup-boost for this block - /// * `new_block_number` - L2 block number being built - /// * `new_payload_id` - Unique identifier for this block's payload /// /// # Note /// Calling this method does not guarantee immediate publishing clearance. /// The node may need to wait for other publishers to stop first. - pub fn start_publishing( - &self, - new_authorization: Authorization, - new_block_number: u64, - new_payload_id: PayloadId, - ) { + pub fn start_publishing(&self, new_authorization: Authorization) { let mut state = self.state.lock(); match &mut state.publishing_status { PublishingStatus::Publishing { authorization } => { @@ -282,18 +270,18 @@ impl FlashblocksHandler { } => { let most_recent_publisher = active_publishers .iter() - .map(|(_, block_number)| *block_number) + .map(|(_, timestamp)| *timestamp) .max() .unwrap_or_default(); // We are waiting to publish, so we update the authorization and // the block number at which we requested to start publishing. - if new_block_number >= most_recent_publisher + MAX_PUBLISH_WAIT_BLOCKS { + if new_authorization.timestamp >= most_recent_publisher + MAX_PUBLISH_WAIT_SEC { // If the block number is greater than the one we requested to start publishing, // we will update it. tracing::warn!( target: "flashblocks::p2p", - %new_payload_id, - %new_block_number, + payload_id = %new_authorization.payload_id, + timestamp = %new_authorization.timestamp, "waiting to publish timed out, starting to publish", ); state.publishing_status = PublishingStatus::Publishing { @@ -306,9 +294,7 @@ impl FlashblocksHandler { } PublishingStatus::NotPublishing { active_publishers } => { // Send an authorized `StartPublish` message to the network - let authorized_msg = AuthorizedMsg::StartPublish(StartPublish { - block_number: new_block_number, - }); + let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); let authorized_payload = Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); @@ -319,7 +305,7 @@ impl FlashblocksHandler { // If we have no previous publishers, we can start publishing immediately. tracing::info!( target: "flashblocks::p2p", - payload_id = %new_payload_id, + payload_id = %new_authorization.payload_id, "starting to publish flashblocks", ); state.publishing_status = PublishingStatus::Publishing { @@ -329,7 +315,7 @@ impl FlashblocksHandler { // If we have previous publishers, we will wait for them to stop. tracing::info!( target: "flashblocks::p2p", - payload_id = %new_payload_id, + payload_id = %new_authorization.payload_id, "waiting to publish flashblocks", ); state.publishing_status = PublishingStatus::WaitingToPublish { @@ -346,17 +332,15 @@ impl FlashblocksHandler { /// This method broadcasts a StopPublish message to all connected peers and transitions /// the node to a non-publishing state. It should be called when receiving a /// ForkChoiceUpdated without payload attributes or without an Authorization token. - /// - /// # Arguments - /// * `block_height` - The L2 block number at which publishing is being stopped - pub fn stop_publishing(&self, block_height: u64) { + pub fn stop_publishing(&self) { let mut state = self.state.lock(); match &mut state.publishing_status { PublishingStatus::Publishing { authorization } => { // We are currently publishing, so we send a stop message. tracing::info!( target: "flashblocks::p2p", - %block_height, + payload_id = %authorization.payload_id, + timestamp = %authorization.timestamp, "stopping to publish flashblocks", ); let authorized_payload = @@ -376,7 +360,8 @@ impl FlashblocksHandler { // We are waiting to publish, so we just update the status. tracing::info!( target: "flashblocks::p2p", - %block_height, + payload_id = %authorization.payload_id, + timestamp = %authorization.timestamp, "aborting wait to publish flashblocks", ); let authorized_payload = @@ -431,7 +416,6 @@ impl FlashblocksP2PCtx { // Check if this is a globally new payload if authorization.timestamp > state.payload_timestamp { - state.block_number = payload.base.as_ref().map(|b| b.block_number); state.payload_id = authorization.payload_id; state.payload_timestamp = authorization.timestamp; state.flashblock_index = 0; diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index 01741f4e..bc37c26c 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -27,16 +27,9 @@ pub struct Authorization { pub authorizer_sig: Signature, } -/// A message requesting to start publishing flashblock payloads at a specific block number. -/// -/// This message is sent to indicate that the sender wants to begin publishing flashblock -/// payloads starting from the specified block number. +/// A message requesting to start publishing flashblock payloads #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub struct StartPublish { - /// The block number from which to start publishing flashblock payloads - pub block_number: u64, -} - +pub struct StartPublish; /// A message requesting to stop publishing flashblock payloads. /// /// This is a simple marker message with no fields that indicates the sender @@ -498,20 +491,16 @@ impl AsRef for AuthorizedMsg { } impl Encodable for StartPublish { - fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { - self.block_number.encode(out); - } + fn encode(&self, _out: &mut dyn alloy_rlp::BufMut) {} fn length(&self) -> usize { - self.block_number.length() + 0 } } impl Decodable for StartPublish { - fn decode(buf: &mut &[u8]) -> Result { - Ok(StartPublish { - block_number: u64::decode(buf)?, - }) + fn decode(_buf: &mut &[u8]) -> Result { + Ok(StartPublish) } } @@ -749,7 +738,7 @@ mod tests { fn authorized_msg_variants_rlp_roundtrip() { let variants = [ AuthorizedMsg::FlashblocksPayloadV1(sample_flashblocks_payload()), - AuthorizedMsg::StartPublish(StartPublish { block_number: 100 }), + AuthorizedMsg::StartPublish(StartPublish), AuthorizedMsg::StopPublish(StopPublish), ]; diff --git a/specs/flashblocks_p2p.md b/specs/flashblocks_p2p.md index eae23474..83ea64fe 100644 --- a/specs/flashblocks_p2p.md +++ b/specs/flashblocks_p2p.md @@ -111,14 +111,10 @@ Every P2P message in the Flashblocks protocol is sent as an `AuthorizedMessage`. A small message indicating the intention to begin publishing flashblocks for a new L2 block. ```rust -pub struct StartPublish { - pub block_number: u64, -} +pub struct StartPublish; ``` -* `block_number`: The L2 block number that the builder is starting to construct/publish. This allows peers (and other potential builders) to coordinate and avoid conflicts (only one builder should publish for a given block number at a time). - -The `StartPublish` message is always sent wrapped in an `AuthorizedMessage` (with the appropriate authorization and signatures). It serves as an announcement to the network that *“Builder X is about to start building block N.”* +The `StartPublish` message is always sent wrapped in an `AuthorizedMessage` (with the appropriate authorization and signatures). It serves as an announcement to the network that *“Builder X is about to start publishing”* ### **`StopPublish`** From 4a862cce045a20c9530149bd2a81cbb3781ecee5 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 24 Jul 2025 16:24:18 -0700 Subject: [PATCH 061/114] feat: pass in handler --- crates/flashblocks-p2p/src/net/mod.rs | 46 +++++++-------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index e3273b50..e6de7bed 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -1,4 +1,3 @@ -use ed25519_dalek::{SigningKey, VerifyingKey}; use reth::chainspec::Hardforks; use reth_eth_wire::NetPrimitivesFor; use reth_ethereum::network::api::FullNetwork; @@ -10,47 +9,32 @@ use reth_node_builder::{ node::{FullNodeTypes, NodeTypes}, }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use rollup_boost::FlashblocksPayloadV1; -use tokio::sync::broadcast; use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; #[derive(Debug)] -struct FlashblocksNetworkBuilderCtx { - authorizer_vk: VerifyingKey, - builder_sk: SigningKey, - flashblocks_receiver_tx: broadcast::Sender, -} - -#[derive(Debug)] -pub struct FlashblocksNetworkBuilder { +pub struct FlashblocksNetworkBuilder { inner: T, - ctx: Option, + flashblocks_p2p_handler: Option>, } -impl FlashblocksNetworkBuilder { - pub fn new( - inner: T, - authorizer_vk: VerifyingKey, - builder_sk: SigningKey, - flashblocks_receiver_tx: broadcast::Sender, - ) -> Self { +impl FlashblocksNetworkBuilder { + pub fn new(inner: T, flashblocks_p2p_handler: FlashblocksHandler) -> Self { Self { inner, - ctx: Some(FlashblocksNetworkBuilderCtx { - authorizer_vk, - builder_sk, - flashblocks_receiver_tx, - }), + flashblocks_p2p_handler: Some(flashblocks_p2p_handler), } } pub fn disabled(inner: T) -> Self { - Self { inner, ctx: None } + Self { + inner, + flashblocks_p2p_handler: None, + } } } -impl NetworkBuilder for FlashblocksNetworkBuilder +impl NetworkBuilder for FlashblocksNetworkBuilder where T: NetworkBuilder, Node: FullNodeTypes>, @@ -69,14 +53,8 @@ where pool: Pool, ) -> eyre::Result { let handle = self.inner.build_network(ctx, pool).await?; - if let Some(ctx) = self.ctx { - let handler = FlashblocksHandler::::new( - handle.clone(), - ctx.authorizer_vk, - ctx.builder_sk, - ctx.flashblocks_receiver_tx, - ); - handle.add_rlpx_sub_protocol(handler.into_rlpx_sub_protocol()); + if let Some(flashblocks_p2p_handler) = self.flashblocks_p2p_handler { + handle.add_rlpx_sub_protocol(flashblocks_p2p_handler.into_rlpx_sub_protocol()); } Ok(handle) From 3aa5090e4275bde968127b45567055fc7b621894 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 24 Jul 2025 17:30:53 -0700 Subject: [PATCH 062/114] for_leyton --- crates/flashblocks-p2p/src/net/mod.rs | 24 ++++---- .../src/protocol/connection.rs | 38 +++++++----- .../flashblocks-p2p/src/protocol/handler.rs | 60 +++++++++++++++---- 3 files changed, 86 insertions(+), 36 deletions(-) diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index e6de7bed..1640e74f 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -10,31 +10,31 @@ use reth_node_builder::{ }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use crate::protocol::handler::{FlashblocksHandler, FlashblocksP2PNetworHandle}; +use crate::protocol::handler::{FlashblocksHandle, FlashblocksHandler, FlashblocksP2PNetworHandle}; #[derive(Debug)] -pub struct FlashblocksNetworkBuilder { +pub struct FlashblocksNetworkBuilder { inner: T, - flashblocks_p2p_handler: Option>, + flashblocks_p2p_handle: Option, } -impl FlashblocksNetworkBuilder { - pub fn new(inner: T, flashblocks_p2p_handler: FlashblocksHandler) -> Self { +impl FlashblocksNetworkBuilder { + pub fn new(inner: T, flashblocks_p2p_handle: FlashblocksHandle) -> Self { Self { inner, - flashblocks_p2p_handler: Some(flashblocks_p2p_handler), + flashblocks_p2p_handle: Some(flashblocks_p2p_handle), } } pub fn disabled(inner: T) -> Self { Self { inner, - flashblocks_p2p_handler: None, + flashblocks_p2p_handle: None, } } } -impl NetworkBuilder for FlashblocksNetworkBuilder +impl NetworkBuilder for FlashblocksNetworkBuilder where T: NetworkBuilder, Node: FullNodeTypes>, @@ -53,8 +53,12 @@ where pool: Pool, ) -> eyre::Result { let handle = self.inner.build_network(ctx, pool).await?; - if let Some(flashblocks_p2p_handler) = self.flashblocks_p2p_handler { - handle.add_rlpx_sub_protocol(flashblocks_p2p_handler.into_rlpx_sub_protocol()); + if let Some(flashblocks_handle) = self.flashblocks_p2p_handle { + let flashblocks_rlpx = FlashblocksHandler { + network_handle: handle.clone(), + flashblocks_handle, + }; + handle.add_rlpx_sub_protocol(flashblocks_rlpx.into_rlpx_sub_protocol()); } Ok(handle) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 69f0cc53..42c2a46a 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -116,7 +116,6 @@ impl Stream for FlashblocksConnection { "failed to decode flashblocks message from peer", ); this.handler - .ctx .network_handle .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); return Poll::Ready(None); @@ -126,7 +125,12 @@ impl Stream for FlashblocksConnection { match msg { FlashblocksP2PMsg::Authorized(authorized) => { if authorized.authorization.builder_vk - == this.handler.ctx.builder_sk.verifying_key() + == this + .handler + .flashblocks_handle + .ctx + .builder_sk + .verifying_key() { tracing::warn!( target: "flashblocks::p2p", @@ -134,13 +138,14 @@ impl Stream for FlashblocksConnection { "received our own message from peer", ); this.handler - .ctx .network_handle .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); continue; } - if let Err(error) = authorized.verify(this.handler.ctx.authorizer_vk) { + if let Err(error) = + authorized.verify(this.handler.flashblocks_handle.ctx.authorizer_vk) + { tracing::warn!( target: "flashblocks::p2p", peer_id = %this.peer_id, @@ -148,7 +153,6 @@ impl Stream for FlashblocksConnection { "failed to verify flashblock", ); this.handler - .ctx .network_handle .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); continue; @@ -191,7 +195,7 @@ impl FlashblocksConnection { &mut self, authorized_payload: AuthorizedPayload, ) { - let mut state = self.handler.state.lock(); + let mut state = self.handler.flashblocks_handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; let msg = authorized_payload.msg(); @@ -204,7 +208,6 @@ impl FlashblocksConnection { "received flashblock with outdated timestamp", ); self.handler - .ctx .network_handle .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; @@ -231,7 +234,6 @@ impl FlashblocksConnection { "received duplicate flashblock from peer", ); self.handler - .ctx .network_handle .reputation_change(self.peer_id, ReputationChangeKind::AlreadySeenTransaction); return; @@ -267,12 +269,15 @@ impl FlashblocksConnection { active_publishers.push((authorization.builder_vk, authorization.timestamp)); } - self.handler.ctx.publish(&mut state, authorized_payload); + self.handler + .flashblocks_handle + .ctx + .publish(&mut state, authorized_payload); } // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { - let mut state = self.handler.state.lock(); + let mut state = self.handler.flashblocks_handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; // Check if the request is expired for dos protection. @@ -287,7 +292,6 @@ impl FlashblocksConnection { "received initiate build request with outdated timestamp", ); self.handler - .ctx .network_handle .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; @@ -304,13 +308,18 @@ impl FlashblocksConnection { ); let authorized = Authorized::new( - &self.handler.ctx.builder_sk, + &self.handler.flashblocks_handle.ctx.builder_sk, *our_authorization, StopPublish.into(), ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.handler.ctx.peer_tx.send(peer_msg).ok(); + self.handler + .flashblocks_handle + .ctx + .peer_tx + .send(peer_msg) + .ok(); state.publishing_status = PublishingStatus::NotPublishing { active_publishers: vec![( @@ -352,7 +361,7 @@ impl FlashblocksConnection { // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { - let mut state = self.handler.state.lock(); + let mut state = self.handler.flashblocks_handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; // Check if the request is expired for dos protection. @@ -367,7 +376,6 @@ impl FlashblocksConnection { "Received initiate build response with outdated timestamp", ); self.handler - .ctx .network_handle .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index ff673a5d..69aac5ce 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -130,9 +130,7 @@ impl FlashblocksP2PState { /// used across all connections in the flashblocks P2P protocol. It provides the shared /// infrastructure needed for message verification, signing, and broadcasting. #[derive(Clone, Debug)] -pub struct FlashblocksP2PCtx { - /// Network handle used to update peer reputation and manage connections. - pub network_handle: N, +pub struct FlashblocksP2PCtx { /// Authorizer's verifying key used to verify authorization signatures from rollup-boost. pub authorizer_vk: VerifyingKey, /// Builder's signing key used to sign outgoing authorized P2P messages. @@ -145,6 +143,39 @@ pub struct FlashblocksP2PCtx { pub flashblock_tx: broadcast::Sender, } +/// Handle for the flashblocks P2P protocol. +/// +/// Encapsulates the shared context and mutable state of the flashblocks +/// P2P protocol, allowing for thread-safe access and modification across multiple +/// connections. +#[derive(Clone, Debug)] +pub struct FlashblocksHandle { + /// Shared context containing network handle, keys, and communication channels. + pub ctx: FlashblocksP2PCtx, + /// Thread-safe mutable state of the flashblocks protocol. + /// Protected by a mutex to allow concurrent access from multiple connections. + pub state: Arc>, +} + +impl FlashblocksHandle { + pub fn new( + authorizer_vk: VerifyingKey, + builder_sk: SigningKey, + flashblock_tx: broadcast::Sender, + ) -> Self { + let peer_tx = broadcast::Sender::new(100); + let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); + let ctx = FlashblocksP2PCtx { + authorizer_vk, + builder_sk, + peer_tx, + flashblock_tx, + }; + + Self { ctx, state } + } +} + /// Main protocol handler for the flashblocks P2P protocol. /// /// This handler manages incoming and outgoing connections, coordinates flashblock publishing, @@ -152,11 +183,10 @@ pub struct FlashblocksP2PCtx { /// logic for multi-builder coordination and failover scenarios in HA sequencer setups. #[derive(Clone, Debug)] pub struct FlashblocksHandler { + /// Network handle used to update peer reputation and manage connections. + pub network_handle: N, /// Shared context containing network handle, keys, and communication channels. - pub ctx: FlashblocksP2PCtx, - /// Thread-safe mutable state of the flashblocks protocol. - /// Protected by a mutex to allow concurrent access from multiple connections. - pub state: Arc>, + pub flashblocks_handle: FlashblocksHandle, } impl FlashblocksHandler { @@ -179,14 +209,20 @@ impl FlashblocksHandler { let peer_tx = broadcast::Sender::new(100); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); let ctx = FlashblocksP2PCtx { - network_handle: network_handle.clone(), authorizer_vk, builder_sk, peer_tx, flashblock_tx, }; + let flashblocks_handle = FlashblocksHandle { + ctx: ctx.clone(), + state: state.clone(), + }; - Self { ctx, state } + Self { + network_handle: network_handle.clone(), + flashblocks_handle, + } } /// Returns the P2P capability for the flashblocks v1 protocol. @@ -196,7 +232,9 @@ impl FlashblocksHandler { pub fn capability() -> Capability { Capability::new_static("flblk", 1) } +} +impl FlashblocksHandle { /// Publishes a newly created flashblock from the payload builder to the P2P network. /// /// This method validates that the builder has authorization to publish and that @@ -378,7 +416,7 @@ impl FlashblocksHandler { } } -impl FlashblocksP2PCtx { +impl FlashblocksP2PCtx { /// Processes and publishes a verified flashblock payload to the P2P network and local stream. /// /// This method handles the core logic of flashblock processing, including validation, @@ -544,7 +582,7 @@ impl ConnectionHandler for FlashblocksHandler ); FlashblocksConnection { - peer_rx: BroadcastStream::new(self.ctx.peer_tx.subscribe()), + peer_rx: BroadcastStream::new(self.flashblocks_handle.ctx.peer_tx.subscribe()), handler: self, conn, peer_id, From 822f0bce3d7794acdf99d9db7df4bb11b45a05db Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 25 Jul 2025 12:38:53 -0700 Subject: [PATCH 063/114] feat: rename --- crates/flashblocks-node/src/bin/main.rs | 10 +-- crates/flashblocks-node/tests/p2p.rs | 42 +++++------- crates/flashblocks-p2p/src/net/mod.rs | 10 +-- .../src/protocol/connection.rs | 62 +++++++---------- crates/flashblocks-p2p/src/protocol/error.rs | 17 +++++ .../flashblocks-p2p/src/protocol/handler.rs | 67 +++++++------------ crates/flashblocks-p2p/src/protocol/mod.rs | 1 + crates/rollup-boost/src/flashblocks/error.rs | 14 +++- crates/rollup-boost/src/flashblocks/p2p.rs | 18 ++--- .../rollup-boost/src/flashblocks/service.rs | 18 +---- crates/rollup-boost/src/server.rs | 2 +- 11 files changed, 119 insertions(+), 142 deletions(-) create mode 100644 crates/flashblocks-p2p/src/protocol/error.rs diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index d5ea1b2c..ffccb19c 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -2,7 +2,7 @@ use clap::Parser; use ed25519_dalek::{SigningKey, VerifyingKey}; use flashblocks_node::FlashblocksNodeArgs; -use flashblocks_p2p::protocol::handler::FlashblocksHandler; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; @@ -45,17 +45,19 @@ pub fn main() { .launch_with_debug_capabilities() .await?; - let custom_rlpx_handler = FlashblocksHandler::new( - handle.node.network.clone(), + let flashblocks_handle = FlashblocksHandle::new( VerifyingKey::default(), SigningKey::from_bytes(&[0u8; 32]), inbound_tx, ); + let flashblocks_p2p_protocol = + FlashblocksP2PProtocol::new(handle.node.network.clone(), flashblocks_handle); + handle .node .network - .add_rlpx_sub_protocol(custom_rlpx_handler.into_rlpx_sub_protocol()); + .add_rlpx_sub_protocol(flashblocks_p2p_protocol.into_rlpx_sub_protocol()); handle.node_exit_future.await }) { diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index ec7e7c36..7f341aaf 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -5,7 +5,7 @@ use alloy_provider::{Provider, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::FlashblocksHandler; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; use op_alloy_consensus::{OpPooledTransaction, OpTxEnvelope}; use reth_eth_wire::BasicNetworkPrimitives; @@ -40,7 +40,7 @@ type Network = NetworkHandle< >; pub struct NodeContext { - p2p_handle: FlashblocksHandler, + p2p_handle: FlashblocksHandle, flashblocks_tx: broadcast::Sender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, @@ -114,15 +114,19 @@ async fn setup_node( .launch() .await?; - let p2p_handle = FlashblocksHandler::new( - node.network.clone(), + let p2p_handle = FlashblocksHandle::new( authorizer_sk.verifying_key(), builder_sk, inbound_tx.clone(), ); + let p2p_protocol = FlashblocksP2PProtocol { + network: node.network.clone(), + handle: p2p_handle.clone(), + }; + node.network - .add_rlpx_sub_protocol(p2p_handle.clone().into_rlpx_sub_protocol()); + .add_rlpx_sub_protocol(p2p_protocol.into_rlpx_sub_protocol()); for (peer_id, addr) in peers { // If a trusted peer is provided, add it to the network @@ -354,9 +358,7 @@ async fn test_double_failover() -> eyre::Result<()> { let msg = payload_0.clone(); let authorized_0 = AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization_0, msg); - nodes[0].p2p_handle.start_publishing( - authorization_0, - ); + nodes[0].p2p_handle.start_publishing(authorization_0); nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -372,9 +374,7 @@ async fn test_double_failover() -> eyre::Result<()> { authorization_1, payload_1.clone(), ); - nodes[1] - .p2p_handle - .start_publishing(authorization_1); + nodes[1].p2p_handle.start_publishing(authorization_1); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[1].p2p_handle.publish_new(authorized_1).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -393,9 +393,7 @@ async fn test_double_failover() -> eyre::Result<()> { authorization_2, msg.clone(), ); - nodes[2] - .p2p_handle - .start_publishing(authorization_2); + nodes[2].p2p_handle.start_publishing(authorization_2); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[2].p2p_handle.publish_new(authorized_2).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -453,9 +451,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { let msg = payload_0.clone(); let authorized = AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization, msg); - nodes[0].p2p_handle.start_publishing( - authorization, - ); + nodes[0].p2p_handle.start_publishing(authorization); nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -527,12 +523,8 @@ async fn test_force_race_condition() -> eyre::Result<()> { authorization_1, msg.clone(), ); - nodes[1].p2p_handle.start_publishing( - authorization_1, - ); - nodes[2].p2p_handle.start_publishing( - authorization_2, - ); + nodes[1].p2p_handle.start_publishing(authorization_1); + nodes[2].p2p_handle.start_publishing(authorization_2); // Wait for clearance to go through tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; tracing::error!( @@ -544,9 +536,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { ); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - nodes[2] - .p2p_handle - .stop_publishing(); + nodes[2].p2p_handle.stop_publishing(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[1].p2p_handle.publish_new(authorized_1)?; diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 1640e74f..7e5baf37 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -10,7 +10,9 @@ use reth_node_builder::{ }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; -use crate::protocol::handler::{FlashblocksHandle, FlashblocksHandler, FlashblocksP2PNetworHandle}; +use crate::protocol::handler::{ + FlashblocksHandle, FlashblocksP2PNetworHandle, FlashblocksP2PProtocol, +}; #[derive(Debug)] pub struct FlashblocksNetworkBuilder { @@ -54,9 +56,9 @@ where ) -> eyre::Result { let handle = self.inner.build_network(ctx, pool).await?; if let Some(flashblocks_handle) = self.flashblocks_p2p_handle { - let flashblocks_rlpx = FlashblocksHandler { - network_handle: handle.clone(), - flashblocks_handle, + let flashblocks_rlpx = FlashblocksP2PProtocol { + network: handle.clone(), + handle: flashblocks_handle, }; handle.add_rlpx_sub_protocol(flashblocks_rlpx.into_rlpx_sub_protocol()); } diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 42c2a46a..6e317dc7 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,5 +1,5 @@ use crate::protocol::handler::{ - FlashblocksHandler, FlashblocksP2PNetworHandle, PeerMsg, PublishingStatus, + FlashblocksP2PNetworHandle, FlashblocksP2PProtocol, PeerMsg, PublishingStatus, }; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; @@ -27,7 +27,7 @@ use tracing::trace; /// should be sent to the connected peer over the underlying protocol connection. pub struct FlashblocksConnection { /// The flashblocks protocol handler that manages the overall protocol state. - pub handler: FlashblocksHandler, + pub protocol: FlashblocksP2PProtocol, /// The underlying protocol connection for sending and receiving raw bytes. pub conn: ProtocolConnection, /// The unique identifier of the connected peer. @@ -115,8 +115,8 @@ impl Stream for FlashblocksConnection { %error, "failed to decode flashblocks message from peer", ); - this.handler - .network_handle + this.protocol + .network .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); return Poll::Ready(None); } @@ -125,35 +125,28 @@ impl Stream for FlashblocksConnection { match msg { FlashblocksP2PMsg::Authorized(authorized) => { if authorized.authorization.builder_vk - == this - .handler - .flashblocks_handle - .ctx - .builder_sk - .verifying_key() + == this.protocol.handle.ctx.builder_sk.verifying_key() { tracing::warn!( target: "flashblocks::p2p", peer_id = %this.peer_id, "received our own message from peer", ); - this.handler - .network_handle + this.protocol + .network .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); continue; } - if let Err(error) = - authorized.verify(this.handler.flashblocks_handle.ctx.authorizer_vk) - { + if let Err(error) = authorized.verify(this.protocol.handle.ctx.authorizer_vk) { tracing::warn!( target: "flashblocks::p2p", peer_id = %this.peer_id, %error, "failed to verify flashblock", ); - this.handler - .network_handle + this.protocol + .network .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); continue; } @@ -195,7 +188,7 @@ impl FlashblocksConnection { &mut self, authorized_payload: AuthorizedPayload, ) { - let mut state = self.handler.flashblocks_handle.state.lock(); + let mut state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; let msg = authorized_payload.msg(); @@ -207,8 +200,8 @@ impl FlashblocksConnection { timestamp = authorization.timestamp, "received flashblock with outdated timestamp", ); - self.handler - .network_handle + self.protocol + .network .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; } @@ -233,8 +226,8 @@ impl FlashblocksConnection { index = msg.index, "received duplicate flashblock from peer", ); - self.handler - .network_handle + self.protocol + .network .reputation_change(self.peer_id, ReputationChangeKind::AlreadySeenTransaction); return; } @@ -269,15 +262,15 @@ impl FlashblocksConnection { active_publishers.push((authorization.builder_vk, authorization.timestamp)); } - self.handler - .flashblocks_handle + self.protocol + .handle .ctx .publish(&mut state, authorized_payload); } // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { - let mut state = self.handler.flashblocks_handle.state.lock(); + let mut state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; // Check if the request is expired for dos protection. @@ -291,8 +284,8 @@ impl FlashblocksConnection { timestamp = authorized_payload.authorized.authorization.timestamp, "received initiate build request with outdated timestamp", ); - self.handler - .network_handle + self.protocol + .network .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; } @@ -308,18 +301,13 @@ impl FlashblocksConnection { ); let authorized = Authorized::new( - &self.handler.flashblocks_handle.ctx.builder_sk, + &self.protocol.handle.ctx.builder_sk, *our_authorization, StopPublish.into(), ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.handler - .flashblocks_handle - .ctx - .peer_tx - .send(peer_msg) - .ok(); + self.protocol.handle.ctx.peer_tx.send(peer_msg).ok(); state.publishing_status = PublishingStatus::NotPublishing { active_publishers: vec![( @@ -361,7 +349,7 @@ impl FlashblocksConnection { // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { - let mut state = self.handler.flashblocks_handle.state.lock(); + let mut state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; // Check if the request is expired for dos protection. @@ -375,8 +363,8 @@ impl FlashblocksConnection { timestamp = authorized_payload.authorized.authorization.timestamp, "Received initiate build response with outdated timestamp", ); - self.handler - .network_handle + self.protocol + .network .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); return; } diff --git a/crates/flashblocks-p2p/src/protocol/error.rs b/crates/flashblocks-p2p/src/protocol/error.rs new file mode 100644 index 00000000..47486b65 --- /dev/null +++ b/crates/flashblocks-p2p/src/protocol/error.rs @@ -0,0 +1,17 @@ +use thiserror::Error; + +#[derive(Error, Debug, Eq, PartialEq)] +pub enum FlashblocksP2PError { + #[error("attempt to publish flashblocks without clearance")] + NotClearedToPublish, + #[error( + "attempt to publish flashblocks with expired authorization. Make sure to call `start_publishing` first" + )] + ExpiredAuthorization, + #[error("input too short")] + InputTooShort, + #[error("unknown message type")] + UnknownMessageType, + #[error("invalid builder signature")] + Rlp(#[from] alloy_rlp::Error), +} diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 69aac5ce..86ee4313 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,7 +1,6 @@ -use crate::protocol::connection::FlashblocksConnection; +use crate::protocol::{connection::FlashblocksConnection, error::FlashblocksP2PError}; use alloy_rlp::BytesMut; use ed25519_dalek::{SigningKey, VerifyingKey}; -use eyre::bail; use parking_lot::Mutex; use reth::payload::PayloadId; use reth_eth_wire::Capability; @@ -32,8 +31,13 @@ const MAX_FRAME: usize = 1 << 24; // 16 MiB const MAX_FLASHBLOCK_INDEX: usize = 100; /// The maximum number of seconds we will wait for a previous publisher to stop +/// before continueing anyways. const MAX_PUBLISH_WAIT_SEC: u64 = 2; +/// The maximum number of broadcast channel messages we will buffer +/// before dropping them. In practice, we should rarely need to buffer any messages. +const BROADCAST_BUFFER_CAPACITY: usize = 100; + /// Trait bound for network handles that can be used with the flashblocks P2P protocol. /// /// This trait combines all the necessary bounds for a network handle to be used @@ -146,8 +150,7 @@ pub struct FlashblocksP2PCtx { /// Handle for the flashblocks P2P protocol. /// /// Encapsulates the shared context and mutable state of the flashblocks -/// P2P protocol, allowing for thread-safe access and modification across multiple -/// connections. +/// P2P protocol. #[derive(Clone, Debug)] pub struct FlashblocksHandle { /// Shared context containing network handle, keys, and communication channels. @@ -163,7 +166,7 @@ impl FlashblocksHandle { builder_sk: SigningKey, flashblock_tx: broadcast::Sender, ) -> Self { - let peer_tx = broadcast::Sender::new(100); + let peer_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); let ctx = FlashblocksP2PCtx { authorizer_vk, @@ -182,46 +185,26 @@ impl FlashblocksHandle { /// and maintains the protocol state across all peer connections. It implements the core /// logic for multi-builder coordination and failover scenarios in HA sequencer setups. #[derive(Clone, Debug)] -pub struct FlashblocksHandler { +pub struct FlashblocksP2PProtocol { /// Network handle used to update peer reputation and manage connections. - pub network_handle: N, + pub network: N, /// Shared context containing network handle, keys, and communication channels. - pub flashblocks_handle: FlashblocksHandle, + pub handle: FlashblocksHandle, } -impl FlashblocksHandler { +impl FlashblocksP2PProtocol { /// Creates a new flashblocks P2P protocol handler. /// /// Initializes the handler with the necessary cryptographic keys, network handle, /// and communication channels. The handler starts in a non-publishing state. /// /// # Arguments - /// * `network_handle` - Network handle for peer management and reputation updates - /// * `authorizer_vk` - Verifying key for validating authorization signatures from rollup-boost - /// * `builder_sk` - Signing key for this builder to sign outgoing messages - /// * `flashblock_tx` - Broadcast channel for publishing verified flashblocks to consumers - pub fn new( - network_handle: N, - authorizer_vk: VerifyingKey, - builder_sk: SigningKey, - flashblock_tx: broadcast::Sender, - ) -> Self { - let peer_tx = broadcast::Sender::new(100); - let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); - let ctx = FlashblocksP2PCtx { - authorizer_vk, - builder_sk, - peer_tx, - flashblock_tx, - }; - let flashblocks_handle = FlashblocksHandle { - ctx: ctx.clone(), - state: state.clone(), - }; - + /// * `network` - Network handle for peer management and reputation updates + /// * `handle` - Shared handle containing the protocol context and mutable state + pub fn new(network: N, handle: FlashblocksHandle) -> Self { Self { - network_handle: network_handle.clone(), - flashblocks_handle, + network: network.clone(), + handle, } } @@ -254,16 +237,14 @@ impl FlashblocksHandle { pub fn publish_new( &self, authorized_payload: AuthorizedPayload, - ) -> eyre::Result<()> { + ) -> Result<(), FlashblocksP2PError> { let mut state = self.state.lock(); let PublishingStatus::Publishing { authorization } = &state.publishing_status else { - bail!("attempt to publish flashblocks without clearance"); + return Err(FlashblocksP2PError::NotClearedToPublish); }; if authorization != &authorized_payload.authorized.authorization { - bail!( - "attempt to publish flashblocks with a previous authorization. Make sure to call `start_publishing` first." - ); + return Err(FlashblocksP2PError::ExpiredAuthorization); } self.ctx.publish(&mut state, authorized_payload); Ok(()) @@ -533,7 +514,7 @@ impl FlashblocksP2PCtx { } } -impl ProtocolHandler for FlashblocksHandler { +impl ProtocolHandler for FlashblocksP2PProtocol { type ConnectionHandler = Self; fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { @@ -549,7 +530,7 @@ impl ProtocolHandler for FlashblocksHandler { } } -impl ConnectionHandler for FlashblocksHandler { +impl ConnectionHandler for FlashblocksP2PProtocol { type Connection = FlashblocksConnection; fn protocol(&self) -> Protocol { @@ -582,8 +563,8 @@ impl ConnectionHandler for FlashblocksHandler ); FlashblocksConnection { - peer_rx: BroadcastStream::new(self.flashblocks_handle.ctx.peer_tx.subscribe()), - handler: self, + peer_rx: BroadcastStream::new(self.handle.ctx.peer_tx.subscribe()), + protocol: self, conn, peer_id, payload_id: Default::default(), diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs index cf8c8107..a83f1723 100644 --- a/crates/flashblocks-p2p/src/protocol/mod.rs +++ b/crates/flashblocks-p2p/src/protocol/mod.rs @@ -1,2 +1,3 @@ pub mod connection; +pub mod error; pub mod handler; diff --git a/crates/rollup-boost/src/flashblocks/error.rs b/crates/rollup-boost/src/flashblocks/error.rs index 33b2fc8d..079394fa 100644 --- a/crates/rollup-boost/src/flashblocks/error.rs +++ b/crates/rollup-boost/src/flashblocks/error.rs @@ -1,7 +1,7 @@ use thiserror::Error; -#[derive(Error, Debug, Eq, PartialEq)] -pub enum FlashblocksP2PError { +#[derive(Debug, Error, PartialEq)] +pub enum FlashblocksError { #[error("invalid authorizer signature")] InvalidAuthorizerSig, #[error("invalid builder signature")] @@ -12,4 +12,14 @@ pub enum FlashblocksP2PError { UnknownMessageType, #[error("invalid builder signature")] Rlp(#[from] alloy_rlp::Error), + #[error("Missing base payload for initial flashblock")] + MissingBasePayload, + #[error("Unexpected base payload for non-initial flashblock")] + UnexpectedBasePayload, + #[error("Missing delta for flashblock")] + MissingDelta, + #[error("Invalid index for flashblock")] + InvalidIndex, + #[error("Missing payload")] + MissingPayload, } diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index bc37c26c..b3683eaf 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -7,7 +7,7 @@ use bytes::{Buf as _, BufMut as _, BytesMut}; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; -use crate::{FlashblocksP2PError, FlashblocksPayloadV1}; +use crate::{FlashblocksError, FlashblocksPayloadV1}; /// An authorization token that grants a builder permission to publish flashblocks for a specific payload. /// @@ -132,14 +132,14 @@ impl Authorization { /// /// * `Ok(())` if the signature is valid /// * `Err(FlashblocksP2PError::InvalidAuthorizerSig)` if the signature is invalid - pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksP2PError> { + pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksError> { let mut msg = self.payload_id.0.to_vec(); msg.extend_from_slice(&self.timestamp.to_le_bytes()); msg.extend_from_slice(self.builder_vk.as_bytes()); let hash = blake3::hash(&msg); authorizer_sk .verify(hash.as_bytes(), &self.authorizer_sig) - .map_err(|_| FlashblocksP2PError::InvalidAuthorizerSig) + .map_err(|_| FlashblocksError::InvalidAuthorizerSig) } } @@ -322,7 +322,7 @@ impl Authorized { /// * `Ok(())` if both signatures are valid /// * `Err(FlashblocksP2PError::InvalidAuthorizerSig)` if the authorization signature is invalid /// * `Err(FlashblocksP2PError::InvalidBuilderSig)` if the actor signature is invalid - pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksP2PError> { + pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksError> { self.authorization.verify(authorizer_sk)?; let mut encoded = Vec::new(); @@ -333,7 +333,7 @@ impl Authorized { self.authorization .builder_vk .verify(hash.as_bytes(), &self.actor_sig) - .map_err(|_| FlashblocksP2PError::InvalidBuilderSig) + .map_err(|_| FlashblocksError::InvalidBuilderSig) } /// Converts this `Authorized` message into a type-safe `AuthorizedPayload` without verification. @@ -447,9 +447,9 @@ impl FlashblocksP2PMsg { buf } - pub fn decode(buf: &mut &[u8]) -> Result { + pub fn decode(buf: &mut &[u8]) -> Result { if buf.is_empty() { - return Err(FlashblocksP2PError::InputTooShort); + return Err(FlashblocksError::InputTooShort); } let id = buf[0]; buf.advance(1); @@ -458,7 +458,7 @@ impl FlashblocksP2PMsg { let payload = Authorized::decode(buf)?; Ok(FlashblocksP2PMsg::Authorized(payload)) } - _ => Err(FlashblocksP2PError::UnknownMessageType), + _ => Err(FlashblocksError::UnknownMessageType), } } } @@ -782,6 +782,6 @@ mod tests { let mut slice: &[u8] = &buf; let err = FlashblocksP2PMsg::decode(&mut slice).expect_err("should fail on unknown message type"); - assert_eq!(err, FlashblocksP2PError::UnknownMessageType); + assert_eq!(err, FlashblocksError::UnknownMessageType); } } diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index 606fc674..b9c6ee7d 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -4,7 +4,8 @@ use super::primitives::{ }; use crate::flashblocks::metrics::FlashblocksServiceMetrics; use crate::{ - ClientResult, EngineApiExt, NewPayload, OpExecutionPayloadEnvelope, PayloadVersion, RpcClient, + ClientResult, EngineApiExt, FlashblocksError, NewPayload, OpExecutionPayloadEnvelope, + PayloadVersion, RpcClient, }; use alloy_primitives::U256; use alloy_rpc_types_engine::{ @@ -22,25 +23,10 @@ use reth_optimism_payload_builder::payload_id_optimism; use serde::{Deserialize, Serialize}; use std::io; use std::sync::Arc; -use thiserror::Error; use tokio::sync::RwLock; use tokio::sync::mpsc; use tracing::{error, info}; -#[derive(Debug, Error, PartialEq)] -pub enum FlashblocksError { - #[error("Missing base payload for initial flashblock")] - MissingBasePayload, - #[error("Unexpected base payload for non-initial flashblock")] - UnexpectedBasePayload, - #[error("Missing delta for flashblock")] - MissingDelta, - #[error("Invalid index for flashblock")] - InvalidIndex, - #[error("Missing payload")] - MissingPayload, -} - #[derive(Debug, Deserialize, Serialize)] struct FlashbotsMessage { method: String, diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index a1e579ce..9970fd04 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -1,5 +1,5 @@ use crate::debug_api::ExecutionMode; -use crate::{Authorization, BlockSelectionPolicy, EngineApiExt, FlashblocksP2PError}; +use crate::{Authorization, BlockSelectionPolicy, EngineApiExt}; use crate::{ client::rpc::RpcClient, debug_api::DebugServer, From 481893e5399b569dc53425256898609553237b37 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 25 Jul 2025 13:25:19 -0700 Subject: [PATCH 064/114] feat: watch channel for publishing state --- crates/flashblocks-node/tests/p2p.rs | 8 +- .../src/protocol/connection.rs | 280 +++++++++--------- .../flashblocks-p2p/src/protocol/handler.rs | 232 ++++++++------- crates/rollup-boost/src/server.rs | 3 - 4 files changed, 270 insertions(+), 253 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 7f341aaf..0a160425 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -41,12 +41,12 @@ type Network = NetworkHandle< pub struct NodeContext { p2p_handle: FlashblocksHandle, - flashblocks_tx: broadcast::Sender, + _flashblocks_tx: broadcast::Sender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, _node: Box, - network_handle: Network, + _network_handle: Network, } impl NodeContext { @@ -143,12 +143,12 @@ async fn setup_node( Ok(NodeContext { p2p_handle, - flashblocks_tx: inbound_tx, + _flashblocks_tx: inbound_tx, local_node_record, http_api_addr, _node_exit_future: node_exit_future, _node: Box::new(node), - network_handle, + _network_handle: network_handle, }) } diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 6e317dc7..9af687c3 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -233,34 +233,36 @@ impl FlashblocksConnection { } self.received[msg.index as usize] = true; - let active_publishers = match &mut state.publishing_status { - PublishingStatus::Publishing { .. } => { - // We are currently building, so we should not be seeing any new flashblocks - // over the p2p network. - tracing::error!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "received flashblock while already building", - ); - return; - } - PublishingStatus::WaitingToPublish { - active_publishers, .. - } => active_publishers, - PublishingStatus::NotPublishing { active_publishers } => active_publishers, - }; + state.publishing_status.send_modify(|status| { + let active_publishers = match status { + PublishingStatus::Publishing { .. } => { + // We are currently building, so we should not be seeing any new flashblocks + // over the p2p network. + tracing::error!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "received flashblock while already building", + ); + return; + } + PublishingStatus::WaitingToPublish { + active_publishers, .. + } => active_publishers, + PublishingStatus::NotPublishing { active_publishers } => active_publishers, + }; - // Update the list of active publishers - if let Some((_, timestamp)) = active_publishers - .iter_mut() - .find(|(publisher, _)| *publisher == authorization.builder_vk) - { - // This is an existing publisher, we should update their block number - *timestamp = authorization.timestamp; - } else { - // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_vk, authorization.timestamp)); - } + // Update the list of active publishers + if let Some((_, timestamp)) = active_publishers + .iter_mut() + .find(|(publisher, _)| *publisher == authorization.builder_vk) + { + // This is an existing publisher, we should update their block number + *timestamp = authorization.timestamp; + } else { + // This is a new publisher, we should add them to the list of active publishers + active_publishers.push((authorization.builder_vk, authorization.timestamp)); + } + }); self.protocol .handle @@ -270,7 +272,7 @@ impl FlashblocksConnection { // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { - let mut state = self.protocol.handle.state.lock(); + let state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; // Check if the request is expired for dos protection. @@ -290,66 +292,68 @@ impl FlashblocksConnection { return; } - let active_publishers = match &mut state.publishing_status { - PublishingStatus::Publishing { - authorization: our_authorization, - } => { - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StartPublish over p2p, stopping publishing flashblocks" - ); + state.publishing_status.send_modify(|status| { + let active_publishers = match status { + PublishingStatus::Publishing { + authorization: our_authorization, + } => { + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received StartPublish over p2p, stopping publishing flashblocks" + ); + + let authorized = Authorized::new( + &self.protocol.handle.ctx.builder_sk, + *our_authorization, + StopPublish.into(), + ); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); + let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); + self.protocol.handle.ctx.peer_tx.send(peer_msg).ok(); - let authorized = Authorized::new( - &self.protocol.handle.ctx.builder_sk, - *our_authorization, - StopPublish.into(), - ); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); - let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.protocol.handle.ctx.peer_tx.send(peer_msg).ok(); + *status = PublishingStatus::NotPublishing { + active_publishers: vec![( + our_authorization.builder_vk, + authorization.timestamp, + )], + }; - state.publishing_status = PublishingStatus::NotPublishing { - active_publishers: vec![( - our_authorization.builder_vk, - authorization.timestamp, - )], - }; + return; + } + PublishingStatus::WaitingToPublish { + active_publishers, .. + } => { + // We are currently waiting to build, but someone else is requesting to build + // This could happen during a double failover. + // We have a potential race condition here so we'll just wait for the + // build request override to kick in next block. + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received StartPublish over p2p while already waiting to publish, ignoring", + ); + active_publishers + } + PublishingStatus::NotPublishing { active_publishers } => active_publishers, + }; - return; + if let Some((_, timestamp)) = active_publishers + .iter_mut() + .find(|(publisher, _)| *publisher == authorization.builder_vk) + { + // This is an existing publisher, we should update their block number + *timestamp = authorization.timestamp; + } else { + // This is a new publisher, we should add them to the list of active publishers + active_publishers.push((authorization.builder_vk, authorization.timestamp)); } - PublishingStatus::WaitingToPublish { - active_publishers, .. - } => { - // We are currently waiting to build, but someone else is requesting to build - // This could happen during a double failover. - // We have a potential race condition here so we'll just wait for the - // build request override to kick in next block. - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StartPublish over p2p while already waiting to publish, ignoring", - ); - active_publishers - } - PublishingStatus::NotPublishing { active_publishers } => active_publishers, - }; - - if let Some((_, timestamp)) = active_publishers - .iter_mut() - .find(|(publisher, _)| *publisher == authorization.builder_vk) - { - // This is an existing publisher, we should update their block number - *timestamp = authorization.timestamp; - } else { - // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_vk, authorization.timestamp)); - } + }); } // TODO: handle propogating this if we care. For now we assume direct peering. fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { - let mut state = self.protocol.handle.state.lock(); + let state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; // Check if the request is expired for dos protection. @@ -369,74 +373,76 @@ impl FlashblocksConnection { return; } - match &mut state.publishing_status { - PublishingStatus::Publishing { .. } => { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StopPublish over p2p while we are the publisher" - ); - } - PublishingStatus::WaitingToPublish { - active_publishers, - authorization, - .. - } => { - // We are currently waiting to build, but someone else is requesting to build - // This could happen during a double failover. - // We have a potential race condition here so we'll just wait for the - // build request override to kick in next block. - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StopPublish over p2p while waiting to publish", - ); - - // Remove the publisher from the list of active publishers - if let Some(index) = active_publishers.iter().position(|(publisher, _)| { - *publisher == authorized_payload.authorized.authorization.builder_vk - }) { - active_publishers.remove(index); - } else { + state.publishing_status.send_modify(|status| { + match status { + PublishingStatus::Publishing { .. } => { tracing::warn!( target: "flashblocks::p2p", peer_id = %self.peer_id, - "Received StopPublish for unknown publisher", + "Received StopPublish over p2p while we are the publisher" ); } - - if active_publishers.is_empty() { - // If there are no active publishers left, we should stop waiting to publish - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "starting to publish" - ); - state.publishing_status = PublishingStatus::Publishing { - authorization: *authorization, - }; - } else { + PublishingStatus::WaitingToPublish { + active_publishers, + authorization, + .. + } => { + // We are currently waiting to build, but someone else is requesting to build + // This could happen during a double failover. + // We have a potential race condition here so we'll just wait for the + // build request override to kick in next block. tracing::info!( target: "flashblocks::p2p", peer_id = %self.peer_id, - "still waiting on active publishers", + "Received StopPublish over p2p while waiting to publish", ); + + // Remove the publisher from the list of active publishers + if let Some(index) = active_publishers.iter().position(|(publisher, _)| { + *publisher == authorized_payload.authorized.authorization.builder_vk + }) { + active_publishers.remove(index); + } else { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received StopPublish for unknown publisher", + ); + } + + if active_publishers.is_empty() { + // If there are no active publishers left, we should stop waiting to publish + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "starting to publish" + ); + *status = PublishingStatus::Publishing { + authorization: *authorization, + }; + } else { + tracing::info!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "still waiting on active publishers", + ); + } } - } - PublishingStatus::NotPublishing { active_publishers } => { - // Remove the publisher from the list of active publishers - if let Some(index) = active_publishers.iter().position(|(publisher, _)| { - *publisher == authorized_payload.authorized.authorization.builder_vk - }) { - active_publishers.remove(index); - } else { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StopPublish for unknown publisher", - ); + PublishingStatus::NotPublishing { active_publishers } => { + // Remove the publisher from the list of active publishers + if let Some(index) = active_publishers.iter().position(|(publisher, _)| { + *publisher == authorized_payload.authorized.authorization.builder_vk + }) { + active_publishers.remove(index); + } else { + tracing::warn!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + "Received StopPublish for unknown publisher", + ); + } } } - } + }); } } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 86ee4313..750ff15c 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -12,7 +12,7 @@ use rollup_boost::{ }; use std::net::SocketAddr; use std::sync::Arc; -use tokio::sync::broadcast; +use tokio::sync::{broadcast, watch}; use tracing::debug; use reth_ethereum::network::{ @@ -104,7 +104,7 @@ impl Default for PublishingStatus { #[derive(Debug, Default)] pub struct FlashblocksP2PState { /// Current publishing status indicating whether we're publishing, waiting, or not publishing. - pub publishing_status: PublishingStatus, + pub publishing_status: watch::Sender, /// Most recent payload ID for the current block being processed. pub payload_id: PayloadId, /// Timestamp of the most recent flashblocks payload. @@ -124,7 +124,7 @@ impl FlashblocksP2PState { /// This indicates whether the node is actively publishing flashblocks, /// waiting to publish, or not publishing at all. pub fn publishing_status(&self) -> PublishingStatus { - self.publishing_status.clone() + self.publishing_status.borrow().clone() } } @@ -239,11 +239,12 @@ impl FlashblocksHandle { authorized_payload: AuthorizedPayload, ) -> Result<(), FlashblocksP2PError> { let mut state = self.state.lock(); - let PublishingStatus::Publishing { authorization } = &state.publishing_status else { + let PublishingStatus::Publishing { authorization } = *state.publishing_status.borrow() + else { return Err(FlashblocksP2PError::NotClearedToPublish); }; - if authorization != &authorized_payload.authorized.authorization { + if authorization != authorized_payload.authorized.authorization { return Err(FlashblocksP2PError::ExpiredAuthorization); } self.ctx.publish(&mut state, authorized_payload); @@ -258,7 +259,16 @@ impl FlashblocksHandle { /// # Returns /// The current `PublishingStatus` enum value pub fn publishing_status(&self) -> PublishingStatus { - self.state.lock().publishing_status.clone() + self.state.lock().publishing_status.borrow().clone() + } + + pub async fn await_clearance(&self) { + let mut status = self.state.lock().publishing_status.subscribe(); + // Safe to unwrap becuase self holds a sender. + status + .wait_for(|status| matches!(status, PublishingStatus::Publishing { .. })) + .await + .unwrap(); } /// Initiates flashblock publishing for a new block. @@ -277,123 +287,127 @@ impl FlashblocksHandle { /// Calling this method does not guarantee immediate publishing clearance. /// The node may need to wait for other publishers to stop first. pub fn start_publishing(&self, new_authorization: Authorization) { - let mut state = self.state.lock(); - match &mut state.publishing_status { - PublishingStatus::Publishing { authorization } => { - // We are already publishing, so we just update the authorization. - *authorization = new_authorization; - } - PublishingStatus::WaitingToPublish { - authorization, - active_publishers, - } => { - let most_recent_publisher = active_publishers - .iter() - .map(|(_, timestamp)| *timestamp) - .max() - .unwrap_or_default(); - // We are waiting to publish, so we update the authorization and - // the block number at which we requested to start publishing. - if new_authorization.timestamp >= most_recent_publisher + MAX_PUBLISH_WAIT_SEC { - // If the block number is greater than the one we requested to start publishing, - // we will update it. - tracing::warn!( - target: "flashblocks::p2p", - payload_id = %new_authorization.payload_id, - timestamp = %new_authorization.timestamp, - "waiting to publish timed out, starting to publish", - ); - state.publishing_status = PublishingStatus::Publishing { - authorization: new_authorization, - }; - } else { - // Continue to wait for the previous builder to stop. + let state = self.state.lock(); + state.publishing_status.send_modify(|status| { + match status { + PublishingStatus::Publishing { authorization } => { + // We are already publishing, so we just update the authorization. *authorization = new_authorization; } + PublishingStatus::WaitingToPublish { + authorization, + active_publishers, + } => { + let most_recent_publisher = active_publishers + .iter() + .map(|(_, timestamp)| *timestamp) + .max() + .unwrap_or_default(); + // We are waiting to publish, so we update the authorization and + // the block number at which we requested to start publishing. + if new_authorization.timestamp >= most_recent_publisher + MAX_PUBLISH_WAIT_SEC { + // If the block number is greater than the one we requested to start publishing, + // we will update it. + tracing::warn!( + target: "flashblocks::p2p", + payload_id = %new_authorization.payload_id, + timestamp = %new_authorization.timestamp, + "waiting to publish timed out, starting to publish", + ); + *status = PublishingStatus::Publishing { + authorization: new_authorization, + }; + } else { + // Continue to wait for the previous builder to stop. + *authorization = new_authorization; + } + } + PublishingStatus::NotPublishing { active_publishers } => { + // Send an authorized `StartPublish` message to the network + let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); + let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); + self.ctx.peer_tx.send(peer_msg).ok(); + + if active_publishers.is_empty() { + // If we have no previous publishers, we can start publishing immediately. + tracing::info!( + target: "flashblocks::p2p", + payload_id = %new_authorization.payload_id, + "starting to publish flashblocks", + ); + *status = PublishingStatus::Publishing { + authorization: new_authorization, + }; + } else { + // If we have previous publishers, we will wait for them to stop. + tracing::info!( + target: "flashblocks::p2p", + payload_id = %new_authorization.payload_id, + "waiting to publish flashblocks", + ); + *status = PublishingStatus::WaitingToPublish { + authorization: new_authorization, + active_publishers: active_publishers.clone(), + }; + } + } } - PublishingStatus::NotPublishing { active_publishers } => { - // Send an authorized `StartPublish` message to the network - let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); - let authorized_payload = - Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); - self.ctx.peer_tx.send(peer_msg).ok(); - - if active_publishers.is_empty() { - // If we have no previous publishers, we can start publishing immediately. + }); + } + + /// Stops flashblock publishing and notifies the P2P network. + /// + /// This method broadcasts a StopPublish message to all connected peers and transitions + /// the node to a non-publishing state. It should be called when receiving a + /// ForkChoiceUpdated without payload attributes or without an Authorization token. + pub fn stop_publishing(&self) { + let state = self.state.lock(); + state.publishing_status.send_modify(|status| { + match status { + PublishingStatus::Publishing { authorization } => { + // We are currently publishing, so we send a stop message. tracing::info!( target: "flashblocks::p2p", - payload_id = %new_authorization.payload_id, - "starting to publish flashblocks", + payload_id = %authorization.payload_id, + timestamp = %authorization.timestamp, + "stopping to publish flashblocks", ); - state.publishing_status = PublishingStatus::Publishing { - authorization: new_authorization, + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); + let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); + self.ctx.peer_tx.send(peer_msg).ok(); + *status = PublishingStatus::NotPublishing { + active_publishers: Vec::new(), }; - } else { - // If we have previous publishers, we will wait for them to stop. + } + PublishingStatus::WaitingToPublish { + authorization, + active_publishers, + .. + } => { + // We are waiting to publish, so we just update the status. tracing::info!( target: "flashblocks::p2p", - payload_id = %new_authorization.payload_id, - "waiting to publish flashblocks", + payload_id = %authorization.payload_id, + timestamp = %authorization.timestamp, + "aborting wait to publish flashblocks", ); - state.publishing_status = PublishingStatus::WaitingToPublish { - authorization: new_authorization, + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); + let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); + self.ctx.peer_tx.send(peer_msg).ok(); + *status = PublishingStatus::NotPublishing { active_publishers: active_publishers.clone(), }; } + PublishingStatus::NotPublishing { .. } => {} } - } - } - - /// Stops flashblock publishing and notifies the P2P network. - /// - /// This method broadcasts a StopPublish message to all connected peers and transitions - /// the node to a non-publishing state. It should be called when receiving a - /// ForkChoiceUpdated without payload attributes or without an Authorization token. - pub fn stop_publishing(&self) { - let mut state = self.state.lock(); - match &mut state.publishing_status { - PublishingStatus::Publishing { authorization } => { - // We are currently publishing, so we send a stop message. - tracing::info!( - target: "flashblocks::p2p", - payload_id = %authorization.payload_id, - timestamp = %authorization.timestamp, - "stopping to publish flashblocks", - ); - let authorized_payload = - Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.ctx.peer_tx.send(peer_msg).ok(); - state.publishing_status = PublishingStatus::NotPublishing { - active_publishers: Vec::new(), - }; - } - PublishingStatus::WaitingToPublish { - authorization, - active_publishers, - .. - } => { - // We are waiting to publish, so we just update the status. - tracing::info!( - target: "flashblocks::p2p", - payload_id = %authorization.payload_id, - timestamp = %authorization.timestamp, - "aborting wait to publish flashblocks", - ); - let authorized_payload = - Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.ctx.peer_tx.send(peer_msg).ok(); - state.publishing_status = PublishingStatus::NotPublishing { - active_publishers: active_publishers.clone(), - }; - } - PublishingStatus::NotPublishing { .. } => {} - } + }); } } diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index 9970fd04..3a0d1798 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -11,13 +11,11 @@ use crate::{ probe::{Health, Probes}, }; use alloy_primitives::{B256, Bytes, bytes}; -use alloy_rlp::{RlpDecodable, RlpEncodable}; use alloy_rpc_types_engine::{ ExecutionPayload, ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus, }; use alloy_rpc_types_eth::{Block, BlockNumberOrTag}; -use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use http_body_util::{BodyExt, Full}; use jsonrpsee::RpcModule; use jsonrpsee::core::BoxError; @@ -35,7 +33,6 @@ use op_alloy_rpc_types_engine::{ }; use opentelemetry::trace::SpanKind; use parking_lot::Mutex; -use serde::{Deserialize, Serialize}; use std::sync::Arc; use std::time::Duration; use tokio::task::JoinHandle; From e0a40c6a28f48a90b7a0fec7d0eb225bce522f19 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 28 Jul 2025 08:36:37 -0700 Subject: [PATCH 065/114] feat: guage for flashblocks peers --- .../src/protocol/connection.rs | 46 ++++++++++++++++--- .../flashblocks-p2p/src/protocol/handler.rs | 13 ++---- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 9af687c3..9d0f2e3d 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -3,6 +3,7 @@ use crate::protocol::handler::{ }; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; +use metrics::gauge; use reth::payload::PayloadId; use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; use reth_network::types::ReputationChangeKind; @@ -27,19 +28,52 @@ use tracing::trace; /// should be sent to the connected peer over the underlying protocol connection. pub struct FlashblocksConnection { /// The flashblocks protocol handler that manages the overall protocol state. - pub protocol: FlashblocksP2PProtocol, + protocol: FlashblocksP2PProtocol, /// The underlying protocol connection for sending and receiving raw bytes. - pub conn: ProtocolConnection, + conn: ProtocolConnection, /// The unique identifier of the connected peer. - pub peer_id: PeerId, + peer_id: PeerId, /// Receiver for peer messages to be sent to all peers. /// We send bytes over this stream to avoid repeatedly having to serialize the payloads. - pub peer_rx: BroadcastStream, + peer_rx: BroadcastStream, /// Most recent payload ID received from this peer to track payload transitions. - pub payload_id: PayloadId, + payload_id: PayloadId, /// A list of flashblock indices that we have already received from /// this peer for the current payload, used to detect duplicate messages. - pub received: Vec, + received: Vec, +} + +impl FlashblocksConnection { + /// Creates a new `FlashblocksConnection` instance. + /// + /// # Arguments + /// * `protocol` - The flashblocks protocol handler managing the connection. + /// * `conn` - The underlying protocol connection for sending and receiving messages. + /// * `peer_id` - The unique identifier of the connected peer. + /// * `peer_rx` - Receiver for peer messages to be sent to all peers. + pub fn new( + protocol: FlashblocksP2PProtocol, + conn: ProtocolConnection, + peer_id: PeerId, + peer_rx: BroadcastStream, + ) -> Self { + gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).increment(1); + + Self { + protocol, + conn, + peer_id, + peer_rx, + payload_id: PayloadId::default(), + received: Vec::new(), + } + } +} + +impl Drop for FlashblocksConnection { + fn drop(&mut self) { + gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).decrement(1); + } } impl Stream for FlashblocksConnection { diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 750ff15c..beda4f03 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -207,7 +207,9 @@ impl FlashblocksP2PProtocol { handle, } } +} +impl FlashblocksP2PProtocol { /// Returns the P2P capability for the flashblocks v1 protocol. /// /// This capability is used during devp2p handshake to advertise support @@ -576,13 +578,8 @@ impl ConnectionHandler for FlashblocksP2PProtocol "new flashblocks connection" ); - FlashblocksConnection { - peer_rx: BroadcastStream::new(self.handle.ctx.peer_tx.subscribe()), - protocol: self, - conn, - peer_id, - payload_id: Default::default(), - received: Vec::new(), - } + let peer_rx = self.handle.ctx.peer_tx.subscribe(); + + FlashblocksConnection::new(self, conn, peer_id, BroadcastStream::new(peer_rx)) } } From 888bd1b9c97a90601dc8b99991fcc09709cabda0 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 28 Jul 2025 09:12:39 -0700 Subject: [PATCH 066/114] chore: unused error messages --- crates/flashblocks-p2p/src/protocol/error.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/error.rs b/crates/flashblocks-p2p/src/protocol/error.rs index 47486b65..928148ed 100644 --- a/crates/flashblocks-p2p/src/protocol/error.rs +++ b/crates/flashblocks-p2p/src/protocol/error.rs @@ -8,10 +8,4 @@ pub enum FlashblocksP2PError { "attempt to publish flashblocks with expired authorization. Make sure to call `start_publishing` first" )] ExpiredAuthorization, - #[error("input too short")] - InputTooShort, - #[error("unknown message type")] - UnknownMessageType, - #[error("invalid builder signature")] - Rlp(#[from] alloy_rlp::Error), } From 8dc7540c4f005795cdb38bd6eaf89dcad2783ded Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 28 Jul 2025 13:24:37 -0700 Subject: [PATCH 067/114] feat: fn flashblock_stream --- .../flashblocks-p2p/src/protocol/handler.rs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index beda4f03..75746adc 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -1,6 +1,7 @@ use crate::protocol::{connection::FlashblocksConnection, error::FlashblocksP2PError}; use alloy_rlp::BytesMut; use ed25519_dalek::{SigningKey, VerifyingKey}; +use futures::{Stream, StreamExt, stream}; use parking_lot::Mutex; use reth::payload::PayloadId; use reth_eth_wire::Capability; @@ -411,6 +412,27 @@ impl FlashblocksHandle { } }); } + + /// Returns a stream of ordered flashblocks starting from the beginning of the current payload. + /// + /// # Behavior + /// The stream will continue to yield flashblocks for consecutive payloads as well, so + /// consumers should take care to handle the stream appropriately. + pub fn flashblock_stream(&self) -> impl Stream + Send + 'static { + let flashblocks = self + .state + .lock() + .flashblocks + .clone() + .into_iter() + .map_while(|x| x); + + let receiver = self.ctx.flashblock_tx.subscribe(); + + let current = stream::iter(flashblocks); + let future = tokio_stream::StreamExt::map_while(BroadcastStream::new(receiver), |x| x.ok()); + current.chain(future) + } } impl FlashblocksP2PCtx { From 360158fd411d0d12ae46cceeb98dd0afbffd7ab3 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 28 Jul 2025 14:29:29 -0700 Subject: [PATCH 068/114] feat: Add more integration tests --- Cargo.lock | 38 +++ Cargo.toml | 5 + crates/flashblocks-p2p/Cargo.toml | 3 + crates/flashblocks-p2p/src/net/mod.rs | 4 +- .../src/protocol/connection.rs | 8 +- .../flashblocks-p2p/src/protocol/handler.rs | 10 +- crates/flashblocks-p2p/tests/protocol.rs | 280 ++++++++++++++++++ 7 files changed, 337 insertions(+), 11 deletions(-) create mode 100644 crates/flashblocks-p2p/tests/protocol.rs diff --git a/Cargo.lock b/Cargo.lock index 27bc4b4c..93fb7900 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3446,6 +3446,7 @@ dependencies = [ "reth-network", "reth-node-api", "reth-node-builder", + "reth-op", "reth-provider", "reth-transaction-pool", "rollup-boost", @@ -8877,6 +8878,43 @@ dependencies = [ "reth-trie-db", ] +[[package]] +name = "reth-op" +version = "1.5.1" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +dependencies = [ + "reth-chainspec", + "reth-codecs", + "reth-consensus", + "reth-consensus-common", + "reth-db", + "reth-eth-wire", + "reth-evm", + "reth-network", + "reth-network-api", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-optimism-chainspec", + "reth-optimism-consensus", + "reth-optimism-evm", + "reth-optimism-node", + "reth-optimism-primitives", + "reth-optimism-rpc", + "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]] name = "reth-optimism-chainspec" version = "1.5.1" diff --git a/Cargo.toml b/Cargo.toml index 6ad2c140..8d054628 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,11 @@ sha2 = { version = "0.10", default-features = false } # Reth deps reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +# Issue with reth feature compatibility. Include this in all crates for temp fix. +reth-op = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ + "full", + "alloy-compat", +] } reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index f9b2b9fa..8067e1bb 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -33,3 +33,6 @@ parking_lot = "0.12" rollup-boost = { path = "../rollup-boost" } + +[dev-dependencies] +reth-op.workspace = true diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 7e5baf37..d8cf9b47 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -11,7 +11,7 @@ use reth_node_builder::{ use reth_transaction_pool::{PoolTransaction, TransactionPool}; use crate::protocol::handler::{ - FlashblocksHandle, FlashblocksP2PNetworHandle, FlashblocksP2PProtocol, + FlashblocksHandle, FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, }; #[derive(Debug)] @@ -43,7 +43,7 @@ where Pool: TransactionPool>> + Unpin + 'static, - Network: FlashblocksP2PNetworHandle + Network: FlashblocksP2PNetworkHandle + NetworkProtocols + FullNetwork>>, { diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 9d0f2e3d..cd44ef3a 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,5 +1,5 @@ use crate::protocol::handler::{ - FlashblocksP2PNetworHandle, FlashblocksP2PProtocol, PeerMsg, PublishingStatus, + FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, PeerMsg, PublishingStatus, }; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; @@ -43,7 +43,7 @@ pub struct FlashblocksConnection { received: Vec, } -impl FlashblocksConnection { +impl FlashblocksConnection { /// Creates a new `FlashblocksConnection` instance. /// /// # Arguments @@ -76,7 +76,7 @@ impl Drop for FlashblocksConnection { } } -impl Stream for FlashblocksConnection { +impl Stream for FlashblocksConnection { type Item = BytesMut; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { @@ -202,7 +202,7 @@ impl Stream for FlashblocksConnection { } } -impl FlashblocksConnection { +impl FlashblocksConnection { /// Handles incoming flashblock payload messages from a peer. /// /// This method validates the flashblock payload, checks for duplicates and ordering, diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 75746adc..349d0a5d 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -43,9 +43,9 @@ const BROADCAST_BUFFER_CAPACITY: usize = 100; /// /// This trait combines all the necessary bounds for a network handle to be used /// in the flashblocks P2P system, including peer management capabilities. -pub trait FlashblocksP2PNetworHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} +pub trait FlashblocksP2PNetworkHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} -impl FlashblocksP2PNetworHandle for N {} +impl FlashblocksP2PNetworkHandle for N {} /// Messages that can be broadcast over a channel to each internal peer connection. /// @@ -193,7 +193,7 @@ pub struct FlashblocksP2PProtocol { pub handle: FlashblocksHandle, } -impl FlashblocksP2PProtocol { +impl FlashblocksP2PProtocol { /// Creates a new flashblocks P2P protocol handler. /// /// Initializes the handler with the necessary cryptographic keys, network handle, @@ -552,7 +552,7 @@ impl FlashblocksP2PCtx { } } -impl ProtocolHandler for FlashblocksP2PProtocol { +impl ProtocolHandler for FlashblocksP2PProtocol { type ConnectionHandler = Self; fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { @@ -568,7 +568,7 @@ impl ProtocolHandler for FlashblocksP2PProtocol ConnectionHandler for FlashblocksP2PProtocol { +impl ConnectionHandler for FlashblocksP2PProtocol { type Connection = FlashblocksConnection; fn protocol(&self) -> Protocol { diff --git a/crates/flashblocks-p2p/tests/protocol.rs b/crates/flashblocks-p2p/tests/protocol.rs new file mode 100644 index 00000000..103213bc --- /dev/null +++ b/crates/flashblocks-p2p/tests/protocol.rs @@ -0,0 +1,280 @@ +use ed25519_dalek::SigningKey; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, PublishingStatus}; +use futures::StreamExt as _; +use reth::payload::PayloadId; +use rollup_boost::{ + Authorization, AuthorizedPayload, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, + FlashblocksPayloadV1, +}; +use std::time::Duration; +use tokio::{sync::broadcast, task}; + +const CHANNEL_CAP: usize = 16; +const DUMMY_TIMESTAMP: u64 = 42; + +/// Helper: deterministic ed25519 key made of the given byte. +fn signing_key(byte: u8) -> SigningKey { + SigningKey::from_bytes(&[byte; 32]) +} + +/// Helper: a minimal Flashblock (index 0) for the given payload-id. +fn payload(payload_id: reth::payload::PayloadId, idx: u64) -> FlashblocksPayloadV1 { + FlashblocksPayloadV1 { + payload_id, + index: idx, + base: Some(ExecutionPayloadBaseV1 { + block_number: 0, + ..Default::default() + }), + diff: ExecutionPayloadFlashblockDeltaV1::default(), + metadata: serde_json::Value::Null, + } +} + +/// Build a fresh handle plus its broadcast receiver. +fn fresh_handle() -> (FlashblocksHandle, broadcast::Receiver) { + // authorizer + builder keys + let auth_sk = signing_key(1); + let builder_sk = signing_key(2); + + // channel for ordered flashblocks + let (tx, rx) = broadcast::channel(CHANNEL_CAP); + + ( + FlashblocksHandle::new(auth_sk.verifying_key(), builder_sk, tx), + rx, + ) +} + +#[tokio::test] +async fn publish_without_clearance_is_rejected() { + let (handle, _rx) = fresh_handle(); + + let payload_id = reth::payload::PayloadId::new([0; 8]); + let auth = Authorization::new( + payload_id, + DUMMY_TIMESTAMP, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + let payload = payload(payload_id, 0); + let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload.clone()); + + // We never called `start_publishing`, so this must fail. + let err = handle.publish_new(signed).unwrap_err(); + assert!(matches!( + err, + flashblocks_p2p::protocol::error::FlashblocksP2PError::NotClearedToPublish + )); +} + +#[tokio::test] +async fn expired_authorization_is_rejected() { + let (handle, _rx) = fresh_handle(); + + // Step 1: obtain clearance with auth_1 + let payload_id = reth::payload::PayloadId::new([1; 8]); + let auth_1 = Authorization::new( + payload_id, + DUMMY_TIMESTAMP, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + handle.start_publishing(auth_1); + + // Step 2: craft a payload signed with *different* authorization → should fail + let auth_2 = Authorization::new( + payload_id, + DUMMY_TIMESTAMP + 1, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + let payload = payload(payload_id, 0); + let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth_2, payload); + + let err = handle.publish_new(signed).unwrap_err(); + assert!(matches!( + err, + flashblocks_p2p::protocol::error::FlashblocksP2PError::ExpiredAuthorization + )); +} + +#[tokio::test] +async fn flashblock_stream_is_ordered() { + let (handle, mut rx) = fresh_handle(); + + // clearance + let payload_id = reth::payload::PayloadId::new([2; 8]); + let auth = Authorization::new( + payload_id, + DUMMY_TIMESTAMP, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + handle.start_publishing(auth); + + // send index 1 first (out-of-order) + for &idx in &[1u64, 0] { + let p = payload(payload_id, idx); + let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, p.clone()); + handle.publish_new(signed).unwrap(); + } + + // Expect to receive 0, then 1 over the ordered broadcast. + let first = rx.recv().await.unwrap(); + let second = rx.recv().await.unwrap(); + assert_eq!(first.index, 0); + assert_eq!(second.index, 1); +} + +#[tokio::test] +async fn stop_and_restart_updates_state() { + let (handle, _rx) = fresh_handle(); + + // 1) start publishing + let payload_id_0 = reth::payload::PayloadId::new([3; 8]); + let auth_0 = Authorization::new( + payload_id_0, + DUMMY_TIMESTAMP, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + handle.start_publishing(auth_0); + assert!(matches!( + handle.publishing_status(), + PublishingStatus::Publishing { .. } + )); + + // 2) stop + handle.stop_publishing(); + assert!(matches!( + handle.publishing_status(), + PublishingStatus::NotPublishing { .. } + )); + + // 3) start again with a new payload + let payload_id_1 = reth::payload::PayloadId::new([4; 8]); + let auth_1 = Authorization::new( + payload_id_1, + DUMMY_TIMESTAMP + 5, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + handle.start_publishing(auth_1); + assert!(matches!( + handle.publishing_status(), + PublishingStatus::Publishing { .. } + )); +} + +#[tokio::test] +async fn stop_and_restart_with_active_publishers() { + let timestamp = 1000; + let (handle, _) = fresh_handle(); + + // Pretend we already know about another publisher. + let other_vk = signing_key(99).verifying_key(); + { + let state = handle.state.lock(); + state + .publishing_status + .send_replace(PublishingStatus::NotPublishing { + active_publishers: vec![(other_vk, timestamp - 1)], + }); + } + + // Our own clearance → should transition to WaitingToPublish. + let payload_id = PayloadId::new([6; 8]); + let auth = Authorization::new( + payload_id, + timestamp, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + handle.start_publishing(auth); + match handle.publishing_status() { + PublishingStatus::WaitingToPublish { + active_publishers, .. + } => { + assert_eq!(active_publishers.len(), 1); + assert_eq!(active_publishers[0].0, other_vk); + } + s => panic!("unexpected status: {s:?}"), + } + + // Now we voluntarily stop. We should end up back in NotPublishing, + // still carrying the same active publisher entry. + handle.stop_publishing(); + match handle.publishing_status() { + PublishingStatus::NotPublishing { active_publishers } => { + assert_eq!(active_publishers.len(), 1); + assert_eq!(active_publishers[0].0, other_vk); + } + s => panic!("unexpected status after stop: {s:?}"), + } +} + +#[tokio::test] +async fn flashblock_stream_buffers_and_live() { + let timestamp = 1000; + let (handle, _rx) = fresh_handle(); + let pid = PayloadId::new([7; 8]); + let auth = Authorization::new( + pid, + timestamp, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + handle.start_publishing(auth); + + // publish index 0 before creating the stream + let signed0 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 0)); + handle.publish_new(signed0).unwrap(); + + // now create the combined stream + let mut stream = handle.flashblock_stream(); + + // first item comes from the cached vector + let first = stream.next().await.unwrap(); + assert_eq!(first.index, 0); + + // publish index 1 after the stream exists + let signed1 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 1)); + handle.publish_new(signed1).unwrap(); + + // second item should be delivered live + let second = stream.next().await.unwrap(); + assert_eq!(second.index, 1); +} + +#[tokio::test] +async fn await_clearance_unblocks_on_publish() { + let (handle, _rx) = fresh_handle(); + + let waiter = { + let h = handle.clone(); + task::spawn(async move { + h.await_clearance().await; + }) + }; + + // give the waiter a chance to subscribe + tokio::task::yield_now().await; + assert!(!waiter.is_finished(), "future must still be pending"); + + // now grant clearance + let payload_id = reth::payload::PayloadId::new([5; 8]); + let auth = Authorization::new( + payload_id, + DUMMY_TIMESTAMP, + &signing_key(1), + handle.ctx.builder_sk.verifying_key(), + ); + handle.start_publishing(auth); + + // waiter should finish very quickly + tokio::time::timeout(Duration::from_secs(1), waiter) + .await + .expect("await_clearance did not complete") + .unwrap(); +} From bb57a4401ffed36f753ea8a36cffd013c38fb0a5 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 28 Jul 2025 14:41:48 -0700 Subject: [PATCH 069/114] feat: check MAX_FLASHBLOCK_INDEX with peers --- .../flashblocks-p2p/src/protocol/connection.rs | 16 +++++++++++++++- crates/flashblocks-p2p/src/protocol/handler.rs | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index cd44ef3a..4c09a566 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,5 +1,6 @@ use crate::protocol::handler::{ - FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, PeerMsg, PublishingStatus, + FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, MAX_FLASHBLOCK_INDEX, PeerMsg, + PublishingStatus, }; use alloy_primitives::bytes::BytesMut; use futures::{Stream, StreamExt}; @@ -246,6 +247,19 @@ impl FlashblocksConnection { self.received.fill(false); } + // Check if the payload index is within the allowed range + if msg.index as usize > MAX_FLASHBLOCK_INDEX { + tracing::error!( + target: "flashblocks::p2p", + peer_id = %self.peer_id, + index = msg.index, + payload_id = %msg.payload_id, + max_index = MAX_FLASHBLOCK_INDEX, + "Received flashblocks payload with index exceeding maximum" + ); + return; + } + // Check if this peer is spamming us with the same payload index let len = self.received.len(); self.received diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 349d0a5d..263e57dc 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -29,7 +29,7 @@ const MAX_FRAME: usize = 1 << 24; // 16 MiB /// Maximum index for flashblocks payloads. /// Not intended to ever be hit. Since we resize the flashblocks vector dynamically, /// this is just a sanity check to prevent excessive memory usage. -const MAX_FLASHBLOCK_INDEX: usize = 100; +pub(crate) const MAX_FLASHBLOCK_INDEX: usize = 100; /// The maximum number of seconds we will wait for a previous publisher to stop /// before continueing anyways. From d8249dac3642a9371503e73a31d997d7a47dafd8 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 28 Jul 2025 14:50:29 -0700 Subject: [PATCH 070/114] feat: additional doc comments --- .../src/protocol/connection.rs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 4c09a566..1a8a2afe 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -318,7 +318,19 @@ impl FlashblocksConnection { .publish(&mut state, authorized_payload); } - // TODO: handle propogating this if we care. For now we assume direct peering. + /// Handles incoming `StartPublish` messages from a peer. + /// + /// TODO: handle propogating this if we care. For now we assume direct peering. + /// + /// # Arguments + /// * `authorized_payload` - The authorized `StartPublish` message received from the peer + /// + /// # Behavior + /// - Validates the timestamp to prevent replay attacks + /// - Updates the publishing status to reflect the new publisher + /// - If we are currently publishing, sends a `StopPublish` message to ourselves + /// - If we are waiting to publish, updates the list of active publishers + /// - If we are not publishing, adds the new publisher to the list of active publishers fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { let state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; @@ -399,7 +411,19 @@ impl FlashblocksConnection { }); } - // TODO: handle propogating this if we care. For now we assume direct peering. + /// Handles incoming `StopPublish` messages from a peer. + /// + /// TODO: handle propogating this if we care. For now we assume direct peering. + /// + /// # Arguments + /// * `authorized_payload` - The authorized `StopPublish` message received from the peer + /// + /// # Behavior + /// - Validates the timestamp to prevent replay attacks + /// - Updates the publishing status based on the current state + /// - If we are currently publishing, logs a warning + /// - If we are waiting to publish, removes the publisher from the list of active publishers and checks if we can start publishing + /// - If we are not publishing, removes the publisher from the list of active publishers fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { let state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; From 528cac3976edb47fa35c6c563314d58b7948579d Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 28 Jul 2025 16:14:00 -0700 Subject: [PATCH 071/114] feat: switch to adding param to FCU for authorization --- crates/flashblocks-node/tests/p2p.rs | 29 ++++++++++++++------------- crates/rollup-boost/src/client/rpc.rs | 2 +- crates/rollup-boost/src/server.rs | 10 +++++---- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 0a160425..e08b9410 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -22,14 +22,14 @@ use reth_optimism_node::{OpNode, args::RollupArgs}; use reth_optimism_primitives::{OpPrimitives, OpReceipt}; use reth_provider::providers::BlockchainProvider; use reth_tasks::{TaskExecutor, TaskManager}; -use reth_tracing::tracing_subscriber; +use reth_tracing::tracing_subscriber::{self, util::SubscriberInitExt}; use rollup_boost::{ Authorization, AuthorizedPayload, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, }; use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; use tokio::sync::broadcast; -use tracing::info; +use tracing::{Dispatch, info}; type Network = NetworkHandle< BasicNetworkPrimitives< @@ -58,6 +58,17 @@ impl NodeContext { } } +fn init_tracing(filter: &str) -> tracing::subscriber::DefaultGuard { + let sub = tracing_subscriber::fmt() + .with_env_filter(filter) + .with_target(false) + .with_target(false) + .without_time() + .finish(); + + Dispatch::new(sub).set_default() +} + async fn setup_node( exec: TaskExecutor, authorizer_sk: SigningKey, @@ -311,12 +322,7 @@ async fn setup_nodes(n: u8) -> eyre::Result<(Vec, SigningKey)> { #[tokio::test] async fn test_double_failover() -> eyre::Result<()> { - tracing_subscriber::fmt() - .with_env_filter("warn,flashblocks=trace") - .with_target(false) - .with_target(false) - .without_time() - .init(); + let _ = init_tracing("warn,flashblocks=trace"); let (nodes, authorizer) = setup_nodes(3).await?; @@ -403,12 +409,7 @@ async fn test_double_failover() -> eyre::Result<()> { #[tokio::test] async fn test_force_race_condition() -> eyre::Result<()> { - tracing_subscriber::fmt() - .with_env_filter("warn,flashblocks=trace") - .with_target(false) - .with_target(false) - .without_time() - .init(); + let _ = init_tracing("warn,flashblocks=trace"); let (nodes, authorizer) = setup_nodes(3).await?; diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index b8b10a20..76e2fc45 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -179,7 +179,7 @@ impl RpcClient { pk.clone(), ); self.auth_client - .fork_choice_updated_flashblocks_v1( + .flashblocks_fork_choice_updated_v3( fork_choice_state, payload_attributes.clone(), Some(authorization), diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index 3a0d1798..d152c50c 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -285,14 +285,16 @@ where } } -#[rpc(server, client)] +#[rpc(client)] pub trait FlashblocksEngineApi { - #[method(name = "engine_forkchoiceUpdatedFlashblocksV1")] - async fn fork_choice_updated_flashblocks_v1( + /// When flashblocks is enabled + /// we add an additional parameter `authorization` to the FCU + #[method(name = "engine_forkchoiceUpdatedV3")] + async fn flashblocks_fork_choice_updated_v3( &self, fork_choice_state: ForkchoiceState, payload_attributes: Option, - flashblocks_authorization: Option, + authorization: Option, ) -> RpcResult; } From 93456dfce26a37a508fbdbd7885e9204d7b7f79c Mon Sep 17 00:00:00 2001 From: 0xOsiris Date: Tue, 5 Aug 2025 14:14:03 -0700 Subject: [PATCH 072/114] feat: add handle to flashblocks sender --- .../flashblocks-p2p/src/protocol/handler.rs | 4 +++ crates/rollup-boost/src/flashblocks/args.rs | 30 +++++-------------- crates/websocket-proxy/src/client.rs | 2 +- crates/websocket-proxy/src/main.rs | 4 +-- crates/websocket-proxy/src/metrics.rs | 2 +- crates/websocket-proxy/src/registry.rs | 2 +- crates/websocket-proxy/src/subscriber.rs | 4 +-- crates/websocket-proxy/tests/integration.rs | 2 +- 8 files changed, 19 insertions(+), 31 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 263e57dc..deedbd94 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -178,6 +178,10 @@ impl FlashblocksHandle { Self { ctx, state } } + + pub fn flashblocks_tx(&self) -> broadcast::Sender { + self.ctx.flashblock_tx.clone() + } } /// Main protocol handler for the flashblocks P2P protocol. diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index b6773219..e10158fe 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -12,35 +12,19 @@ pub struct FlashblocksArgs { pub flashblocks: bool, /// Flashblocks Builder WebSocket URL - #[arg( - long, - env, - default_value = "ws://127.0.0.1:1111" - )] + #[arg(long, env, default_value = "ws://127.0.0.1:1111")] pub flashblocks_builder_url: Url, /// Flashblocks WebSocket host for outbound connections - #[arg( - long, - env, - default_value = "127.0.0.1" - )] + #[arg(long, env, default_value = "127.0.0.1")] pub flashblocks_host: String, /// Flashblocks WebSocket port for outbound connections - #[arg( - long, - env, - default_value = "1112" - )] + #[arg(long, env, default_value = "1112")] pub flashblocks_port: u16, /// Time used for timeout if builder disconnected - #[arg( - long, - env, - default_value = "5000" - )] + #[arg(long, env, default_value = "5000")] pub flashblock_builder_ws_reconnect_ms: u64, #[arg( @@ -51,7 +35,8 @@ pub struct FlashblocksArgs { )] pub flashblocks_authorizer_sk: SigningKey, - #[arg(long, + #[arg( + long, env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk, required = false, @@ -60,8 +45,7 @@ pub struct FlashblocksArgs { } pub fn parse_sk(s: &str) -> eyre::Result { - let bytes = - <[u8; 32]>::from_hex(s.trim())?; + let bytes = <[u8; 32]>::from_hex(s.trim())?; Ok(SigningKey::from_bytes(&bytes)) } diff --git a/crates/websocket-proxy/src/client.rs b/crates/websocket-proxy/src/client.rs index 3b36b468..86e74f39 100644 --- a/crates/websocket-proxy/src/client.rs +++ b/crates/websocket-proxy/src/client.rs @@ -1,6 +1,6 @@ use crate::rate_limit::Ticket; -use axum::extract::ws::WebSocket; use axum::Error; +use axum::extract::ws::WebSocket; use std::net::IpAddr; pub struct ClientConnection { diff --git a/crates/websocket-proxy/src/main.rs b/crates/websocket-proxy/src/main.rs index d653f8e3..a167b40b 100644 --- a/crates/websocket-proxy/src/main.rs +++ b/crates/websocket-proxy/src/main.rs @@ -18,10 +18,10 @@ use std::io::Write; use std::net::SocketAddr; use std::sync::Arc; use subscriber::WebsocketSubscriber; -use tokio::signal::unix::{signal, SignalKind}; +use tokio::signal::unix::{SignalKind, signal}; use tokio::sync::broadcast; use tokio_util::sync::CancellationToken; -use tracing::{error, info, trace, warn, Level}; +use tracing::{Level, error, info, trace, warn}; use tracing_subscriber::EnvFilter; #[derive(Parser, Debug)] diff --git a/crates/websocket-proxy/src/metrics.rs b/crates/websocket-proxy/src/metrics.rs index 5c6c5820..87dfe1cf 100644 --- a/crates/websocket-proxy/src/metrics.rs +++ b/crates/websocket-proxy/src/metrics.rs @@ -1,4 +1,4 @@ -use metrics::{counter, Counter, Gauge}; +use metrics::{Counter, Gauge, counter}; use metrics_derive::Metrics; #[derive(Metrics)] #[metrics(scope = "websocket_proxy")] diff --git a/crates/websocket-proxy/src/registry.rs b/crates/websocket-proxy/src/registry.rs index c320d8fd..59207ec2 100644 --- a/crates/websocket-proxy/src/registry.rs +++ b/crates/websocket-proxy/src/registry.rs @@ -1,8 +1,8 @@ use crate::client::ClientConnection; use crate::metrics::Metrics; use std::sync::Arc; -use tokio::sync::broadcast::error::RecvError; use tokio::sync::broadcast::Sender; +use tokio::sync::broadcast::error::RecvError; use tracing::{info, trace, warn}; #[derive(Clone)] diff --git a/crates/websocket-proxy/src/subscriber.rs b/crates/websocket-proxy/src/subscriber.rs index dabd0faf..9c2d3474 100644 --- a/crates/websocket-proxy/src/subscriber.rs +++ b/crates/websocket-proxy/src/subscriber.rs @@ -1,6 +1,6 @@ use crate::metrics::Metrics; use axum::http::Uri; -use backoff::{backoff::Backoff, ExponentialBackoff}; +use backoff::{ExponentialBackoff, backoff::Backoff}; use futures::StreamExt; use std::sync::Arc; use std::time::Duration; @@ -194,7 +194,7 @@ mod tests { use std::sync::{Arc, Mutex}; use tokio::net::{TcpListener, TcpStream}; use tokio::sync::broadcast; - use tokio::time::{sleep, timeout, Duration}; + use tokio::time::{Duration, sleep, timeout}; use tokio_tungstenite::{accept_async, tungstenite::Message}; struct MockServer { diff --git a/crates/websocket-proxy/tests/integration.rs b/crates/websocket-proxy/tests/integration.rs index c11e012d..f074b5c5 100644 --- a/crates/websocket-proxy/tests/integration.rs +++ b/crates/websocket-proxy/tests/integration.rs @@ -1,6 +1,6 @@ use futures::StreamExt; -use std::collections::hash_map::Entry; use std::collections::HashMap; +use std::collections::hash_map::Entry; use std::error::Error; use std::net::SocketAddr; use std::sync::{Arc, Mutex}; From 7ab74a1948f5f8adb7ef0a5c91463712916248a0 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 5 Aug 2025 17:31:20 -0700 Subject: [PATCH 073/114] feat: internalize flashblocks chan --- Cargo.lock | 1 + crates/flashblocks-node/src/bin/main.rs | 13 +++----- crates/flashblocks-node/tests/p2p.rs | 16 +++------ .../flashblocks-p2p/src/protocol/handler.rs | 7 ++-- crates/flashblocks-p2p/tests/protocol.rs | 33 ++++++++----------- crates/flashblocks-rpc/Cargo.toml | 1 + crates/flashblocks-rpc/src/cache.rs | 3 +- crates/flashblocks-rpc/src/flashblocks.rs | 30 +++++------------ .../rollup-boost/src/flashblocks/service.rs | 2 +- 9 files changed, 38 insertions(+), 68 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 93fb7900..c1bcdc54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3476,6 +3476,7 @@ dependencies = [ "clap", "ed25519-dalek", "eyre", + "flashblocks-p2p", "futures-util", "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index ffccb19c..71dde4d8 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -7,7 +7,6 @@ use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverla use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; -use tokio::sync::broadcast; use tracing::info; #[derive(Debug, Clone, clap::Args)] @@ -25,9 +24,11 @@ pub fn main() { Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); - let (inbound_tx, inbound_rx) = broadcast::channel(100); + let flashblocks_handle = + FlashblocksHandle::new(VerifyingKey::default(), SigningKey::from_bytes(&[0u8; 32])); - let flashblocks_overlay = FlashblocksOverlay::new(chain_spec, inbound_rx); + let flashblocks_overlay = + FlashblocksOverlay::new(flashblocks_handle.clone(), chain_spec); flashblocks_overlay.clone().start()?; info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); @@ -45,12 +46,6 @@ pub fn main() { .launch_with_debug_capabilities() .await?; - let flashblocks_handle = FlashblocksHandle::new( - VerifyingKey::default(), - SigningKey::from_bytes(&[0u8; 32]), - inbound_tx, - ); - let flashblocks_p2p_protocol = FlashblocksP2PProtocol::new(handle.node.network.clone(), flashblocks_handle); diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index e08b9410..74a6cd5a 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -28,7 +28,6 @@ use rollup_boost::{ FlashblocksPayloadV1, }; use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; -use tokio::sync::broadcast; use tracing::{Dispatch, info}; type Network = NetworkHandle< @@ -41,7 +40,6 @@ type Network = NetworkHandle< pub struct NodeContext { p2p_handle: FlashblocksHandle, - _flashblocks_tx: broadcast::Sender, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -75,8 +73,6 @@ async fn setup_node( builder_sk: SigningKey, peers: Vec<(PeerId, SocketAddr)>, ) -> eyre::Result { - let (inbound_tx, inbound_rx) = broadcast::channel(100); - let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); let chain_spec = Arc::new( OpChainSpecBuilder::base_mainnet() @@ -101,6 +97,9 @@ async fn setup_node( let node = OpNode::new(RollupArgs::default()); + let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key(), builder_sk); + let p2p_handle_clone = p2p_handle.clone(); + let NodeHandle { node, node_exit_future, @@ -112,7 +111,7 @@ async fn setup_node( .extend_rpc_modules(move |ctx| { // We are not going to use the websocket connection to send payloads so we use // a dummy url. - let flashblocks_overlay = FlashblocksOverlay::new(chain_spec, inbound_rx); + let flashblocks_overlay = FlashblocksOverlay::new(p2p_handle_clone, chain_spec); flashblocks_overlay.clone().start()?; let eth_api = ctx.registry.eth_api().clone(); @@ -125,12 +124,6 @@ async fn setup_node( .launch() .await?; - let p2p_handle = FlashblocksHandle::new( - authorizer_sk.verifying_key(), - builder_sk, - inbound_tx.clone(), - ); - let p2p_protocol = FlashblocksP2PProtocol { network: node.network.clone(), handle: p2p_handle.clone(), @@ -154,7 +147,6 @@ async fn setup_node( Ok(NodeContext { p2p_handle, - _flashblocks_tx: inbound_tx, local_node_record, http_api_addr, _node_exit_future: node_exit_future, diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index deedbd94..711cbc89 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -162,11 +162,8 @@ pub struct FlashblocksHandle { } impl FlashblocksHandle { - pub fn new( - authorizer_vk: VerifyingKey, - builder_sk: SigningKey, - flashblock_tx: broadcast::Sender, - ) -> Self { + pub fn new(authorizer_vk: VerifyingKey, builder_sk: SigningKey) -> Self { + let flashblock_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let peer_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); let ctx = FlashblocksP2PCtx { diff --git a/crates/flashblocks-p2p/tests/protocol.rs b/crates/flashblocks-p2p/tests/protocol.rs index 103213bc..01223898 100644 --- a/crates/flashblocks-p2p/tests/protocol.rs +++ b/crates/flashblocks-p2p/tests/protocol.rs @@ -7,9 +7,8 @@ use rollup_boost::{ FlashblocksPayloadV1, }; use std::time::Duration; -use tokio::{sync::broadcast, task}; +use tokio::task; -const CHANNEL_CAP: usize = 16; const DUMMY_TIMESTAMP: u64 = 42; /// Helper: deterministic ed25519 key made of the given byte. @@ -32,23 +31,17 @@ fn payload(payload_id: reth::payload::PayloadId, idx: u64) -> FlashblocksPayload } /// Build a fresh handle plus its broadcast receiver. -fn fresh_handle() -> (FlashblocksHandle, broadcast::Receiver) { +fn fresh_handle() -> FlashblocksHandle { // authorizer + builder keys let auth_sk = signing_key(1); let builder_sk = signing_key(2); - // channel for ordered flashblocks - let (tx, rx) = broadcast::channel(CHANNEL_CAP); - - ( - FlashblocksHandle::new(auth_sk.verifying_key(), builder_sk, tx), - rx, - ) + FlashblocksHandle::new(auth_sk.verifying_key(), builder_sk) } #[tokio::test] async fn publish_without_clearance_is_rejected() { - let (handle, _rx) = fresh_handle(); + let handle = fresh_handle(); let payload_id = reth::payload::PayloadId::new([0; 8]); let auth = Authorization::new( @@ -70,7 +63,7 @@ async fn publish_without_clearance_is_rejected() { #[tokio::test] async fn expired_authorization_is_rejected() { - let (handle, _rx) = fresh_handle(); + let handle = fresh_handle(); // Step 1: obtain clearance with auth_1 let payload_id = reth::payload::PayloadId::new([1; 8]); @@ -101,7 +94,7 @@ async fn expired_authorization_is_rejected() { #[tokio::test] async fn flashblock_stream_is_ordered() { - let (handle, mut rx) = fresh_handle(); + let handle = fresh_handle(); // clearance let payload_id = reth::payload::PayloadId::new([2; 8]); @@ -120,16 +113,18 @@ async fn flashblock_stream_is_ordered() { handle.publish_new(signed).unwrap(); } + let mut flashblock_stream = handle.flashblock_stream(); + // Expect to receive 0, then 1 over the ordered broadcast. - let first = rx.recv().await.unwrap(); - let second = rx.recv().await.unwrap(); + let first = flashblock_stream.next().await.unwrap(); + let second = flashblock_stream.next().await.unwrap(); assert_eq!(first.index, 0); assert_eq!(second.index, 1); } #[tokio::test] async fn stop_and_restart_updates_state() { - let (handle, _rx) = fresh_handle(); + let handle = fresh_handle(); // 1) start publishing let payload_id_0 = reth::payload::PayloadId::new([3; 8]); @@ -170,7 +165,7 @@ async fn stop_and_restart_updates_state() { #[tokio::test] async fn stop_and_restart_with_active_publishers() { let timestamp = 1000; - let (handle, _) = fresh_handle(); + let handle = fresh_handle(); // Pretend we already know about another publisher. let other_vk = signing_key(99).verifying_key(); @@ -217,7 +212,7 @@ async fn stop_and_restart_with_active_publishers() { #[tokio::test] async fn flashblock_stream_buffers_and_live() { let timestamp = 1000; - let (handle, _rx) = fresh_handle(); + let handle = fresh_handle(); let pid = PayloadId::new([7; 8]); let auth = Authorization::new( pid, @@ -249,7 +244,7 @@ async fn flashblock_stream_buffers_and_live() { #[tokio::test] async fn await_clearance_unblocks_on_publish() { - let (handle, _rx) = fresh_handle(); + let handle = fresh_handle(); let waiter = { let h = handle.clone(); diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 51bde4ec..93836870 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -6,6 +6,7 @@ license = "MIT" [dependencies] rollup-boost.workspace = true +flashblocks-p2p.workspace = true reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } diff --git a/crates/flashblocks-rpc/src/cache.rs b/crates/flashblocks-rpc/src/cache.rs index 5bc6ef73..4314915c 100644 --- a/crates/flashblocks-rpc/src/cache.rs +++ b/crates/flashblocks-rpc/src/cache.rs @@ -33,7 +33,7 @@ pub struct Metadata { pub block_number: u64, } -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct FlashblocksCache { inner: Arc>, } @@ -66,6 +66,7 @@ impl FlashblocksCache { } } +#[derive(Debug, Clone)] struct FlashblocksCacheInner { chain_spec: Arc, builder: FlashblockBuilder, diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index 71c176d0..159ed716 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -1,48 +1,36 @@ use crate::{FlashblocksApi, cache::FlashblocksCache}; use alloy_primitives::{Address, TxHash, U256}; +use flashblocks_p2p::protocol::handler::FlashblocksHandle; +use futures_util::StreamExt as _; use jsonrpsee::core::async_trait; use op_alloy_network::Optimism; use reth_optimism_chainspec::OpChainSpec; use reth_rpc_eth_api::{RpcBlock, RpcReceipt}; use rollup_boost::FlashblocksPayloadV1; use std::{io::Read, sync::Arc}; -use tokio::sync::broadcast; use tracing::error; +#[derive(Debug, Clone)] pub struct FlashblocksOverlay { - events: broadcast::Receiver, + flashblocks_handle: FlashblocksHandle, cache: FlashblocksCache, } -impl Clone for FlashblocksOverlay { - fn clone(&self) -> Self { - Self { - events: self.events.resubscribe(), - cache: self.cache.clone(), - } - } -} - impl FlashblocksOverlay { - pub fn new( - chain_spec: Arc, - events: broadcast::Receiver, - ) -> Self { + pub fn new(flashblocks_handle: FlashblocksHandle, chain_spec: Arc) -> Self { Self { - events, + flashblocks_handle, cache: FlashblocksCache::new(chain_spec), } } - pub fn start(mut self) -> eyre::Result<()> { + pub fn start(self) -> eyre::Result<()> { let cache_cloned = self.cache.clone(); - // let overlay = FlashblocksOverlay { - // cache: self.cache.clone(), - // }; tokio::spawn(async move { + let mut stream = self.flashblocks_handle.flashblock_stream(); loop { // TODO: handle this error - let payload = self.events.recv().await.unwrap(); + let payload = stream.next().await.unwrap(); if let Err(e) = cache_cloned.process_payload(payload) { error!("failed to process payload: {}", e); } diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index b9c6ee7d..c7dd7378 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -41,7 +41,7 @@ enum FlashblocksEngineMessage { FlashblocksPayloadV1(FlashblocksPayloadV1), } -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub struct FlashblockBuilder { base: Option, flashblocks: Vec, From 36926ad386bb1b0f0d6e2fc686bd29d5ac70d440 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 5 Aug 2025 19:37:38 -0700 Subject: [PATCH 074/114] feat: update tests --- crates/flashblocks-node/tests/p2p.rs | 175 +++++++++++++-------------- 1 file changed, 81 insertions(+), 94 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 74a6cd5a..485f0d3d 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -155,7 +155,7 @@ async fn setup_node( }) } -fn payload_base(block_number: u64, payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { +fn base_payload(block_number: u64, payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { FlashblocksPayloadV1 { payload_id, index, @@ -188,7 +188,7 @@ const TX1_HASH: TxHash = const TX2_HASH: TxHash = b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); -fn payload_next(payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { +fn next_payload(payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { // Create second payload (index 1) with transactions // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 @@ -245,53 +245,6 @@ fn payload_next(payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { } } -// #[tokio::test] -// async fn test_get_block_by_number_pending() -> eyre::Result<()> { -// reth_tracing::init_test_tracing(); -// let node = setup_node(None).await?; -// let provider = node.provider().await?; -// -// let latest_block = provider -// .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) -// .await? -// .expect("latest block expected"); -// assert_eq!(latest_block.number(), 0); -// -// // Querying pending block when it does not exists yet -// let pending_block = provider -// .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) -// .await?; -// assert_eq!(pending_block.is_none(), true); -// -// let base_payload = create_first_payload(); -// node.sender.send(base_payload.clone())?; -// tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; -// -// // Query pending block after sending the base payload with an empty delta -// let pending_block = provider -// .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) -// .await? -// .expect("pending block expected"); -// -// assert_eq!(pending_block.number(), 1); -// assert_eq!(pending_block.transactions.hashes().len(), 0); -// -// let second_payload = create_second_payload(); -// node.sender.send(second_payload.clone())?; -// tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; -// -// // Query pending block after sending the second payload with two transactions -// let block = provider -// .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) -// .await? -// .expect("pending block expected"); -// -// assert_eq!(block.number(), 1); -// assert_eq!(block.transactions.hashes().len(), 2); -// -// Ok(()) -// } -// async fn setup_nodes(n: u8) -> eyre::Result<(Vec, SigningKey)> { let mut nodes = Vec::new(); let mut peers = Vec::new(); @@ -346,7 +299,7 @@ async fn test_double_failover() -> eyre::Result<()> { .await?; assert!(pending_block.is_none()); - let payload_0 = payload_base(0, PayloadId::new([0; 8]), 0); + let payload_0 = base_payload(0, PayloadId::new([0; 8]), 0); let authorization_0 = Authorization::new( payload_0.payload_id, 0, @@ -360,7 +313,7 @@ async fn test_double_failover() -> eyre::Result<()> { nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - let payload_1 = payload_next(payload_0.payload_id, 1); + let payload_1 = next_payload(payload_0.payload_id, 1); let authorization_1 = Authorization::new( payload_1.payload_id, 0, @@ -378,7 +331,7 @@ async fn test_double_failover() -> eyre::Result<()> { tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; // Send a new block, this time from node 1 - let payload_2 = payload_next(payload_0.payload_id, 2); + let payload_2 = next_payload(payload_0.payload_id, 2); let msg = payload_2.clone(); let authorization_2 = Authorization::new( payload_2.payload_id, @@ -433,7 +386,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { .await?; assert!(pending_block.is_none()); - let payload_0 = payload_base(0, PayloadId::new([0; 8]), 0); + let payload_0 = base_payload(0, PayloadId::new([0; 8]), 0); info!("Sending payload 0, index 0"); let authorization = Authorization::new( payload_0.payload_id, @@ -466,7 +419,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { assert_eq!(pending_block.transactions.hashes().len(), 0); info!("Sending payload 0, index 1"); - let payload_1 = payload_next(payload_0.payload_id, 1); + let payload_1 = next_payload(payload_0.payload_id, 1); let authorization = Authorization::new( payload_1.payload_id, 0, @@ -496,7 +449,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { assert_eq!(block.transactions.hashes().len(), 2); // Send a new block, this time from node 1 - let payload_2 = payload_base(1, PayloadId::new([1; 8]), 0); + let payload_2 = base_payload(1, PayloadId::new([1; 8]), 0); info!("Sending payload 1, index 0"); let authorization_1 = Authorization::new( payload_2.payload_id, @@ -538,42 +491,76 @@ async fn test_force_race_condition() -> eyre::Result<()> { Ok(()) } -// #[tokio::test] -// async fn test_get_balance_pending() -> eyre::Result<()> { -// reth_tracing::init_test_tracing(); -// let node = setup_node(None).await?; -// let provider = node.provider().await?; -// -// node.send_test_payloads().await?; -// -// let balance = provider.get_balance(TEST_ADDRESS).await?; -// assert_eq!(balance, U256::ZERO); -// -// let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; -// assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); -// -// Ok(()) -// } -// -// #[tokio::test] -// async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { -// reth_tracing::init_test_tracing(); -// let node = setup_node(None).await?; -// let provider = node.provider().await?; -// -// let receipt = provider.get_transaction_receipt(TX1_HASH).await?; -// assert_eq!(receipt.is_none(), true); -// -// node.send_test_payloads().await?; -// -// let receipt = provider -// .get_transaction_receipt(TX1_HASH) -// .await? -// .expect("receipt expected"); -// assert_eq!(receipt.gas_used, 21000); -// -// // TODO: Add a new payload and validate that the receipts from the previous payload -// // are not returned. -// -// Ok(()) -// } +#[tokio::test] +async fn test_get_block_by_number_pending() -> eyre::Result<()> { + let _ = init_tracing("warn,flashblocks=trace"); + + let (nodes, authorizer) = setup_nodes(1).await?; + + let provider = nodes[0].provider().await?; + + let latest_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) + .await? + .expect("latest block expected"); + assert_eq!(latest_block.number(), 0); + + // Querying pending block when it does not exists yet + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await?; + assert!(pending_block.is_none()); + + let payload_id = PayloadId::new([0; 8]); + let base_payload = base_payload(0, payload_id, 0); + let authorization = Authorization::new( + base_payload.payload_id, + 0, + &authorizer, + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + ); + let authorized = AuthorizedPayload::new( + &nodes[0].p2p_handle.ctx.builder_sk, + authorization, + base_payload, + ); + nodes[0].p2p_handle.start_publishing(authorization); + nodes[0].p2p_handle.publish_new(authorized).unwrap(); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + // Query pending block after sending the base payload with an empty delta + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(pending_block.number(), 0); + assert_eq!(pending_block.transactions.hashes().len(), 0); + + let next_payload = next_payload(payload_id, 1); + let authorization = Authorization::new( + next_payload.payload_id, + 0, + &authorizer, + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + ); + let authorized = AuthorizedPayload::new( + &nodes[0].p2p_handle.ctx.builder_sk, + authorization, + next_payload, + ); + nodes[0].p2p_handle.start_publishing(authorization); + nodes[0].p2p_handle.publish_new(authorized).unwrap(); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + + // Query pending block after sending the second payload with two transactions + let block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(block.number(), 0); + assert_eq!(block.transactions.hashes().len(), 2); + + Ok(()) +} From c0cc1e25a6db19a6b0aeceb89e346d1b7f8d61a0 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 5 Aug 2025 19:42:38 -0700 Subject: [PATCH 075/114] chore: cleanup --- crates/flashblocks-node/tests/p2p.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 485f0d3d..a8750667 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -189,9 +189,6 @@ const TX2_HASH: TxHash = b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); fn next_payload(payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { - // Create second payload (index 1) with transactions - // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) - // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 let tx1 = Bytes::from_str("0x7ef8f8a042a8ae5ec231af3d0f90f68543ec8bca1da4f7edd712d5b51b490688355a6db794deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000044d000a118b00000000000000040000000067cb7cb0000000000077dbd4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014edd27304108914dd6503b19b9eeb9956982ef197febbeeed8a9eac3dbaaabdf000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3").unwrap(); let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); From f634e4b305ea92ced78ef685950a29efbcc6ea7f Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 5 Aug 2025 20:52:36 -0700 Subject: [PATCH 076/114] feat: test_peer_reputation --- crates/flashblocks-node/tests/p2p.rs | 74 ++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index a8750667..5932a093 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -5,7 +5,7 @@ use alloy_provider::{Provider, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol}; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol, PeerMsg}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; use op_alloy_consensus::{OpPooledTransaction, OpTxEnvelope}; use reth_eth_wire::BasicNetworkPrimitives; @@ -24,8 +24,8 @@ use reth_provider::providers::BlockchainProvider; use reth_tasks::{TaskExecutor, TaskManager}; use reth_tracing::tracing_subscriber::{self, util::SubscriberInitExt}; use rollup_boost::{ - Authorization, AuthorizedPayload, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, - FlashblocksPayloadV1, + Authorization, Authorized, AuthorizedMsg, AuthorizedPayload, ExecutionPayloadBaseV1, + ExecutionPayloadFlashblockDeltaV1, FlashblocksP2PMsg, FlashblocksPayloadV1, StartPublish, }; use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; use tracing::{Dispatch, info}; @@ -44,7 +44,7 @@ pub struct NodeContext { http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, _node: Box, - _network_handle: Network, + network_handle: Network, } impl NodeContext { @@ -151,7 +151,7 @@ async fn setup_node( http_api_addr, _node_exit_future: node_exit_future, _node: Box::new(node), - _network_handle: network_handle, + network_handle, }) } @@ -257,14 +257,14 @@ async fn setup_nodes(n: u8) -> eyre::Result<(Vec, SigningKey)> { nodes.push(node); } - tokio::time::sleep(tokio::time::Duration::from_millis(5000)).await; + tokio::time::sleep(tokio::time::Duration::from_millis(6000)).await; Ok((nodes, authorizer)) } #[tokio::test] async fn test_double_failover() -> eyre::Result<()> { - let _ = init_tracing("warn,flashblocks=trace"); + let _tracing = init_tracing("warn,flashblocks=trace"); let (nodes, authorizer) = setup_nodes(3).await?; @@ -351,7 +351,7 @@ async fn test_double_failover() -> eyre::Result<()> { #[tokio::test] async fn test_force_race_condition() -> eyre::Result<()> { - let _ = init_tracing("warn,flashblocks=trace"); + let _tracing = init_tracing("warn,flashblocks=trace"); let (nodes, authorizer) = setup_nodes(3).await?; @@ -490,7 +490,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { #[tokio::test] async fn test_get_block_by_number_pending() -> eyre::Result<()> { - let _ = init_tracing("warn,flashblocks=trace"); + let _tracing = init_tracing("warn,flashblocks=trace"); let (nodes, authorizer) = setup_nodes(1).await?; @@ -561,3 +561,59 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { Ok(()) } + +#[tokio::test] +async fn test_peer_reputation() -> eyre::Result<()> { + let _tracing = init_tracing("warn,flashblocks=trace"); + + let (nodes, _authorizer) = setup_nodes(2).await?; + + let mut publish_flashblocks = nodes[0].p2p_handle.ctx.flashblock_tx.subscribe(); + tokio::spawn(async move { + while let Ok(payload) = publish_flashblocks.recv().await { + println!("\n////////////////////////////////////////////////////////////////////\n"); + println!( + "Received flashblock, payload_id: {}, index: {}", + payload.payload_id, payload.index + ); + println!("\n////////////////////////////////////////////////////////////////////\n"); + } + }); + + let invalid_authorizer = SigningKey::from_bytes(&[99; 32]); + + let payload_0 = base_payload(0, PayloadId::new([0; 8]), 0); + info!("Sending bad authorization"); + let authorization = Authorization::new( + payload_0.payload_id, + 0, + &invalid_authorizer, + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + ); + + let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); + let authorized_payload = Authorized::new( + &nodes[0].p2p_handle.ctx.builder_sk, + authorization, + authorized_msg, + ); + let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); + let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); + + let peers = nodes[1].network_handle.get_all_peers().await?; + let peer_0 = &peers[0].remote_id; + + for _ in 0..100 { + nodes[0].p2p_handle.ctx.peer_tx.send(peer_msg.clone()).ok(); + tokio::time::sleep(tokio::time::Duration::from_millis(10)).await; + let rep_0 = nodes[1].network_handle.reputation_by_id(*peer_0).await?; + if let Some(rep) = rep_0 { + assert!(rep < 0, "Peer reputation should be negative"); + } + } + + // Assert that the peer is banned + assert!(nodes[1].network_handle.get_all_peers().await?.is_empty()); + + Ok(()) +} From 12c65dfd3736e91c4091ede713c90727b78ca98f Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 5 Aug 2025 20:55:07 -0700 Subject: [PATCH 077/114] chore: stray comments --- crates/flashblocks-node/tests/p2p.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index 5932a093..c80ee4b8 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -398,12 +398,6 @@ async fn test_force_race_condition() -> eyre::Result<()> { nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - // let peers = node_0.network_handle.get_all_peers().await?; - // let peer_1 = &peers[0].remote_id; - // - // let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; - // info!(?rep_1, "Peer reputation"); - // Query pending block after sending the base payload with an empty delta let pending_block = nodes[1] .provider() @@ -431,9 +425,6 @@ async fn test_force_race_condition() -> eyre::Result<()> { nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - // let rep_1 = node_0.network_handle.reputation_by_id(*peer_1).await?; - // info!(?rep_1, "Peer reputation"); - // Query pending block after sending the second payload with two transactions let block = nodes[1] .provider() From d84a2daec1ecfebddec4fe8c84bbe19d109f1ec0 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 14 Aug 2025 10:12:53 -0700 Subject: [PATCH 078/114] feat: flashblocks_forkchoiceUpdatedV3 --- crates/rollup-boost/src/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index d152c50c..c74d7016 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -289,7 +289,7 @@ where pub trait FlashblocksEngineApi { /// When flashblocks is enabled /// we add an additional parameter `authorization` to the FCU - #[method(name = "engine_forkchoiceUpdatedV3")] + #[method(name = "flashblocks_forkchoiceUpdatedV3")] async fn flashblocks_fork_choice_updated_v3( &self, fork_choice_state: ForkchoiceState, From 378fd99c6dd44e89878d778c8abc9d5a4d1286fe Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 14 Aug 2025 20:48:58 -0700 Subject: [PATCH 079/114] feat: move rpc-layer --- Cargo.lock | 20 +++----------------- Cargo.toml | 1 + crates/rollup-boost/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1bcdc54..52fec339 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8720,7 +8720,7 @@ dependencies = [ "reth-rpc-builder", "reth-rpc-engine-api", "reth-rpc-eth-types", - "reth-rpc-layer 1.5.1", + "reth-rpc-layer", "reth-stages", "reth-static-file", "reth-tasks", @@ -9662,7 +9662,7 @@ dependencies = [ "reth-rpc-api", "reth-rpc-eth-api", "reth-rpc-eth-types", - "reth-rpc-layer 1.5.1", + "reth-rpc-layer", "reth-rpc-server-types", "reth-storage-api", "reth-tasks", @@ -9816,20 +9816,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "reth-rpc-layer" -version = "1.4.7" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v1.4.7#dc7cb6e6670b0da294a0e5010e02855f5aaf6b49" -dependencies = [ - "alloy-rpc-types-engine", - "http", - "jsonrpsee-http-client 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project", - "tower 0.5.2", - "tower-http", - "tracing", -] - [[package]] name = "reth-rpc-layer" version = "1.5.1" @@ -10589,7 +10575,7 @@ dependencies = [ "rand 0.9.1", "reqwest", "reth-optimism-payload-builder", - "reth-rpc-layer 1.4.7", + "reth-rpc-layer", "rustls", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 8d054628..0ddfca7f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.5.1" } # Alloy libraries alloy-rpc-types-engine = "1.0.13" diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 295623ec..7d73e099 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -19,6 +19,7 @@ url.workspace = true sha2.workspace = true reth-optimism-payload-builder.workspace = true +reth-rpc-layer.workspace = true op-alloy-rpc-types-engine.workspace = true alloy-rpc-types-engine.workspace = true alloy-rpc-types-eth.workspace = true @@ -81,7 +82,6 @@ anyhow = "1.0" assert_cmd = "2.0.10" predicates = "3.1.2" tokio-util = { version = "0.7.13" } -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.4.7" } ctor = "0.4.1" reqwest = "0.12.15" From 0a0079d882ca6adddb8896e058e5bd97c726ed49 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 14 Aug 2025 22:06:56 -0700 Subject: [PATCH 080/114] wip --- Cargo.lock | 1770 +- Cargo.toml | 32 +- crates/flashblocks-node/Cargo.toml | 35 +- .../rust-analyzer/metadata/sysroot/Cargo.lock | 480 + .../metadata/workspace/Cargo.lock | 13607 ++++++++++++++++ crates/flashblocks-p2p/Cargo.toml | 1 + crates/flashblocks-rpc/Cargo.toml | 32 +- crates/rollup-boost/Cargo.toml | 1 + 8 files changed, 15028 insertions(+), 930 deletions(-) create mode 100644 crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock create mode 100644 crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock diff --git a/Cargo.lock b/Cargo.lock index 52fec339..d07b6fba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,22 +97,22 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5674914c2cfdb866c21cb0c09d82374ee39a1395cf512e7515f4c014083b3fff" +checksum = "4195a29a4b87137b2bb02105e746102873bc03561805cf45c0e510c961f160e6" dependencies = [ "alloy-primitives", "alloy-rlp", "num_enum", "serde", - "strum 0.27.1", + "strum 0.27.2", ] [[package]] name = "alloy-consensus" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3b746060277f3d7f9c36903bb39b593a741cb7afcb0044164c28f0e9b673f0" +checksum = "eda689f7287f15bd3582daba6be8d1545bad3740fd1fb778f629a1fe866bb43b" dependencies = [ "alloy-eips", "alloy-primitives", @@ -131,14 +131,14 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-consensus-any" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf98679329fa708fa809ea596db6d974da892b068ad45e48ac1956f582edf946" +checksum = "2b5659581e41e8fe350ecc3593cb5c9dcffddfd550896390f2b78a07af67b0fa" dependencies = [ "alloy-consensus", "alloy-eips", @@ -151,9 +151,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b95b3deca680efc7e9cba781f1a1db352fa1ea50e6384a514944dcf4419e652" +checksum = "d9e8a436f0aad7df8bb47f144095fba61202265d9f5f09a70b0e3227881a668e" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -178,7 +178,7 @@ dependencies = [ "crc", "rand 0.8.5", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -207,14 +207,14 @@ dependencies = [ "rand 0.8.5", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-eips" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f562a81278a3ed83290e68361f2d1c75d018ae3b8589a314faf9303883e18ec9" +checksum = "6f35887da30b5fc50267109a3c61cd63e6ca1f45967983641053a40ee83468c1" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "alloy-evm" -version = "0.14.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2d6e0448bfd057a4438226b3d2fd547a0530fa4226217dfb1682d09f108bd4" +checksum = "145913bf9bc11a7cec63a61aba36a39e41f2604aceb6d81b6bb8a4b2ddc93423" dependencies = [ "alloy-consensus", "alloy-eips", @@ -247,17 +247,17 @@ dependencies = [ "alloy-sol-types", "auto_impl", "derive_more", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-revm", "revm", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-genesis" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc41384e9ab8c9b2fb387c52774d9d432656a28edcda1c2d4083e96051524518" +checksum = "11d4009efea6f403b3a80531f9c6f70fc242399498ff71196a1688cc1c901f44" dependencies = [ "alloy-eips", "alloy-primitives", @@ -269,9 +269,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819a3620fe125e0fff365363315ee5e24c23169173b19747dfd6deba33db8990" +checksum = "3165210652f71dfc094b051602bafd691f506c54050a174b1cba18fb5ef706a3" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -283,9 +283,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15516116086325c157c18261d768a20677f0f699348000ed391d4ad0dcb82530" +checksum = "459f98c6843f208856f338bfb25e65325467f7aff35dfeb0484d0a76e059134b" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -295,24 +295,24 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12c454fcfcd5d26ed3b8cae5933cbee9da5f0b05df19b46d4bd4446d1f082565" +checksum = "883dee3b4020fcb5667ee627b4f401e899dad82bf37b246620339dd980720ed9" dependencies = [ "alloy-primitives", "alloy-sol-types", "http", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", ] [[package]] name = "alloy-network" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d6d39eabe5c7b3d8f23ac47b0b683b99faa4359797114636c66e0743103d05" +checksum = "cd6e5b8ac1654a05c224390008e43634a2bdc74e181e02cf8ed591d8b3d4ad08" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -331,14 +331,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-network-primitives" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3704fa8b7ba9ba3f378d99b3d628c8bc8c2fc431b709947930f154e22a8368b6" +checksum = "80d7980333dd9391719756ac28bc2afa9baa705fc70ffd11dc86ab078dd64477" dependencies = [ "alloy-consensus", "alloy-eips", @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "alloy-op-evm" -version = "0.14.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98354b9c3d50de701a63693d5b6a37e468a93b970b2224f934dd745c727ef998" +checksum = "a0bcba6845a173265afed23c1ac3f1ff072662a9f09d33ec968989d12e2cb73e" dependencies = [ "alloy-consensus", "alloy-eips", @@ -359,16 +359,16 @@ dependencies = [ "alloy-op-hardforks", "alloy-primitives", "auto_impl", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-revm", "revm", ] [[package]] name = "alloy-op-hardforks" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2090f21bb6df43e147d976e754bc9a007ca851badbfc6685377aa679b5f151d9" +checksum = "3417f4187eaf7f7fb0d7556f0197bca26f0b23c4bb3aca0c9d566dc1c5d727a2" dependencies = [ "alloy-chains", "alloy-hardforks", @@ -377,9 +377,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6177ed26655d4e84e00b65cb494d4e0b8830e7cae7ef5d63087d445a2600fb55" +checksum = "3cfebde8c581a5d37b678d0a48a32decb51efd7a63a08ce2517ddec26db705c8" dependencies = [ "alloy-rlp", "arbitrary", @@ -390,7 +390,7 @@ dependencies = [ "derive_more", "foldhash", "getrandom 0.3.3", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "indexmap 2.10.0", "itoa", "k256", @@ -398,7 +398,7 @@ dependencies = [ "paste", "proptest", "proptest-derive", - "rand 0.9.1", + "rand 0.9.2", "ruint", "rustc-hash 2.1.1", "serde", @@ -408,9 +408,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08800e8cbe70c19e2eb7cf3d7ff4b28bdd9b3933f8e1c8136c7d910617ba03bf" +checksum = "478a42fe167057b7b919cd8b0c2844f0247f667473340dad100eaf969de5754e" dependencies = [ "alloy-chains", "alloy-consensus", @@ -435,14 +435,13 @@ dependencies = [ "either", "futures", "futures-utils-wasm", - "http", "lru 0.13.0", "parking_lot", "pin-project", "reqwest", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", "url", @@ -451,13 +450,14 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae68457a2c2ead6bd7d7acb5bf5f1623324b1962d4f8e7b0250657a3c3ab0a0b" +checksum = "b0a99b17987f40a066b29b6b56d75e84cd193b866cac27cae17b59f40338de95" dependencies = [ "alloy-json-rpc", "alloy-primitives", "alloy-transport", + "auto_impl", "bimap", "futures", "parking_lot", @@ -489,14 +489,14 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "alloy-rpc-client" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162301b5a57d4d8f000bf30f4dcb82f9f468f3e5e846eeb8598dd39e7886932c" +checksum = "8a0c6d723fbdf4a87454e2e3a275e161be27edcfbf46e2e3255dd66c138634b6" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -520,9 +520,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cd8ca94ae7e2b32cc3895d9981f3772aab0b4756aa60e9ed0bcfee50f0e1328" +checksum = "c41492dac39365b86a954de86c47ec23dcc7452cdb2fde591caadc194b3e34c6" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -533,9 +533,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bff682e76f3f72e9ddc75e54a1bd1db5ce53cbdf2cce2d63a3a981437f78f5" +checksum = "9c0f415ad97cc68d2f49eb08214f45c6827a6932a69773594f4ce178f8a41dc0" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -545,9 +545,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3ff6a778ebda3deaed9af17930d678611afe1effa895c4260b61009c314f82" +checksum = "10493fa300a2757d8134f584800fef545c15905c95122bed1f6dde0b0d9dae27" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -557,9 +557,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076b47e834b367d8618c52dd0a0d6a711ddf66154636df394805300af4923b8a" +checksum = "8f7eb22670a972ad6c222a6c6dac3eef905579acffe9d63ab42be24c7d158535" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -568,9 +568,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f39da9b760e78fc3f347fba4da257aa6328fb33f73682b26cc0a6874798f7d" +checksum = "53381ffba0110a8aed4c9f108ef34a382ed21aeefb5f50f91c73451ae68b89aa" dependencies = [ "alloy-eips", "alloy-primitives", @@ -579,26 +579,27 @@ dependencies = [ "ethereum_ssz_derive", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", "tree_hash", "tree_hash_derive", ] [[package]] name = "alloy-rpc-types-debug" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a2a86ad7b7d718c15e79d0779bd255561b6b22968dc5ed2e7c0fbc43bb55fe" +checksum = "a9b6f0482c82310366ec3dcf4e5212242f256a69fcf1a26e5017e6704091ee95" dependencies = [ "alloy-primitives", + "derive_more", "serde", ] [[package]] name = "alloy-rpc-types-engine" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba838417c42e8f1fe5eb4f4bbfacb7b5d4b9e615b8d2e831b921e04bf0bed62" +checksum = "e24c171377c0684e3860385f6d93fbfcc8ecc74f6cce8304c822bf1a50bacce0" dependencies = [ "alloy-consensus", "alloy-eips", @@ -611,14 +612,14 @@ dependencies = [ "jsonwebtoken", "rand 0.8.5", "serde", - "strum 0.27.1", + "strum 0.27.2", ] [[package]] name = "alloy-rpc-types-eth" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c2f847e635ec0be819d06e2ada4bcc4e4204026a83c4bfd78ae8d550e027ae7" +checksum = "b777b98526bbe5b7892ca22a7fd5f18ed624ff664a79f40d0f9f2bf94ba79a84" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -633,14 +634,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-rpc-types-mev" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1c9b23cedf70aeb99ea9f16b78cdf902f524e227922fb340e3eb899ebe96dc" +checksum = "c15e8ccb6c16e196fcc968e16a71cd8ce4160f3ec5871d2ea196b75bf569ac02" dependencies = [ "alloy-consensus", "alloy-eips", @@ -653,23 +654,23 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fc58180302a94c934d455eeedb3ecb99cdc93da1dbddcdbbdb79dd6fe618b2a" +checksum = "d6a854af3fe8fce1cfe319fcf84ee8ba8cda352b14d3dd4221405b5fc6cce9e1" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9f089d78bb94148e0fcfda087d4ce5fd35a7002847b5e90610c0fcb140f7b4" +checksum = "3cc803e9b8d16154c856a738c376e002abe4b388e5fef91c8aebc8373e99fd45" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -679,9 +680,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae699248d02ade9db493bbdae61822277dc14ae0f82a5a4153203b60e34422a6" +checksum = "ee8d2c52adebf3e6494976c8542fbdf12f10123b26e11ad56f77274c16a2a039" dependencies = [ "alloy-primitives", "arbitrary", @@ -691,9 +692,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf7d793c813515e2b627b19a15693960b3ed06670f9f66759396d06ebe5747b" +checksum = "7c0494d1e0f802716480aabbe25549c7f6bc2a25ff33b08fd332bbb4b7d06894" dependencies = [ "alloy-primitives", "async-trait", @@ -701,14 +702,14 @@ dependencies = [ "either", "elliptic-curve", "k256", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-signer-local" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a424bc5a11df0d898ce0fd15906b88ebe2a6e4f17a514b51bc93946bb756bd" +checksum = "59c2435eb8979a020763ced3fb478932071c56e5f75ea86db41f320915d325ba" dependencies = [ "alloy-consensus", "alloy-network", @@ -717,28 +718,28 @@ dependencies = [ "async-trait", "k256", "rand 0.8.5", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "alloy-sol-macro" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a14f21d053aea4c6630687c2f4ad614bed4c81e14737a9b904798b24f30ea849" +checksum = "aedac07a10d4c2027817a43cc1f038313fc53c7ac866f7363239971fd01f9f18" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d99282e7c9ef14eb62727981a985a01869e586d1dec729d3bb33679094c100" +checksum = "24f9a598f010f048d8b8226492b6401104f5a5c1273c2869b72af29b48bb4ba9" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -747,16 +748,16 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda029f955b78e493360ee1d7bd11e1ab9f2a220a5715449babc79d6d0a01105" +checksum = "f494adf9d60e49aa6ce26dfd42c7417aa6d4343cf2ae621f20e4d92a5ad07d85" dependencies = [ "const-hex", "dunce", @@ -764,15 +765,15 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10db1bd7baa35bc8d4a1b07efbf734e73e5ba09f2580fb8cee3483a36087ceb2" +checksum = "52db32fbd35a9c0c0e538b58b81ebbae08a51be029e7ad60e08b60481c2ec6c3" dependencies = [ "serde", "winnow", @@ -780,9 +781,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58377025a47d8b8426b3e4846a251f2c1991033b27f517aade368146f6ab1dfe" +checksum = "a285b46e3e0c177887028278f04cc8262b76fd3b8e0e20e93cea0a58c35f5ac5" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -792,12 +793,13 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f317d20f047b3de4d9728c556e2e9a92c9a507702d2016424cd8be13a74ca5e" +checksum = "3c0107675e10c7f248bf7273c1e7fdb02409a717269cc744012e6f3c39959bfb" dependencies = [ "alloy-json-rpc", "alloy-primitives", + "auto_impl", "base64 0.22.1", "derive_more", "futures", @@ -805,7 +807,7 @@ dependencies = [ "parking_lot", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tower 0.5.2", "tracing", @@ -815,9 +817,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff084ac7b1f318c87b579d221f11b748341d68b9ddaa4ffca5e62ed2b8cfefb4" +checksum = "78e3736701b5433afd06eecff08f0688a71a10e0e1352e0bbf0bed72f0dd4e35" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -830,9 +832,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb099cdad8ed2e6a80811cdf9bbf715ebf4e34c981b4a6e2d1f9daacbf8b218" +checksum = "c79064b5a08259581cb5614580010007c2df6deab1e8f3e8c7af8d7e9227008f" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -850,9 +852,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e915e1250dc129ad48d264573ccd08e4716fdda564a772fd217875b8459aff9" +checksum = "77fd607158cb9bc54cbcfcaab4c5f36c5b26994c7dc58b6f095ce27a54f270f3" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -888,15 +890,15 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1154c8187a5ff985c95a8b2daa2fedcf778b17d7668e5e50e556c4ff9c881154" +checksum = "6acb36318dfa50817154064fea7932adf2eec3f51c86680e2b37d7e8906c66bb" dependencies = [ "alloy-primitives", "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -916,9 +918,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -946,29 +948,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "aquamarine" @@ -981,14 +983,14 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -1036,7 +1038,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "itertools 0.13.0", "num-bigint", "num-integer", @@ -1129,7 +1131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -1167,7 +1169,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -1182,7 +1184,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] @@ -1256,7 +1258,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -1344,9 +1346,9 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ "event-listener", "event-listener-strategy", @@ -1372,18 +1374,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -1421,7 +1423,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -1432,9 +1434,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08b5d4e069cbc868041a64bd68dc8cb39a0d79585cd6c5a24caa8c2d622121be" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" dependencies = [ "aws-lc-sys", "zeroize", @@ -1576,9 +1578,9 @@ dependencies = [ [[package]] name = "backon" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302eaff5357a264a2c42f127ecb8bac761cf99749fc3dc95677e2743991f99e7" +checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" dependencies = [ "fastrand", "tokio", @@ -1663,7 +1665,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.104", + "syn 2.0.105", "which", ] @@ -1682,7 +1684,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -1830,7 +1832,7 @@ dependencies = [ "cfg-if", "dashmap 6.1.0", "fast-float2", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "icu_normalizer 1.5.0", "indexmap 2.10.0", "intrusive-collections", @@ -1852,7 +1854,7 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror 2.0.12", + "thiserror 2.0.14", "time", ] @@ -1865,7 +1867,7 @@ dependencies = [ "boa_macros", "boa_profiler", "boa_string", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "thin-vec", ] @@ -1877,7 +1879,7 @@ checksum = "42407a3b724cfaecde8f7d4af566df4b56af32a2f11f0956f5570bb974e7f749" dependencies = [ "boa_gc", "boa_macros", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "indexmap 2.10.0", "once_cell", "phf", @@ -1893,7 +1895,7 @@ checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "synstructure", ] @@ -1966,7 +1968,7 @@ dependencies = [ "serde_json", "serde_repr", "serde_urlencoded", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-util", "tower-service", @@ -2055,22 +2057,22 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.9.3" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2106,9 +2108,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +checksum = "5d07aa9a93b00c76f71bc35d598bed923f6d4f3a9ca5c24b7737ae1a292841c0" dependencies = [ "serde", ] @@ -2146,7 +2148,7 @@ dependencies = [ "semver 1.0.26", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2240,9 +2242,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" dependencies = [ "clap_builder", "clap_derive", @@ -2250,9 +2252,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", @@ -2262,14 +2264,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2346,18 +2348,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "console" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "windows-sys 0.59.0", -] - [[package]] name = "const-hex" version = "1.14.1" @@ -2377,26 +2367,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -2576,9 +2546,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4735f265ba6a1188052ca32d461028a7d1125868be18e287e756019da7607b5" +checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" dependencies = [ "ctor-proc-macro", "dtor", @@ -2586,9 +2556,9 @@ dependencies = [ [[package]] name = "ctor-proc-macro" -version = "0.0.5" +version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f211af61d8efdd104f96e57adf5e426ba1bc3ed7a4ead616e15e5881fd79c4d" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" [[package]] name = "ctr" @@ -2601,9 +2571,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.2.0" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b7c5dbd637569a2cca66e8d66b8c446a1e7bf064ea321d265d7b3dfe7c97e" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", @@ -2623,7 +2593,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2647,7 +2617,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2658,7 +2628,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2711,7 +2681,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2764,24 +2734,24 @@ dependencies = [ [[package]] name = "derive-where" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2802,7 +2772,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2812,7 +2782,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -2833,7 +2803,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "unicode-xid", ] @@ -2897,7 +2867,7 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users 0.5.0", + "redox_users 0.5.2", "windows-sys 0.60.2", ] @@ -2938,7 +2908,7 @@ dependencies = [ "parking_lot", "rand 0.8.5", "smallvec", - "socket2", + "socket2 0.5.10", "tokio", "tracing", "uint 0.10.0", @@ -2953,7 +2923,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -3008,9 +2978,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ecdsa" @@ -3062,7 +3032,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -3094,12 +3064,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - [[package]] name = "encoding_rs" version = "0.8.35" @@ -3144,7 +3108,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -3164,7 +3128,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -3251,14 +3215,14 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -3341,9 +3305,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.3.0" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" @@ -3393,7 +3357,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -3409,7 +3373,6 @@ dependencies = [ "reth-optimism-evm", "reth-optimism-forks", "reth-optimism-node", - "reth-optimism-primitives", "reth-optimism-rpc", "reth-primitives", "reth-primitives-traits", @@ -3447,12 +3410,13 @@ dependencies = [ "reth-node-api", "reth-node-builder", "reth-op", + "reth-optimism-primitives", "reth-provider", "reth-transaction-pool", "rollup-boost", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tracing", @@ -3481,7 +3445,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -3532,7 +3496,7 @@ dependencies = [ "serde_json", "testcontainers", "testcontainers-modules", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-tungstenite", "tokio-util", @@ -3673,7 +3637,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -3806,9 +3770,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gloo-net" @@ -3879,9 +3843,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -3925,9 +3889,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -4000,10 +3964,10 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.1", + "rand 0.9.2", "ring", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tinyvec", "tokio", "tracing", @@ -4023,11 +3987,11 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.1", + "rand 0.9.2", "resolv-conf", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] @@ -4196,7 +4160,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -4230,9 +4194,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -4246,7 +4210,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "system-configuration", "tokio", "tower-service", @@ -4315,7 +4279,7 @@ dependencies = [ "potential_utf", "yoke 0.8.0", "zerofrom", - "zerovec 0.11.2", + "zerovec 0.11.4", ] [[package]] @@ -4328,7 +4292,7 @@ dependencies = [ "litemap 0.8.0", "tinystr 0.8.1", "writeable 0.6.1", - "zerovec 0.11.2", + "zerovec 0.11.4", ] [[package]] @@ -4394,7 +4358,7 @@ dependencies = [ "icu_properties 2.0.1", "icu_provider 2.0.0", "smallvec", - "zerovec 0.11.2", + "zerovec 0.11.4", ] [[package]] @@ -4437,7 +4401,7 @@ dependencies = [ "icu_provider 2.0.0", "potential_utf", "zerotrie", - "zerovec 0.11.2", + "zerovec 0.11.4", ] [[package]] @@ -4483,7 +4447,7 @@ dependencies = [ "yoke 0.8.0", "zerofrom", "zerotrie", - "zerovec 0.11.2", + "zerovec 0.11.4", ] [[package]] @@ -4494,7 +4458,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -4551,7 +4515,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -4575,9 +4539,9 @@ dependencies = [ [[package]] name = "indenter" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" @@ -4598,7 +4562,7 @@ checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "serde", ] @@ -4640,15 +4604,15 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ "darling", "indoc", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -4686,9 +4650,9 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ "bitflags 2.9.1", "cfg-if", @@ -4701,7 +4665,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2", + "socket2 0.5.10", "widestring", "windows-sys 0.48.0", "winreg", @@ -4862,7 +4826,7 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-rustls", "tokio-util", @@ -4886,11 +4850,11 @@ dependencies = [ "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tower 0.5.2", @@ -4912,11 +4876,11 @@ dependencies = [ "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tower 0.5.2", "tracing", @@ -4939,7 +4903,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tower 0.5.2", "url", @@ -4961,7 +4925,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tower 0.5.2", "url", @@ -4977,7 +4941,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -4989,7 +4953,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -5011,7 +4975,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-util", @@ -5037,7 +5001,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-util", @@ -5054,7 +5018,7 @@ dependencies = [ "http", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -5065,7 +5029,7 @@ dependencies = [ "http", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -5177,9 +5141,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libgit2-sys" @@ -5200,7 +5164,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -5223,7 +5187,7 @@ dependencies = [ "multihash", "quick-protobuf", "sha2 0.10.9", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", "zeroize", ] @@ -5241,13 +5205,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ "bitflags 2.9.1", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.17", ] [[package]] @@ -5384,7 +5348,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] @@ -5393,7 +5357,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] @@ -5444,7 +5408,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -5511,7 +5475,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -5551,7 +5515,7 @@ dependencies = [ "metrics", "metrics-util 0.20.0", "quanta", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] @@ -5581,13 +5545,13 @@ dependencies = [ "aho-corasick", "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "indexmap 2.10.0", "metrics", "ordered-float", "quanta", "radix_trie", - "rand 0.9.1", + "rand 0.9.2", "rand_xoshiro", "sketches-ddsketch", ] @@ -5600,10 +5564,10 @@ checksum = "fe8db7a05415d0f919ffb905afa37784f71901c9a773188876984b4f769ab986" dependencies = [ "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "metrics", "quanta", - "rand 0.9.1", + "rand 0.9.2", "rand_xoshiro", "sketches-ddsketch", ] @@ -5799,9 +5763,9 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "notify" -version = "8.1.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3163f59cd3fa0e9ef8c32f242966a7b9994fd7378366099593e0e73077cd8c97" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ "bitflags 2.9.1", "fsevent-sys", @@ -5950,7 +5914,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -5964,9 +5928,9 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675b3a54e5b12af997abc8b6638b0aee51a28caedab70d4967e0d5db3a3f1d06" +checksum = "2ff79de40513a478a9e374a480f897c2df829d48dcc64a83e4792a57fe231c64" dependencies = [ "alloy-rlp", "arbitrary", @@ -6013,14 +5977,14 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "op-alloy-consensus" -version = "0.18.9" +version = "0.18.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8719d9b783b29cfa1cf8d591b894805786b9ab4940adc700a57fd0d5b721cf5" +checksum = "d3c719b26da6d9cac18c3a35634d6ab27a74a304ed9b403b43749c22e57a389f" dependencies = [ "alloy-consensus", "alloy-eips", @@ -6033,7 +5997,7 @@ dependencies = [ "derive_more", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -6044,9 +6008,9 @@ checksum = "a79f352fc3893dcd670172e615afef993a41798a1d3fc0db88a3e60ef2e70ecc" [[package]] name = "op-alloy-network" -version = "0.18.9" +version = "0.18.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "839a7a1826dc1d38fdf9c6d30d1f4ed8182c63816c97054e5815206f1ebf08c7" +checksum = "66be312d3446099f1c46b3bb4bbaccdd4b3d6fb3668921158e3d47dff0a8d4a0" dependencies = [ "alloy-consensus", "alloy-network", @@ -6054,15 +6018,15 @@ dependencies = [ "alloy-provider", "alloy-rpc-types-eth", "alloy-signer", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-alloy-rpc-types", ] [[package]] name = "op-alloy-rpc-jsonrpsee" -version = "0.18.9" +version = "0.18.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9d3de5348e2b34366413412f1f1534dc6b10d2cf6e8e1d97c451749c0c81c0" +checksum = "3833995acfc568fdac3684f037c4ed3f1f2bd2ef5deeb3f46ecee32aafa34c8e" dependencies = [ "alloy-primitives", "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -6070,9 +6034,9 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types" -version = "0.18.9" +version = "0.18.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9640f9e78751e13963762a4a44c846e9ec7974b130c29a51706f40503fe49152" +checksum = "99911fa02e717a96ba24de59874b20cf31c9d116ce79ed4e0253267260b6922f" dependencies = [ "alloy-consensus", "alloy-eips", @@ -6081,17 +6045,17 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-serde", "derive_more", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "op-alloy-rpc-types-engine" -version = "0.18.9" +version = "0.18.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a4559d84f079b3fdfd01e4ee0bb118025e92105fbb89736f5d77ab3ca261698" +checksum = "50cf45d43a3d548fdc39d9bfab6ba13cc06b3214ef4b9c36d3efbf3faea1b9f1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -6102,20 +6066,19 @@ dependencies = [ "derive_more", "ethereum_ssz", "ethereum_ssz_derive", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "serde", "snap", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "op-revm" -version = "8.0.3" +version = "9.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee9ba9cab294a5ed02afd1a1060220762b3c52911acab635db33822e93f7276d" +checksum = "f6889cdfed74c6c924a54b2357982fce232e06473c6bb73b9a0c71a9151bfabd" dependencies = [ "auto_impl", - "once_cell", "revm", "serde", ] @@ -6149,7 +6112,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6180,7 +6143,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", ] @@ -6214,7 +6177,7 @@ dependencies = [ "prost", "reqwest", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tonic", "tracing", @@ -6250,7 +6213,7 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tracing", @@ -6301,19 +6264,17 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.7.5" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arbitrary", "arrayvec", "bitvec", "byte-slice-cast", "bytes", - "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", - "rustversion", "serde", ] @@ -6326,7 +6287,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6353,7 +6314,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.17", "smallvec", "windows-targets 0.52.6", ] @@ -6380,7 +6341,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6412,7 +6373,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", - "thiserror 2.0.12", + "thiserror 2.0.14", "ucd-trie", ] @@ -6457,7 +6418,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6486,7 +6447,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6556,7 +6517,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" dependencies = [ - "zerovec 0.11.2", + "zerovec 0.11.4", ] [[package]] @@ -6616,12 +6577,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" dependencies = [ "proc-macro2", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6672,14 +6633,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -6720,7 +6681,7 @@ dependencies = [ "bitflags 2.9.1", "lazy_static", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax 0.8.5", @@ -6747,7 +6708,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6770,7 +6731,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -6827,8 +6788,8 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls", - "socket2", - "thiserror 2.0.12", + "socket2 0.5.10", + "thiserror 2.0.14", "tokio", "tracing", "web-time", @@ -6843,13 +6804,13 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash 2.1.1", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.14", "tinyvec", "tracing", "web-time", @@ -6864,7 +6825,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -6914,9 +6875,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -7012,9 +6973,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -7022,9 +6983,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -7049,7 +7010,7 @@ dependencies = [ "percent-encoding", "ryu", "sha1_smol", - "socket2", + "socket2 0.5.10", "url", ] @@ -7064,9 +7025,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.1", ] @@ -7084,13 +7045,13 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -7110,7 +7071,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -7163,15 +7124,15 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", "memchr", ] [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", @@ -7213,7 +7174,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -7224,8 +7185,8 @@ checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "reth" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-rpc-types", "aquamarine", @@ -7270,8 +7231,8 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7294,8 +7255,8 @@ dependencies = [ [[package]] name = "reth-chain-state" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7306,7 +7267,7 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec", "reth-errors", "reth-ethereum-primitives", @@ -7325,8 +7286,8 @@ dependencies = [ [[package]] name = "reth-chainspec" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7345,8 +7306,8 @@ dependencies = [ [[package]] name = "reth-cli" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-genesis", "clap", @@ -7359,8 +7320,8 @@ dependencies = [ [[package]] name = "reth-cli-commands" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "ahash", "alloy-chains", @@ -7394,6 +7355,7 @@ dependencies = [ "reth-discv5", "reth-downloaders", "reth-ecies", + "reth-era", "reth-era-downloader", "reth-era-utils", "reth-eth-wire", @@ -7413,6 +7375,7 @@ dependencies = [ "reth-primitives-traits", "reth-provider", "reth-prune", + "reth-revm", "reth-stages", "reth-static-file", "reth-static-file-types", @@ -7430,8 +7393,8 @@ dependencies = [ [[package]] name = "reth-cli-runner" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "reth-tasks", "tokio", @@ -7440,8 +7403,8 @@ dependencies = [ [[package]] name = "reth-cli-util" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7452,14 +7415,14 @@ dependencies = [ "reth-fs-util", "secp256k1 0.30.0", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tikv-jemallocator", ] [[package]] name = "reth-codecs" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7469,7 +7432,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "reth-codecs-derive", "reth-zstd-compressors", "serde", @@ -7478,19 +7441,19 @@ dependencies = [ [[package]] name = "reth-codecs-derive" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "reth-config" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "eyre", "humantime-serde", @@ -7504,21 +7467,21 @@ dependencies = [ [[package]] name = "reth-consensus" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", "reth-execution-types", "reth-primitives-traits", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-consensus-common" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7529,8 +7492,8 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7554,8 +7517,8 @@ dependencies = [ [[package]] name = "reth-db" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "derive_more", @@ -7572,16 +7535,16 @@ dependencies = [ "reth-storage-errors", "reth-tracing", "rustc-hash 2.1.1", - "strum 0.27.1", + "strum 0.27.2", "sysinfo", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-db-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7608,8 +7571,8 @@ dependencies = [ [[package]] name = "reth-db-common" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7621,6 +7584,7 @@ dependencies = [ "reth-config", "reth-db-api", "reth-etl", + "reth-execution-errors", "reth-fs-util", "reth-node-types", "reth-primitives-traits", @@ -7631,14 +7595,14 @@ dependencies = [ "reth-trie-db", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", ] [[package]] name = "reth-db-models" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7652,8 +7616,8 @@ dependencies = [ [[package]] name = "reth-discv4" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7670,7 +7634,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tracing", @@ -7678,8 +7642,8 @@ dependencies = [ [[package]] name = "reth-discv5" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7689,21 +7653,21 @@ dependencies = [ "futures", "itertools 0.14.0", "metrics", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec", "reth-ethereum-forks", "reth-metrics", "reth-network-peers", "secp256k1 0.30.0", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-dns-discovery" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "data-encoding", @@ -7718,7 +7682,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tracing", @@ -7726,8 +7690,8 @@ dependencies = [ [[package]] name = "reth-downloaders" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7752,7 +7716,7 @@ dependencies = [ "reth-tasks", "reth-testing-utils", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-util", @@ -7761,8 +7725,8 @@ dependencies = [ [[package]] name = "reth-ecies" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "aes", "alloy-primitives", @@ -7782,7 +7746,7 @@ dependencies = [ "secp256k1 0.30.0", "sha2 0.10.9", "sha3", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-util", @@ -7792,8 +7756,8 @@ dependencies = [ [[package]] name = "reth-engine-local" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7816,8 +7780,8 @@ dependencies = [ [[package]] name = "reth-engine-primitives" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7828,21 +7792,21 @@ dependencies = [ "reth-chain-state", "reth-errors", "reth-ethereum-primitives", + "reth-evm", "reth-execution-types", "reth-payload-builder-primitives", "reth-payload-primitives", "reth-primitives-traits", - "reth-trie", "reth-trie-common", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", ] [[package]] name = "reth-engine-service" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "futures", "pin-project", @@ -7859,13 +7823,13 @@ dependencies = [ "reth-prune", "reth-stages-api", "reth-tasks", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-engine-tree" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7875,7 +7839,6 @@ dependencies = [ "alloy-rpc-types-engine", "derive_more", "futures", - "itertools 0.14.0", "metrics", "mini-moka", "parking_lot", @@ -7906,18 +7869,19 @@ dependencies = [ "reth-trie-db", "reth-trie-parallel", "reth-trie-sparse", + "reth-trie-sparse-parallel", "revm", "revm-primitives", "schnellru", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-engine-util" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -7927,6 +7891,7 @@ dependencies = [ "pin-project", "reth-chainspec", "reth-engine-primitives", + "reth-engine-tree", "reth-errors", "reth-evm", "reth-fs-util", @@ -7943,8 +7908,8 @@ dependencies = [ [[package]] name = "reth-era" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7954,13 +7919,13 @@ dependencies = [ "ethereum_ssz_derive", "reth-ethereum-primitives", "snap", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-era-downloader" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "bytes", @@ -7974,8 +7939,8 @@ dependencies = [ [[package]] name = "reth-era-utils" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7998,19 +7963,19 @@ dependencies = [ [[package]] name = "reth-errors" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "reth-consensus", "reth-execution-errors", "reth-storage-errors", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-eth-wire" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-chains", "alloy-primitives", @@ -8028,7 +7993,7 @@ dependencies = [ "reth-primitives-traits", "serde", "snap", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-util", @@ -8037,8 +8002,8 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8053,13 +8018,13 @@ dependencies = [ "reth-ethereum-primitives", "reth-primitives-traits", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-ethereum" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -8069,6 +8034,7 @@ dependencies = [ "reth-consensus", "reth-consensus-common", "reth-db", + "reth-engine-local", "reth-eth-wire", "reth-ethereum-cli", "reth-ethereum-consensus", @@ -8096,67 +8062,29 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types", - "backon", "clap", "eyre", - "futures", - "reth-basic-payload-builder", "reth-chainspec", "reth-cli", "reth-cli-commands", "reth-cli-runner", - "reth-cli-util", - "reth-config", - "reth-consensus", "reth-db", - "reth-db-api", - "reth-downloaders", - "reth-errors", - "reth-ethereum-payload-builder", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-exex", - "reth-fs-util", - "reth-network", - "reth-network-api", - "reth-network-p2p", "reth-node-api", "reth-node-builder", "reth-node-core", "reth-node-ethereum", - "reth-node-events", "reth-node-metrics", - "reth-payload-builder", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-revm", - "reth-stages", - "reth-static-file", - "reth-tasks", "reth-tracing", - "reth-transaction-pool", - "reth-trie", - "reth-trie-db", - "serde_json", - "similar-asserts", - "tokio", "tracing", ] [[package]] name = "reth-ethereum-consensus" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8171,8 +8099,8 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8184,13 +8112,13 @@ dependencies = [ "reth-primitives-traits", "serde", "sha2 0.10.9", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-ethereum-forks" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8202,8 +8130,8 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8229,8 +8157,8 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8247,8 +8175,8 @@ dependencies = [ [[package]] name = "reth-etl" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "rayon", "reth-db-api", @@ -8257,8 +8185,8 @@ dependencies = [ [[package]] name = "reth-evm" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8280,13 +8208,14 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-evm", "alloy-primitives", + "alloy-rpc-types-engine", "derive_more", "reth-chainspec", "reth-ethereum-forks", @@ -8294,26 +8223,27 @@ dependencies = [ "reth-evm", "reth-execution-types", "reth-primitives-traits", + "reth-storage-errors", "revm", ] [[package]] name = "reth-execution-errors" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-evm", "alloy-primitives", "alloy-rlp", "nybbles", "reth-storage-errors", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-execution-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8330,8 +8260,8 @@ dependencies = [ [[package]] name = "reth-exex" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8360,7 +8290,7 @@ dependencies = [ "reth-tasks", "reth-tracing", "rmp-serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-util", "tracing", @@ -8368,8 +8298,8 @@ dependencies = [ [[package]] name = "reth-exex-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8382,18 +8312,18 @@ dependencies = [ [[package]] name = "reth-fs-util" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-invalid-block-hooks" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8420,8 +8350,8 @@ dependencies = [ [[package]] name = "reth-ipc" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "bytes", "futures", @@ -8430,7 +8360,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-util", @@ -8440,8 +8370,8 @@ dependencies = [ [[package]] name = "reth-libmdbx" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "bitflags 2.9.1", "byteorder", @@ -8451,14 +8381,14 @@ dependencies = [ "parking_lot", "reth-mdbx-sys", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", ] [[package]] name = "reth-mdbx-sys" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "bindgen 0.70.1", "cc", @@ -8466,8 +8396,8 @@ dependencies = [ [[package]] name = "reth-metrics" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "futures", "metrics", @@ -8478,30 +8408,30 @@ dependencies = [ [[package]] name = "reth-net-banlist" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", ] [[package]] name = "reth-net-nat" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "futures-util", "if-addrs", "reqwest", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-network" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8518,7 +8448,7 @@ dependencies = [ "parking_lot", "pin-project", "rand 0.8.5", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec", "reth-consensus", "reth-discv4", @@ -8546,7 +8476,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-util", @@ -8555,11 +8485,13 @@ dependencies = [ [[package]] name = "reth-network-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ + "alloy-consensus", "alloy-primitives", "alloy-rpc-types-admin", + "alloy-rpc-types-eth", "auto_impl", "derive_more", "enr", @@ -8571,15 +8503,15 @@ dependencies = [ "reth-network-types", "reth-tokio-util", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", ] [[package]] name = "reth-network-p2p" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8601,23 +8533,23 @@ dependencies = [ [[package]] name = "reth-network-peers" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "alloy-rlp", "enr", "secp256k1 0.30.0", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "url", ] [[package]] name = "reth-network-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8630,8 +8562,8 @@ dependencies = [ [[package]] name = "reth-nippy-jar" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "anyhow", "bincode", @@ -8640,15 +8572,15 @@ dependencies = [ "memmap2", "reth-fs-util", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", "zstd", ] [[package]] name = "reth-node-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8671,8 +8603,8 @@ dependencies = [ [[package]] name = "reth-node-builder" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8698,6 +8630,7 @@ dependencies = [ "reth-db-common", "reth-downloaders", "reth-engine-local", + "reth-engine-primitives", "reth-engine-service", "reth-engine-tree", "reth-engine-util", @@ -8710,9 +8643,11 @@ dependencies = [ "reth-network-p2p", "reth-node-api", "reth-node-core", + "reth-node-ethstats", "reth-node-events", "reth-node-metrics", "reth-payload-builder", + "reth-primitives-traits", "reth-provider", "reth-prune", "reth-rpc", @@ -8736,8 +8671,8 @@ dependencies = [ [[package]] name = "reth-node-core" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8749,7 +8684,7 @@ dependencies = [ "eyre", "futures", "humantime", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec", "reth-cli-util", "reth-config", @@ -8757,6 +8692,7 @@ dependencies = [ "reth-db", "reth-discv4", "reth-discv5", + "reth-engine-local", "reth-engine-primitives", "reth-ethereum-forks", "reth-net-nat", @@ -8776,8 +8712,8 @@ dependencies = [ "secp256k1 0.30.0", "serde", "shellexpand", - "strum 0.27.1", - "thiserror 2.0.12", + "strum 0.27.2", + "thiserror 2.0.14", "toml", "tracing", "url", @@ -8787,15 +8723,16 @@ dependencies = [ [[package]] name = "reth-node-ethereum" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", + "alloy-network", "alloy-rpc-types-engine", "alloy-rpc-types-eth", "eyre", "reth-chainspec", - "reth-consensus", + "reth-engine-local", "reth-engine-primitives", "reth-ethereum-consensus", "reth-ethereum-engine-primitives", @@ -8813,18 +8750,44 @@ dependencies = [ "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", "reth-trie-db", "revm", + "tokio", +] + +[[package]] +name = "reth-node-ethstats" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "chrono", + "futures-util", + "reth-chain-state", + "reth-network-api", + "reth-primitives-traits", + "reth-storage-api", + "reth-transaction-pool", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tracing", + "url", ] [[package]] name = "reth-node-events" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8847,8 +8810,8 @@ dependencies = [ [[package]] name = "reth-node-metrics" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "eyre", "http", @@ -8868,8 +8831,8 @@ dependencies = [ [[package]] name = "reth-node-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "reth-chainspec", "reth-db-api", @@ -8881,14 +8844,15 @@ dependencies = [ [[package]] name = "reth-op" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "reth-chainspec", "reth-codecs", "reth-consensus", "reth-consensus-common", "reth-db", + "reth-engine-local", "reth-eth-wire", "reth-evm", "reth-network", @@ -8918,8 +8882,8 @@ dependencies = [ [[package]] name = "reth-optimism-chainspec" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8929,6 +8893,7 @@ dependencies = [ "alloy-primitives", "derive_more", "miniz_oxide", + "op-alloy-consensus 0.18.13", "op-alloy-rpc-types", "paste", "reth-chainspec", @@ -8940,13 +8905,13 @@ dependencies = [ "serde", "serde_json", "tar-no-std", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-optimism-cli" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8956,7 +8921,7 @@ dependencies = [ "derive_more", "eyre", "futures-util", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "reth-chainspec", "reth-cli", "reth-cli-commands", @@ -8992,18 +8957,18 @@ dependencies = [ [[package]] name = "reth-optimism-consensus" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-trie", - "op-alloy-consensus 0.18.9", "reth-chainspec", "reth-consensus", "reth-consensus-common", "reth-execution-types", + "reth-optimism-chainspec", "reth-optimism-forks", "reth-optimism-primitives", "reth-primitives-traits", @@ -9011,21 +8976,22 @@ dependencies = [ "reth-storage-errors", "reth-trie-common", "revm", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", ] [[package]] name = "reth-optimism-evm" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-evm", "alloy-op-evm", "alloy-primitives", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", + "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", "reth-evm", @@ -9036,14 +9002,16 @@ dependencies = [ "reth-optimism-forks", "reth-optimism-primitives", "reth-primitives-traits", + "reth-rpc-eth-api", + "reth-storage-errors", "revm", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-optimism-forks" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-op-hardforks", "alloy-primitives", @@ -9053,8 +9021,8 @@ dependencies = [ [[package]] name = "reth-optimism-node" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9062,12 +9030,12 @@ dependencies = [ "alloy-rpc-types-eth", "clap", "eyre", - "op-alloy-consensus 0.18.9", - "op-alloy-network", + "op-alloy-consensus 0.18.13", "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", "reth-consensus", + "reth-engine-local", "reth-evm", "reth-network", "reth-node-api", @@ -9087,8 +9055,6 @@ dependencies = [ "reth-provider", "reth-rpc-api", "reth-rpc-engine-api", - "reth-rpc-eth-api", - "reth-rpc-eth-types", "reth-rpc-server-types", "reth-tracing", "reth-transaction-pool", @@ -9096,12 +9062,13 @@ dependencies = [ "reth-trie-db", "revm", "serde", + "tokio", ] [[package]] name = "reth-optimism-payload-builder" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9110,7 +9077,7 @@ dependencies = [ "alloy-rpc-types-debug", "alloy-rpc-types-engine", "derive_more", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-alloy-rpc-types-engine", "reth-basic-payload-builder", "reth-chain-state", @@ -9133,14 +9100,14 @@ dependencies = [ "revm", "serde", "sha2 0.10.9", - "thiserror 2.0.12", + "thiserror 2.0.14", "tracing", ] [[package]] name = "reth-optimism-primitives" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9149,7 +9116,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "reth-codecs", "reth-primitives-traits", "reth-zstd-compressors", @@ -9159,8 +9126,8 @@ dependencies = [ [[package]] name = "reth-optimism-rpc" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9179,19 +9146,16 @@ dependencies = [ "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-alloy-network", "op-alloy-rpc-jsonrpsee", "op-alloy-rpc-types", "op-alloy-rpc-types-engine", "op-revm", - "parking_lot", "reqwest", - "reth-chain-state", "reth-chainspec", "reth-evm", "reth-metrics", - "reth-network-api", "reth-node-api", "reth-node-builder", "reth-optimism-evm", @@ -9211,7 +9175,7 @@ dependencies = [ "reth-transaction-pool", "revm", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tower 0.5.2", "tracing", @@ -9219,8 +9183,8 @@ dependencies = [ [[package]] name = "reth-optimism-storage" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9235,8 +9199,8 @@ dependencies = [ [[package]] name = "reth-optimism-txpool" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9249,7 +9213,7 @@ dependencies = [ "derive_more", "futures-util", "metrics", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "op-alloy-flz", "op-alloy-rpc-types", "op-revm", @@ -9264,15 +9228,15 @@ dependencies = [ "reth-storage-api", "reth-transaction-pool", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-payload-builder" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9292,8 +9256,8 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "pin-project", "reth-payload-primitives", @@ -9304,8 +9268,8 @@ dependencies = [ [[package]] name = "reth-payload-primitives" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9317,14 +9281,14 @@ dependencies = [ "reth-errors", "reth-primitives-traits", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", ] [[package]] name = "reth-payload-util" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9333,8 +9297,8 @@ dependencies = [ [[package]] name = "reth-payload-validator" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9343,8 +9307,8 @@ dependencies = [ [[package]] name = "reth-primitives" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "c-kzg", @@ -9357,8 +9321,8 @@ dependencies = [ [[package]] name = "reth-primitives-traits" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9374,7 +9338,7 @@ dependencies = [ "derive_more", "modular-bitfield", "once_cell", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", "proptest", "proptest-arbitrary-interop", "rayon", @@ -9385,13 +9349,13 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-provider" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9428,15 +9392,15 @@ dependencies = [ "reth-trie-db", "revm-database", "revm-state", - "strum 0.27.1", + "strum 0.27.2", "tokio", "tracing", ] [[package]] name = "reth-prune" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9456,15 +9420,15 @@ dependencies = [ "reth-static-file-types", "reth-tokio-util", "rustc-hash 2.1.1", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-prune-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "arbitrary", @@ -9472,13 +9436,13 @@ dependencies = [ "modular-bitfield", "reth-codecs", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-ress-protocol" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9496,8 +9460,8 @@ dependencies = [ [[package]] name = "reth-ress-provider" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9523,8 +9487,8 @@ dependencies = [ [[package]] name = "reth-revm" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9536,8 +9500,8 @@ dependencies = [ [[package]] name = "reth-rpc" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9565,6 +9529,7 @@ dependencies = [ "http", "http-body", "hyper", + "itertools 0.14.0", "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonwebtoken", @@ -9575,7 +9540,6 @@ dependencies = [ "reth-consensus", "reth-engine-primitives", "reth-errors", - "reth-ethereum-primitives", "reth-evm", "reth-evm-ethereum", "reth-execution-types", @@ -9602,7 +9566,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tower 0.5.2", @@ -9612,8 +9576,8 @@ dependencies = [ [[package]] name = "reth-rpc-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-genesis", @@ -9640,8 +9604,8 @@ dependencies = [ [[package]] name = "reth-rpc-builder" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-network", "alloy-provider", @@ -9668,7 +9632,7 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-util", "tower 0.5.2", @@ -9678,30 +9642,33 @@ dependencies = [ [[package]] name = "reth-rpc-convert" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-json-rpc", "alloy-network", "alloy-primitives", "alloy-rpc-types-eth", + "alloy-signer", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "op-alloy-consensus 0.18.9", + "op-alloy-consensus 0.18.13", + "op-alloy-network", "op-alloy-rpc-types", "op-revm", + "reth-ethereum-primitives", "reth-evm", "reth-optimism-primitives", "reth-primitives-traits", "reth-storage-api", "revm-context", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-rpc-engine-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9723,15 +9690,15 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-rpc-eth-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9757,7 +9724,6 @@ dependencies = [ "reth-evm", "reth-network-api", "reth-node-api", - "reth-payload-builder", "reth-primitives-traits", "reth-revm", "reth-rpc-convert", @@ -9775,12 +9741,13 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-evm", + "alloy-network", "alloy-primitives", "alloy-rpc-types-eth", "alloy-sol-types", @@ -9790,7 +9757,7 @@ dependencies = [ "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", - "rand 0.9.1", + "rand 0.9.2", "reth-chain-state", "reth-chainspec", "reth-errors", @@ -9810,7 +9777,7 @@ dependencies = [ "revm-inspectors", "schnellru", "serde", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tracing", @@ -9818,8 +9785,8 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-rpc-types-engine", "http", @@ -9832,8 +9799,8 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9843,19 +9810,18 @@ dependencies = [ "reth-errors", "reth-network-api", "serde", - "strum 0.27.1", + "strum 0.27.2", ] [[package]] name = "reth-stages" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "bincode", - "blake3", "eyre", "futures-util", "itertools 0.14.0", @@ -9889,17 +9855,16 @@ dependencies = [ "reth-testing-utils", "reth-trie", "reth-trie-db", - "serde", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-stages-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9918,15 +9883,15 @@ dependencies = [ "reth-static-file", "reth-static-file-types", "reth-tokio-util", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-stages-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "arbitrary", @@ -9939,8 +9904,8 @@ dependencies = [ [[package]] name = "reth-static-file" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "parking_lot", @@ -9959,20 +9924,20 @@ dependencies = [ [[package]] name = "reth-static-file-types" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "clap", "derive_more", "serde", - "strum 0.27.1", + "strum 0.27.2", ] [[package]] name = "reth-storage-api" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9995,8 +9960,8 @@ dependencies = [ [[package]] name = "reth-storage-errors" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -10006,13 +9971,13 @@ dependencies = [ "reth-prune-types", "reth-static-file-types", "revm-database-interface", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "reth-tasks" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "auto_impl", "dyn-clone", @@ -10021,7 +9986,7 @@ dependencies = [ "pin-project", "rayon", "reth-metrics", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", "tracing-futures", @@ -10029,15 +9994,15 @@ dependencies = [ [[package]] name = "reth-testing-utils" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-genesis", "alloy-primitives", "rand 0.8.5", - "rand 0.9.1", + "rand 0.9.2", "reth-ethereum-primitives", "reth-primitives-traits", "secp256k1 0.30.0", @@ -10045,8 +10010,8 @@ dependencies = [ [[package]] name = "reth-tokio-util" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "tokio", "tokio-stream", @@ -10055,8 +10020,8 @@ dependencies = [ [[package]] name = "reth-tracing" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "clap", "eyre", @@ -10070,8 +10035,8 @@ dependencies = [ [[package]] name = "reth-transaction-pool" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10084,7 +10049,8 @@ dependencies = [ "metrics", "parking_lot", "paste", - "rand 0.9.1", + "pin-project", + "rand 0.9.2", "reth-chain-state", "reth-chainspec", "reth-eth-wire-types", @@ -10095,13 +10061,14 @@ dependencies = [ "reth-primitives-traits", "reth-storage-api", "reth-tasks", - "revm-interpreter", + "revm-interpreter 23.0.2", "revm-primitives", "rustc-hash 2.1.1", "schnellru", "serde", + "serde_json", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tracing", @@ -10109,8 +10076,8 @@ dependencies = [ [[package]] name = "reth-trie" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10134,8 +10101,8 @@ dependencies = [ [[package]] name = "reth-trie-common" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10160,8 +10127,8 @@ dependencies = [ [[package]] name = "reth-trie-db" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "reth-db-api", @@ -10173,8 +10140,8 @@ dependencies = [ [[package]] name = "reth-trie-parallel" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10191,21 +10158,22 @@ dependencies = [ "reth-trie-common", "reth-trie-db", "reth-trie-sparse", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", ] [[package]] name = "reth-trie-sparse" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-trie", "auto_impl", "metrics", + "rayon", "reth-execution-errors", "reth-metrics", "reth-primitives-traits", @@ -10214,28 +10182,46 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-trie-sparse-parallel" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "metrics", + "rayon", + "reth-execution-errors", + "reth-metrics", + "reth-trie-common", + "reth-trie-sparse", + "smallvec", + "tracing", +] + [[package]] name = "reth-zstd-compressors" -version = "1.5.1" -source = "git+https://github.com/paradigmxyz/reth?tag=v1.5.1#dbe7ee9c21392f360ff01f6307480f5d7dd73a3a" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" dependencies = [ "zstd", ] [[package]] name = "revm" -version = "27.0.3" +version = "28.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a84455f03d3480d4ed2e7271c15f2ec95b758e86d57cb8d258a8ff1c22e9a4" +checksum = "ee5d3f7d031e90ab47c7488061bdc4875abc4e9dcea6c18f5dee09732d0436fb" dependencies = [ "revm-bytecode", "revm-context", - "revm-context-interface", + "revm-context-interface 10.0.1", "revm-database", "revm-database-interface", "revm-handler", "revm-inspector", - "revm-interpreter", + "revm-interpreter 25.0.1", "revm-precompile", "revm-primitives", "revm-state", @@ -10243,12 +10229,11 @@ dependencies = [ [[package]] name = "revm-bytecode" -version = "6.0.1" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a685758a4f375ae9392b571014b9779cfa63f0d8eb91afb4626ddd958b23615" +checksum = "1d800e6c2119457ded5b0af71634eb2468040bf97de468eee5a730272a106da0" dependencies = [ "bitvec", - "once_cell", "phf", "revm-primitives", "serde", @@ -10256,14 +10241,15 @@ dependencies = [ [[package]] name = "revm-context" -version = "8.0.3" +version = "9.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a990abf66b47895ca3e915d5f3652bb7c6a4cff6e5351fdf0fc2795171fd411c" +checksum = "5c63485b4d1b0e67f342f9a8c0e9f78b6b5f1750863a39bdf6ceabdbaaf4aed1" dependencies = [ + "bitvec", "cfg-if", "derive-where", "revm-bytecode", - "revm-context-interface", + "revm-context-interface 10.0.1", "revm-database-interface", "revm-primitives", "revm-state", @@ -10286,11 +10272,27 @@ dependencies = [ "serde", ] +[[package]] +name = "revm-context-interface" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "550cb8b9465e00bdb0a384922b69f864c5bcc228bed19c8ecbfa69fff2256382" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "auto_impl", + "either", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", +] + [[package]] name = "revm-database" -version = "7.0.1" +version = "7.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db360729b61cc347f9c2f12adb9b5e14413aea58778cf9a3b7676c6a4afa115" +checksum = "40000c7d917c865f6c232a78581b78e70c43f52db17282bd1b52d4f0565bc8a2" dependencies = [ "alloy-eips", "revm-bytecode", @@ -10302,9 +10304,9 @@ dependencies = [ [[package]] name = "revm-database-interface" -version = "7.0.1" +version = "7.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8500194cad0b9b1f0567d72370795fd1a5e0de9ec719b1607fa1566a23f039a" +checksum = "f4ccea7a168cba1196b1e57dd3e22c36047208c135f600f8e58cbe7d49957dba" dependencies = [ "auto_impl", "either", @@ -10315,17 +10317,17 @@ dependencies = [ [[package]] name = "revm-handler" -version = "8.0.3" +version = "9.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c35a17a38203976f97109e20eccf6732447ce6c9c42973bae42732b2e957ff" +checksum = "7cb09d07e6799823ce5a344f1604236b53fe1a92bacd7122c0b16286f92254c2" dependencies = [ "auto_impl", "derive-where", "revm-bytecode", "revm-context", - "revm-context-interface", + "revm-context-interface 10.0.1", "revm-database-interface", - "revm-interpreter", + "revm-interpreter 25.0.1", "revm-precompile", "revm-primitives", "revm-state", @@ -10334,16 +10336,16 @@ dependencies = [ [[package]] name = "revm-inspector" -version = "8.0.3" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e69abf6a076741bd5cd87b7d6c1b48be2821acc58932f284572323e81a8d4179" +checksum = "2770c0d7e9f4f23660dc0b8b954b7a1eee8989ec97f936ebce366c78b6d7b915" dependencies = [ "auto_impl", "either", "revm-context", "revm-database-interface", "revm-handler", - "revm-interpreter", + "revm-interpreter 25.0.1", "revm-primitives", "revm-state", "serde", @@ -10352,9 +10354,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.26.5" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7b99a2332cf8eed9e9a22fffbf76dfadc99d2c45de6ae6431a1eb9f657dd97a" +checksum = "3a76ba086ca57a718368e46e792a81c5eb7a30366956aa6293adbcec8b1181ce" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -10367,7 +10369,7 @@ dependencies = [ "revm", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -10377,16 +10379,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d95c4a9a1662d10b689b66b536ddc2eb1e89f5debfcabc1a2d7b8417a2fa47cd" dependencies = [ "revm-bytecode", - "revm-context-interface", + "revm-context-interface 8.0.1", + "revm-primitives", + "serde", +] + +[[package]] +name = "revm-interpreter" +version = "25.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c938c0d4d617c285203cad8aba1cefeec383fcff2fdf94a4469f588ab979b5" +dependencies = [ + "revm-bytecode", + "revm-context-interface 10.0.1", "revm-primitives", "serde", ] [[package]] name = "revm-precompile" -version = "24.0.1" +version = "26.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b68d54a4733ac36bd29ee645c3c2e5e782fb63f199088d49e2c48c64a9fedc15" +checksum = "7f7bb5e8b92891c5ac9dd8dae157bd1d90aab01973ad4f99d4135d507facc3e7" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -10400,7 +10414,6 @@ dependencies = [ "cfg-if", "k256", "libsecp256k1", - "once_cell", "p256", "revm-primitives", "ripemd", @@ -10411,20 +10424,21 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "20.0.0" +version = "20.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cdf897b3418f2ee05bcade64985e5faed2dbaa349b2b5f27d3d6bfd10fff2a" +checksum = "5aa29d9da06fe03b249b6419b33968ecdf92ad6428e2f012dc57bcd619b5d94e" dependencies = [ "alloy-primitives", "num_enum", + "once_cell", "serde", ] [[package]] name = "revm-state" -version = "7.0.1" +version = "7.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "106fec5c634420118c7d07a6c37110186ae7f23025ceac3a5dbe182eea548363" +checksum = "f9d7f39ea56df3bfbb3c81c99b1f028d26f205b6004156baffbf1a4f84b46cfa" dependencies = [ "bitflags 2.9.1", "revm-bytecode", @@ -10543,6 +10557,7 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-serde", "anyhow", + "arbitrary", "assert_cmd", "blake3", "bytes", @@ -10572,7 +10587,7 @@ dependencies = [ "parking_lot", "paste", "predicates", - "rand 0.9.1", + "rand 0.9.2", "reqwest", "reth-optimism-payload-builder", "reth-rpc-layer", @@ -10581,7 +10596,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "testcontainers", - "thiserror 2.0.12", + "thiserror 2.0.14", "time", "tokio", "tokio-tungstenite", @@ -10616,9 +10631,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" +checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" dependencies = [ "alloy-rlp", "arbitrary", @@ -10634,7 +10649,7 @@ dependencies = [ "primitive-types", "proptest", "rand 0.8.5", - "rand 0.9.1", + "rand 0.9.2", "rlp", "ruint-macro", "serde", @@ -10650,9 +10665,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -10721,9 +10736,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "aws-lc-rs", "log", @@ -10744,7 +10759,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.2.0", + "security-framework 3.3.0", ] [[package]] @@ -10781,7 +10796,7 @@ dependencies = [ "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework 3.2.0", + "security-framework 3.3.0", "security-framework-sys", "webpki-root-certs 0.26.11", "windows-sys 0.59.0", @@ -10807,9 +10822,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" @@ -10934,7 +10949,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes", - "rand 0.9.1", + "rand 0.9.2", "secp256k1-sys 0.11.0", ] @@ -10971,9 +10986,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" dependencies = [ "bitflags 2.9.1", "core-foundation 0.10.1", @@ -11048,14 +11063,14 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "indexmap 2.10.0", "itoa", @@ -11082,7 +11097,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11135,7 +11150,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11256,9 +11271,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -11273,27 +11288,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "similar" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" -dependencies = [ - "bstr", - "unicode-segmentation", -] - -[[package]] -name = "similar-asserts" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b441962c817e33508847a22bd82f03a30cff43642dc2fae8b050566121eb9a" -dependencies = [ - "console", - "serde", - "similar", -] - [[package]] name = "simple_asn1" version = "0.6.3" @@ -11302,7 +11296,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.12", + "thiserror 2.0.14", "time", ] @@ -11335,9 +11329,9 @@ checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -11365,6 +11359,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "soketto" version = "0.8.1" @@ -11424,7 +11428,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11435,7 +11439,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11449,11 +11453,11 @@ dependencies = [ [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros 0.27.1", + "strum_macros 0.27.2", ] [[package]] @@ -11466,20 +11470,19 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11501,9 +11504,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" dependencies = [ "proc-macro2", "quote", @@ -11512,14 +11515,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ac494e7266fcdd2ad80bf4375d55d27a117ea5c866c26d0e97fe5b3caeeb75" +checksum = "a7a985ff4ffd7373e10e0fb048110fb11a162e5a4c47f92ddb8787a6f766b769" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11539,7 +11542,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11601,13 +11604,12 @@ dependencies = [ [[package]] name = "tar-no-std" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15574aa79d3c04a12f3cb53ff976d5571e53b9d8e0bdbe4021df0a06473dd1c9" +checksum = "ac9ee8b664c9f1740cd813fea422116f8ba29997bb7c878d1940424889802897" dependencies = [ "bitflags 2.9.1", "log", - "memchr", "num-traits", ] @@ -11651,7 +11653,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-stream", "tokio-tar", @@ -11685,11 +11687,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.14", ] [[package]] @@ -11700,18 +11702,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11823,7 +11825,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", - "zerovec 0.11.2", + "zerovec 0.11.4", ] [[package]] @@ -11843,9 +11845,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -11856,9 +11858,9 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -11869,7 +11871,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -11929,6 +11931,7 @@ dependencies = [ "log", "native-tls", "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-native-tls", @@ -11939,9 +11942,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -12014,7 +12017,7 @@ dependencies = [ "percent-encoding", "pin-project", "prost", - "socket2", + "socket2 0.5.10", "tokio", "tokio-stream", "tower 0.4.13", @@ -12138,7 +12141,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12275,7 +12278,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12312,11 +12315,11 @@ dependencies = [ "httparse", "log", "native-tls", - "rand 0.9.1", + "rand 0.9.2", "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.12", + "thiserror 2.0.14", "utf-8", ] @@ -12469,9 +12472,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -12545,7 +12548,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12613,7 +12616,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "wasm-bindgen-shared", ] @@ -12648,7 +12651,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -12715,14 +12718,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.1", + "webpki-root-certs 1.0.2", ] [[package]] name = "webpki-root-certs" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86138b15b2b7d561bc4469e77027b8dd005a43dc502e9031d1f5afc8ce1f280e" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" dependencies = [ "rustls-pki-types", ] @@ -12733,14 +12736,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -12893,7 +12896,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12904,7 +12907,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12915,7 +12918,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12926,7 +12929,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12937,7 +12940,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -12948,7 +12951,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -13066,7 +13069,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -13117,10 +13120,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -13379,7 +13383,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror 2.0.12", + "thiserror 2.0.14", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -13442,7 +13446,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "synstructure", ] @@ -13454,7 +13458,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "synstructure", ] @@ -13475,7 +13479,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -13495,7 +13499,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", "synstructure", ] @@ -13516,7 +13520,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -13543,9 +13547,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke 0.8.0", "zerofrom", @@ -13560,7 +13564,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] @@ -13571,7 +13575,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.105", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0ddfca7f..8970c883 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,29 +28,35 @@ tokio-stream = "0.1.17" eyre = "0.6.12" url = "2.2.0" sha2 = { version = "0.10", default-features = false } +arbitrary = { version = "=1.4.2", features = ["derive"] } # Reth deps -reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } # Issue with reth feature compatibility. Include this in all crates for temp fix. -reth-op = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ +reth-op = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ "full", "alloy-compat", ] } -reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-network = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-network-peers = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.5.1" } +reth = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-network = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ + "serde", + "arbitrary", + "reth-codec", +] } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "6daf5fc" } # Alloy libraries alloy-rpc-types-engine = "1.0.13" alloy-rpc-types-eth = "1.0.13" -alloy-primitives = { version = "1.2.0", features = ["rand"] } +alloy-primitives = { version = "1.3.0", features = ["rand", "arbitrary"] } alloy-serde = "1.0.13" alloy-eips = "1.0.13" alloy-json-rpc = "1.0.13" diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index 9e14846f..d7ae27e9 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -9,26 +9,25 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true flashblocks-rpc.workspace = true -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } diff --git a/crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock b/crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock new file mode 100644 index 00000000..09228825 --- /dev/null +++ b/crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock @@ -0,0 +1,480 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9acbfca36652500c911ddb767ed433e3ed99b032b5d935be73c6923662db1d43" +dependencies = [ + "gimli", + "rustc-std-workspace-alloc", + "rustc-std-workspace-core", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "alloc" +version = "0.0.0" +dependencies = [ + "compiler_builtins", + "core", +] + +[[package]] +name = "alloctests" +version = "0.0.0" +dependencies = [ + "rand", + "rand_xorshift", +] + +[[package]] +name = "cc" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aeb932158bd710538c73702db6945cb68a8fb08c519e6e12706b94263b36db8" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "compiler_builtins" +version = "0.1.160" +dependencies = [ + "cc", + "core", +] + +[[package]] +name = "core" +version = "0.0.0" + +[[package]] +name = "coretests" +version = "0.0.0" +dependencies = [ + "rand", + "rand_xorshift", +] + +[[package]] +name = "dlmalloc" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa3a2dbee57b69fbb5dbe852fa9c0925697fb0c7fbcb1593e90e5ffaedf13d51" +dependencies = [ + "cfg-if", + "libc", + "rustc-std-workspace-core", + "windows-sys", +] + +[[package]] +name = "fortanix-sgx-abi" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efc85edd5b83e8394f4371dd0da6859dff63dd387dab8568fece6af4cde6f84" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "getopts" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" +dependencies = [ + "rustc-std-workspace-core", + "rustc-std-workspace-std", + "unicode-width", +] + +[[package]] +name = "gimli" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93563d740bc9ef04104f9ed6f86f1e3275c2cdafb95664e26584b9ca807a8ffe" +dependencies = [ + "rustc-std-workspace-alloc", + "rustc-std-workspace-core", +] + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "rustc-std-workspace-alloc", + "rustc-std-workspace-core", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +dependencies = [ + "rustc-std-workspace-alloc", + "rustc-std-workspace-core", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "rustc-std-workspace-alloc", + "rustc-std-workspace-core", +] + +[[package]] +name = "object" +version = "0.37.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e3d0a7419f081f4a808147e845310313a39f322d7ae1f996b7f001d6cbed04" +dependencies = [ + "memchr", + "rustc-std-workspace-alloc", + "rustc-std-workspace-core", +] + +[[package]] +name = "panic_abort" +version = "0.0.0" +dependencies = [ + "alloc", + "libc", + "rustc-std-workspace-core", +] + +[[package]] +name = "panic_unwind" +version = "0.0.0" +dependencies = [ + "alloc", + "cfg-if", + "libc", + "rustc-std-workspace-core", + "unwind", +] + +[[package]] +name = "proc_macro" +version = "0.0.0" +dependencies = [ + "core", + "rustc-literal-escaper", + "std", +] + +[[package]] +name = "profiler_builtins" +version = "0.0.0" +dependencies = [ + "cc", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "r-efi-alloc" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2f58ef3ca9bb0f9c44d9aa8537601bcd3df94cc9314a40178cadf7d4466354" +dependencies = [ + "r-efi", + "rustc-std-workspace-core", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +dependencies = [ + "rustc-std-workspace-core", +] + +[[package]] +name = "rustc-literal-escaper" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b" +dependencies = [ + "rustc-std-workspace-core", + "rustc-std-workspace-std", +] + +[[package]] +name = "rustc-std-workspace-alloc" +version = "1.99.0" +dependencies = [ + "alloc", +] + +[[package]] +name = "rustc-std-workspace-core" +version = "1.99.0" +dependencies = [ + "compiler_builtins", + "core", +] + +[[package]] +name = "rustc-std-workspace-std" +version = "1.99.0" +dependencies = [ + "std", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "std" +version = "0.0.0" +dependencies = [ + "addr2line", + "alloc", + "cfg-if", + "core", + "dlmalloc", + "fortanix-sgx-abi", + "hashbrown", + "hermit-abi", + "libc", + "miniz_oxide", + "object", + "panic_abort", + "panic_unwind", + "r-efi", + "r-efi-alloc", + "rand", + "rand_xorshift", + "rustc-demangle", + "std_detect", + "unwind", + "wasi", + "windows-targets 0.0.0", +] + +[[package]] +name = "std_detect" +version = "0.1.5" +dependencies = [ + "alloc", + "cfg-if", + "core", + "libc", +] + +[[package]] +name = "sysroot" +version = "0.0.0" +dependencies = [ + "proc_macro", + "profiler_builtins", + "std", + "test", +] + +[[package]] +name = "test" +version = "0.0.0" +dependencies = [ + "core", + "getopts", + "libc", + "std", +] + +[[package]] +name = "unicode-width" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +dependencies = [ + "rustc-std-workspace-core", + "rustc-std-workspace-std", +] + +[[package]] +name = "unwind" +version = "0.0.0" +dependencies = [ + "cfg-if", + "libc", + "rustc-std-workspace-core", + "unwinding", +] + +[[package]] +name = "unwinding" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60612c845ef41699f39dc8c5391f252942c0a88b7d15da672eff0d14101bbd6d" +dependencies = [ + "gimli", + "rustc-std-workspace-core", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +dependencies = [ + "rustc-std-workspace-alloc", + "rustc-std-workspace-core", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.0.0" + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock b/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock new file mode 100644 index 00000000..d07b6fba --- /dev/null +++ b/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock @@ -0,0 +1,13607 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-chains" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4195a29a4b87137b2bb02105e746102873bc03561805cf45c0e510c961f160e6" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "num_enum", + "serde", + "strum 0.27.2", +] + +[[package]] +name = "alloy-consensus" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda689f7287f15bd3582daba6be8d1545bad3740fd1fb778f629a1fe866bb43b" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "arbitrary", + "auto_impl", + "c-kzg", + "derive_more", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1 0.30.0", + "serde", + "serde_with", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-consensus-any" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5659581e41e8fe350ecc3593cb5c9dcffddfd550896390f2b78a07af67b0fa" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "arbitrary", + "serde", +] + +[[package]] +name = "alloy-dyn-abi" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8a436f0aad7df8bb47f144095fba61202265d9f5f09a70b0e3227881a668e" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "derive_more", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arbitrary", + "crc", + "rand 0.8.5", + "serde", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arbitrary", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arbitrary", + "k256", + "rand 0.8.5", + "serde", + "serde_with", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-eips" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f35887da30b5fc50267109a3c61cd63e6ca1f45967983641053a40ee83468c1" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "arbitrary", + "auto_impl", + "c-kzg", + "derive_more", + "either", + "ethereum_ssz", + "ethereum_ssz_derive", + "serde", + "sha2 0.10.9", +] + +[[package]] +name = "alloy-evm" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145913bf9bc11a7cec63a61aba36a39e41f2604aceb6d81b6bb8a4b2ddc93423" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-hardforks", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-sol-types", + "auto_impl", + "derive_more", + "op-alloy-consensus 0.18.13", + "op-revm", + "revm", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-genesis" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d4009efea6f403b3a80531f9c6f70fc242399498ff71196a1688cc1c901f44" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", + "serde_with", +] + +[[package]] +name = "alloy-hardforks" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165210652f71dfc094b051602bafd691f506c54050a174b1cba18fb5ef706a3" +dependencies = [ + "alloy-chains", + "alloy-eip2124", + "alloy-primitives", + "auto_impl", + "dyn-clone", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459f98c6843f208856f338bfb25e65325467f7aff35dfeb0484d0a76e059134b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883dee3b4020fcb5667ee627b4f401e899dad82bf37b246620339dd980720ed9" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "http", + "serde", + "serde_json", + "thiserror 2.0.14", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6e5b8ac1654a05c224390008e43634a2bdc74e181e02cf8ed591d8b3d4ad08" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-network-primitives" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7980333dd9391719756ac28bc2afa9baa705fc70ffd11dc86ab078dd64477" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-op-evm" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bcba6845a173265afed23c1ac3f1ff072662a9f09d33ec968989d12e2cb73e" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-op-hardforks", + "alloy-primitives", + "auto_impl", + "op-alloy-consensus 0.18.13", + "op-revm", + "revm", +] + +[[package]] +name = "alloy-op-hardforks" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3417f4187eaf7f7fb0d7556f0197bca26f0b23c4bb3aca0c9d566dc1c5d727a2" +dependencies = [ + "alloy-chains", + "alloy-hardforks", + "auto_impl", +] + +[[package]] +name = "alloy-primitives" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cfebde8c581a5d37b678d0a48a32decb51efd7a63a08ce2517ddec26db705c8" +dependencies = [ + "alloy-rlp", + "arbitrary", + "bytes", + "cfg-if", + "const-hex", + "derive_arbitrary", + "derive_more", + "foldhash", + "getrandom 0.3.3", + "hashbrown 0.15.5", + "indexmap 2.10.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "proptest-derive", + "rand 0.9.2", + "ruint", + "rustc-hash 2.1.1", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478a42fe167057b7b919cd8b0c2844f0247f667473340dad100eaf969de5754e" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-signer", + "alloy-sol-types", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap 6.1.0", + "either", + "futures", + "futures-utils-wasm", + "lru 0.13.0", + "parking_lot", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-pubsub" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a99b17987f40a066b29b6b56d75e84cd193b866cac27cae17b59f40338de95" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "auto_impl", + "bimap", + "futures", + "parking_lot", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "alloy-rpc-client" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0c6d723fbdf4a87454e2e3a275e161be27edcfbf46e2e3255dd66c138634b6" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41492dac39365b86a954de86c47ec23dcc7452cdb2fde591caadc194b3e34c6" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-admin" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c0f415ad97cc68d2f49eb08214f45c6827a6932a69773594f4ce178f8a41dc0" +dependencies = [ + "alloy-genesis", + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-rpc-types-anvil" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10493fa300a2757d8134f584800fef545c15905c95122bed1f6dde0b0d9dae27" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f7eb22670a972ad6c222a6c6dac3eef905579acffe9d63ab42be24c7d158535" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-beacon" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53381ffba0110a8aed4c9f108ef34a382ed21aeefb5f50f91c73451ae68b89aa" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "ethereum_ssz", + "ethereum_ssz_derive", + "serde", + "serde_with", + "thiserror 2.0.14", + "tree_hash", + "tree_hash_derive", +] + +[[package]] +name = "alloy-rpc-types-debug" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b6f0482c82310366ec3dcf4e5212242f256a69fcf1a26e5017e6704091ee95" +dependencies = [ + "alloy-primitives", + "derive_more", + "serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24c171377c0684e3860385f6d93fbfcc8ecc74f6cce8304c822bf1a50bacce0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more", + "ethereum_ssz", + "ethereum_ssz_derive", + "jsonwebtoken", + "rand 0.8.5", + "serde", + "strum 0.27.2", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b777b98526bbe5b7892ca22a7fd5f18ed624ff664a79f40d0f9f2bf94ba79a84" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "arbitrary", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-rpc-types-mev" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c15e8ccb6c16e196fcc968e16a71cd8ce4160f3ec5871d2ea196b75bf569ac02" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a854af3fe8fce1cfe319fcf84ee8ba8cda352b14d3dd4221405b5fc6cce9e1" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-rpc-types-txpool" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc803e9b8d16154c856a738c376e002abe4b388e5fef91c8aebc8373e99fd45" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-serde" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8d2c52adebf3e6494976c8542fbdf12f10123b26e11ad56f77274c16a2a039" +dependencies = [ + "alloy-primitives", + "arbitrary", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c0494d1e0f802716480aabbe25549c7f6bc2a25ff33b08fd332bbb4b7d06894" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-signer-local" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c2435eb8979a020763ced3fb478932071c56e5f75ea86db41f320915d325ba" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.14", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedac07a10d4c2027817a43cc1f038313fc53c7ac866f7363239971fd01f9f18" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f9a598f010f048d8b8226492b6401104f5a5c1273c2869b72af29b48bb4ba9" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.10.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.105", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f494adf9d60e49aa6ce26dfd42c7417aa6d4343cf2ae621f20e4d92a5ad07d85" +dependencies = [ + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.105", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52db32fbd35a9c0c0e538b58b81ebbae08a51be029e7ad60e08b60481c2ec6c3" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a285b46e3e0c177887028278f04cc8262b76fd3b8e0e20e93cea0a58c35f5ac5" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0107675e10c7f248bf7273c1e7fdb02409a717269cc744012e6f3c39959bfb" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "auto_impl", + "base64 0.22.1", + "derive_more", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78e3736701b5433afd06eecff08f0688a71a10e0e1352e0bbf0bed72f0dd4e35" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower 0.5.2", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c79064b5a08259581cb5614580010007c2df6deab1e8f3e8c7af8d7e9227008f" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd607158cb9bc54cbcfcaab4c5f36c5b26994c7dc58b6f095ce27a54f270f3" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "alloy-trie" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bada1fc392a33665de0dc50d401a3701b62583c655e3522a323490a5da016962" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arbitrary", + "arrayvec", + "derive_arbitrary", + "derive_more", + "nybbles", + "proptest", + "proptest-derive", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "alloy-tx-macros" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6acb36318dfa50817154064fea7932adf2eec3f51c86680e2b37d7e8906c66bb" +dependencies = [ + "alloy-primitives", + "darling", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + +[[package]] +name = "anyhow" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" + +[[package]] +name = "aquamarine" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.105", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "asn1_der" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" + +[[package]] +name = "assert_cmd" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" +dependencies = [ + "anstyle", + "bstr", + "doc-comment", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + +[[package]] +name = "async-compression" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "zstd", + "zstd-safe", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "aurora-engine-modexp" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518bc5745a6264b5fd7b09dffb9667e400ee9e2bbe18555fac75e1fe9afa0df9" +dependencies = [ + "hex", + "num", +] + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +dependencies = [ + "bindgen 0.69.5", + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "itoa", + "matchit 0.7.3", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +dependencies = [ + "axum-core 0.5.2", + "base64 0.22.1", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit 0.8.4", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.16", + "instant", + "rand 0.8.5", +] + +[[package]] +name = "backon" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" +dependencies = [ + "fastrand", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.9.1", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.105", + "which", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.9.1", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.105", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "serde", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "boa_ast" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" +dependencies = [ + "bitflags 2.9.1", + "boa_interner", + "boa_macros", + "boa_string", + "indexmap 2.10.0", + "num-bigint", + "rustc-hash 2.1.1", +] + +[[package]] +name = "boa_engine" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" +dependencies = [ + "arrayvec", + "bitflags 2.9.1", + "boa_ast", + "boa_gc", + "boa_interner", + "boa_macros", + "boa_parser", + "boa_profiler", + "boa_string", + "bytemuck", + "cfg-if", + "dashmap 6.1.0", + "fast-float2", + "hashbrown 0.15.5", + "icu_normalizer 1.5.0", + "indexmap 2.10.0", + "intrusive-collections", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "num_enum", + "once_cell", + "pollster", + "portable-atomic", + "rand 0.8.5", + "regress", + "rustc-hash 2.1.1", + "ryu-js", + "serde", + "serde_json", + "sptr", + "static_assertions", + "tap", + "thin-vec", + "thiserror 2.0.14", + "time", +] + +[[package]] +name = "boa_gc" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2425c0b7720d42d73eaa6a883fbb77a5c920da8694964a3d79a67597ac55cce2" +dependencies = [ + "boa_macros", + "boa_profiler", + "boa_string", + "hashbrown 0.15.5", + "thin-vec", +] + +[[package]] +name = "boa_interner" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42407a3b724cfaecde8f7d4af566df4b56af32a2f11f0956f5570bb974e7f749" +dependencies = [ + "boa_gc", + "boa_macros", + "hashbrown 0.15.5", + "indexmap 2.10.0", + "once_cell", + "phf", + "rustc-hash 2.1.1", + "static_assertions", +] + +[[package]] +name = "boa_macros" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", + "synstructure", +] + +[[package]] +name = "boa_parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" +dependencies = [ + "bitflags 2.9.1", + "boa_ast", + "boa_interner", + "boa_macros", + "boa_profiler", + "fast-float2", + "icu_properties 1.5.1", + "num-bigint", + "num-traits", + "regress", + "rustc-hash 2.1.1", +] + +[[package]] +name = "boa_profiler" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4064908e7cdf9b6317179e9b04dcb27f1510c1c144aeab4d0394014f37a0f922" + +[[package]] +name = "boa_string" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7debc13fbf7997bf38bf8e9b20f1ad5e2a7d27a900e1f6039fe244ce30f589b5" +dependencies = [ + "fast-float2", + "paste", + "rustc-hash 2.1.1", + "sptr", + "static_assertions", +] + +[[package]] +name = "bollard" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ccca1260af6a459d75994ad5acc1651bcabcbdbc41467cc9786519ab854c30" +dependencies = [ + "base64 0.22.1", + "bollard-stubs", + "bytes", + "futures-core", + "futures-util", + "hex", + "home", + "http", + "http-body-util", + "hyper", + "hyper-named-pipe", + "hyper-rustls", + "hyper-util", + "hyperlocal", + "log", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "serde_urlencoded", + "thiserror 2.0.14", + "tokio", + "tokio-util", + "tower-service", + "url", + "winapi", +] + +[[package]] +name = "bollard-stubs" +version = "1.47.1-rc.27.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f179cfbddb6e77a5472703d4b30436bff32929c0aa8a9008ecf23d1d3cdd0da" +dependencies = [ + "serde", + "serde_repr", + "serde_with", +] + +[[package]] +name = "boyer-moore-magiclen" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95e6233f2d926b5b123caf9d58e3885885255567fbe7776a7fdcae2a4d7241c4" +dependencies = [ + "debug-helper", +] + +[[package]] +name = "brotli" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "regex-automata 0.4.9", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +dependencies = [ + "arbitrary", + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d07aa9a93b00c76f71bc35d598bed923f6d4f3a9ca5c24b7737ae1a292841c0" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "comfy-table" +version = "7.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" +dependencies = [ + "crossterm", + "unicode-segmentation", + "unicode-width 0.2.0", +] + +[[package]] +name = "compact_str" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + +[[package]] +name = "concat-kdf" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d72c1252426a83be2092dd5884a5f6e3b8e7180f6891b6263d2c21b92ec8816" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-hex" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags 2.9.1", + "crossterm_winapi", + "mio", + "parking_lot", + "rustix 0.38.44", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version 0.4.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.105", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "data-encoding-macro" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" +dependencies = [ + "data-encoding", + "syn 2.0.105", +] + +[[package]] +name = "debug-helper" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" + +[[package]] +name = "delay_map" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88e365f083a5cb5972d50ce8b1b2c9f125dc5ec0f50c0248cfb568ae59efcf0b" +dependencies = [ + "futures", + "tokio", + "tokio-util", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive-where" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.105", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.105", + "unicode-xid", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.60.2", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + +[[package]] +name = "discv5" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4b4e7798d2ff74e29cee344dc490af947ae657d6ab5273dde35d58ce06a4d71" +dependencies = [ + "aes", + "aes-gcm", + "alloy-rlp", + "arrayvec", + "ctr", + "delay_map", + "enr", + "fnv", + "futures", + "hashlink", + "hex", + "hkdf", + "lazy_static", + "libp2p-identity", + "lru 0.12.5", + "more-asserts", + "multiaddr", + "parking_lot", + "rand 0.8.5", + "smallvec", + "socket2 0.5.10", + "tokio", + "tracing", + "uint 0.10.0", + "zeroize", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "docker_credential" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d89dfcba45b4afad7450a99b39e751590463e45c04728cf555d36bb66940de8" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dtor" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "enr" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "851bd664a3d3a3c175cff92b2f0df02df3c541b4895d0ae307611827aae46152" +dependencies = [ + "alloy-rlp", + "base64 0.22.1", + "bytes", + "ed25519-dalek", + "hex", + "k256", + "log", + "rand 0.8.5", + "secp256k1 0.30.0", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "ethereum_hashing" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c853bd72c9e5787f8aafc3df2907c2ed03cff3150c3acd94e2e53a98ab70a8ab" +dependencies = [ + "cpufeatures", + "ring", + "sha2 0.10.9", +] + +[[package]] +name = "ethereum_serde_utils" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dc1355dbb41fbbd34ec28d4fb2a57d9a70c67ac3c19f6a5ca4d4a176b9e997a" +dependencies = [ + "alloy-primitives", + "hex", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "ethereum_ssz" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca8ba45b63c389c6e115b095ca16381534fdcc03cf58176a3f8554db2dbe19b" +dependencies = [ + "alloy-primitives", + "ethereum_serde_utils", + "itertools 0.13.0", + "serde", + "serde_derive", + "smallvec", + "typenum", +] + +[[package]] +name = "ethereum_ssz_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd55d08012b4e0dfcc92b8d6081234df65f2986ad34cc76eeed69c5e2ce7506" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[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", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fast-float2" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fdlimit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" +dependencies = [ + "libc", + "thiserror 1.0.69", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "flashblocks-node" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-json-rpc", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "brotli", + "clap", + "ed25519-dalek", + "eyre", + "flashblocks-p2p", + "flashblocks-rpc", + "futures-util", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "metrics-derive", + "op-alloy-consensus 0.18.13", + "op-alloy-network", + "op-alloy-rpc-types", + "reth-db", + "reth-eth-wire", + "reth-ethereum", + "reth-network", + "reth-network-peers", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-optimism-chainspec", + "reth-optimism-cli", + "reth-optimism-evm", + "reth-optimism-forks", + "reth-optimism-node", + "reth-optimism-rpc", + "reth-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-rpc-eth-api", + "reth-rpc-server-types", + "reth-tasks", + "reth-tracing", + "rollup-boost", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "url", +] + +[[package]] +name = "flashblocks-p2p" +version = "0.1.0" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "blake3", + "clap", + "ed25519-dalek", + "eyre", + "futures", + "metrics", + "parking_lot", + "reth", + "reth-eth-wire", + "reth-ethereum", + "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-op", + "reth-optimism-primitives", + "reth-provider", + "reth-transaction-pool", + "rollup-boost", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "flashblocks-rpc" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-json-rpc", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "brotli", + "clap", + "ed25519-dalek", + "eyre", + "flashblocks-p2p", + "futures-util", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "metrics-derive", + "op-alloy-consensus 0.18.13", + "op-alloy-network", + "op-alloy-rpc-types", + "reth-db", + "reth-eth-wire", + "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-optimism-chainspec", + "reth-optimism-evm", + "reth-optimism-forks", + "reth-optimism-primitives", + "reth-optimism-rpc", + "reth-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-rpc-eth-api", + "reth-rpc-server-types", + "reth-tasks", + "reth-tracing", + "rollup-boost", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "url", +] + +[[package]] +name = "flashblocks-websocket-proxy" +version = "0.1.0" +dependencies = [ + "axum 0.8.4", + "backoff", + "brotli", + "clap", + "dotenvy", + "eyre", + "futures", + "hostname", + "http", + "metrics", + "metrics-derive", + "metrics-exporter-prometheus 0.17.2", + "redis", + "reqwest", + "serde_json", + "testcontainers", + "testcontainers-modules", + "thiserror 2.0.14", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tracing", + "tracing-subscriber 0.3.19", + "uuid", +] + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generator" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.61.3", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "git2" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +dependencies = [ + "bitflags 2.9.1", + "libc", + "libgit2-sys", + "log", + "url", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gmp-mpfr-sys" +version = "1.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66d61197a68f6323b9afa616cf83d55d69191e1bf364d4eb7d35ae18defe776" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.10.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash-db" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "byteorder", + "num-traits", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hickory-proto" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.9.2", + "ring", + "serde", + "thiserror 2.0.14", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "moka", + "once_cell", + "parking_lot", + "rand 0.9.2", + "resolv-conf", + "serde", + "smallvec", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "hostname" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +dependencies = [ + "cfg-if", + "libc", + "windows-link", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "human_bytes" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" + +[[package]] +name = "humantime" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" + +[[package]] +name = "humantime-serde" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" +dependencies = [ + "humantime", + "serde", +] + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-named-pipe" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" +dependencies = [ + "hex", + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", + "winapi", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.2", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.0", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "hyperlocal" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" +dependencies = [ + "hex", + "http-body-util", + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke 0.8.0", + "zerofrom", + "zerovec 0.11.4", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap 0.8.0", + "tinystr 0.8.1", + "writeable 0.6.1", + "zerovec 0.11.4", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap 0.7.5", + "tinystr 0.7.6", + "writeable 0.5.5", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections 1.5.0", + "icu_normalizer_data 1.5.1", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections 2.0.0", + "icu_normalizer_data 2.0.0", + "icu_properties 2.0.1", + "icu_provider 2.0.0", + "smallvec", + "zerovec 0.11.4", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections 1.5.0", + "icu_locid_transform", + "icu_properties_data 1.5.1", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections 2.0.0", + "icu_locale_core", + "icu_properties_data 2.0.1", + "icu_provider 2.0.0", + "potential_utf", + "zerotrie", + "zerovec 0.11.4", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr 0.7.6", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr 0.8.1", + "writeable 0.6.1", + "yoke 0.8.0", + "zerofrom", + "zerotrie", + "zerovec 0.11.4", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer 2.0.0", + "icu_properties 2.0.1", +] + +[[package]] +name = "if-addrs" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b2eeee38fef3aa9b4cc5f1beea8a2444fc00e7377cafae396de3f5c2065e24" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +dependencies = [ + "arbitrary", + "equivalent", + "hashbrown 0.15.5", + "serde", +] + +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "inotify" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +dependencies = [ + "bitflags 2.9.1", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instability" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" +dependencies = [ + "darling", + "indoc", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "interprocess" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + +[[package]] +name = "intrusive-collections" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" +dependencies = [ + "memoffset", +] + +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-http-client 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-proc-macros 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-server 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-wasm-client", + "jsonrpsee-ws-client", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee" +version = "0.25.1" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +dependencies = [ + "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-http-client 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-proc-macros 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-server 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a320a3f1464e4094f780c4d48413acd786ce5627aaaecfac9e9c7431d13ae1" +dependencies = [ + "base64 0.22.1", + "futures-channel", + "futures-util", + "gloo-net", + "http", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "soketto", + "thiserror 2.0.14", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" +dependencies = [ + "async-trait", + "bytes", + "futures-timer", + "futures-util", + "http", + "http-body", + "http-body-util", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot", + "pin-project", + "rand 0.9.2", + "rustc-hash 2.1.1", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "wasm-bindgen-futures", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.25.1" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "parking_lot", + "pin-project", + "rand 0.9.2", + "rustc-hash 2.1.1", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" +dependencies = [ + "base64 0.22.1", + "http-body", + "hyper", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls", + "rustls-platform-verifier", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tower 0.5.2", + "url", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.25.1" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +dependencies = [ + "base64 0.22.1", + "http-body", + "hyper", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "rustls", + "rustls-platform-verifier", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tower 0.5.2", + "url", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fa4f5daed39f982a1bb9d15449a28347490ad42b212f8eaa2a2a344a0dce9e9" +dependencies = [ + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.25.1" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +dependencies = [ + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38b0bcf407ac68d241f90e2d46041e6a06988f97fe1721fb80b91c42584fae6" +dependencies = [ + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project", + "route-recognizer", + "serde", + "serde_json", + "soketto", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-util", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.25.1" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +dependencies = [ + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "pin-project", + "route-recognizer", + "serde", + "serde_json", + "soketto", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-util", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" +dependencies = [ + "http", + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.25.1" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +dependencies = [ + "http", + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b67695cbcf4653f39f8f8738925547e0e23fd9fe315bccf951097b9f6a38781" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tower 0.5.2", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da2694c9ff271a9d3ebfe520f6b36820e85133a51be77a3cb549fd615095261" +dependencies = [ + "http", + "jsonrpsee-client-transport", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2 0.10.9", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +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" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "libgit2-sys" +version = "0.18.2+1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.53.3", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libp2p-identity" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" +dependencies = [ + "asn1_der", + "bs58", + "ed25519-dalek", + "hkdf", + "k256", + "multihash", + "quick-protobuf", + "sha2 0.10.9", + "thiserror 2.0.14", + "tracing", + "zeroize", +] + +[[package]] +name = "libproc" +version = "0.14.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" +dependencies = [ + "bindgen 0.70.1", + "errno", + "libc", +] + +[[package]] +name = "libredox" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +dependencies = [ + "bitflags 2.9.1", + "libc", + "redox_syscall 0.5.17", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" +dependencies = [ + "arrayref", + "base64 0.22.1", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae85b5be22d9843c80e5fc80e9b64c8a3b1f98f867c709956eca3efff4e92e2" +dependencies = [ + "linked-hash-map", + "serde", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", + "serde", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "lz4_flex" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "memmap2" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metrics" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dea7ac8057892855ec285c440160265225438c3c45072613c25a4b26e98ef5" +dependencies = [ + "ahash", + "portable-atomic", +] + +[[package]] +name = "metrics-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3dbdd96ed57d565ec744cba02862d707acf373c5772d152abae6ec5c4e24f6c" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.105", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7399781913e5393588a8d8c6a2867bf85fb38eaf2502fdce465aad2dc6f034" +dependencies = [ + "base64 0.22.1", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap 2.10.0", + "ipnet", + "metrics", + "metrics-util 0.19.1", + "quanta", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b166dea96003ee2531cf14833efedced545751d800f03535801d833313f8c15" +dependencies = [ + "base64 0.22.1", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap 2.10.0", + "ipnet", + "metrics", + "metrics-util 0.20.0", + "quanta", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-process" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a82c8add4382f29a122fa64fff1891453ed0f6b2867d971e7d60cb8dfa322ff" +dependencies = [ + "libc", + "libproc", + "mach2", + "metrics", + "once_cell", + "procfs", + "rlimit", + "windows 0.58.0", +] + +[[package]] +name = "metrics-util" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8496cc523d1f94c1385dd8f0f0c2c480b2b8aeccb5b7e4485ad6365523ae376" +dependencies = [ + "aho-corasick", + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.15.5", + "indexmap 2.10.0", + "metrics", + "ordered-float", + "quanta", + "radix_trie", + "rand 0.9.2", + "rand_xoshiro", + "sketches-ddsketch", +] + +[[package]] +name = "metrics-util" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe8db7a05415d0f919ffb905afa37784f71901c9a773188876984b4f769ab986" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.15.5", + "metrics", + "quanta", + "rand 0.9.2", + "rand_xoshiro", + "sketches-ddsketch", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mini-moka" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" +dependencies = [ + "crossbeam-channel", + "crossbeam-utils", + "dashmap 5.5.3", + "skeptic", + "smallvec", + "tagptr", + "triomphe", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "moka" +version = "0.12.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +dependencies = [ + "async-lock", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "event-listener", + "futures-util", + "loom", + "parking_lot", + "portable-atomic", + "rustc_version 0.4.1", + "smallvec", + "tagptr", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "more-asserts" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" + +[[package]] +name = "multiaddr" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "libp2p-identity", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" +dependencies = [ + "core2", + "unsigned-varint", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "notify" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" +dependencies = [ + "bitflags 2.9.1", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.60.2", +] + +[[package]] +name = "notify-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "nybbles" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ff79de40513a478a9e374a480f897c2df829d48dcc64a83e4792a57fe231c64" +dependencies = [ + "alloy-rlp", + "arbitrary", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "op-alloy-consensus" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2423a125ef2daa0d15dacc361805a0b6f76d6acfc6e24a1ff6473582087fe75" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "derive_more", + "thiserror 2.0.14", +] + +[[package]] +name = "op-alloy-consensus" +version = "0.18.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3c719b26da6d9cac18c3a35634d6ab27a74a304ed9b403b43749c22e57a389f" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-serde", + "arbitrary", + "derive_more", + "serde", + "serde_with", + "thiserror 2.0.14", +] + +[[package]] +name = "op-alloy-flz" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a79f352fc3893dcd670172e615afef993a41798a1d3fc0db88a3e60ef2e70ecc" + +[[package]] +name = "op-alloy-network" +version = "0.18.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66be312d3446099f1c46b3bb4bbaccdd4b3d6fb3668921158e3d47dff0a8d4a0" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types-eth", + "alloy-signer", + "op-alloy-consensus 0.18.13", + "op-alloy-rpc-types", +] + +[[package]] +name = "op-alloy-rpc-jsonrpsee" +version = "0.18.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3833995acfc568fdac3684f037c4ed3f1f2bd2ef5deeb3f46ecee32aafa34c8e" +dependencies = [ + "alloy-primitives", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "op-alloy-rpc-types" +version = "0.18.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99911fa02e717a96ba24de59874b20cf31c9d116ce79ed4e0253267260b6922f" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "derive_more", + "op-alloy-consensus 0.18.13", + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "op-alloy-rpc-types-engine" +version = "0.18.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cf45d43a3d548fdc39d9bfab6ba13cc06b3214ef4b9c36d3efbf3faea1b9f1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "alloy-serde", + "derive_more", + "ethereum_ssz", + "ethereum_ssz_derive", + "op-alloy-consensus 0.18.13", + "serde", + "snap", + "thiserror 2.0.14", +] + +[[package]] +name = "op-revm" +version = "9.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6889cdfed74c6c924a54b2357982fce232e06473c6bb73b9a0c71a9151bfabd" +dependencies = [ + "auto_impl", + "revm", + "serde", +] + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e667b670a5cdf90c258f5a55794ec5ac5027e960c224bff8367a59e1e6426" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.14", + "tracing", +] + +[[package]] +name = "opentelemetry-http" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8863faf2910030d139fb48715ad5ff2f35029fc5f244f6d5f689ddcf4d26253" +dependencies = [ + "async-trait", + "bytes", + "http", + "opentelemetry", + "reqwest", + "tracing", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bef114c6d41bea83d6dc60eb41720eedd0261a67af57b66dd2b84ac46c01d91" +dependencies = [ + "async-trait", + "futures-core", + "http", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-proto", + "opentelemetry_sdk", + "prost", + "reqwest", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tonic", + "tracing", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f8870d3024727e99212eb3bb1762ec16e255e3e6f58eeb3dc8db1aa226746d" +dependencies = [ + "base64 0.22.1", + "hex", + "opentelemetry", + "opentelemetry_sdk", + "prost", + "serde", + "tonic", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" +dependencies = [ + "async-trait", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "opentelemetry", + "percent-encoding", + "rand 0.8.5", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arbitrary", + "arrayvec", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.17", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "parse-display" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" +dependencies = [ + "parse-display-derive", + "regex", + "regex-syntax 0.8.5", +] + +[[package]] +name = "parse-display-derive" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae7800a4c974efd12df917266338e79a7a74415173caf7e70aa0a0707345281" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "regex-syntax 0.8.5", + "structmeta", + "syn 2.0.105", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +dependencies = [ + "memchr", + "thiserror 2.0.14", + "ucd-trie", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain_hasher" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e19e6491bdde87c2c43d70f4c194bc8a758f2eb732df00f61e43f7362e3b4cc" +dependencies = [ + "crunchy", +] + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec 0.11.4", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "predicates" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "prettyplease" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +dependencies = [ + "proc-macro2", + "syn 2.0.105", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint 0.9.5", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "proc-macro2" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "procfs" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" +dependencies = [ + "bitflags 2.9.1", + "chrono", + "flate2", + "hex", + "procfs-core", + "rustix 0.38.44", +] + +[[package]] +name = "procfs-core" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" +dependencies = [ + "bitflags 2.9.1", + "chrono", + "hex", +] + +[[package]] +name = "proptest" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.9.1", + "lazy_static", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "proptest-arbitrary-interop" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1981e49bd2432249da8b0e11e5557099a8e74690d6b94e721f7dc0bb7f3555f" +dependencies = [ + "arbitrary", + "proptest", +] + +[[package]] +name = "proptest-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +dependencies = [ + "bitflags 2.9.1", + "memchr", + "unicase", +] + +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.1+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quinn" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2 0.5.10", + "thiserror 2.0.14", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.14", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "serde", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "ratatui" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" +dependencies = [ + "bitflags 2.9.1", + "cassowary", + "compact_str", + "crossterm", + "indoc", + "instability", + "itertools 0.13.0", + "lru 0.12.5", + "paste", + "strum 0.26.3", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.0", +] + +[[package]] +name = "raw-cpuid" +version = "11.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + +[[package]] +name = "redis" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "438a4e5f8e9aa246d6f3666d6978441bf1b37d5f417b50c4dd220be09f5fcc17" +dependencies = [ + "arc-swap", + "combine", + "itoa", + "num-bigint", + "percent-encoding", + "ryu", + "sha1_smol", + "socket2 0.5.10", + "url", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.14", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "regress" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" +dependencies = [ + "hashbrown 0.15.5", + "memchr", +] + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util", + "tower 0.5.2", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 1.0.2", +] + +[[package]] +name = "resolv-conf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" + +[[package]] +name = "reth" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-rpc-types", + "aquamarine", + "clap", + "eyre", + "reth-chainspec", + "reth-cli-runner", + "reth-cli-util", + "reth-consensus", + "reth-consensus-common", + "reth-db", + "reth-ethereum-cli", + "reth-ethereum-payload-builder", + "reth-ethereum-primitives", + "reth-evm", + "reth-network", + "reth-network-api", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-node-ethereum", + "reth-node-metrics", + "reth-payload-builder", + "reth-payload-primitives", + "reth-primitives", + "reth-provider", + "reth-ress-protocol", + "reth-ress-provider", + "reth-revm", + "reth-rpc", + "reth-rpc-api", + "reth-rpc-builder", + "reth-rpc-convert", + "reth-rpc-eth-types", + "reth-rpc-server-types", + "reth-tasks", + "reth-tokio-util", + "reth-transaction-pool", + "tokio", + "tracing", +] + +[[package]] +name = "reth-basic-payload-builder" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "futures-core", + "futures-util", + "metrics", + "reth-chain-state", + "reth-metrics", + "reth-payload-builder", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-revm", + "reth-storage-api", + "reth-tasks", + "tokio", + "tracing", +] + +[[package]] +name = "reth-chain-state" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-signer", + "alloy-signer-local", + "derive_more", + "metrics", + "parking_lot", + "pin-project", + "rand 0.9.2", + "reth-chainspec", + "reth-errors", + "reth-ethereum-primitives", + "reth-execution-types", + "reth-metrics", + "reth-primitives-traits", + "reth-storage-api", + "reth-trie", + "revm-database", + "revm-state", + "serde", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-chainspec" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-genesis", + "alloy-primitives", + "alloy-trie", + "auto_impl", + "derive_more", + "reth-ethereum-forks", + "reth-network-peers", + "reth-primitives-traits", + "serde_json", +] + +[[package]] +name = "reth-cli" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-genesis", + "clap", + "eyre", + "reth-cli-runner", + "reth-db", + "serde_json", + "shellexpand", +] + +[[package]] +name = "reth-cli-commands" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "ahash", + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "backon", + "clap", + "comfy-table", + "crossterm", + "eyre", + "fdlimit", + "futures", + "human_bytes", + "itertools 0.14.0", + "lz4", + "ratatui", + "reqwest", + "reth-chainspec", + "reth-cli", + "reth-cli-runner", + "reth-cli-util", + "reth-codecs", + "reth-config", + "reth-consensus", + "reth-db", + "reth-db-api", + "reth-db-common", + "reth-discv4", + "reth-discv5", + "reth-downloaders", + "reth-ecies", + "reth-era", + "reth-era-downloader", + "reth-era-utils", + "reth-eth-wire", + "reth-etl", + "reth-evm", + "reth-exex", + "reth-fs-util", + "reth-net-nat", + "reth-network", + "reth-network-p2p", + "reth-network-peers", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-node-events", + "reth-node-metrics", + "reth-primitives-traits", + "reth-provider", + "reth-prune", + "reth-revm", + "reth-stages", + "reth-static-file", + "reth-static-file-types", + "reth-trie", + "reth-trie-db", + "secp256k1 0.30.0", + "serde", + "serde_json", + "tar", + "tokio", + "tokio-stream", + "toml", + "tracing", +] + +[[package]] +name = "reth-cli-runner" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "reth-tasks", + "tokio", + "tracing", +] + +[[package]] +name = "reth-cli-util" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "cfg-if", + "eyre", + "libc", + "rand 0.8.5", + "reth-fs-util", + "secp256k1 0.30.0", + "serde", + "thiserror 2.0.14", + "tikv-jemallocator", +] + +[[package]] +name = "reth-codecs" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-trie", + "arbitrary", + "bytes", + "modular-bitfield", + "op-alloy-consensus 0.18.13", + "reth-codecs-derive", + "reth-zstd-compressors", + "serde", + "visibility", +] + +[[package]] +name = "reth-codecs-derive" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "reth-config" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "eyre", + "humantime-serde", + "reth-network-types", + "reth-prune-types", + "reth-stages-types", + "serde", + "toml", + "url", +] + +[[package]] +name = "reth-consensus" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "auto_impl", + "reth-execution-types", + "reth-primitives-traits", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-consensus-common" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "reth-chainspec", + "reth-consensus", + "reth-primitives-traits", +] + +[[package]] +name = "reth-consensus-debug-client" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types-engine", + "auto_impl", + "derive_more", + "eyre", + "futures", + "reqwest", + "reth-node-api", + "reth-primitives-traits", + "reth-tracing", + "ringbuffer", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "reth-db" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "derive_more", + "eyre", + "metrics", + "page_size", + "parking_lot", + "reth-db-api", + "reth-fs-util", + "reth-libmdbx", + "reth-metrics", + "reth-nippy-jar", + "reth-static-file-types", + "reth-storage-errors", + "reth-tracing", + "rustc-hash 2.1.1", + "strum 0.27.2", + "sysinfo", + "tempfile", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-db-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-genesis", + "alloy-primitives", + "arbitrary", + "bytes", + "derive_more", + "metrics", + "modular-bitfield", + "parity-scale-codec", + "proptest", + "reth-codecs", + "reth-db-models", + "reth-ethereum-primitives", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-prune-types", + "reth-stages-types", + "reth-storage-errors", + "reth-trie-common", + "roaring", + "serde", +] + +[[package]] +name = "reth-db-common" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-genesis", + "alloy-primitives", + "boyer-moore-magiclen", + "eyre", + "reth-chainspec", + "reth-codecs", + "reth-config", + "reth-db-api", + "reth-etl", + "reth-execution-errors", + "reth-fs-util", + "reth-node-types", + "reth-primitives-traits", + "reth-provider", + "reth-stages-types", + "reth-static-file-types", + "reth-trie", + "reth-trie-db", + "serde", + "serde_json", + "thiserror 2.0.14", + "tracing", +] + +[[package]] +name = "reth-db-models" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "arbitrary", + "bytes", + "modular-bitfield", + "reth-codecs", + "reth-primitives-traits", + "serde", +] + +[[package]] +name = "reth-discv4" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "discv5", + "enr", + "generic-array", + "itertools 0.14.0", + "parking_lot", + "rand 0.8.5", + "reth-ethereum-forks", + "reth-net-banlist", + "reth-net-nat", + "reth-network-peers", + "schnellru", + "secp256k1 0.30.0", + "serde", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-discv5" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more", + "discv5", + "enr", + "futures", + "itertools 0.14.0", + "metrics", + "rand 0.9.2", + "reth-chainspec", + "reth-ethereum-forks", + "reth-metrics", + "reth-network-peers", + "secp256k1 0.30.0", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-dns-discovery" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "data-encoding", + "enr", + "hickory-resolver", + "linked_hash_set", + "parking_lot", + "reth-ethereum-forks", + "reth-network-peers", + "reth-tokio-util", + "schnellru", + "secp256k1 0.30.0", + "serde", + "serde_with", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-downloaders" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "futures", + "futures-util", + "itertools 0.14.0", + "metrics", + "pin-project", + "rayon", + "reth-config", + "reth-consensus", + "reth-db", + "reth-db-api", + "reth-ethereum-primitives", + "reth-metrics", + "reth-network-p2p", + "reth-network-peers", + "reth-primitives-traits", + "reth-storage-api", + "reth-tasks", + "reth-testing-utils", + "tempfile", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-ecies" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "aes", + "alloy-primitives", + "alloy-rlp", + "block-padding", + "byteorder", + "cipher", + "concat-kdf", + "ctr", + "digest 0.10.7", + "futures", + "generic-array", + "hmac", + "pin-project", + "rand 0.8.5", + "reth-network-peers", + "secp256k1 0.30.0", + "sha2 0.10.9", + "sha3", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "typenum", +] + +[[package]] +name = "reth-engine-local" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types-engine", + "eyre", + "futures-util", + "op-alloy-rpc-types-engine", + "reth-chainspec", + "reth-engine-primitives", + "reth-ethereum-engine-primitives", + "reth-optimism-chainspec", + "reth-payload-builder", + "reth-payload-primitives", + "reth-provider", + "reth-transaction-pool", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-engine-primitives" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "futures", + "reth-chain-state", + "reth-errors", + "reth-ethereum-primitives", + "reth-evm", + "reth-execution-types", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-trie-common", + "serde", + "thiserror 2.0.14", + "tokio", +] + +[[package]] +name = "reth-engine-service" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "futures", + "pin-project", + "reth-chainspec", + "reth-consensus", + "reth-engine-primitives", + "reth-engine-tree", + "reth-ethereum-primitives", + "reth-evm", + "reth-network-p2p", + "reth-node-types", + "reth-payload-builder", + "reth-provider", + "reth-prune", + "reth-stages-api", + "reth-tasks", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-engine-tree" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "derive_more", + "futures", + "metrics", + "mini-moka", + "parking_lot", + "rayon", + "reth-chain-state", + "reth-chainspec", + "reth-consensus", + "reth-db", + "reth-engine-primitives", + "reth-errors", + "reth-ethereum-primitives", + "reth-evm", + "reth-metrics", + "reth-network-p2p", + "reth-payload-builder", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-prune", + "reth-prune-types", + "reth-revm", + "reth-stages", + "reth-stages-api", + "reth-static-file", + "reth-tasks", + "reth-tracing", + "reth-trie", + "reth-trie-db", + "reth-trie-parallel", + "reth-trie-sparse", + "reth-trie-sparse-parallel", + "revm", + "revm-primitives", + "schnellru", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-engine-util" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-rpc-types-engine", + "eyre", + "futures", + "itertools 0.14.0", + "pin-project", + "reth-chainspec", + "reth-engine-primitives", + "reth-engine-tree", + "reth-errors", + "reth-evm", + "reth-fs-util", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-revm", + "reth-storage-api", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-era" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "ethereum_ssz", + "ethereum_ssz_derive", + "reth-ethereum-primitives", + "snap", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-era-downloader" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "bytes", + "eyre", + "futures-util", + "reqwest", + "reth-fs-util", + "sha2 0.10.9", + "tokio", +] + +[[package]] +name = "reth-era-utils" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "eyre", + "futures-util", + "reth-db-api", + "reth-era", + "reth-era-downloader", + "reth-ethereum-primitives", + "reth-etl", + "reth-fs-util", + "reth-primitives-traits", + "reth-provider", + "reth-stages-types", + "reth-storage-api", + "tokio", + "tracing", +] + +[[package]] +name = "reth-errors" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "reth-consensus", + "reth-execution-errors", + "reth-storage-errors", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-eth-wire" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-chains", + "alloy-primitives", + "alloy-rlp", + "bytes", + "derive_more", + "futures", + "pin-project", + "reth-codecs", + "reth-ecies", + "reth-eth-wire-types", + "reth-ethereum-forks", + "reth-metrics", + "reth-network-peers", + "reth-primitives-traits", + "serde", + "snap", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-eth-wire-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-hardforks", + "alloy-primitives", + "alloy-rlp", + "bytes", + "derive_more", + "reth-chainspec", + "reth-codecs-derive", + "reth-ethereum-primitives", + "reth-primitives-traits", + "serde", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-ethereum" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +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-trie", + "reth-trie-db", +] + +[[package]] +name = "reth-ethereum-cli" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "clap", + "eyre", + "reth-chainspec", + "reth-cli", + "reth-cli-commands", + "reth-cli-runner", + "reth-db", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-node-ethereum", + "reth-node-metrics", + "reth-tracing", + "tracing", +] + +[[package]] +name = "reth-ethereum-consensus" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "reth-chainspec", + "reth-consensus", + "reth-consensus-common", + "reth-execution-types", + "reth-primitives-traits", + "tracing", +] + +[[package]] +name = "reth-ethereum-engine-primitives" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "reth-engine-primitives", + "reth-ethereum-primitives", + "reth-payload-primitives", + "reth-primitives-traits", + "serde", + "sha2 0.10.9", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-ethereum-forks" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eip2124", + "alloy-hardforks", + "alloy-primitives", + "auto_impl", + "once_cell", + "rustc-hash 2.1.1", +] + +[[package]] +name = "reth-ethereum-payload-builder" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "reth-basic-payload-builder", + "reth-chainspec", + "reth-errors", + "reth-ethereum-primitives", + "reth-evm", + "reth-evm-ethereum", + "reth-payload-builder", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-payload-validator", + "reth-primitives-traits", + "reth-revm", + "reth-storage-api", + "reth-transaction-pool", + "revm", + "tracing", +] + +[[package]] +name = "reth-ethereum-primitives" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "arbitrary", + "modular-bitfield", + "reth-codecs", + "reth-primitives-traits", + "reth-zstd-compressors", + "serde", + "serde_with", +] + +[[package]] +name = "reth-etl" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "rayon", + "reth-db-api", + "tempfile", +] + +[[package]] +name = "reth-evm" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "auto_impl", + "derive_more", + "futures-util", + "metrics", + "reth-execution-errors", + "reth-execution-types", + "reth-metrics", + "reth-primitives-traits", + "reth-storage-api", + "reth-storage-errors", + "reth-trie-common", + "revm", +] + +[[package]] +name = "reth-evm-ethereum" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "alloy-rpc-types-engine", + "derive_more", + "reth-chainspec", + "reth-ethereum-forks", + "reth-ethereum-primitives", + "reth-evm", + "reth-execution-types", + "reth-primitives-traits", + "reth-storage-errors", + "revm", +] + +[[package]] +name = "reth-execution-errors" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-evm", + "alloy-primitives", + "alloy-rlp", + "nybbles", + "reth-storage-errors", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-execution-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "derive_more", + "reth-ethereum-primitives", + "reth-primitives-traits", + "reth-trie-common", + "revm", + "serde", + "serde_with", +] + +[[package]] +name = "reth-exex" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "eyre", + "futures", + "itertools 0.14.0", + "metrics", + "parking_lot", + "reth-chain-state", + "reth-chainspec", + "reth-config", + "reth-ethereum-primitives", + "reth-evm", + "reth-exex-types", + "reth-fs-util", + "reth-metrics", + "reth-node-api", + "reth-node-core", + "reth-payload-builder", + "reth-primitives-traits", + "reth-provider", + "reth-prune-types", + "reth-revm", + "reth-stages-api", + "reth-tasks", + "reth-tracing", + "rmp-serde", + "thiserror 2.0.14", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-exex-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "reth-chain-state", + "reth-execution-types", + "reth-primitives-traits", + "serde", + "serde_with", +] + +[[package]] +name = "reth-fs-util" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-invalid-block-hooks" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-debug", + "eyre", + "futures", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty_assertions", + "reth-chainspec", + "reth-engine-primitives", + "reth-evm", + "reth-primitives-traits", + "reth-provider", + "reth-revm", + "reth-rpc-api", + "reth-tracing", + "reth-trie", + "revm-bytecode", + "revm-database", + "serde", + "serde_json", +] + +[[package]] +name = "reth-ipc" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "bytes", + "futures", + "futures-util", + "interprocess", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-util", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "reth-libmdbx" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "bitflags 2.9.1", + "byteorder", + "dashmap 6.1.0", + "derive_more", + "indexmap 2.10.0", + "parking_lot", + "reth-mdbx-sys", + "smallvec", + "thiserror 2.0.14", + "tracing", +] + +[[package]] +name = "reth-mdbx-sys" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "bindgen 0.70.1", + "cc", +] + +[[package]] +name = "reth-metrics" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "futures", + "metrics", + "metrics-derive", + "tokio", + "tokio-util", +] + +[[package]] +name = "reth-net-banlist" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", +] + +[[package]] +name = "reth-net-nat" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "futures-util", + "if-addrs", + "reqwest", + "serde_with", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-network" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "aquamarine", + "auto_impl", + "derive_more", + "discv5", + "enr", + "futures", + "itertools 0.14.0", + "metrics", + "parking_lot", + "pin-project", + "rand 0.8.5", + "rand 0.9.2", + "reth-chainspec", + "reth-consensus", + "reth-discv4", + "reth-discv5", + "reth-dns-discovery", + "reth-ecies", + "reth-eth-wire", + "reth-eth-wire-types", + "reth-ethereum-forks", + "reth-ethereum-primitives", + "reth-fs-util", + "reth-metrics", + "reth-net-banlist", + "reth-network-api", + "reth-network-p2p", + "reth-network-peers", + "reth-network-types", + "reth-primitives-traits", + "reth-storage-api", + "reth-tasks", + "reth-tokio-util", + "reth-transaction-pool", + "rustc-hash 2.1.1", + "schnellru", + "secp256k1 0.30.0", + "serde", + "smallvec", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-network-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types-admin", + "alloy-rpc-types-eth", + "auto_impl", + "derive_more", + "enr", + "futures", + "reth-eth-wire-types", + "reth-ethereum-forks", + "reth-network-p2p", + "reth-network-peers", + "reth-network-types", + "reth-tokio-util", + "serde", + "thiserror 2.0.14", + "tokio", + "tokio-stream", +] + +[[package]] +name = "reth-network-p2p" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "auto_impl", + "derive_more", + "futures", + "parking_lot", + "reth-consensus", + "reth-eth-wire-types", + "reth-ethereum-primitives", + "reth-network-peers", + "reth-network-types", + "reth-primitives-traits", + "reth-storage-errors", + "tokio", + "tracing", +] + +[[package]] +name = "reth-network-peers" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "enr", + "secp256k1 0.30.0", + "serde_with", + "thiserror 2.0.14", + "tokio", + "url", +] + +[[package]] +name = "reth-network-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eip2124", + "humantime-serde", + "reth-net-banlist", + "reth-network-peers", + "serde", + "serde_json", + "tracing", +] + +[[package]] +name = "reth-nippy-jar" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "anyhow", + "bincode", + "derive_more", + "lz4_flex", + "memmap2", + "reth-fs-util", + "serde", + "thiserror 2.0.14", + "tracing", + "zstd", +] + +[[package]] +name = "reth-node-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-rpc-types-engine", + "eyre", + "reth-basic-payload-builder", + "reth-consensus", + "reth-db-api", + "reth-engine-primitives", + "reth-evm", + "reth-network-api", + "reth-node-core", + "reth-node-types", + "reth-payload-builder", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-provider", + "reth-tasks", + "reth-tokio-util", + "reth-transaction-pool", +] + +[[package]] +name = "reth-node-builder" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types", + "alloy-rpc-types-engine", + "aquamarine", + "eyre", + "fdlimit", + "futures", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon", + "reth-basic-payload-builder", + "reth-chain-state", + "reth-chainspec", + "reth-cli-util", + "reth-config", + "reth-consensus", + "reth-consensus-debug-client", + "reth-db", + "reth-db-api", + "reth-db-common", + "reth-downloaders", + "reth-engine-local", + "reth-engine-primitives", + "reth-engine-service", + "reth-engine-tree", + "reth-engine-util", + "reth-evm", + "reth-exex", + "reth-fs-util", + "reth-invalid-block-hooks", + "reth-network", + "reth-network-api", + "reth-network-p2p", + "reth-node-api", + "reth-node-core", + "reth-node-ethstats", + "reth-node-events", + "reth-node-metrics", + "reth-payload-builder", + "reth-primitives-traits", + "reth-provider", + "reth-prune", + "reth-rpc", + "reth-rpc-api", + "reth-rpc-builder", + "reth-rpc-engine-api", + "reth-rpc-eth-types", + "reth-rpc-layer", + "reth-stages", + "reth-static-file", + "reth-tasks", + "reth-tokio-util", + "reth-tracing", + "reth-transaction-pool", + "secp256k1 0.30.0", + "serde_json", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-node-core" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "clap", + "derive_more", + "dirs-next", + "eyre", + "futures", + "humantime", + "rand 0.9.2", + "reth-chainspec", + "reth-cli-util", + "reth-config", + "reth-consensus", + "reth-db", + "reth-discv4", + "reth-discv5", + "reth-engine-local", + "reth-engine-primitives", + "reth-ethereum-forks", + "reth-net-nat", + "reth-network", + "reth-network-p2p", + "reth-network-peers", + "reth-primitives-traits", + "reth-prune-types", + "reth-rpc-convert", + "reth-rpc-eth-types", + "reth-rpc-server-types", + "reth-stages-types", + "reth-storage-api", + "reth-storage-errors", + "reth-tracing", + "reth-transaction-pool", + "secp256k1 0.30.0", + "serde", + "shellexpand", + "strum 0.27.2", + "thiserror 2.0.14", + "toml", + "tracing", + "url", + "vergen", + "vergen-git2", +] + +[[package]] +name = "reth-node-ethereum" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-network", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "eyre", + "reth-chainspec", + "reth-engine-local", + "reth-engine-primitives", + "reth-ethereum-consensus", + "reth-ethereum-engine-primitives", + "reth-ethereum-payload-builder", + "reth-ethereum-primitives", + "reth-evm", + "reth-evm-ethereum", + "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-revm", + "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", + "reth-trie-db", + "revm", + "tokio", +] + +[[package]] +name = "reth-node-ethstats" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "chrono", + "futures-util", + "reth-chain-state", + "reth-network-api", + "reth-primitives-traits", + "reth-storage-api", + "reth-transaction-pool", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tracing", + "url", +] + +[[package]] +name = "reth-node-events" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "derive_more", + "futures", + "humantime", + "pin-project", + "reth-engine-primitives", + "reth-network-api", + "reth-primitives-traits", + "reth-prune-types", + "reth-stages", + "reth-static-file-types", + "reth-storage-api", + "tokio", + "tracing", +] + +[[package]] +name = "reth-node-metrics" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "eyre", + "http", + "jsonrpsee-server 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "metrics-exporter-prometheus 0.16.2", + "metrics-process", + "metrics-util 0.19.1", + "procfs", + "reth-metrics", + "reth-tasks", + "tikv-jemalloc-ctl", + "tokio", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "reth-node-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "reth-chainspec", + "reth-db-api", + "reth-engine-primitives", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-trie-db", +] + +[[package]] +name = "reth-op" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "reth-chainspec", + "reth-codecs", + "reth-consensus", + "reth-consensus-common", + "reth-db", + "reth-engine-local", + "reth-eth-wire", + "reth-evm", + "reth-network", + "reth-network-api", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-optimism-chainspec", + "reth-optimism-consensus", + "reth-optimism-evm", + "reth-optimism-node", + "reth-optimism-primitives", + "reth-optimism-rpc", + "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]] +name = "reth-optimism-chainspec" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-hardforks", + "alloy-primitives", + "derive_more", + "miniz_oxide", + "op-alloy-consensus 0.18.13", + "op-alloy-rpc-types", + "paste", + "reth-chainspec", + "reth-ethereum-forks", + "reth-network-peers", + "reth-optimism-forks", + "reth-optimism-primitives", + "reth-primitives-traits", + "serde", + "serde_json", + "tar-no-std", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-optimism-cli" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "clap", + "derive_more", + "eyre", + "futures-util", + "op-alloy-consensus 0.18.13", + "reth-chainspec", + "reth-cli", + "reth-cli-commands", + "reth-cli-runner", + "reth-consensus", + "reth-db", + "reth-db-api", + "reth-db-common", + "reth-downloaders", + "reth-execution-types", + "reth-fs-util", + "reth-node-builder", + "reth-node-core", + "reth-node-events", + "reth-node-metrics", + "reth-optimism-chainspec", + "reth-optimism-consensus", + "reth-optimism-evm", + "reth-optimism-node", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-prune", + "reth-stages", + "reth-static-file", + "reth-static-file-types", + "reth-tracing", + "serde", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-optimism-consensus" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-trie", + "reth-chainspec", + "reth-consensus", + "reth-consensus-common", + "reth-execution-types", + "reth-optimism-chainspec", + "reth-optimism-forks", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-storage-api", + "reth-storage-errors", + "reth-trie-common", + "revm", + "thiserror 2.0.14", + "tracing", +] + +[[package]] +name = "reth-optimism-evm" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-op-evm", + "alloy-primitives", + "op-alloy-consensus 0.18.13", + "op-alloy-rpc-types-engine", + "op-revm", + "reth-chainspec", + "reth-evm", + "reth-execution-errors", + "reth-execution-types", + "reth-optimism-chainspec", + "reth-optimism-consensus", + "reth-optimism-forks", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-rpc-eth-api", + "reth-storage-errors", + "revm", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-optimism-forks" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-op-hardforks", + "alloy-primitives", + "once_cell", + "reth-ethereum-forks", +] + +[[package]] +name = "reth-optimism-node" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "clap", + "eyre", + "op-alloy-consensus 0.18.13", + "op-alloy-rpc-types-engine", + "op-revm", + "reth-chainspec", + "reth-consensus", + "reth-engine-local", + "reth-evm", + "reth-network", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-optimism-chainspec", + "reth-optimism-consensus", + "reth-optimism-evm", + "reth-optimism-forks", + "reth-optimism-payload-builder", + "reth-optimism-primitives", + "reth-optimism-rpc", + "reth-optimism-storage", + "reth-optimism-txpool", + "reth-payload-builder", + "reth-primitives-traits", + "reth-provider", + "reth-rpc-api", + "reth-rpc-engine-api", + "reth-rpc-server-types", + "reth-tracing", + "reth-transaction-pool", + "reth-trie-common", + "reth-trie-db", + "revm", + "serde", + "tokio", +] + +[[package]] +name = "reth-optimism-payload-builder" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "derive_more", + "op-alloy-consensus 0.18.13", + "op-alloy-rpc-types-engine", + "reth-basic-payload-builder", + "reth-chain-state", + "reth-chainspec", + "reth-evm", + "reth-execution-types", + "reth-optimism-evm", + "reth-optimism-forks", + "reth-optimism-primitives", + "reth-optimism-txpool", + "reth-payload-builder", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-payload-util", + "reth-payload-validator", + "reth-primitives-traits", + "reth-revm", + "reth-storage-api", + "reth-transaction-pool", + "revm", + "serde", + "sha2 0.10.9", + "thiserror 2.0.14", + "tracing", +] + +[[package]] +name = "reth-optimism-primitives" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "arbitrary", + "bytes", + "modular-bitfield", + "op-alloy-consensus 0.18.13", + "reth-codecs", + "reth-primitives-traits", + "reth-zstd-compressors", + "serde", + "serde_with", +] + +[[package]] +name = "reth-optimism-rpc" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-trait", + "derive_more", + "eyre", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "op-alloy-consensus 0.18.13", + "op-alloy-network", + "op-alloy-rpc-jsonrpsee", + "op-alloy-rpc-types", + "op-alloy-rpc-types-engine", + "op-revm", + "reqwest", + "reth-chainspec", + "reth-evm", + "reth-metrics", + "reth-node-api", + "reth-node-builder", + "reth-optimism-evm", + "reth-optimism-forks", + "reth-optimism-payload-builder", + "reth-optimism-primitives", + "reth-optimism-txpool", + "reth-primitives-traits", + "reth-rpc", + "reth-rpc-api", + "reth-rpc-engine-api", + "reth-rpc-eth-api", + "reth-rpc-eth-types", + "reth-rpc-server-types", + "reth-storage-api", + "reth-tasks", + "reth-transaction-pool", + "revm", + "serde_json", + "thiserror 2.0.14", + "tokio", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "reth-optimism-storage" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "reth-chainspec", + "reth-db-api", + "reth-node-api", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-storage-api", +] + +[[package]] +name = "reth-optimism-txpool" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-serde", + "c-kzg", + "derive_more", + "futures-util", + "metrics", + "op-alloy-consensus 0.18.13", + "op-alloy-flz", + "op-alloy-rpc-types", + "op-revm", + "parking_lot", + "reth-chain-state", + "reth-chainspec", + "reth-metrics", + "reth-optimism-evm", + "reth-optimism-forks", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-storage-api", + "reth-transaction-pool", + "serde", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-payload-builder" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types", + "futures-util", + "metrics", + "reth-chain-state", + "reth-ethereum-engine-primitives", + "reth-metrics", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-primitives-traits", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-payload-builder-primitives" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "pin-project", + "reth-payload-primitives", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-payload-primitives" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "op-alloy-rpc-types-engine", + "reth-chain-state", + "reth-chainspec", + "reth-errors", + "reth-primitives-traits", + "serde", + "thiserror 2.0.14", + "tokio", +] + +[[package]] +name = "reth-payload-util" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "reth-transaction-pool", +] + +[[package]] +name = "reth-payload-validator" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-rpc-types-engine", + "reth-primitives-traits", +] + +[[package]] +name = "reth-primitives" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "c-kzg", + "once_cell", + "reth-ethereum-forks", + "reth-ethereum-primitives", + "reth-primitives-traits", + "reth-static-file-types", +] + +[[package]] +name = "reth-primitives-traits" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-trie", + "arbitrary", + "auto_impl", + "byteorder", + "bytes", + "derive_more", + "modular-bitfield", + "once_cell", + "op-alloy-consensus 0.18.13", + "proptest", + "proptest-arbitrary-interop", + "rayon", + "reth-codecs", + "revm-bytecode", + "revm-primitives", + "revm-state", + "secp256k1 0.30.0", + "serde", + "serde_with", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-provider" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "dashmap 6.1.0", + "eyre", + "itertools 0.14.0", + "metrics", + "notify", + "parking_lot", + "rayon", + "reth-chain-state", + "reth-chainspec", + "reth-codecs", + "reth-db", + "reth-db-api", + "reth-errors", + "reth-ethereum-engine-primitives", + "reth-ethereum-primitives", + "reth-evm", + "reth-execution-types", + "reth-fs-util", + "reth-metrics", + "reth-nippy-jar", + "reth-node-types", + "reth-primitives-traits", + "reth-prune-types", + "reth-stages-types", + "reth-static-file-types", + "reth-storage-api", + "reth-storage-errors", + "reth-trie", + "reth-trie-db", + "revm-database", + "revm-state", + "strum 0.27.2", + "tokio", + "tracing", +] + +[[package]] +name = "reth-prune" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "itertools 0.14.0", + "metrics", + "rayon", + "reth-chainspec", + "reth-config", + "reth-db-api", + "reth-errors", + "reth-exex-types", + "reth-metrics", + "reth-primitives-traits", + "reth-provider", + "reth-prune-types", + "reth-static-file-types", + "reth-tokio-util", + "rustc-hash 2.1.1", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-prune-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "arbitrary", + "derive_more", + "modular-bitfield", + "reth-codecs", + "serde", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-ress-protocol" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "futures", + "reth-eth-wire", + "reth-ethereum-primitives", + "reth-network", + "reth-network-api", + "reth-storage-errors", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-ress-provider" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "eyre", + "futures", + "parking_lot", + "reth-chain-state", + "reth-errors", + "reth-ethereum-primitives", + "reth-evm", + "reth-node-api", + "reth-primitives-traits", + "reth-ress-protocol", + "reth-revm", + "reth-storage-api", + "reth-tasks", + "reth-tokio-util", + "reth-trie", + "schnellru", + "tokio", + "tracing", +] + +[[package]] +name = "reth-revm" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "reth-primitives-traits", + "reth-storage-api", + "reth-storage-errors", + "reth-trie", + "revm", +] + +[[package]] +name = "reth-rpc" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-eips", + "alloy-evm", + "alloy-genesis", + "alloy-network", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types", + "alloy-rpc-types-admin", + "alloy-rpc-types-beacon", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-mev", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "async-trait", + "derive_more", + "futures", + "http", + "http-body", + "hyper", + "itertools 0.14.0", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonwebtoken", + "parking_lot", + "pin-project", + "reth-chain-state", + "reth-chainspec", + "reth-consensus", + "reth-engine-primitives", + "reth-errors", + "reth-evm", + "reth-evm-ethereum", + "reth-execution-types", + "reth-metrics", + "reth-network-api", + "reth-network-peers", + "reth-network-types", + "reth-node-api", + "reth-primitives-traits", + "reth-revm", + "reth-rpc-api", + "reth-rpc-convert", + "reth-rpc-engine-api", + "reth-rpc-eth-api", + "reth-rpc-eth-types", + "reth-rpc-server-types", + "reth-storage-api", + "reth-tasks", + "reth-transaction-pool", + "reth-trie-common", + "revm", + "revm-inspectors", + "revm-primitives", + "serde", + "serde_json", + "sha2 0.10.9", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "tracing-futures", +] + +[[package]] +name = "reth-rpc-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-genesis", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-types", + "alloy-rpc-types-admin", + "alloy-rpc-types-anvil", + "alloy-rpc-types-beacon", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-mev", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-serde", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "reth-chain-state", + "reth-engine-primitives", + "reth-network-peers", + "reth-rpc-eth-api", + "reth-trie-common", +] + +[[package]] +name = "reth-rpc-builder" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-network", + "alloy-provider", + "http", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "pin-project", + "reth-chain-state", + "reth-chainspec", + "reth-consensus", + "reth-evm", + "reth-ipc", + "reth-metrics", + "reth-network-api", + "reth-node-core", + "reth-primitives-traits", + "reth-rpc", + "reth-rpc-api", + "reth-rpc-eth-api", + "reth-rpc-eth-types", + "reth-rpc-layer", + "reth-rpc-server-types", + "reth-storage-api", + "reth-tasks", + "reth-transaction-pool", + "serde", + "thiserror 2.0.14", + "tokio", + "tokio-util", + "tower 0.5.2", + "tower-http", + "tracing", +] + +[[package]] +name = "reth-rpc-convert" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-json-rpc", + "alloy-network", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-signer", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "op-alloy-consensus 0.18.13", + "op-alloy-network", + "op-alloy-rpc-types", + "op-revm", + "reth-ethereum-primitives", + "reth-evm", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-storage-api", + "revm-context", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-rpc-engine-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "async-trait", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "parking_lot", + "reth-chainspec", + "reth-engine-primitives", + "reth-metrics", + "reth-payload-builder", + "reth-payload-builder-primitives", + "reth-payload-primitives", + "reth-primitives-traits", + "reth-rpc-api", + "reth-storage-api", + "reth-tasks", + "reth-transaction-pool", + "serde", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-rpc-eth-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-eips", + "alloy-evm", + "alloy-json-rpc", + "alloy-network", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-rpc-types-mev", + "alloy-serde", + "async-trait", + "auto_impl", + "dyn-clone", + "futures", + "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot", + "reth-chain-state", + "reth-chainspec", + "reth-errors", + "reth-evm", + "reth-network-api", + "reth-node-api", + "reth-primitives-traits", + "reth-revm", + "reth-rpc-convert", + "reth-rpc-eth-types", + "reth-rpc-server-types", + "reth-storage-api", + "reth-tasks", + "reth-transaction-pool", + "reth-trie-common", + "revm", + "revm-inspectors", + "tokio", + "tracing", +] + +[[package]] +name = "reth-rpc-eth-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-network", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-sol-types", + "derive_more", + "futures", + "itertools 0.14.0", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "metrics", + "rand 0.9.2", + "reth-chain-state", + "reth-chainspec", + "reth-errors", + "reth-ethereum-primitives", + "reth-evm", + "reth-execution-types", + "reth-metrics", + "reth-primitives-traits", + "reth-revm", + "reth-rpc-convert", + "reth-rpc-server-types", + "reth-storage-api", + "reth-tasks", + "reth-transaction-pool", + "reth-trie", + "revm", + "revm-inspectors", + "schnellru", + "serde", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-rpc-layer" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-rpc-types-engine", + "http", + "jsonrpsee-http-client 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project", + "tower 0.5.2", + "tower-http", + "tracing", +] + +[[package]] +name = "reth-rpc-server-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "reth-errors", + "reth-network-api", + "serde", + "strum 0.27.2", +] + +[[package]] +name = "reth-stages" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "bincode", + "eyre", + "futures-util", + "itertools 0.14.0", + "num-traits", + "rayon", + "reqwest", + "reth-chainspec", + "reth-codecs", + "reth-config", + "reth-consensus", + "reth-db", + "reth-db-api", + "reth-era", + "reth-era-downloader", + "reth-era-utils", + "reth-ethereum-primitives", + "reth-etl", + "reth-evm", + "reth-execution-types", + "reth-exex", + "reth-fs-util", + "reth-network-p2p", + "reth-primitives-traits", + "reth-provider", + "reth-prune", + "reth-prune-types", + "reth-revm", + "reth-stages-api", + "reth-static-file-types", + "reth-storage-errors", + "reth-testing-utils", + "reth-trie", + "reth-trie-db", + "tempfile", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-stages-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "aquamarine", + "auto_impl", + "futures-util", + "metrics", + "reth-consensus", + "reth-errors", + "reth-metrics", + "reth-network-p2p", + "reth-primitives-traits", + "reth-provider", + "reth-prune", + "reth-stages-types", + "reth-static-file", + "reth-static-file-types", + "reth-tokio-util", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-stages-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "arbitrary", + "bytes", + "modular-bitfield", + "reth-codecs", + "reth-trie-common", + "serde", +] + +[[package]] +name = "reth-static-file" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "parking_lot", + "rayon", + "reth-codecs", + "reth-db-api", + "reth-primitives-traits", + "reth-provider", + "reth-prune-types", + "reth-stages-types", + "reth-static-file-types", + "reth-storage-errors", + "reth-tokio-util", + "tracing", +] + +[[package]] +name = "reth-static-file-types" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "clap", + "derive_more", + "serde", + "strum 0.27.2", +] + +[[package]] +name = "reth-storage-api" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "reth-chainspec", + "reth-db-api", + "reth-db-models", + "reth-ethereum-primitives", + "reth-execution-types", + "reth-primitives-traits", + "reth-prune-types", + "reth-stages-types", + "reth-storage-errors", + "reth-trie-common", + "reth-trie-db", + "revm-database", +] + +[[package]] +name = "reth-storage-errors" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "derive_more", + "reth-primitives-traits", + "reth-prune-types", + "reth-static-file-types", + "revm-database-interface", + "thiserror 2.0.14", +] + +[[package]] +name = "reth-tasks" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "auto_impl", + "dyn-clone", + "futures-util", + "metrics", + "pin-project", + "rayon", + "reth-metrics", + "thiserror 2.0.14", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "reth-testing-utils" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "rand 0.8.5", + "rand 0.9.2", + "reth-ethereum-primitives", + "reth-primitives-traits", + "secp256k1 0.30.0", +] + +[[package]] +name = "reth-tokio-util" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-tracing" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "clap", + "eyre", + "rolling-file", + "tracing", + "tracing-appender", + "tracing-journald", + "tracing-logfmt", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "reth-transaction-pool" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "aquamarine", + "auto_impl", + "bitflags 2.9.1", + "futures-util", + "metrics", + "parking_lot", + "paste", + "pin-project", + "rand 0.9.2", + "reth-chain-state", + "reth-chainspec", + "reth-eth-wire-types", + "reth-ethereum-primitives", + "reth-execution-types", + "reth-fs-util", + "reth-metrics", + "reth-primitives-traits", + "reth-storage-api", + "reth-tasks", + "revm-interpreter 23.0.2", + "revm-primitives", + "rustc-hash 2.1.1", + "schnellru", + "serde", + "serde_json", + "smallvec", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-trie" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "auto_impl", + "itertools 0.14.0", + "metrics", + "reth-execution-errors", + "reth-metrics", + "reth-primitives-traits", + "reth-stages-types", + "reth-storage-errors", + "reth-trie-common", + "reth-trie-sparse", + "revm-database", + "tracing", + "triehash", +] + +[[package]] +name = "reth-trie-common" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-trie", + "arbitrary", + "bytes", + "derive_more", + "hash-db", + "itertools 0.14.0", + "nybbles", + "plain_hasher", + "rayon", + "reth-codecs", + "reth-primitives-traits", + "revm-database", + "serde", + "serde_with", +] + +[[package]] +name = "reth-trie-db" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "reth-db-api", + "reth-execution-errors", + "reth-primitives-traits", + "reth-trie", + "tracing", +] + +[[package]] +name = "reth-trie-parallel" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more", + "itertools 0.14.0", + "metrics", + "rayon", + "reth-db-api", + "reth-execution-errors", + "reth-metrics", + "reth-provider", + "reth-storage-errors", + "reth-trie", + "reth-trie-common", + "reth-trie-db", + "reth-trie-sparse", + "thiserror 2.0.14", + "tokio", + "tracing", +] + +[[package]] +name = "reth-trie-sparse" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "auto_impl", + "metrics", + "rayon", + "reth-execution-errors", + "reth-metrics", + "reth-primitives-traits", + "reth-trie-common", + "smallvec", + "tracing", +] + +[[package]] +name = "reth-trie-sparse-parallel" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "metrics", + "rayon", + "reth-execution-errors", + "reth-metrics", + "reth-trie-common", + "reth-trie-sparse", + "smallvec", + "tracing", +] + +[[package]] +name = "reth-zstd-compressors" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +dependencies = [ + "zstd", +] + +[[package]] +name = "revm" +version = "28.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee5d3f7d031e90ab47c7488061bdc4875abc4e9dcea6c18f5dee09732d0436fb" +dependencies = [ + "revm-bytecode", + "revm-context", + "revm-context-interface 10.0.1", + "revm-database", + "revm-database-interface", + "revm-handler", + "revm-inspector", + "revm-interpreter 25.0.1", + "revm-precompile", + "revm-primitives", + "revm-state", +] + +[[package]] +name = "revm-bytecode" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d800e6c2119457ded5b0af71634eb2468040bf97de468eee5a730272a106da0" +dependencies = [ + "bitvec", + "phf", + "revm-primitives", + "serde", +] + +[[package]] +name = "revm-context" +version = "9.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c63485b4d1b0e67f342f9a8c0e9f78b6b5f1750863a39bdf6ceabdbaaf4aed1" +dependencies = [ + "bitvec", + "cfg-if", + "derive-where", + "revm-bytecode", + "revm-context-interface 10.0.1", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", +] + +[[package]] +name = "revm-context-interface" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a303a93102fceccec628265efd550ce49f2817b38ac3a492c53f7d524f18a1ca" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "auto_impl", + "either", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", +] + +[[package]] +name = "revm-context-interface" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "550cb8b9465e00bdb0a384922b69f864c5bcc228bed19c8ecbfa69fff2256382" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "auto_impl", + "either", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", +] + +[[package]] +name = "revm-database" +version = "7.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40000c7d917c865f6c232a78581b78e70c43f52db17282bd1b52d4f0565bc8a2" +dependencies = [ + "alloy-eips", + "revm-bytecode", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", +] + +[[package]] +name = "revm-database-interface" +version = "7.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ccea7a168cba1196b1e57dd3e22c36047208c135f600f8e58cbe7d49957dba" +dependencies = [ + "auto_impl", + "either", + "revm-primitives", + "revm-state", + "serde", +] + +[[package]] +name = "revm-handler" +version = "9.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cb09d07e6799823ce5a344f1604236b53fe1a92bacd7122c0b16286f92254c2" +dependencies = [ + "auto_impl", + "derive-where", + "revm-bytecode", + "revm-context", + "revm-context-interface 10.0.1", + "revm-database-interface", + "revm-interpreter 25.0.1", + "revm-precompile", + "revm-primitives", + "revm-state", + "serde", +] + +[[package]] +name = "revm-inspector" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2770c0d7e9f4f23660dc0b8b954b7a1eee8989ec97f936ebce366c78b6d7b915" +dependencies = [ + "auto_impl", + "either", + "revm-context", + "revm-database-interface", + "revm-handler", + "revm-interpreter 25.0.1", + "revm-primitives", + "revm-state", + "serde", + "serde_json", +] + +[[package]] +name = "revm-inspectors" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a76ba086ca57a718368e46e792a81c5eb7a30366956aa6293adbcec8b1181ce" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-sol-types", + "anstyle", + "boa_engine", + "boa_gc", + "colorchoice", + "revm", + "serde", + "serde_json", + "thiserror 2.0.14", +] + +[[package]] +name = "revm-interpreter" +version = "23.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95c4a9a1662d10b689b66b536ddc2eb1e89f5debfcabc1a2d7b8417a2fa47cd" +dependencies = [ + "revm-bytecode", + "revm-context-interface 8.0.1", + "revm-primitives", + "serde", +] + +[[package]] +name = "revm-interpreter" +version = "25.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c938c0d4d617c285203cad8aba1cefeec383fcff2fdf94a4469f588ab979b5" +dependencies = [ + "revm-bytecode", + "revm-context-interface 10.0.1", + "revm-primitives", + "serde", +] + +[[package]] +name = "revm-precompile" +version = "26.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7bb5e8b92891c5ac9dd8dae157bd1d90aab01973ad4f99d4135d507facc3e7" +dependencies = [ + "ark-bls12-381", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "arrayref", + "aurora-engine-modexp", + "blst", + "c-kzg", + "cfg-if", + "k256", + "libsecp256k1", + "p256", + "revm-primitives", + "ripemd", + "rug", + "secp256k1 0.31.1", + "sha2 0.10.9", +] + +[[package]] +name = "revm-primitives" +version = "20.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa29d9da06fe03b249b6419b33968ecdf92ad6428e2f012dc57bcd619b5d94e" +dependencies = [ + "alloy-primitives", + "num_enum", + "once_cell", + "serde", +] + +[[package]] +name = "revm-state" +version = "7.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d7f39ea56df3bfbb3c81c99b1f028d26f205b6004156baffbf1a4f84b46cfa" +dependencies = [ + "bitflags 2.9.1", + "revm-bytecode", + "revm-primitives", + "serde", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ringbuffer" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df6368f71f205ff9c33c076d170dd56ebf68e8161c733c0caa07a7a5509ed53" + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rlimit" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" +dependencies = [ + "libc", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "roaring" +version = "0.10.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e8d2cfa184d94d0726d650a9f4a1be7f9b76ac9fdb954219878dc00c1c1e7b" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "rolling-file" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" +dependencies = [ + "chrono", +] + +[[package]] +name = "rollup-boost" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "anyhow", + "arbitrary", + "assert_cmd", + "blake3", + "bytes", + "clap", + "ctor", + "dotenvy", + "ed25519-dalek", + "eyre", + "futures", + "hex", + "http", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "jsonrpsee 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "metrics", + "metrics-derive", + "metrics-exporter-prometheus 0.16.2", + "metrics-util 0.19.1", + "moka", + "op-alloy-consensus 0.17.2", + "op-alloy-rpc-types-engine", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", + "parking_lot", + "paste", + "predicates", + "rand 0.9.2", + "reqwest", + "reth-optimism-payload-builder", + "reth-rpc-layer", + "rustls", + "serde", + "serde_json", + "sha2 0.10.9", + "testcontainers", + "thiserror 2.0.14", + "time", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tower 0.5.2", + "tower-http", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber 0.3.19", + "url", + "vergen", + "vergen-git2", +] + +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "rug" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3" +dependencies = [ + "az", + "gmp-mpfr-sys", + "libc", + "libm", +] + +[[package]] +name = "ruint" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" +dependencies = [ + "alloy-rlp", + "arbitrary", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.60.2", +] + +[[package]] +name = "rustls" +version = "0.23.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.3.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework 3.3.0", + "security-framework-sys", + "webpki-root-certs 0.26.11", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "ryu-js" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" +dependencies = [ + "ahash", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys 0.10.1", + "serde", +] + +[[package]] +name = "secp256k1" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" +dependencies = [ + "bitcoin_hashes", + "rand 0.9.2", + "secp256k1-sys 0.11.0", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "serde_json" +version = "1.0.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +dependencies = [ + "indexmap 2.10.0", + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.10.0", + "schemars 0.9.0", + "schemars 1.0.4", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shellexpand" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" +dependencies = [ + "dirs", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.14", + "time", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata 0.14.2", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", +] + +[[package]] +name = "sketches-ddsketch" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "arbitrary", + "serde", +] + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "soketto" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "structmeta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive", + "syn 2.0.105", +] + +[[package]] +name = "structmeta-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.105", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a985ff4ffd7373e10e0fb048110fb11a162e5a4c47f92ddb8787a6f766b769" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "sysinfo" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "windows 0.57.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tar-no-std" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9ee8b664c9f1740cd813fea422116f8ba29997bb7c878d1940424889802897" +dependencies = [ + "bitflags 2.9.1", + "log", + "num-traits", +] + +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix 1.0.8", + "windows-sys 0.59.0", +] + +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + +[[package]] +name = "testcontainers" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a4f01f39bb10fc2a5ab23eb0d888b1e2bb168c157f61a1b98e6c501c639c74" +dependencies = [ + "async-trait", + "bollard", + "bollard-stubs", + "bytes", + "docker_credential", + "either", + "etcetera", + "futures", + "log", + "memchr", + "parse-display", + "pin-project-lite", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.14", + "tokio", + "tokio-stream", + "tokio-tar", + "tokio-util", + "url", +] + +[[package]] +name = "testcontainers-modules" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d43ed4e8f58424c3a2c6c56dbea6643c3c23e8666a34df13c54f0a184e6c707" +dependencies = [ + "testcontainers", +] + +[[package]] +name = "thin-vec" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" +dependencies = [ + "thiserror-impl 2.0.14", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tikv-jemalloc-ctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21f216790c8df74ce3ab25b534e0718da5a1916719771d3fec23315c99e468b" +dependencies = [ + "libc", + "paste", + "tikv-jemalloc-sys", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "tikv-jemallocator" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" +dependencies = [ + "libc", + "tikv-jemalloc-sys", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "js-sys", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec 0.10.4", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec 0.11.4", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2 0.6.0", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tar" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75" +dependencies = [ + "filetime", + "futures-core", + "libc", + "redox_syscall 0.3.5", + "tokio", + "tokio-stream", + "xattr", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "native-tls", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.10.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.7.9", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "socket2 0.5.10", + "tokio", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "hdrhistogram", + "indexmap 2.10.0", + "pin-project-lite", + "slab", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "async-compression", + "base64 0.22.1", + "bitflags 2.9.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "iri-string", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", + "uuid", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror 1.0.69", + "time", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-journald" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0b4143302cf1022dac868d521e36e8b27691f72c84b3311750d5188ebba657" +dependencies = [ + "libc", + "tracing-core", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-logfmt" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" +dependencies = [ + "time", + "tracing", + "tracing-core", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "721f2d2569dce9f3dfbbddee5906941e953bfcdf736a62da3377f5751650cc36" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry", + "opentelemetry_sdk", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber 0.3.19", + "web-time", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "tree_hash" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee44f4cef85f88b4dea21c0b1f58320bdf35715cf56d840969487cff00613321" +dependencies = [ + "alloy-primitives", + "ethereum_hashing", + "ethereum_ssz", + "smallvec", + "typenum", +] + +[[package]] +name = "tree_hash_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bee2ea1551f90040ab0e34b6fb7f2fa3bad8acc925837ac654f2c78a13e3089" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "triehash" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1631b201eb031b563d2e85ca18ec8092508e262a3196ce9bd10a67ec87b9f5c" +dependencies = [ + "hash-db", + "rlp", +] + +[[package]] +name = "triomphe" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "native-tls", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.14", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "uint" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools 0.13.0", + "unicode-segmentation", + "unicode-width 0.1.14", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vergen" +version = "9.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" +dependencies = [ + "anyhow", + "cargo_metadata 0.19.2", + "derive_builder", + "regex", + "rustversion", + "time", + "vergen-lib", +] + +[[package]] +name = "vergen-git2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f6ee511ec45098eabade8a0750e76eec671e7fb2d9360c563911336bea9cac1" +dependencies = [ + "anyhow", + "derive_builder", + "git2", + "rustversion", + "time", + "vergen", + "vergen-lib", +] + +[[package]] +name = "vergen-lib" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "visibility" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.105", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmtimer" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d49b5d6c64e8558d9b1b065014426f35c18de636895d24893dbbd329743446" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.2", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link", +] + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper 0.6.0", + "thiserror 2.0.14", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xattr" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" +dependencies = [ + "libc", + "rustix 1.0.8", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.8.0", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", + "synstructure", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke 0.8.0", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke 0.7.5", + "zerofrom", + "zerovec-derive 0.10.3", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke 0.8.0", + "zerofrom", + "zerovec-derive 0.11.1", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.105", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml index 8067e1bb..60324f48 100644 --- a/crates/flashblocks-p2p/Cargo.toml +++ b/crates/flashblocks-p2p/Cargo.toml @@ -6,6 +6,7 @@ license = "MIT" [dependencies] reth.workspace = true +reth-optimism-primitives.workspace = true reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } reth-network = { workspace = true } diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 93836870..8715bebc 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -8,24 +8,24 @@ license = "MIT" rollup-boost.workspace = true flashblocks-p2p.workspace = true -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1", features = [ +reth-optimism-primitives.workspace = true +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.5.1" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } reth-eth-wire = { workspace = true } reth-network = { workspace = true } diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 7d73e099..3893a340 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -17,6 +17,7 @@ tokio.workspace = true eyre.workspace = true url.workspace = true sha2.workspace = true +arbitrary.workspace = true reth-optimism-payload-builder.workspace = true reth-rpc-layer.workspace = true From 171cfbc502b441f543d3f7921a575a92cd11a10a Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 15 Aug 2025 09:01:05 -0700 Subject: [PATCH 081/114] fixed --- Cargo.lock | 87 ++++++++++++------- Cargo.toml | 5 +- crates/flashblocks-node/Cargo.toml | 1 + .../metadata/workspace/Cargo.lock | 49 +++++------ crates/flashblocks-rpc/src/cache.rs | 39 ++++++--- 5 files changed, 110 insertions(+), 71 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d07b6fba..cb21c94a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "alloy-evm" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145913bf9bc11a7cec63a61aba36a39e41f2604aceb6d81b6bb8a4b2ddc93423" +checksum = "55212170663df0af86b8b88ea08f13e3ee305e6717372e693d3408c0910e2981" dependencies = [ "alloy-consensus", "alloy-eips", @@ -247,7 +247,7 @@ dependencies = [ "alloy-sol-types", "auto_impl", "derive_more", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-revm", "revm", "thiserror 2.0.14", @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "alloy-op-evm" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bcba6845a173265afed23c1ac3f1ff072662a9f09d33ec968989d12e2cb73e" +checksum = "94815887c4dc3d84a16587b7f2c655a77f3717e058b4b6559650176e31693c4b" dependencies = [ "alloy-consensus", "alloy-eips", @@ -359,7 +359,7 @@ dependencies = [ "alloy-op-hardforks", "alloy-primitives", "auto_impl", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-revm", "revm", ] @@ -378,15 +378,13 @@ dependencies = [ [[package]] name = "alloy-primitives" version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cfebde8c581a5d37b678d0a48a32decb51efd7a63a08ce2517ddec26db705c8" +source = "git+https://github.com/alloy-rs/core?rev=8c5713c#8c5713c20e3ed08cf09634ea5cb696d7021002a8" dependencies = [ "alloy-rlp", "arbitrary", "bytes", "cfg-if", "const-hex", - "derive_arbitrary", "derive_more", "foldhash", "getrandom 0.3.3", @@ -2367,6 +2365,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -3357,7 +3375,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -3373,6 +3391,7 @@ dependencies = [ "reth-optimism-evm", "reth-optimism-forks", "reth-optimism-node", + "reth-optimism-primitives", "reth-optimism-rpc", "reth-primitives", "reth-primitives-traits", @@ -3445,7 +3464,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -5928,9 +5947,9 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ff79de40513a478a9e374a480f897c2df829d48dcc64a83e4792a57fe231c64" +checksum = "63cb50036b1ad148038105af40aaa70ff24d8a14fbc44ae5c914e1348533d12e" dependencies = [ "alloy-rlp", "arbitrary", @@ -5982,9 +6001,9 @@ dependencies = [ [[package]] name = "op-alloy-consensus" -version = "0.18.13" +version = "0.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c719b26da6d9cac18c3a35634d6ab27a74a304ed9b403b43749c22e57a389f" +checksum = "0c88d2940558fd69f8f07b3cbd7bb3c02fc7d31159c1a7ba9deede50e7881024" dependencies = [ "alloy-consensus", "alloy-eips", @@ -6018,7 +6037,7 @@ dependencies = [ "alloy-provider", "alloy-rpc-types-eth", "alloy-signer", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types", ] @@ -6034,9 +6053,9 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types" -version = "0.18.13" +version = "0.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99911fa02e717a96ba24de59874b20cf31c9d116ce79ed4e0253267260b6922f" +checksum = "f22201e53e8cbb67a053e88b534b4e7f02265c5406994bf35978482a9ad0ae26" dependencies = [ "alloy-consensus", "alloy-eips", @@ -6045,7 +6064,7 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-serde", "derive_more", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "serde", "serde_json", "thiserror 2.0.14", @@ -6066,7 +6085,7 @@ dependencies = [ "derive_more", "ethereum_ssz", "ethereum_ssz_derive", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "serde", "snap", "thiserror 2.0.14", @@ -6264,17 +6283,19 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ "arbitrary", "arrayvec", "bitvec", "byte-slice-cast", "bytes", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] @@ -7432,7 +7453,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "reth-codecs-derive", "reth-zstd-compressors", "serde", @@ -8893,7 +8914,7 @@ dependencies = [ "alloy-primitives", "derive_more", "miniz_oxide", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types", "paste", "reth-chainspec", @@ -8921,7 +8942,7 @@ dependencies = [ "derive_more", "eyre", "futures-util", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "reth-chainspec", "reth-cli", "reth-cli-commands", @@ -8990,7 +9011,7 @@ dependencies = [ "alloy-evm", "alloy-op-evm", "alloy-primitives", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", @@ -9030,7 +9051,7 @@ dependencies = [ "alloy-rpc-types-eth", "clap", "eyre", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", @@ -9077,7 +9098,7 @@ dependencies = [ "alloy-rpc-types-debug", "alloy-rpc-types-engine", "derive_more", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types-engine", "reth-basic-payload-builder", "reth-chain-state", @@ -9116,7 +9137,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "reth-codecs", "reth-primitives-traits", "reth-zstd-compressors", @@ -9146,7 +9167,7 @@ dependencies = [ "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-jsonrpsee", "op-alloy-rpc-types", @@ -9213,7 +9234,7 @@ dependencies = [ "derive_more", "futures-util", "metrics", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-flz", "op-alloy-rpc-types", "op-revm", @@ -9338,7 +9359,7 @@ dependencies = [ "derive_more", "modular-bitfield", "once_cell", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "proptest", "proptest-arbitrary-interop", "rayon", @@ -9652,7 +9673,7 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-signer", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-types", "op-revm", diff --git a/Cargo.toml b/Cargo.toml index 8970c883..ca28a98a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,9 @@ members = [ "crates/flashblocks-node", ] +[patch.crates-io] +alloy-primitives = { git = "https://github.com/alloy-rs/core", rev = "8c5713c" } + [workspace.dependencies] rollup-boost = { path = "crates/rollup-boost" } flashblocks-p2p = { path = "crates/flashblocks-p2p" } @@ -69,7 +72,7 @@ alloy-provider = "1.0.13" op-alloy-network = "0.18.7" op-alloy-rpc-types-engine = "0.18.7" op-alloy-consensus = "0.18.7" -op-alloy-rpc-types = "0.18.7" +op-alloy-rpc-types = "=0.18.14" tokio-tungstenite = { version = "0.26.2", features = ["native-tls"] } testcontainers = "0.23" testcontainers-modules = { version = "0.11", features = ["redis"] } diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index d7ae27e9..6fbcaed7 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -16,6 +16,7 @@ reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = " reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } diff --git a/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock b/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock index d07b6fba..886da312 100644 --- a/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock +++ b/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock @@ -247,7 +247,7 @@ dependencies = [ "alloy-sol-types", "auto_impl", "derive_more", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-revm", "revm", "thiserror 2.0.14", @@ -359,7 +359,7 @@ dependencies = [ "alloy-op-hardforks", "alloy-primitives", "auto_impl", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-revm", "revm", ] @@ -378,15 +378,13 @@ dependencies = [ [[package]] name = "alloy-primitives" version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cfebde8c581a5d37b678d0a48a32decb51efd7a63a08ce2517ddec26db705c8" +source = "git+https://github.com/alloy-rs/core?rev=8c5713c#8c5713c20e3ed08cf09634ea5cb696d7021002a8" dependencies = [ "alloy-rlp", "arbitrary", "bytes", "cfg-if", "const-hex", - "derive_arbitrary", "derive_more", "foldhash", "getrandom 0.3.3", @@ -3357,7 +3355,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -3373,6 +3371,7 @@ dependencies = [ "reth-optimism-evm", "reth-optimism-forks", "reth-optimism-node", + "reth-optimism-primitives", "reth-optimism-rpc", "reth-primitives", "reth-primitives-traits", @@ -3445,7 +3444,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -5982,9 +5981,9 @@ dependencies = [ [[package]] name = "op-alloy-consensus" -version = "0.18.13" +version = "0.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c719b26da6d9cac18c3a35634d6ab27a74a304ed9b403b43749c22e57a389f" +checksum = "0c88d2940558fd69f8f07b3cbd7bb3c02fc7d31159c1a7ba9deede50e7881024" dependencies = [ "alloy-consensus", "alloy-eips", @@ -6018,7 +6017,7 @@ dependencies = [ "alloy-provider", "alloy-rpc-types-eth", "alloy-signer", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types", ] @@ -6034,9 +6033,9 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types" -version = "0.18.13" +version = "0.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99911fa02e717a96ba24de59874b20cf31c9d116ce79ed4e0253267260b6922f" +checksum = "f22201e53e8cbb67a053e88b534b4e7f02265c5406994bf35978482a9ad0ae26" dependencies = [ "alloy-consensus", "alloy-eips", @@ -6045,7 +6044,7 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-serde", "derive_more", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "serde", "serde_json", "thiserror 2.0.14", @@ -6066,7 +6065,7 @@ dependencies = [ "derive_more", "ethereum_ssz", "ethereum_ssz_derive", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "serde", "snap", "thiserror 2.0.14", @@ -7432,7 +7431,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "reth-codecs-derive", "reth-zstd-compressors", "serde", @@ -8893,7 +8892,7 @@ dependencies = [ "alloy-primitives", "derive_more", "miniz_oxide", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types", "paste", "reth-chainspec", @@ -8921,7 +8920,7 @@ dependencies = [ "derive_more", "eyre", "futures-util", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "reth-chainspec", "reth-cli", "reth-cli-commands", @@ -8990,7 +8989,7 @@ dependencies = [ "alloy-evm", "alloy-op-evm", "alloy-primitives", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", @@ -9030,7 +9029,7 @@ dependencies = [ "alloy-rpc-types-eth", "clap", "eyre", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", @@ -9077,7 +9076,7 @@ dependencies = [ "alloy-rpc-types-debug", "alloy-rpc-types-engine", "derive_more", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-rpc-types-engine", "reth-basic-payload-builder", "reth-chain-state", @@ -9116,7 +9115,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "reth-codecs", "reth-primitives-traits", "reth-zstd-compressors", @@ -9146,7 +9145,7 @@ dependencies = [ "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-jsonrpsee", "op-alloy-rpc-types", @@ -9213,7 +9212,7 @@ dependencies = [ "derive_more", "futures-util", "metrics", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-flz", "op-alloy-rpc-types", "op-revm", @@ -9338,7 +9337,7 @@ dependencies = [ "derive_more", "modular-bitfield", "once_cell", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "proptest", "proptest-arbitrary-interop", "rayon", @@ -9652,7 +9651,7 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-signer", "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "op-alloy-consensus 0.18.13", + "op-alloy-consensus 0.18.14", "op-alloy-network", "op-alloy-rpc-types", "op-revm", diff --git a/crates/flashblocks-rpc/src/cache.rs b/crates/flashblocks-rpc/src/cache.rs index 4314915c..c98a9a58 100644 --- a/crates/flashblocks-rpc/src/cache.rs +++ b/crates/flashblocks-rpc/src/cache.rs @@ -1,4 +1,5 @@ use alloy_consensus::Transaction as _; +use alloy_consensus::TxReceipt as _; use alloy_consensus::transaction::SignerRecoverable; use alloy_consensus::transaction::TransactionMeta; use alloy_primitives::{Address, Sealable, TxHash, U256}; @@ -10,16 +11,19 @@ use op_alloy_rpc_types::OpTransactionReceipt; use op_alloy_rpc_types::Transaction; use reth_optimism_chainspec::OpChainSpec; use reth_optimism_evm::extract_l1_info; +use reth_optimism_primitives::OpPrimitives; use reth_optimism_primitives::{OpBlock, OpReceipt, OpTransactionSigned}; use reth_optimism_rpc::OpReceiptBuilder; use reth_primitives::Recovered; use reth_primitives_traits::block::body::BlockBody; +use reth_rpc_eth_api::transaction::ConvertReceiptInput; use reth_rpc_eth_api::{RpcBlock, RpcReceipt}; use rollup_boost::{ FlashblockBuilder, FlashblocksPayloadV1, OpExecutionPayloadEnvelope, PayloadVersion, }; use serde::{Deserialize, Serialize}; +use std::borrow::Cow; use std::{ collections::HashMap, str::FromStr, @@ -198,23 +202,34 @@ impl FlashblocksCacheInner { extract_l1_info(&block.body).expect("failed to extract l1 info"); // build the receipts - for (indx, tx) in block.body.transactions.iter().enumerate() { + for (idx, tx) in block.body.transactions.iter().cloned().enumerate() { let receipt = all_receipts - .get(indx) + .get(idx) .expect("Receipt should exist for transaction"); let meta = TransactionMeta::default(); - - let rpc_receipt = OpReceiptBuilder::new( - &self.chain_spec.clone(), - tx, + let mut next_log_index = 0; + let mut gas_used = 0; + if meta.index > 0 { + for receipt in all_receipts.iter().take(meta.index as usize) { + gas_used = receipt.cumulative_gas_used(); + next_log_index += receipt.logs().len(); + } + } + let tx = tx.try_into_recovered_unchecked()?; + + let input: ConvertReceiptInput<'_, OpPrimitives> = ConvertReceiptInput { + tx: tx.as_recovered_ref(), + gas_used: receipt.cumulative_gas_used() - gas_used, + receipt: Cow::Owned(receipt.clone()), + next_log_index, meta, - receipt, - &all_receipts, - &mut l1_block_info, - ) - .expect("failed to build receipt") - .build(); + }; + + let rpc_receipt = + OpReceiptBuilder::new(&self.chain_spec.clone(), input, &mut l1_block_info) + .expect("failed to build receipt") + .build(); self.receipts_cache .insert(tx.tx_hash(), rpc_receipt.clone()); From bf861042ef6a848e5488da84342b3b92cb407d2b Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 15 Aug 2025 14:12:40 -0700 Subject: [PATCH 082/114] feat: cleanup flashblocks keys --- crates/rollup-boost/src/cli.rs | 16 ++++----- crates/rollup-boost/src/client/rpc.rs | 36 ++++++++++--------- .../rollup-boost/src/flashblocks/service.rs | 2 -- crates/rollup-boost/src/health.rs | 5 --- crates/rollup-boost/src/server.rs | 2 -- 5 files changed, 27 insertions(+), 34 deletions(-) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index c0be9470..5fb1d116 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -13,7 +13,8 @@ use tokio::signal::unix::{SignalKind, signal as unix_signal}; use tracing::{Level, info}; use crate::{ - BlockSelectionPolicy, Flashblocks, FlashblocksArgs, ProxyLayer, RollupBoostServer, RpcClient, + BlockSelectionPolicy, Flashblocks, FlashblocksArgs, FlashblocksKeys, ProxyLayer, + RollupBoostServer, RpcClient, client::rpc::{BuilderArgs, L2ClientArgs}, debug_api::ExecutionMode, get_version, init_metrics, @@ -119,7 +120,6 @@ impl RollupBoostArgs { l2_client_args.l2_timeout, PayloadSource::L2, None, - None, )?; let builder_args = self.builder; @@ -131,17 +131,17 @@ impl RollupBoostArgs { bail!("Missing Builder JWT secret"); }; + let flashblocks_keys = self.flashblocks.as_ref().map(|fb| FlashblocksKeys { + authorization_sk: fb.flashblocks_authorizer_sk.clone(), + builder_pk: fb.flashblocks_builder_vk.clone(), + }); + let builder_client = RpcClient::new( builder_args.builder_url.clone(), builder_auth_jwt, builder_args.builder_timeout, PayloadSource::Builder, - self.flashblocks - .as_ref() - .map(|fb| fb.flashblocks_authorizer_sk.clone()), - self.flashblocks - .as_ref() - .map(|fb| fb.flashblocks_builder_vk.clone()), + flashblocks_keys, )?; let (probe_layer, probes) = ProbeLayer::new(); diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index 76e2fc45..d71d0ed8 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -99,6 +99,14 @@ impl From for ErrorObjectOwned { } } +#[derive(Clone)] +pub struct FlashblocksKeys { + /// Flashblocks Authorization Secret + pub authorization_sk: SigningKey, + /// Flashblocks builder vk + pub builder_pk: VerifyingKey, +} + /// Client interface for interacting with execution layer node's Engine API. /// /// - **Engine API** calls are faciliated via the `auth_client` (requires JWT authentication). @@ -111,10 +119,10 @@ pub struct RpcClient { auth_rpc: Uri, /// The source of the payload payload_source: PayloadSource, - /// Flashblocks Authorization Secret - flashblocks_authorization_sk: Option, - /// Flashblocks Authorization Secret - flashblocks_builder_pk: Option, + /// Flashblocks keys + /// + /// `None` if flashblocks are disabled + flashblocks_keys: Option, } impl RpcClient { @@ -124,8 +132,7 @@ impl RpcClient { auth_rpc_jwt_secret: JwtSecret, timeout: u64, payload_source: PayloadSource, - flashblocks_authorization_sk: Option, - flashblocks_builder_pk: Option, + flashblocks_keys: Option, ) -> Result { let version = format!("{CARGO_PKG_VERSION}-{VERGEN_GIT_SHA}"); let mut headers = HeaderMap::new(); @@ -142,8 +149,7 @@ impl RpcClient { auth_client, auth_rpc, payload_source, - flashblocks_authorization_sk, - flashblocks_builder_pk, + flashblocks_keys, }) } @@ -165,18 +171,14 @@ impl RpcClient { payload_attributes: Option, ) -> ClientResult { info!("Sending fork_choice_updated_v3 to {}", self.payload_source); - let res = match ( - &payload_attributes, - &self.flashblocks_authorization_sk, - &self.flashblocks_builder_pk, - ) { - (Some(attrs), Some(sk), Some(pk)) => { + let res = match (&payload_attributes, &self.flashblocks_keys) { + (Some(attrs), Some(flashblocks)) => { let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attrs, 3); let authorization = Authorization::new( payload_id, attrs.payload_attributes.timestamp, - sk, - pk.clone(), + &flashblocks.authorization_sk, + flashblocks.builder_pk.clone(), ); self.auth_client .flashblocks_fork_choice_updated_v3( @@ -488,7 +490,7 @@ pub mod tests { let port = get_available_port(); let secret = JwtSecret::from_hex(SECRET).unwrap(); let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, port)).unwrap(); - let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2, None, None).unwrap(); + let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2, None).unwrap(); let response = send_request(client.auth_client, port).await; assert!(response.is_ok()); assert_eq!(response.unwrap(), "You are the dark lord"); diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index c7dd7378..04106e03 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -372,7 +372,6 @@ mod tests { 2000, PayloadSource::Builder, None, - None, )?; let service = @@ -403,7 +402,6 @@ mod tests { 2000, PayloadSource::Builder, None, - None, )?; let service = diff --git a/crates/rollup-boost/src/health.rs b/crates/rollup-boost/src/health.rs index 730582a2..0af8f450 100644 --- a/crates/rollup-boost/src/health.rs +++ b/crates/rollup-boost/src/health.rs @@ -274,7 +274,6 @@ mod tests { 100, PayloadSource::Builder, None, - None, )?); let health_handle = HealthHandle { @@ -307,7 +306,6 @@ mod tests { 100, PayloadSource::Builder, None, - None, )?); let health_handle = HealthHandle { @@ -341,7 +339,6 @@ mod tests { 100, PayloadSource::Builder, None, - None, )?); let health_handle = HealthHandle { @@ -375,7 +372,6 @@ mod tests { 100, PayloadSource::Builder, None, - None, )?); let health_handle = HealthHandle { @@ -402,7 +398,6 @@ mod tests { 100, PayloadSource::Builder, None, - None, )?); let health_handle = HealthHandle { diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index c74d7016..12155f89 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -671,7 +671,6 @@ pub mod tests { 2000, PayloadSource::L2, None, - None, ) .unwrap(); @@ -683,7 +682,6 @@ pub mod tests { 2000, PayloadSource::Builder, None, - None, ) .unwrap(), ); From e46bf8052fc6862733c95a1f6520f8d9ab63ee3e Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 15 Aug 2025 14:57:13 -0700 Subject: [PATCH 083/114] feat: parse args tests --- Cargo.lock | 1 + .../metadata/workspace/Cargo.lock | 1 + .../flashblocks-p2p/src/protocol/handler.rs | 4 + crates/rollup-boost/Cargo.toml | 1 + crates/rollup-boost/src/cli.rs | 283 ++++++++++++++++++ 5 files changed, 290 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index cb21c94a..5a2b8a66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10616,6 +10616,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", + "tempfile", "testcontainers", "thiserror 2.0.14", "time", diff --git a/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock b/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock index 886da312..7db8c4fd 100644 --- a/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock +++ b/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock @@ -10594,6 +10594,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", + "tempfile", "testcontainers", "thiserror 2.0.14", "time", diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 711cbc89..96272d5e 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -266,6 +266,10 @@ impl FlashblocksHandle { self.state.lock().publishing_status.borrow().clone() } + /// Awaits clearance to publish flashblocks. + /// + /// # Note + /// This is never guaranteed to return. pub async fn await_clearance(&self) { let mut status = self.state.lock().publishing_status.subscribe(); // Safe to unwrap becuase self holds a sender. diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 3893a340..0f7081bc 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -74,6 +74,7 @@ hex = "0.4" bytes = "1.2" [dev-dependencies] +tempfile = "3.20.0" rand = "0.9.0" time = { version = "0.3.36", features = ["macros", "formatting", "parsing"] } op-alloy-consensus = "0.17.2" diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index 5fb1d116..c0fc7176 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -259,3 +259,286 @@ impl std::str::FromStr for LogFormat { } } } + +#[cfg(test)] +pub mod tests { + use std::result::Result; + + use super::*; + + const SECRET: &str = "f79ae8046bc11c9927afe911db7143c51a806c4a537cc08e0d37140b0192f430"; + const FLASHBLOCKS_SK: &str = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; + const FLASHBLOCKS_VK: &str = "fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210"; + + #[test] + fn test_parse_args_minimal() -> Result<(), Box> { + let args = RollupBoostArgs::try_parse_from(["rollup-boost"])?; + + assert!(!args.tracing); + assert!(!args.metrics); + assert_eq!(args.rpc_host, "127.0.0.1"); + assert_eq!(args.rpc_port, 8081); + assert!(args.flashblocks.is_none()); + + Ok(()) + } + + #[test] + fn test_parse_args_missing_flashblocks_flag() -> Result<(), Box> { + let args = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--flashblocks-authorizer-sk", + FLASHBLOCKS_SK, + "--flashblocks-builder-vk", + FLASHBLOCKS_VK, + ]); + + assert!( + args.is_err(), + "flashblocks args should be invalid without --flashblocks flag" + ); + + Ok(()) + } + + #[test] + fn test_parse_args_with_flashblocks_flag() -> Result<(), Box> { + let args = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--flashblocks", + "--flashblocks-authorizer-sk", + FLASHBLOCKS_SK, + "--flashblocks-builder-vk", + FLASHBLOCKS_VK, + ])?; + + let flashblocks = args + .flashblocks + .expect("flashblocks should be Some when flag is passed"); + assert!(flashblocks.flashblocks); + assert_eq!( + flashblocks.flashblocks_builder_url.to_string(), + "ws://127.0.0.1:1111/" + ); + assert_eq!(flashblocks.flashblocks_host, "127.0.0.1"); + assert_eq!(flashblocks.flashblocks_port, 1112); + assert_eq!(flashblocks.flashblock_builder_ws_reconnect_ms, 5000); + + Ok(()) + } + + #[test] + fn test_parse_args_with_flashblocks_custom_values() -> Result<(), Box> { + let args = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--flashblocks", + "--flashblocks-authorizer-sk", + FLASHBLOCKS_SK, + "--flashblocks-builder-vk", + FLASHBLOCKS_VK, + "--flashblocks-builder-url", + "ws://example.com:9999", + "--flashblocks-host", + "0.0.0.0", + "--flashblocks-port", + "2222", + "--flashblock-builder-ws-reconnect-ms", + "10000", + ])?; + + let flashblocks = args + .flashblocks + .expect("flashblocks should be Some when flag is passed"); + assert!(flashblocks.flashblocks); + assert_eq!( + flashblocks.flashblocks_builder_url.to_string(), + "ws://example.com:9999/" + ); + assert_eq!(flashblocks.flashblocks_host, "0.0.0.0"); + assert_eq!(flashblocks.flashblocks_port, 2222); + assert_eq!(flashblocks.flashblock_builder_ws_reconnect_ms, 10000); + + Ok(()) + } + + #[test] + fn test_parse_args_with_all_options() -> Result<(), Box> { + let args = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--health-check-interval", + "120", + "--max-unsafe-interval", + "20", + "--rpc-host", + "0.0.0.0", + "--rpc-port", + "9090", + "--tracing", + "--metrics", + "--metrics-host", + "192.168.1.1", + "--metrics-port", + "8080", + "--log-level", + "debug", + "--log-format", + "json", + "--debug-host", + "localhost", + "--debug-server-port", + "6666", + "--execution-mode", + "disabled", + "--flashblocks", + "--flashblocks-authorizer-sk", + FLASHBLOCKS_SK, + "--flashblocks-builder-vk", + FLASHBLOCKS_VK, + ])?; + + assert_eq!(args.health_check_interval, 120); + assert_eq!(args.max_unsafe_interval, 20); + assert_eq!(args.rpc_host, "0.0.0.0"); + assert_eq!(args.rpc_port, 9090); + assert!(args.tracing); + assert!(args.metrics); + assert_eq!(args.metrics_host, "192.168.1.1"); + assert_eq!(args.metrics_port, 8080); + assert_eq!(args.log_level, Level::DEBUG); + assert_eq!(args.debug_host, "localhost"); + assert_eq!(args.debug_server_port, 6666); + + let flashblocks = args + .flashblocks + .expect("flashblocks should be Some when flag is passed"); + assert!(flashblocks.flashblocks); + + Ok(()) + } + + #[test] + fn test_parse_args_missing_jwt_succeeds_at_parse_time() { + // JWT validation happens at runtime, not parse time, so this should succeed + let result = + RollupBoostArgs::try_parse_from(["rollup-boost", "--builder-jwt-token", SECRET]); + + assert!(result.is_ok()); + let args = result.unwrap(); + assert!(args.builder.builder_jwt_token.is_some()); + assert!(args.l2_client.l2_jwt_token.is_none()); + } + + #[test] + fn test_parse_args_invalid_flashblocks_sk() { + let result = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--flashblocks", + "--flashblocks-authorizer-sk", + "invalid_hex", + "--flashblocks-builder-vk", + FLASHBLOCKS_VK, + ]); + + assert!(result.is_err()); + } + + #[test] + fn test_parse_args_invalid_flashblocks_vk() { + let result = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--flashblocks", + "--flashblocks-authorizer-sk", + FLASHBLOCKS_SK, + "--flashblocks-builder-vk", + "invalid_hex", + ]); + + assert!(result.is_err()); + } + + #[test] + fn test_log_format_parsing() -> Result<(), Box> { + let json_args = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--log-format", + "json", + ])?; + + match json_args.log_format { + LogFormat::Json => {} + LogFormat::Text => panic!("Expected Json format"), + } + + let text_args = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-token", + SECRET, + "--l2-jwt-token", + SECRET, + "--log-format", + "text", + ])?; + + match text_args.log_format { + LogFormat::Text => {} + LogFormat::Json => panic!("Expected Text format"), + } + + Ok(()) + } + + #[test] + fn test_parse_args_with_jwt_paths() -> Result<(), Box> { + use std::io::Write; + use tempfile::NamedTempFile; + + let mut builder_jwt_file = NamedTempFile::new()?; + writeln!(builder_jwt_file, "{}", SECRET)?; + let builder_jwt_path = builder_jwt_file.path(); + + let mut l2_jwt_file = NamedTempFile::new()?; + writeln!(l2_jwt_file, "{}", SECRET)?; + let l2_jwt_path = l2_jwt_file.path(); + + let args = RollupBoostArgs::try_parse_from([ + "rollup-boost", + "--builder-jwt-path", + builder_jwt_path.to_str().unwrap(), + "--l2-jwt-path", + l2_jwt_path.to_str().unwrap(), + ])?; + + assert!(args.builder.builder_jwt_path.is_some()); + assert!(args.l2_client.l2_jwt_path.is_some()); + + Ok(()) + } +} From c7130aa6cf7e0ba8587f8058843bd8b213e1c64f Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 15 Aug 2025 15:06:04 -0700 Subject: [PATCH 084/114] remove websocket config --- crates/rollup-boost/src/cli.rs | 94 +++++---------------- crates/rollup-boost/src/flashblocks/args.rs | 17 ---- 2 files changed, 19 insertions(+), 92 deletions(-) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index c0fc7176..0cd66dff 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -3,18 +3,13 @@ use clap::Parser; use eyre::bail; use jsonrpsee::{RpcModule, server::Server}; use parking_lot::Mutex; -use std::{ - net::{IpAddr, SocketAddr}, - path::PathBuf, - str::FromStr, - sync::Arc, -}; +use std::{net::SocketAddr, path::PathBuf, sync::Arc}; use tokio::signal::unix::{SignalKind, signal as unix_signal}; use tracing::{Level, info}; use crate::{ - BlockSelectionPolicy, Flashblocks, FlashblocksArgs, FlashblocksKeys, ProxyLayer, - RollupBoostServer, RpcClient, + BlockSelectionPolicy, FlashblocksArgs, FlashblocksKeys, ProxyLayer, RollupBoostServer, + RpcClient, client::rpc::{BuilderArgs, L2ClientArgs}, debug_api::ExecutionMode, get_version, init_metrics, @@ -147,51 +142,22 @@ impl RollupBoostArgs { let (probe_layer, probes) = ProbeLayer::new(); let execution_mode = Arc::new(Mutex::new(self.execution_mode)); - let (rpc_module, health_handle): (RpcModule<()>, _) = - if let Some(flashblocks_args) = self.flashblocks { - let inbound_url = flashblocks_args.flashblocks_builder_url; - let outbound_addr = SocketAddr::new( - IpAddr::from_str(&flashblocks_args.flashblocks_host)?, - flashblocks_args.flashblocks_port, - ); - - let builder_client = Arc::new(Flashblocks::run( - builder_client.clone(), - inbound_url, - outbound_addr, - flashblocks_args.flashblock_builder_ws_reconnect_ms, - )?); - - let rollup_boost = RollupBoostServer::new( - l2_client, - builder_client, - execution_mode.clone(), - self.block_selection_policy, - probes.clone(), - ); - - let health_handle = rollup_boost - .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); - - // Spawn the debug server - rollup_boost.start_debug_server(debug_addr.as_str()).await?; - (rollup_boost.try_into()?, health_handle) - } else { - let rollup_boost = RollupBoostServer::new( - l2_client, - Arc::new(builder_client), - execution_mode.clone(), - self.block_selection_policy, - probes.clone(), - ); - - let health_handle = rollup_boost - .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); - - // Spawn the debug server - rollup_boost.start_debug_server(debug_addr.as_str()).await?; - (rollup_boost.try_into()?, health_handle) - }; + let (rpc_module, health_handle): (RpcModule<()>, _) = { + let rollup_boost = RollupBoostServer::new( + l2_client, + Arc::new(builder_client), + execution_mode.clone(), + self.block_selection_policy, + probes.clone(), + ); + + let health_handle = rollup_boost + .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); + + // Spawn the debug server + rollup_boost.start_debug_server(debug_addr.as_str()).await?; + (rollup_boost.try_into()?, health_handle) + }; // Build and start the server info!("Starting server on :{}", self.rpc_port); @@ -324,13 +290,6 @@ pub mod tests { .flashblocks .expect("flashblocks should be Some when flag is passed"); assert!(flashblocks.flashblocks); - assert_eq!( - flashblocks.flashblocks_builder_url.to_string(), - "ws://127.0.0.1:1111/" - ); - assert_eq!(flashblocks.flashblocks_host, "127.0.0.1"); - assert_eq!(flashblocks.flashblocks_port, 1112); - assert_eq!(flashblocks.flashblock_builder_ws_reconnect_ms, 5000); Ok(()) } @@ -348,27 +307,12 @@ pub mod tests { FLASHBLOCKS_SK, "--flashblocks-builder-vk", FLASHBLOCKS_VK, - "--flashblocks-builder-url", - "ws://example.com:9999", - "--flashblocks-host", - "0.0.0.0", - "--flashblocks-port", - "2222", - "--flashblock-builder-ws-reconnect-ms", - "10000", ])?; let flashblocks = args .flashblocks .expect("flashblocks should be Some when flag is passed"); assert!(flashblocks.flashblocks); - assert_eq!( - flashblocks.flashblocks_builder_url.to_string(), - "ws://example.com:9999/" - ); - assert_eq!(flashblocks.flashblocks_host, "0.0.0.0"); - assert_eq!(flashblocks.flashblocks_port, 2222); - assert_eq!(flashblocks.flashblock_builder_ws_reconnect_ms, 10000); Ok(()) } diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index e10158fe..8c513073 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -1,6 +1,5 @@ use clap::Args; use ed25519_dalek::{SigningKey, VerifyingKey}; -use url::Url; use hex::FromHex; @@ -11,22 +10,6 @@ pub struct FlashblocksArgs { #[arg(long, env, required = false)] pub flashblocks: bool, - /// Flashblocks Builder WebSocket URL - #[arg(long, env, default_value = "ws://127.0.0.1:1111")] - pub flashblocks_builder_url: Url, - - /// Flashblocks WebSocket host for outbound connections - #[arg(long, env, default_value = "127.0.0.1")] - pub flashblocks_host: String, - - /// Flashblocks WebSocket port for outbound connections - #[arg(long, env, default_value = "1112")] - pub flashblocks_port: u16, - - /// Time used for timeout if builder disconnected - #[arg(long, env, default_value = "5000")] - pub flashblock_builder_ws_reconnect_ms: u64, - #[arg( long, env = "FLASHBLOCKS_AUTHORIZER_SK", From 101ffc0d087030784659425c807f79236f75b953 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 18 Aug 2025 14:56:02 -0700 Subject: [PATCH 085/114] feat: update rust version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8e1c6340..99120f50 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ # # Based on https://depot.dev/blog/rust-dockerfile-best-practices # -FROM rust:1.87.0 AS base +FROM rust:1.89.0 AS base ARG FEATURES ARG RELEASE=true From fe634cbf15bcb498edb8130fb06f7ca526880c3e Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 19 Aug 2025 13:41:08 -0700 Subject: [PATCH 086/114] feat: remove websocket proxy --- Cargo.lock | 225 +- Cargo.toml | 1 - crates/websocket-proxy/.dockerignore | 5 - crates/websocket-proxy/.env.example | 3 - crates/websocket-proxy/Cargo.lock | 2829 ------------------- crates/websocket-proxy/Cargo.toml | 43 - crates/websocket-proxy/Dockerfile | 18 - crates/websocket-proxy/README.md | 69 - crates/websocket-proxy/src/auth.rs | 176 -- crates/websocket-proxy/src/client.rs | 28 - crates/websocket-proxy/src/lib.rs | 15 - crates/websocket-proxy/src/main.rs | 403 --- crates/websocket-proxy/src/metrics.rs | 58 - crates/websocket-proxy/src/rate_limit.rs | 820 ------ crates/websocket-proxy/src/registry.rs | 61 - crates/websocket-proxy/src/server.rs | 226 -- crates/websocket-proxy/src/subscriber.rs | 398 --- crates/websocket-proxy/tests/integration.rs | 349 --- 18 files changed, 8 insertions(+), 5719 deletions(-) delete mode 100644 crates/websocket-proxy/.dockerignore delete mode 100644 crates/websocket-proxy/.env.example delete mode 100644 crates/websocket-proxy/Cargo.lock delete mode 100644 crates/websocket-proxy/Cargo.toml delete mode 100644 crates/websocket-proxy/Dockerfile delete mode 100644 crates/websocket-proxy/README.md delete mode 100644 crates/websocket-proxy/src/auth.rs delete mode 100644 crates/websocket-proxy/src/client.rs delete mode 100644 crates/websocket-proxy/src/lib.rs delete mode 100644 crates/websocket-proxy/src/main.rs delete mode 100644 crates/websocket-proxy/src/metrics.rs delete mode 100644 crates/websocket-proxy/src/rate_limit.rs delete mode 100644 crates/websocket-proxy/src/registry.rs delete mode 100644 crates/websocket-proxy/src/server.rs delete mode 100644 crates/websocket-proxy/src/subscriber.rs delete mode 100644 crates/websocket-proxy/tests/integration.rs diff --git a/Cargo.lock b/Cargo.lock index 5a2b8a66..276007d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -993,12 +993,6 @@ dependencies = [ "derive_arbitrary", ] -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - [[package]] name = "ark-bls12-381" version = "0.5.0" @@ -1460,14 +1454,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", - "axum-core 0.4.5", + "axum-core", "bytes", "futures-util", "http", "http-body", "http-body-util", "itoa", - "matchit 0.7.3", + "matchit", "memchr", "mime", "percent-encoding", @@ -1480,43 +1474,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "axum" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" -dependencies = [ - "axum-core 0.5.2", - "base64 0.22.1", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit 0.8.4", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sha1", - "sync_wrapper", - "tokio", - "tokio-tungstenite", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "axum-core" version = "0.4.5" @@ -1537,43 +1494,12 @@ dependencies = [ "tower-service", ] -[[package]] -name = "axum-core" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "az" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "getrandom 0.2.16", - "instant", - "rand 0.8.5", -] - [[package]] name = "backon" version = "1.5.2" @@ -3494,36 +3420,6 @@ dependencies = [ "url", ] -[[package]] -name = "flashblocks-websocket-proxy" -version = "0.1.0" -dependencies = [ - "axum 0.8.4", - "backoff", - "brotli", - "clap", - "dotenvy", - "eyre", - "futures", - "hostname", - "http", - "metrics", - "metrics-derive", - "metrics-exporter-prometheus 0.17.2", - "redis", - "reqwest", - "serde_json", - "testcontainers", - "testcontainers-modules", - "thiserror 2.0.14", - "tokio", - "tokio-tungstenite", - "tokio-util", - "tracing", - "tracing-subscriber 0.3.19", - "uuid", -] - [[package]] name = "flate2" version = "1.1.2" @@ -4042,17 +3938,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "hostname" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" -dependencies = [ - "cfg-if", - "libc", - "windows-link", -] - [[package]] name = "http" version = "1.3.1" @@ -4634,15 +4519,6 @@ dependencies = [ "syn 2.0.105", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "interprocess" version = "2.2.3" @@ -5445,12 +5321,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - [[package]] name = "memchr" version = "2.7.5" @@ -5511,34 +5381,13 @@ dependencies = [ "indexmap 2.10.0", "ipnet", "metrics", - "metrics-util 0.19.1", + "metrics-util", "quanta", "thiserror 1.0.69", "tokio", "tracing", ] -[[package]] -name = "metrics-exporter-prometheus" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b166dea96003ee2531cf14833efedced545751d800f03535801d833313f8c15" -dependencies = [ - "base64 0.22.1", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "indexmap 2.10.0", - "ipnet", - "metrics", - "metrics-util 0.20.0", - "quanta", - "thiserror 2.0.14", - "tokio", - "tracing", -] - [[package]] name = "metrics-process" version = "2.4.0" @@ -5575,22 +5424,6 @@ dependencies = [ "sketches-ddsketch", ] -[[package]] -name = "metrics-util" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe8db7a05415d0f919ffb905afa37784f71901c9a773188876984b4f769ab986" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", - "hashbrown 0.15.5", - "metrics", - "quanta", - "rand 0.9.2", - "rand_xoshiro", - "sketches-ddsketch", -] - [[package]] name = "mime" version = "0.3.17" @@ -7018,23 +6851,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" -[[package]] -name = "redis" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "438a4e5f8e9aa246d6f3666d6978441bf1b37d5f417b50c4dd220be09f5fcc17" -dependencies = [ - "arc-swap", - "combine", - "itoa", - "num-bigint", - "percent-encoding", - "ryu", - "sha1_smol", - "socket2 0.5.10", - "url", -] - [[package]] name = "redox_syscall" version = "0.3.5" @@ -8838,9 +8654,9 @@ dependencies = [ "http", "jsonrpsee-server 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", - "metrics-exporter-prometheus 0.16.2", + "metrics-exporter-prometheus", "metrics-process", - "metrics-util 0.19.1", + "metrics-util", "procfs", "reth-metrics", "reth-tasks", @@ -10597,8 +10413,8 @@ dependencies = [ "jsonrpsee 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", "metrics", "metrics-derive", - "metrics-exporter-prometheus 0.16.2", - "metrics-util 0.19.1", + "metrics-exporter-prometheus", + "metrics-util", "moka", "op-alloy-consensus 0.17.2", "op-alloy-rpc-types-engine", @@ -11101,16 +10917,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" -dependencies = [ - "itoa", - "serde", -] - [[package]] name = "serde_repr" version = "0.1.20" @@ -11196,12 +11002,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - [[package]] name = "sha2" version = "0.9.9" @@ -11683,15 +11483,6 @@ dependencies = [ "url", ] -[[package]] -name = "testcontainers-modules" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d43ed4e8f58424c3a2c6c56dbea6643c3c23e8666a34df13c54f0a184e6c707" -dependencies = [ - "testcontainers", -] - [[package]] name = "thin-vec" version = "0.2.14" @@ -12026,7 +11817,7 @@ checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", - "axum 0.7.9", + "axum", "base64 0.22.1", "bytes", "h2", diff --git a/Cargo.toml b/Cargo.toml index ca28a98a..c5065740 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,6 @@ resolver = "3" members = [ "crates/rollup-boost", - "crates/websocket-proxy", "crates/flashblocks-rpc", "crates/flashblocks-p2p", "crates/flashblocks-node", diff --git a/crates/websocket-proxy/.dockerignore b/crates/websocket-proxy/.dockerignore deleted file mode 100644 index 7bf30c2f..00000000 --- a/crates/websocket-proxy/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -target/ -.git/ -.github/ -.gitignore -README.md \ No newline at end of file diff --git a/crates/websocket-proxy/.env.example b/crates/websocket-proxy/.env.example deleted file mode 100644 index b6f660ec..00000000 --- a/crates/websocket-proxy/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -UPSTREAM_WS=ws://upstreamurl.com/rs -MAXIMUM_CONCURRENT_CONNECTIONS=2 -LOG_LEVEL=debug diff --git a/crates/websocket-proxy/Cargo.lock b/crates/websocket-proxy/Cargo.lock deleted file mode 100644 index 78e1ba82..00000000 --- a/crates/websocket-proxy/Cargo.lock +++ /dev/null @@ -1,2829 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" -dependencies = [ - "anstyle", - "once_cell", - "windows-sys 0.59.0", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "aws-lc-rs" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.28.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa9b6986f250236c27e5a204062434a773a13243d2ffc2955f37bdba4c5c6a1" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", -] - -[[package]] -name = "axum" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" -dependencies = [ - "axum-core", - "base64", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sha1", - "sync_wrapper", - "tokio", - "tokio-tungstenite", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "getrandom 0.2.16", - "instant", - "rand 0.8.5", -] - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", - "which", -] - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cc" -version = "1.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.5.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "cmake" -version = "0.1.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" -dependencies = [ - "cc", -] - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "flashblocks-websocket-proxy" -version = "0.1.0" -dependencies = [ - "axum", - "backoff", - "clap", - "dotenvy", - "futures", - "hostname", - "http", - "metrics", - "metrics-derive", - "metrics-exporter-prometheus", - "redis", - "redis-test", - "reqwest", - "ring", - "serde_json", - "thiserror", - "tokio", - "tokio-tungstenite", - "tokio-util", - "tracing", - "tracing-subscriber", - "uuid", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "h2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "foldhash", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "hostname" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" -dependencies = [ - "cfg-if", - "libc", - "windows-link", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom 0.3.2", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libloading" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "metrics" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dea7ac8057892855ec285c440160265225438c3c45072613c25a4b26e98ef5" -dependencies = [ - "ahash", - "portable-atomic", -] - -[[package]] -name = "metrics-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3dbdd96ed57d565ec744cba02862d707acf373c5772d152abae6ec5c4e24f6c" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn", -] - -[[package]] -name = "metrics-exporter-prometheus" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df88858cd28baaaf2cfc894e37789ed4184be0e1351157aec7bf3c2266c793fd" -dependencies = [ - "base64", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "indexmap", - "ipnet", - "metrics", - "metrics-util", - "quanta", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "metrics-util" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8496cc523d1f94c1385dd8f0f0c2c480b2b8aeccb5b7e4485ad6365523ae376" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", - "hashbrown", - "metrics", - "quanta", - "rand 0.9.1", - "rand_xoshiro", - "sketches-ddsketch", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "openssl" -version = "0.10.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "portable-atomic" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy 0.8.25", -] - -[[package]] -name = "prettyplease" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" -dependencies = [ - "proc-macro2", - "syn", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quanta" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", - "web-sys", - "winapi", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.2", -] - -[[package]] -name = "rand_xoshiro" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" -dependencies = [ - "rand_core 0.9.3", -] - -[[package]] -name = "raw-cpuid" -version = "11.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redis" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "438a4e5f8e9aa246d6f3666d6978441bf1b37d5f417b50c4dd220be09f5fcc17" -dependencies = [ - "arc-swap", - "combine", - "itoa", - "num-bigint", - "percent-encoding", - "ryu", - "sha1_smol", - "socket2", - "url", -] - -[[package]] -name = "redis-test" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "967d3ffa2d2ead5a95b2e8561d7453c4719c9fe9dbba521673e058e513cb1c24" -dependencies = [ - "rand 0.9.1", - "redis", - "socket2", - "tempfile", -] - -[[package]] -name = "redox_syscall" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" -dependencies = [ - "aws-lc-rs", - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.2.0", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" - -[[package]] -name = "rustls-webpki" -version = "0.103.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" -dependencies = [ - "bitflags", - "core-foundation 0.10.0", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - -[[package]] -name = "sketches-ddsketch" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" - -[[package]] -name = "socket2" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix 1.0.5", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" -dependencies = [ - "futures-util", - "log", - "native-tls", - "tokio", - "tokio-native-tls", - "tungstenite", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "native-tls", - "rand 0.9.1", - "sha1", - "thiserror", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" -dependencies = [ - "getrandom 0.3.2", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", -] - -[[package]] -name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/crates/websocket-proxy/Cargo.toml b/crates/websocket-proxy/Cargo.toml deleted file mode 100644 index 8c4c9e13..00000000 --- a/crates/websocket-proxy/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -[package] -name = "flashblocks-websocket-proxy" -version = "0.1.0" -edition = "2024" -rust-version = "1.85" -license = "MIT" - -[dependencies] -tracing.workspace = true -tracing-subscriber.workspace = true -clap.workspace = true -futures.workspace = true -thiserror.workspace = true -serde_json.workspace = true -metrics.workspace = true -metrics-derive.workspace = true -tokio.workspace = true -tokio-tungstenite.workspace = true -eyre.workspace = true - -metrics-exporter-prometheus = { version = "0.17.0", features = [ - "http-listener", -] } -http = "1.2.0" -axum = { version = "0.8.1", features = ["ws"] } -dotenvy = "0.15.7" -backoff = "0.4.0" -reqwest = { version = "0.12.15", default-features = false, features = [ - "native-tls", -] } - -hostname = "0.4.0" -redis = "0.30.0" -uuid = { version = "1.16.0", features = ["v4"] } -tokio-util = "0.7.12" -brotli = "8.0.1" - -[lib] -name = "websocket_proxy" - -[dev-dependencies] -testcontainers.workspace = true -testcontainers-modules.workspace = true diff --git a/crates/websocket-proxy/Dockerfile b/crates/websocket-proxy/Dockerfile deleted file mode 100644 index f8fe1b6d..00000000 --- a/crates/websocket-proxy/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM rust:1.85 AS builder - -WORKDIR /app - -ARG BINARY="flashblocks-websocket-proxy" -ARG FEATURES - -COPY . . - -RUN cargo build --release --features="$FEATURES" --package=${BINARY} - -FROM gcr.io/distroless/cc-debian12 -WORKDIR /app - -ARG BINARY="flashblocks-websocket-proxy" -COPY --from=builder /app/target/release/${BINARY} /usr/local/bin/ - -ENTRYPOINT ["/usr/local/bin/flashblocks-websocket-proxy"] diff --git a/crates/websocket-proxy/README.md b/crates/websocket-proxy/README.md deleted file mode 100644 index 2443fafa..00000000 --- a/crates/websocket-proxy/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# Flashblocks Websocket Proxy - -## Overview -The Flashblocks Websocket Proxy is a service that subscribes to new Flashblocks from -[rollup-boost](https://github.com/flashbots/rollup-boost) on the sequencer. Then broadcasts them out to any downstream -RPC nodes. Minimizing the number of connections to the sequencer and restricting access. - -> ⚠️ **Warning** -> -> This is currently alpha software -- deploy at your own risk! -> -> Currently, this project is a one-directional generic websocket proxy. It doesn't inspect any data or validate clients. -> This may not always be the case. - -## For Developers - -### Contributing - -### Building & Testing -You can build and test the project using [Cargo](https://doc.rust-lang.org/cargo/). Some useful commands are: -``` -# Build the project -cargo build - -# Run all the tests (requires local version of redis to be installed) -cargo test --all-features -``` - -### Deployment -Builds of the websocket proxy [are provided](https://github.com/base/flashblocks-websocket-proxy/pkgs/container/flashblocks-websocket-proxy). -The only configuration required is the rollup-boost URL to proxy. You can set this via an env var `UPSTREAM_WS` or a flag `--upstream-ws`. - - -You can see a full list of parameters by running: - -`docker run ghcr.io/base/flashblocks-websocket-proxy:master --help` - -### Redis Integration - -The proxy supports distributed rate limiting with Redis. This is useful when running multiple instances of the proxy behind a load balancer, as it allows rate limits to be enforced across all instances. - -To enable Redis integration, use the following parameters: - -- `--redis-url` - Redis connection URL (e.g., `redis://localhost:6379`) -- `--redis-key-prefix` - Prefix for Redis keys (default: `flashblocks`) - -Example: - -```bash -docker run ghcr.io/base/flashblocks-websocket-proxy:master \ - --upstream-ws wss://your-sequencer-endpoint \ - --redis-url redis://redis:6379 \ - --global-connections-limit 1000 \ - --per-ip-connections-limit 10 -``` - -When Redis is enabled, the following features are available: - -- Distributed rate limiting across multiple proxy instances -- Connection tracking persists even if the proxy instance restarts -- More accurate global connection limiting in multi-instance deployments - -If the Redis connection fails, the proxy will automatically fall back to in-memory rate limiting. - -### Brotli Compression - -The proxy supports compressing messages to downstream clients using Brotli. - -To enable this, pass the parameter `--enable-compression` \ No newline at end of file diff --git a/crates/websocket-proxy/src/auth.rs b/crates/websocket-proxy/src/auth.rs deleted file mode 100644 index 74d3172c..00000000 --- a/crates/websocket-proxy/src/auth.rs +++ /dev/null @@ -1,176 +0,0 @@ -use crate::auth::AuthenticationParseError::{ - DuplicateAPIKeyArgument, DuplicateApplicationArgument, MissingAPIKeyArgument, - MissingApplicationArgument, NoData, TooManyComponents, -}; -use std::collections::{HashMap, HashSet}; - -#[derive(Clone, Debug)] -pub struct Authentication { - key_to_application: HashMap, -} - -#[derive(Debug, PartialEq)] -pub enum AuthenticationParseError { - NoData(), - MissingApplicationArgument(String), - MissingAPIKeyArgument(String), - TooManyComponents(String), - DuplicateApplicationArgument(String), - DuplicateAPIKeyArgument(String), -} - -impl std::fmt::Display for AuthenticationParseError { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - NoData() => write!(f, "No API Keys Provided"), - MissingApplicationArgument(arg) => write!(f, "Missing application argument: [{arg}]"), - MissingAPIKeyArgument(app) => write!(f, "Missing API Key argument: [{app}]"), - TooManyComponents(app) => write!(f, "Too many components: [{app}]"), - DuplicateApplicationArgument(app) => { - write!(f, "Duplicate application argument: [{app}]") - } - DuplicateAPIKeyArgument(app) => write!(f, "Duplicate API key: [{app}]"), - } - } -} - -impl std::error::Error for AuthenticationParseError {} - -impl TryFrom> for Authentication { - type Error = AuthenticationParseError; - - fn try_from(args: Vec) -> Result { - let mut applications = HashSet::new(); - let mut key_to_application: HashMap = HashMap::new(); - - if args.is_empty() { - return Err(NoData()); - } - - for arg in args { - let mut parts = arg.split(":"); - let app = parts - .next() - .ok_or(MissingApplicationArgument(arg.clone()))?; - if app.is_empty() { - return Err(MissingApplicationArgument(arg.clone())); - } - - let key = parts.next().ok_or(MissingAPIKeyArgument(app.to_string()))?; - if key.is_empty() { - return Err(MissingAPIKeyArgument(app.to_string())); - } - - if parts.count() > 0 { - return Err(TooManyComponents(app.to_string())); - } - - if applications.contains(app) { - return Err(DuplicateApplicationArgument(app.to_string())); - } - - if key_to_application.contains_key(key) { - return Err(DuplicateAPIKeyArgument(app.to_string())); - } - - applications.insert(app.to_string()); - key_to_application.insert(key.to_string(), app.to_string()); - } - - Ok(Self { key_to_application }) - } -} - -impl Authentication { - pub fn none() -> Self { - Self { - key_to_application: HashMap::new(), - } - } - - #[allow(dead_code)] - pub fn new(api_keys: HashMap) -> Self { - Self { - key_to_application: api_keys, - } - } - - pub fn get_application_for_key(&self, api_key: &String) -> Option<&String> { - self.key_to_application.get(api_key) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_parsing() { - let auth = Authentication::try_from(vec![ - "app1:key1".to_string(), - "app2:key2".to_string(), - "app3:key3".to_string(), - ]) - .unwrap(); - - assert_eq!(auth.key_to_application.len(), 3); - assert_eq!(auth.key_to_application["key1"], "app1"); - assert_eq!(auth.key_to_application["key2"], "app2"); - assert_eq!(auth.key_to_application["key3"], "app3"); - - let auth = Authentication::try_from(vec![ - "app1:key1".to_string(), - "".to_string(), - "app3:key3".to_string(), - ]); - assert!(auth.is_err()); - assert_eq!(auth.unwrap_err(), MissingApplicationArgument("".into())); - - let auth = Authentication::try_from(vec![ - "app1:key1".to_string(), - "app2".to_string(), - "app3:key3".to_string(), - ]); - assert!(auth.is_err()); - assert_eq!(auth.unwrap_err(), MissingAPIKeyArgument("app2".into())); - - let auth = Authentication::try_from(vec![ - "app1:key1".to_string(), - ":".to_string(), - "app3:key3".to_string(), - ]); - assert!(auth.is_err()); - assert_eq!(auth.unwrap_err(), MissingApplicationArgument(":".into())); - - let auth = Authentication::try_from(vec![ - "app1:key1".to_string(), - "app2:".to_string(), - "app3:key3".to_string(), - ]); - assert!(auth.is_err()); - assert_eq!(auth.unwrap_err(), MissingAPIKeyArgument("app2".into())); - - let auth = Authentication::try_from(vec![ - "app1:key1".to_string(), - "app2:key2:unexpected2".to_string(), - "app3:key3".to_string(), - ]); - assert!(auth.is_err()); - assert_eq!(auth.unwrap_err(), TooManyComponents("app2".into())); - - let auth = Authentication::try_from(vec![ - "app1:key1".to_string(), - "app1:key3".to_string(), - "app2:key2".to_string(), - ]); - assert!(auth.is_err()); - assert_eq!( - auth.unwrap_err(), - DuplicateApplicationArgument("app1".into()) - ); - - let auth = Authentication::try_from(vec!["app1:key1".to_string(), "app2:key1".to_string()]); - assert!(auth.is_err()); - assert_eq!(auth.unwrap_err(), DuplicateAPIKeyArgument("app2".into())); - } -} diff --git a/crates/websocket-proxy/src/client.rs b/crates/websocket-proxy/src/client.rs deleted file mode 100644 index 86e74f39..00000000 --- a/crates/websocket-proxy/src/client.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::rate_limit::Ticket; -use axum::Error; -use axum::extract::ws::WebSocket; -use std::net::IpAddr; - -pub struct ClientConnection { - client_addr: IpAddr, - _ticket: Ticket, - pub(crate) websocket: WebSocket, -} - -impl ClientConnection { - pub fn new(client_addr: IpAddr, ticket: Ticket, websocket: WebSocket) -> Self { - Self { - client_addr, - _ticket: ticket, - websocket, - } - } - - pub async fn send(&mut self, data: Vec) -> Result<(), Error> { - self.websocket.send(data.into()).await - } - - pub fn id(&self) -> String { - self.client_addr.to_string() - } -} diff --git a/crates/websocket-proxy/src/lib.rs b/crates/websocket-proxy/src/lib.rs deleted file mode 100644 index ec369b49..00000000 --- a/crates/websocket-proxy/src/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -pub mod auth; -pub mod client; -pub mod metrics; -pub mod rate_limit; -pub mod registry; -pub mod server; -pub mod subscriber; - -pub use auth::*; -pub use client::*; -pub use metrics::*; -pub use rate_limit::*; -pub use registry::*; -pub use server::*; -pub use subscriber::*; diff --git a/crates/websocket-proxy/src/main.rs b/crates/websocket-proxy/src/main.rs deleted file mode 100644 index a167b40b..00000000 --- a/crates/websocket-proxy/src/main.rs +++ /dev/null @@ -1,403 +0,0 @@ -mod auth; -mod client; -mod metrics; -mod rate_limit; -mod registry; -mod server; -mod subscriber; - -use axum::http::Uri; -use clap::Parser; -use dotenvy::dotenv; -use metrics::Metrics; -use metrics_exporter_prometheus::PrometheusBuilder; -use rate_limit::{InMemoryRateLimit, RateLimit, RedisRateLimit}; -use registry::Registry; -use server::Server; -use std::io::Write; -use std::net::SocketAddr; -use std::sync::Arc; -use subscriber::WebsocketSubscriber; -use tokio::signal::unix::{SignalKind, signal}; -use tokio::sync::broadcast; -use tokio_util::sync::CancellationToken; -use tracing::{Level, error, info, trace, warn}; -use tracing_subscriber::EnvFilter; - -#[derive(Parser, Debug)] -#[command(author, version, about)] -struct Args { - #[arg( - long, - env, - default_value = "0.0.0.0:8545", - help = "The address and port to listen on for incoming connections" - )] - listen_addr: SocketAddr, - - #[arg( - long, - env, - value_delimiter = ',', - help = "WebSocket URI of the upstream server to connect to" - )] - upstream_ws: Vec, - - #[arg( - long, - env, - default_value = "20", - help = "Number of messages to buffer for lagging clients" - )] - message_buffer_size: usize, - - #[arg( - long, - env, - default_value = "100", - help = "Maximum number of concurrently connected clients per instance" - )] - instance_connection_limit: usize, - - #[arg( - long, - env, - default_value = "10", - help = "Maximum number of concurrently connected clients per IP" - )] - per_ip_connection_limit: usize, - #[arg( - long, - env, - default_value = "false", - help = "Enable brotli compression on messages to downstream clients" - )] - enable_compression: bool, - - #[arg( - long, - env, - default_value = "X-Forwarded-For", - help = "Header to use to determine the clients origin IP" - )] - ip_addr_http_header: String, - - #[arg(long, env, default_value = "info")] - log_level: Level, - - /// Format for logs, can be json or text - #[arg(long, env, default_value = "text")] - log_format: String, - - /// Enable Prometheus metrics - #[arg(long, env, default_value = "true")] - metrics: bool, - - /// API Keys, if not provided will be an unauthenticated endpoint, should be in the format :,:,.. - #[arg(long, env, value_delimiter = ',', help = "API keys to allow")] - api_keys: Vec, - - /// Address to run the metrics server on - #[arg(long, env, default_value = "0.0.0.0:9000")] - metrics_addr: SocketAddr, - - /// Tags to add to every metrics emitted, should be in the format --metrics-global-labels label1=value1,label2=value2 - #[arg(long, env, default_value = "")] - metrics_global_labels: String, - - /// Add the hostname as a label to all Prometheus metrics - #[arg(long, env, default_value = "false")] - metrics_host_label: bool, - - /// Maximum backoff allowed for upstream connections - #[arg(long, env, default_value = "20")] - subscriber_max_interval: u64, - - #[arg( - long, - env, - help = "Redis URL for distributed rate limiting (e.g., redis://localhost:6379). If not provided, in-memory rate limiting will be used." - )] - redis_url: Option, - - #[arg( - long, - env, - default_value = "flashblocks", - help = "Prefix for Redis keys" - )] - redis_key_prefix: String, -} - -#[tokio::main] -async fn main() { - dotenv().ok(); - let args = Args::parse(); - - let log_format = args.log_format.to_lowercase(); - let log_level = args.log_level.to_string(); - - if log_format == "json" { - tracing_subscriber::fmt() - .json() - .with_env_filter(EnvFilter::new(log_level)) - .with_ansi(false) - .init(); - } else { - tracing_subscriber::fmt() - .with_env_filter(EnvFilter::new(log_level)) - .with_ansi(false) - .init(); - } - - let api_keys: Vec = args - .api_keys - .into_iter() - .filter(|s| !s.is_empty()) - .collect(); - let authentication = if api_keys.is_empty() { - None - } else { - match auth::Authentication::try_from(api_keys) { - Ok(auth) => Some(auth), - Err(e) => { - panic!("Failed to parse API Keys: {e}") - } - } - }; - - if args.metrics { - info!( - message = "starting metrics server", - address = args.metrics_addr.to_string() - ); - - let mut builder = PrometheusBuilder::new().with_http_listener(args.metrics_addr); - - if args.metrics_host_label { - let hostname = hostname::get() - .expect("could not find hostname") - .into_string() - .expect("could not convert hostname to string"); - builder = builder.add_global_label("hostname", hostname); - } - - for (key, value) in parse_global_metrics(args.metrics_global_labels) { - builder = builder.add_global_label(key, value); - } - - builder - .install() - .expect("failed to setup Prometheus endpoint") - } - - // Validate that we have at least one upstream URI - if args.upstream_ws.is_empty() { - error!(message = "no upstream URIs provided"); - panic!("No upstream URIs provided"); - } - - info!(message = "using upstream URIs", uris = ?args.upstream_ws); - - let metrics = Arc::new(Metrics::default()); - let metrics_clone = metrics.clone(); - - let (send, _rec) = broadcast::channel(args.message_buffer_size); - let sender = send.clone(); - - let listener = move |data: String| { - trace!(message = "received data", data = data); - // Subtract one from receiver count, as we have to keep one receiver open at all times (see _rec) - // to avoid the channel being closed. However this is not an active client connection. - metrics_clone - .active_connections - .set((send.receiver_count() - 1) as f64); - - let message_data = if args.enable_compression { - let data_bytes = data.as_bytes(); - let mut compressed_data_bytes = Vec::new(); - { - let mut compressor = - brotli::CompressorWriter::new(&mut compressed_data_bytes, 4096, 5, 22); - compressor.write_all(data_bytes).unwrap(); - } - compressed_data_bytes - } else { - data.into_bytes() - }; - - match send.send(message_data) { - Ok(_) => (), - Err(e) => error!(message = "failed to send data", error = e.to_string()), - } - }; - - let token = CancellationToken::new(); - let mut subscriber_tasks = Vec::new(); - - // Start a subscriber for each upstream URI - for (index, uri) in args.upstream_ws.iter().enumerate() { - let uri_clone = uri.clone(); - let listener_clone = listener.clone(); - let token_clone = token.clone(); - let metrics_clone = metrics.clone(); - - let mut subscriber = WebsocketSubscriber::new( - uri_clone.clone(), - listener_clone, - args.subscriber_max_interval, - metrics_clone, - ); - - let task = tokio::spawn(async move { - info!( - message = "starting subscriber", - index = index, - uri = uri_clone.to_string() - ); - subscriber.run(token_clone).await; - }); - - subscriber_tasks.push(task); - } - - let registry = Registry::new(sender, metrics.clone()); - - let rate_limiter = match &args.redis_url { - Some(redis_url) => { - info!(message = "Using Redis rate limiter", redis_url = redis_url); - match RedisRateLimit::new( - redis_url, - args.instance_connection_limit, - args.per_ip_connection_limit, - &args.redis_key_prefix, - ) { - Ok(limiter) => { - info!(message = "Connected to Redis successfully"); - Arc::new(limiter) as Arc - } - Err(e) => { - error!( - message = - "Failed to connect to Redis, falling back to in-memory rate limiting", - error = e.to_string() - ); - Arc::new(InMemoryRateLimit::new( - args.instance_connection_limit, - args.per_ip_connection_limit, - )) as Arc - } - } - } - None => { - info!(message = "Using in-memory rate limiter"); - Arc::new(InMemoryRateLimit::new( - args.instance_connection_limit, - args.per_ip_connection_limit, - )) as Arc - } - }; - - let server = Server::new( - args.listen_addr, - registry.clone(), - metrics, - rate_limiter, - authentication, - args.ip_addr_http_header, - ); - let server_task = server.listen(token.clone()); - - let mut interrupt = signal(SignalKind::interrupt()).unwrap(); - let mut terminate = signal(SignalKind::terminate()).unwrap(); - - tokio::select! { - _ = futures::future::join_all(subscriber_tasks) => { - info!("all subscriber tasks terminated"); - token.cancel(); - }, - _ = server_task => { - info!("server task terminated"); - token.cancel(); - } - _ = interrupt.recv() => { - info!("process interrupted, shutting down"); - token.cancel(); - } - _ = terminate.recv() => { - info!("process terminated, shutting down"); - token.cancel(); - } - } -} - -fn parse_global_metrics(metrics: String) -> Vec<(String, String)> { - let mut result = Vec::new(); - - for metric in metrics.split(',') { - if metric.is_empty() { - continue; - } - - let parts = metric - .splitn(2, '=') - .map(|s| s.to_string()) - .collect::>(); - - if parts.len() != 2 { - warn!( - message = "malformed global metric: invalid count", - metric = metric - ); - continue; - } - - let label = parts[0].to_string(); - let value = parts[1].to_string(); - - if label.is_empty() || value.is_empty() { - warn!( - message = "malformed global metric: empty value", - metric = metric - ); - continue; - } - - result.push((label, value)); - } - - result -} - -#[cfg(test)] -mod test { - use crate::parse_global_metrics; - - #[test] - fn test_parse_global_metrics() { - assert_eq!( - parse_global_metrics("".into()), - Vec::<(String, String)>::new(), - ); - - assert_eq!( - parse_global_metrics("key=value".into()), - vec![("key".into(), "value".into())] - ); - - assert_eq!( - parse_global_metrics("key=value,key2=value2".into()), - vec![ - ("key".into(), "value".into()), - ("key2".into(), "value2".into()) - ], - ); - - assert_eq!(parse_global_metrics("gibberish".into()), Vec::new()); - - assert_eq!( - parse_global_metrics("key=value,key2=,".into()), - vec![("key".into(), "value".into())], - ); - } -} diff --git a/crates/websocket-proxy/src/metrics.rs b/crates/websocket-proxy/src/metrics.rs deleted file mode 100644 index 87dfe1cf..00000000 --- a/crates/websocket-proxy/src/metrics.rs +++ /dev/null @@ -1,58 +0,0 @@ -use metrics::{Counter, Gauge, counter}; -use metrics_derive::Metrics; -#[derive(Metrics)] -#[metrics(scope = "websocket_proxy")] -pub struct Metrics { - #[metric(describe = "Messages sent to clients")] - pub sent_messages: Counter, - - #[metric(describe = "Count of messages that were unable to be sent")] - pub failed_messages: Counter, - - #[metric(describe = "Count of new connections opened")] - pub new_connections: Counter, - - #[metric(describe = "Count of number of connections closed")] - pub closed_connections: Counter, - - #[metric(describe = "Count the number of connections which lagged and then disconnected")] - pub lagged_connections: Counter, - - #[metric(describe = "Number of client connections currently open")] - pub active_connections: Gauge, - - #[metric(describe = "Count of rate limited request")] - pub rate_limited_requests: Counter, - - #[metric(describe = "Count of unauthorized requests with invalid API keys")] - pub unauthorized_requests: Counter, - - #[metric(describe = "Count of times upstream receiver was closed/errored")] - pub upstream_errors: Counter, - - #[metric(describe = "Number of active upstream connections")] - pub upstream_connections: Gauge, - - #[metric(describe = "Number of upstream connection attempts")] - pub upstream_connection_attempts: Counter, - - #[metric(describe = "Number of successful upstream connections")] - pub upstream_connection_successes: Counter, - - #[metric(describe = "Number of failed upstream connection attempts")] - pub upstream_connection_failures: Counter, - - #[metric(describe = "Total bytes broadcasted to clients")] - pub bytes_broadcasted: Counter, -} - -impl Metrics { - pub fn proxy_connections_by_app(&self, app: &str) { - counter!("websocket_proxy.connections_by_app", "app" => app.to_owned()).increment(1); - } - - pub fn message_received_from_upstream(&self, upstream: &str) { - counter!("websocket_proxy.upstream_messages", "upstream" => upstream.to_owned()) - .increment(1); - } -} diff --git a/crates/websocket-proxy/src/rate_limit.rs b/crates/websocket-proxy/src/rate_limit.rs deleted file mode 100644 index 34148def..00000000 --- a/crates/websocket-proxy/src/rate_limit.rs +++ /dev/null @@ -1,820 +0,0 @@ -use std::collections::HashMap; -use std::net::IpAddr; -use std::sync::{Arc, Mutex}; -use tracing::{debug, error, warn}; - -use thiserror::Error; -use tokio::sync::{OwnedSemaphorePermit, Semaphore}; - -use redis::{Client, Commands, RedisError}; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::time::{Duration, SystemTime}; -use uuid::Uuid; - -#[derive(Error, Debug)] -pub enum RateLimitError { - #[error("Rate Limit Reached: {reason}")] - Limit { reason: String }, -} - -#[clippy::has_significant_drop] -pub struct Ticket { - addr: IpAddr, - _permit: OwnedSemaphorePermit, - rate_limiter: Arc, -} - -impl Drop for Ticket { - fn drop(&mut self) { - self.rate_limiter.release(self.addr) - } -} - -pub trait RateLimit: Send + Sync { - fn try_acquire(self: Arc, addr: IpAddr) -> Result; - - fn release(&self, ticket: IpAddr); -} - -struct Inner { - active_connections: HashMap, - semaphore: Arc, -} - -pub struct InMemoryRateLimit { - per_ip_limit: usize, - inner: Mutex, -} - -impl InMemoryRateLimit { - pub fn new(instance_limit: usize, per_ip_limit: usize) -> Self { - Self { - per_ip_limit, - inner: Mutex::new(Inner { - active_connections: HashMap::new(), - semaphore: Arc::new(Semaphore::new(instance_limit)), - }), - } - } -} - -impl RateLimit for InMemoryRateLimit { - fn try_acquire(self: Arc, addr: IpAddr) -> Result { - let mut inner = self.inner.lock().unwrap(); - - let permit = - inner - .semaphore - .clone() - .try_acquire_owned() - .map_err(|_| RateLimitError::Limit { - reason: "Global limit".to_owned(), - })?; - - let current_count = match inner.active_connections.get(&addr) { - Some(count) => *count, - None => 0, - }; - - if current_count + 1 > self.per_ip_limit { - debug!( - message = "Rate limit exceeded, trying to acquire", - client = addr.to_string() - ); - return Err(RateLimitError::Limit { - reason: String::from("IP limit exceeded"), - }); - } - - let new_count = current_count + 1; - - inner.active_connections.insert(addr, new_count); - - Ok(Ticket { - addr, - _permit: permit, - rate_limiter: self.clone(), - }) - } - - fn release(&self, addr: IpAddr) { - let mut inner = self.inner.lock().unwrap(); - - let current_count = match inner.active_connections.get(&addr) { - Some(count) => *count, - None => 0, - }; - - let new_count = if current_count == 0 { - warn!( - message = "ip counting is not accurate -- unexpected underflow", - client = addr.to_string() - ); - 0 - } else { - current_count - 1 - }; - - if new_count == 0 { - inner.active_connections.remove(&addr); - } else { - inner.active_connections.insert(addr, new_count); - } - } -} - -pub struct RedisRateLimit { - redis_client: Client, - instance_limit: usize, - per_ip_limit: usize, - semaphore: Arc, - key_prefix: String, - instance_id: String, - heartbeat_interval: Duration, - heartbeat_ttl: Duration, - background_tasks_started: AtomicBool, -} - -impl RedisRateLimit { - pub fn new( - redis_url: &str, - instance_limit: usize, - per_ip_limit: usize, - key_prefix: &str, - ) -> Result { - let client = Client::open(redis_url)?; - let instance_id = Uuid::new_v4().to_string(); - - let heartbeat_interval = Duration::from_secs(10); - let heartbeat_ttl = Duration::from_secs(30); - - let rate_limiter = Self { - redis_client: client, - instance_limit, - per_ip_limit, - semaphore: Arc::new(Semaphore::new(instance_limit)), - key_prefix: key_prefix.to_string(), - instance_id, - heartbeat_interval, - heartbeat_ttl, - background_tasks_started: AtomicBool::new(false), - }; - - if let Err(e) = rate_limiter.register_instance() { - error!( - message = "Failed to register instance in Redis", - error = e.to_string() - ); - } - - Ok(rate_limiter) - } - - pub fn start_background_tasks(self: Arc) { - if self.background_tasks_started.swap(true, Ordering::SeqCst) { - return; - } - - debug!( - message = "Starting background heartbeat and cleanup tasks", - instance_id = self.instance_id - ); - - let self_clone = self.clone(); - tokio::spawn(async move { - loop { - if let Err(e) = self_clone.update_heartbeat() { - error!( - message = "Failed to update heartbeat in background task", - error = e.to_string() - ); - } - - if let Err(e) = self_clone.cleanup_stale_instances() { - error!( - message = "Failed to cleanup stale instances in background task", - error = e.to_string() - ); - } - - tokio::time::sleep(self_clone.heartbeat_interval / 2).await; - } - }); - } - - fn register_instance(&self) -> Result<(), RedisError> { - self.update_heartbeat()?; - debug!( - message = "Registered instance in Redis", - instance_id = self.instance_id - ); - - Ok(()) - } - - fn update_heartbeat(&self) -> Result<(), RedisError> { - let now = SystemTime::now(); - let mut conn = self.redis_client.get_connection()?; - - let ttl = self.heartbeat_ttl.as_secs(); - conn.set_ex::<_, _, ()>( - self.instance_heartbeat_key(), - now.duration_since(SystemTime::UNIX_EPOCH) - .unwrap() - .as_secs(), - ttl, - )?; - - debug!( - message = "Updated instance heartbeat", - instance_id = self.instance_id - ); - - Ok(()) - } - - fn cleanup_stale_instances(&self) -> Result<(), RedisError> { - let mut conn = self.redis_client.get_connection()?; - - let instance_heartbeat_pattern = format!("{}:instance:*:heartbeat", self.key_prefix); - let instance_heartbeats: Vec = conn.keys(instance_heartbeat_pattern)?; - - let active_instance_ids: Vec = instance_heartbeats - .iter() - .filter_map(|key| key.split(':').nth(2).map(String::from)) - .collect(); - - debug!( - message = "Active instances with heartbeats", - instance_count = active_instance_ids.len(), - current_instance = self.instance_id - ); - - let ip_instance_pattern = format!("{}:ip:*:instance:*:connections", self.key_prefix); - let ip_instance_keys: Vec = conn.keys(ip_instance_pattern)?; - - let mut instance_ids_with_connections = std::collections::HashSet::new(); - for key in &ip_instance_keys { - if let Some(instance_id) = key.split(':').nth(4) { - instance_ids_with_connections.insert(instance_id.to_string()); - } - } - - debug!( - message = "Checking for stale instances", - instances_with_connections = instance_ids_with_connections.len(), - current_instance = self.instance_id - ); - - for instance_id in instance_ids_with_connections { - if instance_id == self.instance_id { - debug!( - message = "Skipping current instance", - instance_id = instance_id - ); - continue; - } - - if !active_instance_ids.contains(&instance_id) { - debug!( - message = "Found stale instance", - instance_id = instance_id, - reason = "Heartbeat key not found" - ); - self.cleanup_instance(&mut conn, &instance_id)?; - } - } - - debug!(message = "Completed stale instance cleanup"); - - Ok(()) - } - - fn cleanup_instance( - &self, - conn: &mut redis::Connection, - instance_id: &str, - ) -> Result<(), RedisError> { - let ip_instance_pattern = format!( - "{}:ip:*:instance:{}:connections", - self.key_prefix, instance_id - ); - let ip_instance_keys: Vec = conn.keys(ip_instance_pattern)?; - - debug!( - message = "Cleaning up instance", - instance_id = instance_id, - ip_key_count = ip_instance_keys.len() - ); - - for key in ip_instance_keys { - conn.del::<_, ()>(&key)?; - debug!(message = "Deleted IP instance key", key = key); - } - - Ok(()) - } - - fn ip_instance_key(&self, addr: &IpAddr) -> String { - format!( - "{}:ip:{}:instance:{}:connections", - self.key_prefix, addr, self.instance_id - ) - } - - fn instance_heartbeat_key(&self) -> String { - format!( - "{}:instance:{}:heartbeat", - self.key_prefix, self.instance_id - ) - } -} - -impl RateLimit for RedisRateLimit { - fn try_acquire(self: Arc, addr: IpAddr) -> Result { - self.clone().start_background_tasks(); - - let permit = match self.semaphore.clone().try_acquire_owned() { - Ok(permit) => permit, - Err(_) => { - return Err(RateLimitError::Limit { - reason: "Maximum connection limit reached for this server instance".to_string(), - }); - } - }; - - let mut conn = match self.redis_client.get_connection() { - Ok(conn) => conn, - Err(e) => { - error!( - message = "Failed to connect to Redis", - error = e.to_string() - ); - return Err(RateLimitError::Limit { - reason: "Redis connection failed".to_string(), - }); - } - }; - - let ip_keys_pattern = format!("{}:ip:{}:instance:*:connections", self.key_prefix, addr); - let ip_keys: Vec = match conn.keys(ip_keys_pattern) { - Ok(keys) => keys, - Err(e) => { - error!( - message = "Failed to get IP instance keys from Redis", - error = e.to_string() - ); - return Err(RateLimitError::Limit { - reason: "Redis operation failed".to_string(), - }); - } - }; - - let mut total_ip_connections: usize = 0; - for key in &ip_keys { - let count: usize = conn.get(key).unwrap_or(0); - total_ip_connections += count; - } - - if total_ip_connections >= self.per_ip_limit { - return Err(RateLimitError::Limit { - reason: format!("Per-IP connection limit reached for {addr}"), - }); - } - - let ip_instance_connections: usize = match conn.incr(self.ip_instance_key(&addr), 1) { - Ok(count) => count, - Err(e) => { - error!( - message = "Failed to increment per-instance IP counter in Redis", - error = e.to_string() - ); - return Err(RateLimitError::Limit { - reason: "Redis operation failed".to_string(), - }); - } - }; - - let total_instance_connections = self.instance_limit - self.semaphore.available_permits(); - - debug!( - message = "Connection established", - ip = addr.to_string(), - ip_instance_connections = ip_instance_connections, - total_ip_connections = total_ip_connections + 1, - total_instance_connections = total_instance_connections, - instance_id = self.instance_id - ); - - Ok(Ticket { - addr, - _permit: permit, - rate_limiter: self, - }) - } - - fn release(&self, addr: IpAddr) { - match self.redis_client.get_connection() { - Ok(mut conn) => { - let ip_instance_connections: Result = - conn.decr(self.ip_instance_key(&addr), 1); - - if let Err(ref e) = ip_instance_connections { - error!( - message = "Failed to decrement per-instance IP counter in Redis", - error = e.to_string() - ); - } - - debug!( - message = "Connection released", - ip = addr.to_string(), - ip_instance_connections = ip_instance_connections.unwrap_or(0), - instance_id = self.instance_id - ); - } - Err(e) => { - error!( - message = "Failed to connect to Redis for release", - error = e.to_string() - ); - } - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::str::FromStr; - use std::time::Duration; - use testcontainers::runners::AsyncRunner; - use testcontainers_modules::redis::Redis; - - const GLOBAL_LIMIT: usize = 3; - const PER_IP_LIMIT: usize = 2; - - #[tokio::test] - async fn test_tickets_are_released() { - let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); - - let rate_limiter = Arc::new(InMemoryRateLimit::new(GLOBAL_LIMIT, PER_IP_LIMIT)); - - assert_eq!( - rate_limiter - .inner - .lock() - .unwrap() - .semaphore - .available_permits(), - GLOBAL_LIMIT - ); - assert_eq!( - rate_limiter.inner.lock().unwrap().active_connections.len(), - 0 - ); - - let c1 = rate_limiter.clone().try_acquire(user_1).unwrap(); - - assert_eq!( - rate_limiter - .inner - .lock() - .unwrap() - .semaphore - .available_permits(), - GLOBAL_LIMIT - 1 - ); - assert_eq!( - rate_limiter.inner.lock().unwrap().active_connections.len(), - 1 - ); - assert_eq!( - rate_limiter.inner.lock().unwrap().active_connections[&user_1], - 1 - ); - - drop(c1); - - assert_eq!( - rate_limiter - .inner - .lock() - .unwrap() - .semaphore - .available_permits(), - GLOBAL_LIMIT - ); - assert_eq!( - rate_limiter.inner.lock().unwrap().active_connections.len(), - 0 - ); - } - - #[tokio::test] - async fn test_global_rate_limits() { - let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); - let user_2 = IpAddr::from_str("128.0.0.1").unwrap(); - - let rate_limiter = Arc::new(InMemoryRateLimit::new(GLOBAL_LIMIT, PER_IP_LIMIT)); - - let _c1 = rate_limiter.clone().try_acquire(user_1).unwrap(); - - let _c2 = rate_limiter.clone().try_acquire(user_2).unwrap(); - - let _c3 = rate_limiter.clone().try_acquire(user_1).unwrap(); - - assert_eq!( - rate_limiter - .inner - .lock() - .unwrap() - .semaphore - .available_permits(), - 0 - ); - - let c4 = rate_limiter.clone().try_acquire(user_2); - assert!(c4.is_err()); - assert_eq!( - c4.err().unwrap().to_string(), - "Rate Limit Reached: Global limit" - ); - - drop(_c3); - - let c4 = rate_limiter.clone().try_acquire(user_2); - assert!(c4.is_ok()); - } - - #[tokio::test] - async fn test_per_ip_limits() { - let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); - let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); - - let rate_limiter = Arc::new(InMemoryRateLimit::new(GLOBAL_LIMIT, PER_IP_LIMIT)); - - let _c1 = rate_limiter.clone().try_acquire(user_1).unwrap(); - let _c2 = rate_limiter.clone().try_acquire(user_1).unwrap(); - - assert_eq!( - rate_limiter.inner.lock().unwrap().active_connections[&user_1], - 2 - ); - - let c3 = rate_limiter.clone().try_acquire(user_1); - assert!(c3.is_err()); - assert_eq!( - c3.err().unwrap().to_string(), - "Rate Limit Reached: IP limit exceeded" - ); - - let c4 = rate_limiter.clone().try_acquire(user_2); - assert!(c4.is_ok()); - } - - #[tokio::test] - async fn test_global_limits_with_multiple_ips() { - let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); - let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); - let user_3 = IpAddr::from_str("127.0.0.3").unwrap(); - - let rate_limiter = Arc::new(InMemoryRateLimit::new(4, 3)); - - let ticket_1_1 = rate_limiter.clone().try_acquire(user_1).unwrap(); - let ticket_1_2 = rate_limiter.clone().try_acquire(user_1).unwrap(); - - let ticket_2_1 = rate_limiter.clone().try_acquire(user_2).unwrap(); - let ticket_2_2 = rate_limiter.clone().try_acquire(user_2).unwrap(); - - assert_eq!( - rate_limiter - .inner - .lock() - .unwrap() - .semaphore - .available_permits(), - 0 - ); - - // Try user_3 - should fail due to global limit - let result = rate_limiter.clone().try_acquire(user_3); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - "Rate Limit Reached: Global limit" - ); - - drop(ticket_1_1); - - let ticket_3_1 = rate_limiter.clone().try_acquire(user_3).unwrap(); - - drop(ticket_1_2); - drop(ticket_2_1); - drop(ticket_2_2); - drop(ticket_3_1); - - assert_eq!( - rate_limiter - .inner - .lock() - .unwrap() - .semaphore - .available_permits(), - 4 - ); - assert_eq!( - rate_limiter.inner.lock().unwrap().active_connections.len(), - 0 - ); - } - - #[tokio::test] - async fn test_per_ip_limits_remain_enforced() { - let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); - let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); - - let rate_limiter = Arc::new(InMemoryRateLimit::new(5, 2)); - - let ticket_1_1 = rate_limiter.clone().try_acquire(user_1).unwrap(); - let ticket_1_2 = rate_limiter.clone().try_acquire(user_1).unwrap(); - - let result = rate_limiter.clone().try_acquire(user_1); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - "Rate Limit Reached: IP limit exceeded" - ); - - let ticket_2_1 = rate_limiter.clone().try_acquire(user_2).unwrap(); - drop(ticket_1_1); - - let ticket_1_3 = rate_limiter.clone().try_acquire(user_1).unwrap(); - - let result = rate_limiter.clone().try_acquire(user_1); - assert!(result.is_err()); - assert_eq!( - result.err().unwrap().to_string(), - "Rate Limit Reached: IP limit exceeded" - ); - - drop(ticket_1_2); - drop(ticket_1_3); - drop(ticket_2_1); - - assert_eq!( - rate_limiter - .inner - .lock() - .unwrap() - .semaphore - .available_permits(), - 5 - ); - assert_eq!( - rate_limiter.inner.lock().unwrap().active_connections.len(), - 0 - ); - } - - #[tokio::test] - async fn test_instance_tracking_and_cleanup() { - let container = Redis::default().start().await.unwrap(); - let host_port = container.get_host_port_ipv4(6379).await.unwrap(); - let client_addr = format!("redis://127.0.0.1:{}", host_port); - - tokio::time::sleep(Duration::from_millis(100)).await; - - let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); - let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); - - let redis_client = Client::open(client_addr.as_str()).unwrap(); - - { - let rate_limiter1 = Arc::new(RedisRateLimit { - redis_client: Client::open(client_addr.as_str()).unwrap(), - instance_limit: 10, - per_ip_limit: 5, - semaphore: Arc::new(Semaphore::new(10)), - key_prefix: "test".to_string(), - instance_id: "instance1".to_string(), - heartbeat_interval: Duration::from_millis(200), - heartbeat_ttl: Duration::from_secs(1), - background_tasks_started: AtomicBool::new(true), - }); - - rate_limiter1.register_instance().unwrap(); - let _ticket1 = rate_limiter1.clone().try_acquire(user_1).unwrap(); - let _ticket2 = rate_limiter1.clone().try_acquire(user_2).unwrap(); - // no drop on release (exit of block) - std::mem::forget(_ticket1); - std::mem::forget(_ticket2); - - { - let mut conn = redis_client.get_connection().unwrap(); - - let exists: bool = redis::cmd("EXISTS") - .arg("test:instance:instance1:heartbeat".to_string()) - .query(&mut conn) - .unwrap(); - assert!(exists, "Instance1 heartbeat should exist initially"); - - let ip1_instance1_count: usize = redis::cmd("GET") - .arg("test:ip:127.0.0.1:instance:instance1:connections") - .query(&mut conn) - .unwrap(); - let ip2_instance1_count: usize = redis::cmd("GET") - .arg("test:ip:127.0.0.2:instance:instance1:connections") - .query(&mut conn) - .unwrap(); - - assert_eq!(ip1_instance1_count, 1, "IP1 count should be 1 initially"); - assert_eq!(ip2_instance1_count, 1, "IP2 count should be 1 initially"); - } - }; - - tokio::time::sleep(Duration::from_secs(1)).await; - - { - let mut conn = redis_client.get_connection().unwrap(); - - let exists: bool = redis::cmd("EXISTS") - .arg("test:instance:instance1:heartbeat".to_string()) - .query(&mut conn) - .unwrap(); - assert!( - !exists, - "Instance1 heartbeat should be gone after TTL expiration" - ); - - let ip1_instance1_count: usize = redis::cmd("GET") - .arg("test:ip:127.0.0.1:instance:instance1:connections") - .query(&mut conn) - .unwrap(); - let ip2_instance1_count: usize = redis::cmd("GET") - .arg("test:ip:127.0.0.2:instance:instance1:connections") - .query(&mut conn) - .unwrap(); - - assert_eq!( - ip1_instance1_count, 1, - "IP1 instance1 count should still be 1 after instance1 crash" - ); - assert_eq!( - ip2_instance1_count, 1, - "IP2 instance1 count should still be 1 after crash" - ); - } - - let rate_limiter2 = Arc::new(RedisRateLimit { - redis_client: Client::open(client_addr.as_str()).unwrap(), - instance_limit: 10, - per_ip_limit: 5, - semaphore: Arc::new(Semaphore::new(10)), - key_prefix: "test".to_string(), - instance_id: "instance2".to_string(), - heartbeat_interval: Duration::from_millis(200), - heartbeat_ttl: Duration::from_secs(2), - background_tasks_started: AtomicBool::new(false), - }); - - rate_limiter2.register_instance().unwrap(); - rate_limiter2.cleanup_stale_instances().unwrap(); - - tokio::time::sleep(Duration::from_secs(1)).await; - - { - let mut conn = redis_client.get_connection().unwrap(); - - let ip1_instance1_exists: bool = redis::cmd("EXISTS") - .arg("test:ip:127.0.0.1:instance:instance1:connections") - .query(&mut conn) - .unwrap(); - let ip2_instance1_exists: bool = redis::cmd("EXISTS") - .arg("test:ip:127.0.0.2:instance:instance1:connections") - .query(&mut conn) - .unwrap(); - - assert!( - !ip1_instance1_exists, - "IP1 instance1 counter should be gone after cleanup" - ); - assert!( - !ip2_instance1_exists, - "IP2 instance1 counter should be gone after cleanup" - ); - } - - let _ticket3 = rate_limiter2.clone().try_acquire(user_1).unwrap(); - - { - let mut conn = redis_client.get_connection().unwrap(); - let ip1_instance2_count: usize = redis::cmd("GET") - .arg("test:ip:127.0.0.1:instance:instance2:connections") - .query(&mut conn) - .unwrap(); - - assert_eq!(ip1_instance2_count, 1, "IP1 instance2 count should be 1"); - } - } -} diff --git a/crates/websocket-proxy/src/registry.rs b/crates/websocket-proxy/src/registry.rs deleted file mode 100644 index 59207ec2..00000000 --- a/crates/websocket-proxy/src/registry.rs +++ /dev/null @@ -1,61 +0,0 @@ -use crate::client::ClientConnection; -use crate::metrics::Metrics; -use std::sync::Arc; -use tokio::sync::broadcast::Sender; -use tokio::sync::broadcast::error::RecvError; -use tracing::{info, trace, warn}; - -#[derive(Clone)] -pub struct Registry { - sender: Sender>, - metrics: Arc, -} - -impl Registry { - pub fn new(sender: Sender>, metrics: Arc) -> Self { - Self { sender, metrics } - } - - pub async fn subscribe(&self, mut client: ClientConnection) { - info!(message = "subscribing client", client = client.id()); - - let mut receiver = self.sender.subscribe(); - let metrics = self.metrics.clone(); - metrics.new_connections.increment(1); - - tokio::spawn(async move { - loop { - match receiver.recv().await { - Ok(msg) => match client.send(msg.clone()).await { - Ok(_) => { - trace!(message = "message sent to client", client = client.id()); - metrics.sent_messages.increment(1); - metrics.bytes_broadcasted.increment(msg.len() as u64); - } - Err(e) => { - warn!( - message = "failed to send data to client", - client = client.id(), - error = e.to_string() - ); - metrics.failed_messages.increment(1); - break; - } - }, - Err(RecvError::Closed) => { - info!(message = "upstream connection closed", client = client.id()); - break; - } - Err(RecvError::Lagged(_)) => { - info!(message = "client is lagging", client = client.id()); - metrics.lagged_connections.increment(1); - break; - } - } - } - - metrics.closed_connections.increment(1); - info!(message = "client disconnected", client = client.id()); - }); - } -} diff --git a/crates/websocket-proxy/src/server.rs b/crates/websocket-proxy/src/server.rs deleted file mode 100644 index fadf6237..00000000 --- a/crates/websocket-proxy/src/server.rs +++ /dev/null @@ -1,226 +0,0 @@ -use crate::auth::Authentication; -use crate::client::ClientConnection; -use crate::metrics::Metrics; -use crate::rate_limit::{RateLimit, RateLimitError}; -use crate::registry::Registry; -use axum::body::Body; -use axum::extract::{ConnectInfo, Path, State, WebSocketUpgrade}; -use axum::http::StatusCode; -use axum::response::{IntoResponse, Response}; -use axum::routing::{any, get}; -use axum::{Error, Router}; -use http::{HeaderMap, HeaderValue}; -use serde_json::json; -use std::net::{IpAddr, SocketAddr}; -use std::sync::Arc; -use tokio_util::sync::CancellationToken; -use tracing::{info, warn}; - -#[derive(Clone)] -struct ServerState { - registry: Registry, - rate_limiter: Arc, - metrics: Arc, - auth: Authentication, - ip_addr_http_header: String, -} - -#[derive(Clone)] -pub struct Server { - listen_addr: SocketAddr, - registry: Registry, - rate_limiter: Arc, - metrics: Arc, - ip_addr_http_header: String, - authentication: Option, -} - -impl Server { - pub fn new( - listen_addr: SocketAddr, - registry: Registry, - metrics: Arc, - rate_limiter: Arc, - authentication: Option, - ip_addr_http_header: String, - ) -> Self { - Self { - listen_addr, - registry, - rate_limiter, - metrics, - authentication, - ip_addr_http_header, - } - } - - pub async fn listen(&self, cancellation_token: CancellationToken) { - let mut router: Router = Router::new().route("/healthz", get(healthz_handler)); - - if self.authentication.is_some() { - info!("Authentication is enabled"); - router = router.route("/ws/{api_key}", any(authenticated_websocket_handler)); - } else { - info!("Public endpoint is enabled"); - router = router.route("/ws", any(unauthenticated_websocket_handler)); - } - - let router = router.with_state(ServerState { - registry: self.registry.clone(), - rate_limiter: self.rate_limiter.clone(), - metrics: self.metrics.clone(), - auth: self - .authentication - .clone() - .unwrap_or_else(Authentication::none), - ip_addr_http_header: self.ip_addr_http_header.clone(), - }); - - let listener = tokio::net::TcpListener::bind(self.listen_addr) - .await - .unwrap(); - - info!( - message = "starting server", - address = listener.local_addr().unwrap().to_string() - ); - - axum::serve( - listener, - router.into_make_service_with_connect_info::(), - ) - .with_graceful_shutdown(cancellation_token.cancelled_owned()) - .await - .unwrap() - } -} - -async fn healthz_handler() -> impl IntoResponse { - StatusCode::OK -} - -async fn authenticated_websocket_handler( - State(state): State, - ws: WebSocketUpgrade, - ConnectInfo(addr): ConnectInfo, - headers: HeaderMap, - Path(api_key): Path, -) -> impl IntoResponse { - let application = state.auth.get_application_for_key(&api_key); - - match application { - None => { - state.metrics.unauthorized_requests.increment(1); - - Response::builder() - .status(StatusCode::UNAUTHORIZED) - .body(Body::from( - json!({"message": "Invalid API key"}).to_string(), - )) - .unwrap() - } - Some(app) => { - state.metrics.proxy_connections_by_app(app); - websocket_handler(state, ws, addr, headers) - } - } -} - -async fn unauthenticated_websocket_handler( - State(state): State, - ws: WebSocketUpgrade, - ConnectInfo(addr): ConnectInfo, - headers: HeaderMap, -) -> impl IntoResponse { - websocket_handler(state, ws, addr, headers) -} - -fn websocket_handler( - state: ServerState, - ws: WebSocketUpgrade, - addr: SocketAddr, - headers: HeaderMap, -) -> Response { - let connect_addr = addr.ip(); - - let client_addr = match headers.get(state.ip_addr_http_header) { - None => connect_addr, - Some(value) => extract_addr(value, connect_addr), - }; - - let ticket = match state.rate_limiter.try_acquire(client_addr) { - Ok(ticket) => ticket, - Err(RateLimitError::Limit { reason }) => { - state.metrics.rate_limited_requests.increment(1); - - return Response::builder() - .status(StatusCode::TOO_MANY_REQUESTS) - .body(Body::from(json!({"message": reason}).to_string())) - .unwrap(); - } - }; - - ws.on_failed_upgrade(move |e: Error| { - info!( - message = "failed to upgrade connection", - error = e.to_string(), - client = addr.to_string() - ) - }) - .on_upgrade(async move |socket| { - let client = ClientConnection::new(client_addr, ticket, socket); - state.registry.subscribe(client).await; - }) -} - -fn extract_addr(header: &HeaderValue, fallback: IpAddr) -> IpAddr { - if header.is_empty() { - return fallback; - } - - match header.to_str() { - Ok(header_value) => { - let raw_value = header_value - .split(',') - .map(|ip| ip.trim().to_string()) - .next_back(); - - if let Some(raw_value) = raw_value { - return raw_value.parse::().unwrap_or(fallback); - } - - fallback - } - Err(e) => { - warn!( - message = "could not get header value", - error = e.to_string() - ); - fallback - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::net::Ipv4Addr; - - #[tokio::test] - async fn test_header_addr() { - let fb = Ipv4Addr::new(127, 0, 0, 1); - - let test = |header: &str, expected: Ipv4Addr| { - let hv = HeaderValue::from_str(header).unwrap(); - let result = extract_addr(&hv, IpAddr::V4(fb)); - assert_eq!(result, expected); - }; - - test("129.1.1.1", Ipv4Addr::new(129, 1, 1, 1)); - test("129.1.1.1,130.1.1.1", Ipv4Addr::new(130, 1, 1, 1)); - test("129.1.1.1 , 130.1.1.1 ", Ipv4Addr::new(130, 1, 1, 1)); - test("nonsense", fb); - test("400.0.0.1", fb); - test("120.0.0.1.0", fb); - } -} diff --git a/crates/websocket-proxy/src/subscriber.rs b/crates/websocket-proxy/src/subscriber.rs deleted file mode 100644 index 9c2d3474..00000000 --- a/crates/websocket-proxy/src/subscriber.rs +++ /dev/null @@ -1,398 +0,0 @@ -use crate::metrics::Metrics; -use axum::http::Uri; -use backoff::{ExponentialBackoff, backoff::Backoff}; -use futures::StreamExt; -use std::sync::Arc; -use std::time::Duration; -use tokio::select; -use tokio_tungstenite::tungstenite::Error::ConnectionClosed; -use tokio_tungstenite::tungstenite::Message; -use tokio_tungstenite::{connect_async, tungstenite::Error}; -use tokio_util::sync::CancellationToken; -use tracing::{error, info, trace, warn}; - -pub struct WebsocketSubscriber -where - F: Fn(String) + Send + Sync + 'static, -{ - uri: Uri, - handler: F, - backoff: ExponentialBackoff, - metrics: Arc, -} - -impl WebsocketSubscriber -where - F: Fn(String) + Send + Sync + 'static, -{ - pub fn new(uri: Uri, handler: F, max_interval: u64, metrics: Arc) -> Self { - let backoff = ExponentialBackoff { - initial_interval: Duration::from_secs(1), - max_interval: Duration::from_secs(max_interval), - max_elapsed_time: None, // Will retry indefinitely - ..Default::default() - }; - - Self { - uri, - handler, - backoff, - metrics, - } - } - - pub async fn run(&mut self, token: CancellationToken) { - info!( - message = "starting upstream subscription", - uri = self.uri.to_string() - ); - loop { - select! { - _ = token.cancelled() => { - info!( - message = "cancelled upstream subscription", - uri = self.uri.to_string() - ); - return; - } - result = self.connect_and_listen() => { - match result { - Ok(()) => { - info!( - message = "upstream connection closed", - uri = self.uri.to_string() - ); - } - Err(e) => { - error!( - message = "upstream websocket error", - uri = self.uri.to_string(), - error = e.to_string() - ); - self.metrics.upstream_errors.increment(1); - // Decrement the active connections count when connection fails - self.metrics.upstream_connections.decrement(1); - - if let Some(duration) = self.backoff.next_backoff() { - warn!( - message = "reconnecting", - uri = self.uri.to_string(), - seconds = duration.as_secs() - ); - select! { - _ = token.cancelled() => { - info!( - message = "cancelled subscriber during backoff", - uri = self.uri.to_string() - ); - return - } - _ = tokio::time::sleep(duration) => {} - } - } - } - } - } - } - } - } - - async fn connect_and_listen(&mut self) -> Result<(), Error> { - info!( - message = "connecting to websocket", - uri = self.uri.to_string() - ); - - // Increment connection attempts counter for metrics - self.metrics.upstream_connection_attempts.increment(1); - - // Modified connection with success/failure metrics tracking - let (ws_stream, _) = match connect_async(&self.uri).await { - Ok(connection) => { - // Track successful connections - self.metrics.upstream_connection_successes.increment(1); - connection - } - Err(e) => { - // Track failed connections - self.metrics.upstream_connection_failures.increment(1); - return Err(e); - } - }; - - info!( - message = "websocket connection established", - uri = self.uri.to_string() - ); - - // Increment active connections counter - self.metrics.upstream_connections.increment(1); - // Reset backoff timer on successful connection - self.backoff.reset(); - - let (_, mut read) = ws_stream.split(); - - while let Some(message) = read.next().await { - self.handle_message(message).await?; - } - - Ok(()) - } - - async fn handle_message(&self, message: Result) -> Result<(), Error> { - let msg = match message { - Ok(msg) => msg, - Err(e) => { - error!( - message = "error receiving message", - uri = self.uri.to_string(), - error = e.to_string() - ); - return Err(e); - } - }; - - match msg { - Message::Text(text) => { - trace!( - message = "received text message", - uri = self.uri.to_string(), - payload = text.as_str() - ); - self.metrics - .message_received_from_upstream(self.uri.to_string().as_str()); - (self.handler)(text.to_string()); - } - Message::Binary(data) => { - warn!( - message = "received binary message, unsupported", - uri = self.uri.to_string(), - size = data.len() - ); - } - Message::Close(_) => { - info!( - message = "received close frame from upstream", - uri = self.uri.to_string() - ); - return Err(ConnectionClosed); - } - _ => {} - } - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::metrics::Metrics; - use axum::http::Uri; - use futures::SinkExt; - use std::net::SocketAddr; - use std::sync::{Arc, Mutex}; - use tokio::net::{TcpListener, TcpStream}; - use tokio::sync::broadcast; - use tokio::time::{Duration, sleep, timeout}; - use tokio_tungstenite::{accept_async, tungstenite::Message}; - - struct MockServer { - addr: SocketAddr, - message_sender: broadcast::Sender, - shutdown: CancellationToken, - } - - impl MockServer { - async fn new() -> Self { - let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); - let addr = listener.local_addr().unwrap(); - let (tx, _) = broadcast::channel::(100); - let shutdown = CancellationToken::new(); - let shutdown_clone = shutdown.clone(); - let tx_clone = tx.clone(); - - tokio::spawn(async move { - loop { - select! { - _ = shutdown_clone.cancelled() => { - break; - } - accept_result = listener.accept() => { - match accept_result { - Ok((stream, _)) => { - let tx = tx_clone.clone(); - let shutdown = shutdown_clone.clone(); - tokio::spawn(async move { - Self::handle_connection(stream, tx, shutdown).await; - }); - } - Err(e) => { - eprintln!("Failed to accept: {}", e); - break; - } - } - } - } - } - }); - - Self { - addr, - message_sender: tx, - shutdown, - } - } - - async fn handle_connection( - stream: TcpStream, - tx: broadcast::Sender, - shutdown: CancellationToken, - ) { - let ws_stream = match accept_async(stream).await { - Ok(ws_stream) => ws_stream, - Err(e) => { - eprintln!("Failed to accept websocket: {}", e); - return; - } - }; - - let (mut ws_sender, _) = ws_stream.split(); - - let mut rx = tx.subscribe(); - - loop { - select! { - _ = shutdown.cancelled() => { - break; - } - msg = rx.recv() => { - match msg { - Ok(text) => { - if let Err(e) = ws_sender.send(Message::Text(text.into())).await { - eprintln!("Error sending message: {}", e); - break; - } - } - Err(_) => { - break; - } - } - } - } - } - } - - async fn send_message( - &self, - msg: &str, - ) -> Result> { - self.message_sender.send(msg.to_string()) - } - - async fn shutdown(self) { - self.shutdown.cancel(); - } - - fn uri(&self) -> Uri { - format!("ws://{}", self.addr) - .parse() - .expect("Failed to parse URI") - } - } - - #[tokio::test] - async fn test_multiple_subscribers_single_listener() { - // Create two mock servers - let server1 = MockServer::new().await; - let server2 = MockServer::new().await; - - // Create a receiver for the messages - let received_messages = Arc::new(Mutex::new(Vec::new())); - let received_clone = received_messages.clone(); - - // Create a listener function that will be shared by both subscribers - let listener = move |data: String| { - if let Ok(mut messages) = received_clone.lock() { - messages.push(data); - } - }; - - // Create metrics - let metrics = Arc::new(Metrics::default()); - - // Create cancellation token - let token = CancellationToken::new(); - let token_clone1 = token.clone(); - let token_clone2 = token.clone(); - - // Create and run the first subscriber - let uri1 = server1.uri(); - let listener_clone1 = listener.clone(); - let metrics_clone1 = metrics.clone(); - - let mut subscriber1 = - WebsocketSubscriber::new(uri1.clone(), listener_clone1, 5, metrics_clone1); - - // Create and run the second subscriber - let uri2 = server2.uri(); - let listener_clone2 = listener.clone(); - let metrics_clone2 = metrics.clone(); - - let mut subscriber2 = - WebsocketSubscriber::new(uri2.clone(), listener_clone2, 5, metrics_clone2); - - // Spawn tasks for subscribers - let task1 = tokio::spawn(async move { - subscriber1.run(token_clone1).await; - }); - - let task2 = tokio::spawn(async move { - subscriber2.run(token_clone2).await; - }); - - // Wait for connections to establish - sleep(Duration::from_millis(500)).await; - - // Send different messages from each server - let _ = server1.send_message("Message from server 1").await; - let _ = server2.send_message("Message from server 2").await; - - // Wait for messages to be processed - sleep(Duration::from_millis(500)).await; - - // Send more messages to ensure continuous operation - let _ = server1.send_message("Another message from server 1").await; - let _ = server2.send_message("Another message from server 2").await; - - // Wait for messages to be processed - sleep(Duration::from_millis(500)).await; - - // Cancel the token to shut down subscribers - token.cancel(); - - // Wait for tasks to complete - let _ = timeout(Duration::from_secs(1), task1).await; - let _ = timeout(Duration::from_secs(1), task2).await; - - // Shutdown the mock servers - server1.shutdown().await; - server2.shutdown().await; - - // Verify that messages were received - let messages = match received_messages.lock() { - Ok(guard) => guard, - Err(poisoned) => poisoned.into_inner(), - }; - - assert_eq!(messages.len(), 4); - - // Check that we received messages from both servers - assert!(messages.contains(&"Message from server 1".to_string())); - assert!(messages.contains(&"Message from server 2".to_string())); - assert!(messages.contains(&"Another message from server 1".to_string())); - assert!(messages.contains(&"Another message from server 2".to_string())); - - assert!(!messages.is_empty()); - } -} diff --git a/crates/websocket-proxy/tests/integration.rs b/crates/websocket-proxy/tests/integration.rs deleted file mode 100644 index f074b5c5..00000000 --- a/crates/websocket-proxy/tests/integration.rs +++ /dev/null @@ -1,349 +0,0 @@ -use futures::StreamExt; -use std::collections::HashMap; -use std::collections::hash_map::Entry; -use std::error::Error; -use std::net::SocketAddr; -use std::sync::{Arc, Mutex}; -use std::time::Duration; -use tokio::net::TcpListener; -use tokio::sync::broadcast; -use tokio::sync::broadcast::Sender; -use tokio::task::JoinHandle; -use tokio_tungstenite::connect_async; -use tokio_util::sync::CancellationToken; -use tracing::error; -use websocket_proxy::auth::Authentication; -use websocket_proxy::metrics::Metrics; -use websocket_proxy::rate_limit::InMemoryRateLimit; -use websocket_proxy::registry::Registry; -use websocket_proxy::server::Server; - -struct TestHarness { - received_messages: Arc>>>, - clients_failed_to_connect: Arc>>, - current_client_id: usize, - cancel_token: CancellationToken, - server: Server, - server_addr: SocketAddr, - client_id_to_handle: HashMap>, - sender: Sender>, -} - -impl TestHarness { - async fn alloc_port() -> SocketAddr { - let address = SocketAddr::from(([127, 0, 0, 1], 0)); - let listener = TcpListener::bind(&address).await.unwrap(); - listener.local_addr().unwrap() - } - fn new(addr: SocketAddr) -> TestHarness { - TestHarness::new_with_auth(addr, None) - } - - fn new_with_auth(addr: SocketAddr, auth: Option) -> TestHarness { - let (sender, _) = broadcast::channel(5); - let metrics = Arc::new(Metrics::default()); - let registry = Registry::new(sender.clone(), metrics.clone()); - let rate_limited = Arc::new(InMemoryRateLimit::new(3, 10)); - - Self { - received_messages: Arc::new(Mutex::new(HashMap::new())), - clients_failed_to_connect: Arc::new(Mutex::new(HashMap::new())), - current_client_id: 0, - cancel_token: CancellationToken::new(), - server: Server::new( - addr, - registry, - metrics, - rate_limited, - auth, - "header".to_string(), - ), - server_addr: addr, - client_id_to_handle: HashMap::new(), - sender, - } - } - - async fn healthcheck(&self) -> Result<(), Box> { - let url = format!("http://{}/healthz", self.server_addr); - let response = reqwest::get(url).await?; - match response.error_for_status() { - Ok(_) => Ok(()), - Err(e) => Err(e.into()), - } - } - - async fn start_server(&mut self) { - let cancel_token = self.cancel_token.clone(); - let server = self.server.clone(); - - // todo! - let _server_handle = tokio::spawn(async move { - _ = server.listen(cancel_token).await; - }); - - let mut healthy = true; - for _ in 0..5 { - let resp = self.healthcheck().await; - match resp { - Ok(_) => { - healthy = true; - break; - } - Err(_) => { - tokio::time::sleep(Duration::from_millis(25)).await; - } - } - } - - assert!(healthy); - } - - async fn can_connect(&mut self, path: &str) -> bool { - let uri = format!("ws://{}/{}", self.server_addr, path); - (connect_async(uri).await).is_ok() - } - - fn connect_client(&mut self) -> usize { - let uri = format!("ws://{}/ws", self.server_addr); - - let client_id = self.current_client_id; - self.current_client_id += 1; - - let results = self.received_messages.clone(); - let failed_conns = self.clients_failed_to_connect.clone(); - - let handle = tokio::spawn(async move { - let (ws_stream, _) = match connect_async(uri).await { - Ok(results) => results, - Err(_) => { - failed_conns.lock().unwrap().insert(client_id, true); - return; - } - }; - - let (_, mut read) = ws_stream.split(); - - loop { - match read.next().await { - Some(Ok(msg)) => { - match results.lock().unwrap().entry(client_id) { - Entry::Occupied(o) => { - o.into_mut().push(msg.to_string()); - } - Entry::Vacant(v) => { - v.insert(vec![msg.to_string()]); - } - }; - } - Some(Err(e)) => { - error!(message = "error receiving message", error = e.to_string()); - } - None => {} - } - } - }); - - self.client_id_to_handle.insert(client_id, handle); - client_id - } - - fn send_messages(&mut self, messages: Vec<&str>) { - let messages: Vec> = messages - .into_iter() - .map(|m| m.as_bytes().to_vec()) - .collect(); - - for message in messages.iter() { - match self.sender.send(message.clone()) { - Ok(_) => {} - Err(_) => { - assert!(false) - } - } - } - } - - async fn wait_for_messages_to_drain(&mut self) { - let mut drained = false; - for _ in 0..5 { - let len = self.sender.len(); - if len > 0 { - tokio::time::sleep(Duration::from_millis(5)).await; - continue; - } else { - drained = true; - break; - } - } - assert!(drained); - } - - fn messages_for_client(&mut self, client_id: usize) -> Vec { - match self.received_messages.lock().unwrap().get(&client_id) { - Some(messages) => messages.clone(), - None => vec![], - } - } - - async fn stop_client(&mut self, client_id: usize) { - if let Some(handle) = self.client_id_to_handle.remove(&client_id) { - handle.abort(); - _ = handle.await; - } else { - assert!(false) - } - } -} - -#[tokio::test] -async fn test_healthcheck() { - let addr = TestHarness::alloc_port().await; - let mut harness = TestHarness::new(addr); - assert!(harness.healthcheck().await.is_err()); - harness.start_server().await; - assert!(harness.healthcheck().await.is_ok()); -} - -#[tokio::test] -async fn test_clients_receive_messages() { - let addr = TestHarness::alloc_port().await; - - let mut harness = TestHarness::new(addr); - harness.start_server().await; - - let client_one = harness.connect_client(); - let client_two = harness.connect_client(); - - tokio::time::sleep(Duration::from_millis(100)).await; - - harness.send_messages(vec!["one", "two"]); - harness.wait_for_messages_to_drain().await; - - assert_eq!(vec!["one", "two"], harness.messages_for_client(client_one)); - assert_eq!(vec!["one", "two"], harness.messages_for_client(client_two)); -} - -#[tokio::test] -async fn test_server_limits_connections() { - let addr = TestHarness::alloc_port().await; - - let mut harness = TestHarness::new(addr); - harness.start_server().await; - - let client_one = harness.connect_client(); - let client_two = harness.connect_client(); - let client_three = harness.connect_client(); - let client_four = harness.connect_client(); - - tokio::time::sleep(Duration::from_millis(100)).await; - - harness.send_messages(vec!["one", "two"]); - harness.wait_for_messages_to_drain().await; - - assert_eq!(vec!["one", "two"], harness.messages_for_client(client_one)); - assert_eq!(vec!["one", "two"], harness.messages_for_client(client_two)); - assert_eq!( - vec!["one", "two"], - harness.messages_for_client(client_three) - ); - - // Client four was not able to be setup as the test has a limit of three - assert!(harness.messages_for_client(client_four).is_empty()); - assert!(harness.clients_failed_to_connect.lock().unwrap()[&client_four]); -} - -#[tokio::test] -async fn test_deregister() { - let addr = TestHarness::alloc_port().await; - - let mut harness = TestHarness::new(addr); - harness.start_server().await; - - assert_eq!(harness.sender.receiver_count(), 0); - - let client_one = harness.connect_client(); - let client_two = harness.connect_client(); - let client_three = harness.connect_client(); - - tokio::time::sleep(Duration::from_millis(100)).await; - - assert_eq!(harness.sender.receiver_count(), 3); - - harness.send_messages(vec!["one", "two"]); - harness.wait_for_messages_to_drain().await; - - assert_eq!(vec!["one", "two"], harness.messages_for_client(client_one)); - assert_eq!(vec!["one", "two"], harness.messages_for_client(client_two)); - assert_eq!( - vec!["one", "two"], - harness.messages_for_client(client_three) - ); - - harness.stop_client(client_three).await; - tokio::time::sleep(Duration::from_millis(100)).await; - - // It takes a couple of messages for dead clients to disconnect. - harness.send_messages(vec!["three"]); - harness.wait_for_messages_to_drain().await; - harness.send_messages(vec!["four"]); - harness.wait_for_messages_to_drain().await; - - // Client three is disconnected - assert_eq!(harness.sender.receiver_count(), 2); - - let client_four = harness.connect_client(); - tokio::time::sleep(Duration::from_millis(100)).await; - assert_eq!(harness.sender.receiver_count(), 3); - - harness.send_messages(vec!["five"]); - harness.wait_for_messages_to_drain().await; - harness.send_messages(vec!["six"]); - harness.wait_for_messages_to_drain().await; - - assert_eq!( - vec!["one", "two", "three", "four", "five", "six"], - harness.messages_for_client(client_one) - ); - assert_eq!( - vec!["one", "two", "three", "four", "five", "six"], - harness.messages_for_client(client_two) - ); - assert_eq!( - vec!["one", "two"], - harness.messages_for_client(client_three) - ); - assert_eq!( - vec!["five", "six"], - harness.messages_for_client(client_four) - ); -} - -#[tokio::test] -async fn test_authentication_disables_public_endpoint() { - let addr = TestHarness::alloc_port().await; - let auth = Authentication::none(); - - let mut harness = TestHarness::new_with_auth(addr, Some(auth)); - harness.start_server().await; - - assert!(!(harness.can_connect("ws").await)); -} - -#[tokio::test] -async fn test_authentication_allows_known_api_keys() { - let addr = TestHarness::alloc_port().await; - let auth = Authentication::new(HashMap::from([ - ("key1".to_string(), "app1".to_string()), - ("key2".to_string(), "app2".to_string()), - ("key3".to_string(), "app3".to_string()), - ])); - - let mut harness = TestHarness::new_with_auth(addr, Some(auth)); - harness.start_server().await; - - assert!(harness.can_connect("ws/key1").await); - assert!(harness.can_connect("ws/key2").await); - assert!(harness.can_connect("ws/key3").await); - assert!(!(harness.can_connect("ws/key4").await)); -} From ba6b3e49d1370d8f6c642d356a0ca58ffbbacfa3 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 19 Aug 2025 13:44:46 -0700 Subject: [PATCH 087/114] feat: remove unused stuff --- crates/flashblocks-rpc/src/flashblocks.rs | 34 +- .../rollup-boost/src/flashblocks/inbound.rs | 299 --------------- .../rollup-boost/src/flashblocks/launcher.rs | 31 -- .../rollup-boost/src/flashblocks/metrics.rs | 33 -- crates/rollup-boost/src/flashblocks/mod.rs | 9 - .../rollup-boost/src/flashblocks/outbound.rs | 227 ----------- .../rollup-boost/src/flashblocks/service.rs | 356 +----------------- 7 files changed, 2 insertions(+), 987 deletions(-) delete mode 100644 crates/rollup-boost/src/flashblocks/inbound.rs delete mode 100644 crates/rollup-boost/src/flashblocks/launcher.rs delete mode 100644 crates/rollup-boost/src/flashblocks/metrics.rs delete mode 100644 crates/rollup-boost/src/flashblocks/outbound.rs diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index 159ed716..d90427f5 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -7,7 +7,7 @@ use op_alloy_network::Optimism; use reth_optimism_chainspec::OpChainSpec; use reth_rpc_eth_api::{RpcBlock, RpcReceipt}; use rollup_boost::FlashblocksPayloadV1; -use std::{io::Read, sync::Arc}; +use std::sync::Arc; use tracing::error; #[derive(Debug, Clone)] @@ -45,38 +45,6 @@ impl FlashblocksOverlay { } } -enum InternalMessage { - NewPayload(FlashblocksPayloadV1), -} - -fn try_decode_message(bytes: &[u8]) -> eyre::Result { - let text = try_parse_message(bytes)?; - - let payload: FlashblocksPayloadV1 = match serde_json::from_str(&text) { - Ok(m) => m, - Err(e) => { - return Err(eyre::eyre!("failed to parse message: {}", e)); - } - }; - - Ok(payload) -} - -fn try_parse_message(bytes: &[u8]) -> eyre::Result { - if let Ok(text) = String::from_utf8(bytes.to_vec()) { - if text.trim_start().starts_with("{") { - return Ok(text); - } - } - - let mut decompressor = brotli::Decompressor::new(bytes, 4096); - let mut decompressed = Vec::new(); - decompressor.read_to_end(&mut decompressed)?; - - let text = String::from_utf8(decompressed)?; - Ok(text) -} - #[async_trait] impl FlashblocksApi for FlashblocksOverlay { async fn block_by_number(&self, full: bool) -> Option> { diff --git a/crates/rollup-boost/src/flashblocks/inbound.rs b/crates/rollup-boost/src/flashblocks/inbound.rs deleted file mode 100644 index a5f6e053..00000000 --- a/crates/rollup-boost/src/flashblocks/inbound.rs +++ /dev/null @@ -1,299 +0,0 @@ -use std::time::Duration; - -use super::{metrics::FlashblocksWsInboundMetrics, primitives::FlashblocksPayloadV1}; -use futures::{SinkExt, StreamExt}; -use tokio::{sync::mpsc, time::interval}; -use tokio_tungstenite::{connect_async, tungstenite::Message}; -use tokio_util::sync::CancellationToken; -use tracing::{error, info}; -use url::Url; - -#[derive(Debug, thiserror::Error)] -enum FlashblocksReceiverError { - #[error("WebSocket connection failed: {0}")] - Connection(#[from] tokio_tungstenite::tungstenite::Error), - - #[error("Ping failed")] - PingFailed, - - #[error("Read timeout")] - ReadTimeout, - - #[error("Connection error: {0}")] - ConnectionError(String), - - #[error("Connection closed")] - ConnectionClosed, - - #[error("Task panicked: {0}")] - TaskPanic(String), - - #[error("Failed to send message to sender: {0}")] - SendError(#[from] Box>), -} - -pub struct FlashblocksReceiverService { - url: Url, - sender: mpsc::Sender, - reconnect_ms: u64, - metrics: FlashblocksWsInboundMetrics, -} - -impl FlashblocksReceiverService { - pub fn new(url: Url, sender: mpsc::Sender, reconnect_ms: u64) -> Self { - Self { - url, - sender, - reconnect_ms, - metrics: Default::default(), - } - } - - pub async fn run(self) { - loop { - if let Err(e) = self.connect_and_handle().await { - error!("Flashblocks receiver connection error, retrying in 5 seconds: {e}"); - self.metrics.reconnect_attempts.increment(1); - self.metrics.connection_status.set(0); - tokio::time::sleep(std::time::Duration::from_millis(self.reconnect_ms)).await; - } else { - break; - } - } - } - - async fn connect_and_handle(&self) -> Result<(), FlashblocksReceiverError> { - let (ws_stream, _) = connect_async(self.url.as_str()).await?; - let (mut write, mut read) = ws_stream.split(); - - info!("Connected to Flashblocks receiver at {}", self.url); - self.metrics.connection_status.set(1); - - let cancel_token = CancellationToken::new(); - let cancel_for_ping = cancel_token.clone(); - - let ping_task = tokio::spawn(async move { - let mut ping_interval = interval(Duration::from_millis(500)); - - loop { - tokio::select! { - _ = ping_interval.tick() => { - if write.send(Message::Ping(Default::default())).await.is_err() { - return Err(FlashblocksReceiverError::PingFailed); - } - } - _ = cancel_for_ping.cancelled() => { - tracing::debug!("Ping task cancelled"); - return Ok(()); - } - } - } - }); - - let sender = self.sender.clone(); - let metrics = self.metrics.clone(); - - let read_timeout = Duration::from_millis(1500); - let message_handle = tokio::spawn(async move { - loop { - let result = tokio::time::timeout(read_timeout, read.next()) - .await - .map_err(|_| FlashblocksReceiverError::ReadTimeout)?; - - match result { - Some(Ok(msg)) => match msg { - Message::Text(text) => { - metrics.messages_received.increment(1); - if let Ok(flashblocks_msg) = - serde_json::from_str::(&text) - { - sender.send(flashblocks_msg).await.map_err(|e| { - FlashblocksReceiverError::SendError(Box::new(e)) - })?; - } - } - Message::Close(_) => { - return Err(FlashblocksReceiverError::ConnectionClosed); - } - _ => {} - }, - Some(Err(e)) => { - return Err(FlashblocksReceiverError::ConnectionError(e.to_string())); - } - None => { - return Err(FlashblocksReceiverError::ReadTimeout); - } - }; - } - }); - - let result = tokio::select! { - result = message_handle => { - result.map_err(|e| FlashblocksReceiverError::TaskPanic(e.to_string()))? - }, - result = ping_task => { - result.map_err(|e| FlashblocksReceiverError::TaskPanic(e.to_string()))? - }, - }; - - cancel_token.cancel(); - result - } -} - -#[cfg(test)] -mod tests { - use futures::SinkExt; - use tokio::sync::watch; - use tokio_tungstenite::{accept_async, tungstenite::Utf8Bytes}; - - use super::*; - use std::net::{SocketAddr, TcpListener}; - - async fn start( - addr: SocketAddr, - ) -> eyre::Result<( - watch::Sender, - mpsc::Sender, - mpsc::Receiver<()>, - url::Url, - )> { - let (term_tx, mut term_rx) = watch::channel(false); - let (send_tx, mut send_rx) = mpsc::channel::(100); - let (send_ping_tx, send_ping_rx) = mpsc::channel::<()>(100); - - let listener = TcpListener::bind(addr)?; - let url = Url::parse(&format!("ws://{addr}"))?; - - listener - .set_nonblocking(true) - .expect("Failed to set TcpListener socket to non-blocking"); - - let listener = tokio::net::TcpListener::from_std(listener) - .expect("Failed to convert TcpListener to tokio TcpListener"); - - tokio::spawn(async move { - loop { - tokio::select! { - _ = term_rx.changed() => { - if *term_rx.borrow() { - return; - } - } - - result = listener.accept() => { - match result { - Ok((connection, _addr)) => { - match accept_async(connection).await { - Ok(ws_stream) => { - let (mut write, mut read) = ws_stream.split(); - - loop { - tokio::select! { - Some(msg) = send_rx.recv() => { - let serialized = serde_json::to_string(&msg).unwrap(); - let utf8_bytes = Utf8Bytes::from(serialized); - - write.send(Message::Text(utf8_bytes)).await.unwrap(); - }, - msg = read.next() => { - match msg { - // we need to read for the library to handle pong messages - Some(Ok(Message::Ping(_))) => { - send_ping_tx.send(()).await.unwrap(); - }, - _ => {} - } - } - _ = term_rx.changed() => { - if *term_rx.borrow() { - return; - } - } - } - } - } - Err(e) => { - eprintln!("Failed to accept WebSocket connection: {}", e); - } - } - } - Err(e) => { - // Optionally break or continue based on error type - if e.kind() == std::io::ErrorKind::Interrupted { - break; - } - } - } - } - } - } - }); - - Ok((term_tx, send_tx, send_ping_rx, url)) - } - - #[tokio::test] - async fn test_flashblocks_receiver_service() -> eyre::Result<()> { - let addr = "127.0.0.1:8080".parse::().unwrap(); - let (term, send_msg, _, url) = start(addr).await?; - - let (tx, mut rx) = mpsc::channel(100); - - let service = FlashblocksReceiverService::new(url, tx, 100); - let _ = tokio::spawn(async move { - service.run().await; - }); - - // Send a message to the websocket server - send_msg - .send(FlashblocksPayloadV1::default()) - .await - .expect("Failed to send message"); - - let msg = rx.recv().await.expect("Failed to receive message"); - assert_eq!(msg, FlashblocksPayloadV1::default()); - - // Drop the websocket server and start another one with the same address - // The FlashblocksReceiverService should reconnect to the new server - term.send(true).unwrap(); - - // sleep for 1 second to ensure the server is dropped - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - - // start a new server with the same address - let (term, send_msg, _, _url) = start(addr).await?; - send_msg - .send(FlashblocksPayloadV1::default()) - .await - .expect("Failed to send message"); - - let msg = rx.recv().await.expect("Failed to receive message"); - assert_eq!(msg, FlashblocksPayloadV1::default()); - term.send(true).unwrap(); - - Ok(()) - } - - #[tokio::test] - async fn test_flashblocks_receiver_service_ping_pong() -> eyre::Result<()> { - // test that if the builder is not sending any messages back, the service will send - // ping messages to test the connection periodically - - let addr = "127.0.0.1:8081".parse::().unwrap(); - let (_term, _send_msg, mut ping_rx, url) = start(addr).await?; - - let (tx, _rx) = mpsc::channel(100); - let service = FlashblocksReceiverService::new(url, tx, 100); - let _ = tokio::spawn(async move { - service.run().await; - }); - - // even if we do not send any messages, we should receive pings to keep the connection alive - for _ in 0..10 { - ping_rx.recv().await.expect("Failed to receive ping"); - } - - Ok(()) - } -} diff --git a/crates/rollup-boost/src/flashblocks/launcher.rs b/crates/rollup-boost/src/flashblocks/launcher.rs deleted file mode 100644 index fd8f0fb9..00000000 --- a/crates/rollup-boost/src/flashblocks/launcher.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::flashblocks::inbound::FlashblocksReceiverService; -use crate::{FlashblocksService, RpcClient}; -use core::net::SocketAddr; -use tokio::sync::mpsc; -use url::Url; - -pub struct Flashblocks {} - -impl Flashblocks { - pub fn run( - builder_url: RpcClient, - flashblocks_url: Url, - outbound_addr: SocketAddr, - reconnect_ms: u64, - ) -> eyre::Result { - let (tx, rx) = mpsc::channel(100); - - let receiver = FlashblocksReceiverService::new(flashblocks_url, tx, reconnect_ms); - tokio::spawn(async move { - let _ = receiver.run().await; - }); - - let service = FlashblocksService::new(builder_url, outbound_addr)?; - let mut service_handle = service.clone(); - tokio::spawn(async move { - service_handle.run(rx).await; - }); - - Ok(service) - } -} diff --git a/crates/rollup-boost/src/flashblocks/metrics.rs b/crates/rollup-boost/src/flashblocks/metrics.rs deleted file mode 100644 index e1cf3508..00000000 --- a/crates/rollup-boost/src/flashblocks/metrics.rs +++ /dev/null @@ -1,33 +0,0 @@ -use metrics::{Counter, Gauge, Histogram}; -use metrics_derive::Metrics; - -#[derive(Metrics, Clone)] -#[metrics(scope = "flashblocks.ws_inbound")] -pub struct FlashblocksWsInboundMetrics { - /// Total number of WebSocket reconnection attempts - #[metric(describe = "Total number of WebSocket reconnection attempts")] - pub reconnect_attempts: Counter, - - /// Current WebSocket connection status (1 = connected, 0 = disconnected) - #[metric(describe = "Current WebSocket connection status")] - pub connection_status: Gauge, - - #[metric(describe = "Number of flashblock messages received from builder")] - pub messages_received: Counter, -} - -#[derive(Metrics, Clone)] -#[metrics(scope = "flashblocks.service")] -pub struct FlashblocksServiceMetrics { - #[metric(describe = "Number of errors when extending payload")] - pub extend_payload_errors: Counter, - - #[metric(describe = "Number of times the current payload ID has been set")] - pub current_payload_id_mismatch: Counter, - - #[metric(describe = "Number of messages processed by the service")] - pub messages_processed: Counter, - - #[metric(describe = "Number of flashblocks used to build a block")] - pub flashblocks_used: Histogram, -} diff --git a/crates/rollup-boost/src/flashblocks/mod.rs b/crates/rollup-boost/src/flashblocks/mod.rs index c5a9412e..b78ba788 100644 --- a/crates/rollup-boost/src/flashblocks/mod.rs +++ b/crates/rollup-boost/src/flashblocks/mod.rs @@ -1,16 +1,9 @@ -mod launcher; - -pub use launcher::*; - mod primitives; mod service; pub use primitives::*; pub use service::*; -mod inbound; -mod outbound; - mod args; pub use args::*; @@ -19,5 +12,3 @@ pub use error::*; mod p2p; pub use p2p::*; - -mod metrics; diff --git a/crates/rollup-boost/src/flashblocks/outbound.rs b/crates/rollup-boost/src/flashblocks/outbound.rs deleted file mode 100644 index e1b2c982..00000000 --- a/crates/rollup-boost/src/flashblocks/outbound.rs +++ /dev/null @@ -1,227 +0,0 @@ -use super::primitives::FlashblocksPayloadV1; -use core::{ - fmt::{Debug, Formatter}, - net::SocketAddr, - pin::Pin, - sync::atomic::{AtomicUsize, Ordering}, - task::{Context, Poll}, -}; -use futures::{Sink, SinkExt}; -use std::{io, net::TcpListener, sync::Arc}; -use tokio::{ - net::TcpStream, - sync::{ - broadcast::{self, Receiver, error::RecvError}, - watch, - }, -}; -use tokio_tungstenite::WebSocketStream; -use tokio_tungstenite::tungstenite::Utf8Bytes; -use tokio_tungstenite::{accept_async, tungstenite::Message}; - -/// A WebSockets publisher that accepts connections from client websockets and broadcasts to them -/// updates about new flashblocks. It maintains a count of sent messages and active subscriptions. -/// -/// This is modelled as a `futures::Sink` that can be used to send `FlashblocksPayloadV1` messages. -pub struct WebSocketPublisher { - sent: Arc, - subs: Arc, - term: watch::Sender, - pipe: broadcast::Sender, -} - -impl WebSocketPublisher { - pub fn new(addr: SocketAddr) -> io::Result { - let (pipe, _) = broadcast::channel(100); - let (term, _) = watch::channel(false); - - let sent = Arc::new(AtomicUsize::new(0)); - let subs = Arc::new(AtomicUsize::new(0)); - let listener = TcpListener::bind(addr)?; - - tokio::spawn(listener_loop( - listener, - pipe.subscribe(), - term.subscribe(), - Arc::clone(&sent), - Arc::clone(&subs), - )); - - Ok(Self { - sent, - subs, - term, - pipe, - }) - } - - pub fn publish(&self, payload: &FlashblocksPayloadV1) -> io::Result<()> { - // Serialize the payload to a UTF-8 string - // serialize only once, then just copy around only a pointer - // to the serialized data for each subscription. - let serialized = serde_json::to_string(payload)?; - let utf8_bytes = Utf8Bytes::from(serialized); - - // Send the serialized payload to all subscribers - self.pipe - .send(utf8_bytes) - .map_err(|e| io::Error::new(io::ErrorKind::ConnectionAborted, e))?; - Ok(()) - } -} - -impl Drop for WebSocketPublisher { - fn drop(&mut self) { - // Notify the listener loop to terminate - let _ = self.term.send(true); - tracing::info!("WebSocketPublisher dropped, terminating listener loop"); - } -} - -async fn listener_loop( - listener: TcpListener, - receiver: Receiver, - term: watch::Receiver, - sent: Arc, - subs: Arc, -) { - listener - .set_nonblocking(true) - .expect("Failed to set TcpListener socket to non-blocking"); - - let listener = tokio::net::TcpListener::from_std(listener) - .expect("Failed to convert TcpListener to tokio TcpListener"); - - let listen_addr = listener - .local_addr() - .expect("Failed to get local address of listener"); - tracing::info!("Flashblocks WebSocketPublisher listening on {listen_addr}"); - - let mut term = term; - - loop { - let subs = Arc::clone(&subs); - - tokio::select! { - // drop this connection if the `WebSocketPublisher` is dropped - _ = term.changed() => { - if *term.borrow() { - return; - } - } - - // Accept new connections on the websocket listener - // when a new connection is established, spawn a dedicated task to handle - // the connection and broadcast with that connection. - Ok((connection, peer_addr)) = listener.accept() => { - let sent = Arc::clone(&sent); - let term = term.clone(); - let receiver_clone = receiver.resubscribe(); - - match accept_async(connection).await { - Ok(stream) => { - tokio::spawn(async move { - subs.fetch_add(1, Ordering::Relaxed); - tracing::debug!("WebSocket connection established with {}", peer_addr); - - // Handle the WebSocket connection in a dedicated task - broadcast_loop(stream, term, receiver_clone, sent).await; - - subs.fetch_sub(1, Ordering::Relaxed); - tracing::debug!("WebSocket connection closed for {}", peer_addr); - }); - } - Err(e) => { - tracing::warn!("Failed to accept WebSocket connection from {peer_addr}: {e}"); - } - } - } - } - } -} - -/// An instance of this loop is spawned for each connected WebSocket client. -/// It listens for broadcast updates about new flashblocks and sends them to the client. -/// It also handles termination signals to gracefully close the connection. -/// Any connectivity errors will terminate the loop, which will in turn -/// decrement the subscription count in the `WebSocketPublisher`. -async fn broadcast_loop( - stream: WebSocketStream, - term: watch::Receiver, - blocks: broadcast::Receiver, - sent: Arc, -) { - let mut term = term; - let mut blocks = blocks; - let mut stream = stream; - let Ok(peer_addr) = stream.get_ref().peer_addr() else { - return; - }; - - loop { - tokio::select! { - // Check if the publisher is terminated - _ = term.changed() => { - if *term.borrow() { - tracing::info!("WebSocketPublisher is terminating, closing broadcast loop"); - return; - } - } - - // Receive payloads from the broadcast channel - payload = blocks.recv() => match payload { - Ok(payload) => { - // Here you would typically send the payload to the WebSocket clients. - // For this example, we just increment the sent counter. - sent.fetch_add(1, Ordering::Relaxed); - - tracing::info!("Broadcasted payload: {:?}", payload); - if let Err(e) = stream.send(Message::Text(payload)).await { - tracing::debug!("Closing flashblocks subscription for {peer_addr}: {e}"); - break; // Exit the loop if sending fails - } - } - Err(RecvError::Closed) => { - tracing::debug!("Broadcast channel closed, exiting broadcast loop"); - return; - } - Err(RecvError::Lagged(_)) => { - tracing::warn!("Broadcast channel lagged, some messages were dropped"); - } - }, - } - } -} - -impl Debug for WebSocketPublisher { - fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { - let subs = self.subs.load(Ordering::Relaxed); - let sent = self.sent.load(Ordering::Relaxed); - - f.debug_struct("WebSocketPublisher") - .field("subs", &subs) - .field("payloads_sent", &sent) - .finish() - } -} - -impl Sink<&FlashblocksPayloadV1> for WebSocketPublisher { - type Error = eyre::Report; - - fn poll_ready(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn start_send(self: Pin<&mut Self>, item: &FlashblocksPayloadV1) -> Result<(), Self::Error> { - self.publish(item)?; - Ok(()) - } - - fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn poll_close(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } -} diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index 04106e03..4cc47119 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -1,45 +1,14 @@ -use super::outbound::WebSocketPublisher; use super::primitives::{ ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, }; -use crate::flashblocks::metrics::FlashblocksServiceMetrics; -use crate::{ - ClientResult, EngineApiExt, FlashblocksError, NewPayload, OpExecutionPayloadEnvelope, - PayloadVersion, RpcClient, -}; +use crate::{FlashblocksError, OpExecutionPayloadEnvelope, PayloadVersion}; use alloy_primitives::U256; use alloy_rpc_types_engine::{ BlobsBundleV1, ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3, }; -use alloy_rpc_types_engine::{ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus}; -use alloy_rpc_types_eth::{Block, BlockNumberOrTag}; -use core::net::SocketAddr; -use jsonrpsee::core::async_trait; use op_alloy_rpc_types_engine::{ OpExecutionPayloadEnvelopeV3, OpExecutionPayloadEnvelopeV4, OpExecutionPayloadV4, - OpPayloadAttributes, }; -use reth_optimism_payload_builder::payload_id_optimism; -use serde::{Deserialize, Serialize}; -use std::io; -use std::sync::Arc; -use tokio::sync::RwLock; -use tokio::sync::mpsc; -use tracing::{error, info}; - -#[derive(Debug, Deserialize, Serialize)] -struct FlashbotsMessage { - method: String, - params: serde_json::Value, - #[serde(default)] - id: Option, -} - -// Simplify actor messages to just handle shutdown -#[derive(Debug)] -enum FlashblocksEngineMessage { - FlashblocksPayloadV1(FlashblocksPayloadV1), -} #[derive(Clone, Debug, Default)] pub struct FlashblockBuilder { @@ -157,326 +126,3 @@ impl FlashblockBuilder { } } } - -#[derive(Clone)] -pub struct FlashblocksService { - client: RpcClient, - - // Current payload ID we're processing (set from external notification) - current_payload_id: Arc>, - - // flashblocks payload being constructed - best_payload: Arc>, - - // websocket publisher for sending valid preconfirmations to clients - ws_pub: Arc, - - metrics: FlashblocksServiceMetrics, -} - -impl FlashblocksService { - pub fn new(client: RpcClient, outbound_addr: SocketAddr) -> io::Result { - let ws_pub = WebSocketPublisher::new(outbound_addr)?.into(); - - Ok(Self { - client, - current_payload_id: Arc::new(RwLock::new(PayloadId::default())), - best_payload: Arc::new(RwLock::new(FlashblockBuilder::new())), - ws_pub, - metrics: Default::default(), - }) - } - - pub async fn get_best_payload( - &self, - version: PayloadVersion, - payload_id: PayloadId, - ) -> Result { - // Check that we have flashblocks for correct payload - if *self.current_payload_id.read().await != payload_id { - // We have outdated `current_payload_id` so we should fallback to get_payload - // Clearing best_payload in here would cause situation when old `get_payload` would clear - // currently built correct flashblocks. - // This will self-heal on the next FCU. - return Err(FlashblocksError::MissingPayload); - } - // consume the best payload and reset the builder - let payload = { - let mut builder = self.best_payload.write().await; - let flashblocks_number = builder.flashblocks.len(); - self.metrics - .flashblocks_used - .record(flashblocks_number as f64); - tracing::Span::current().record("flashblocks_count", flashblocks_number); - // Take payload and place new one in its place in one go to avoid double locking - std::mem::replace(&mut *builder, FlashblockBuilder::new()).into_envelope(version)? - }; - - Ok(payload) - } - - pub async fn set_current_payload_id(&self, payload_id: PayloadId) { - tracing::debug!(message = "Setting current payload ID", payload_id = %payload_id); - *self.current_payload_id.write().await = payload_id; - // Current state won't be useful anymore because chain progressed - *self.best_payload.write().await = FlashblockBuilder::new(); - } - - async fn on_event(&mut self, event: FlashblocksEngineMessage) { - match event { - FlashblocksEngineMessage::FlashblocksPayloadV1(payload) => { - self.metrics.messages_processed.increment(1); - - tracing::debug!( - message = "Received flashblock payload", - payload_id = %payload.payload_id, - index = payload.index - ); - - // make sure the payload id matches the current payload id - let local_payload_id = *self.current_payload_id.read().await; - if local_payload_id != payload.payload_id { - self.metrics.current_payload_id_mismatch.increment(1); - error!( - message = "Payload ID mismatch", - payload_id = %payload.payload_id, - %local_payload_id, - index = payload.index, - ); - return; - } - - if let Err(e) = self.best_payload.write().await.extend(payload.clone()) { - self.metrics.extend_payload_errors.increment(1); - error!( - message = "Failed to extend payload", - error = %e, - payload_id = %payload.payload_id, - index = payload.index, - ); - } else { - // Broadcast the valid message - if let Err(e) = self.ws_pub.publish(&payload) { - error!( - message = "Failed to broadcast payload", - error = %e, - payload_id = %payload.payload_id, - index = payload.index, - ); - } - } - } - } - } - - pub async fn run(&mut self, mut stream: mpsc::Receiver) { - while let Some(event) = stream.recv().await { - self.on_event(FlashblocksEngineMessage::FlashblocksPayloadV1(event)) - .await; - } - } -} - -#[async_trait] -impl EngineApiExt for FlashblocksService { - async fn fork_choice_updated_v3( - &self, - fork_choice_state: ForkchoiceState, - payload_attributes: Option, - ) -> ClientResult { - // Calculate and set expected payload_id - if let Some(attr) = &payload_attributes { - let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attr, 3); - self.set_current_payload_id(payload_id).await; - } - - let resp = self - .client - .fork_choice_updated_v3(fork_choice_state, payload_attributes) - .await?; - - if let Some(payload_id) = resp.payload_id { - let current_payload = *self.current_payload_id.read().await; - if current_payload != payload_id { - tracing::error!( - message = "Payload id returned by builder differs from calculated. Using builder payload id", - builder_payload_id = %payload_id, - calculated_payload_id = %current_payload, - ); - self.set_current_payload_id(payload_id).await; - } else { - tracing::debug!(message = "Forkchoice updated", payload_id = %payload_id); - } - } else { - tracing::debug!(message = "Forkchoice updated with no payload ID"); - } - Ok(resp) - } - - async fn new_payload(&self, new_payload: NewPayload) -> ClientResult { - self.client.new_payload(new_payload).await - } - - async fn get_payload( - &self, - payload_id: PayloadId, - version: PayloadVersion, - ) -> ClientResult { - // First try to get the best flashblocks payload from the builder if it exists - - match self.get_best_payload(version, payload_id).await { - Ok(payload) => { - info!(message = "Returning fb payload"); - Ok(payload) - } - Err(e) => { - error!(message = "Error getting fb best payload, falling back on client", error = %e); - info!(message = "Falling back to get_payload on client", payload_id = %payload_id); - let result = self.client.get_payload(payload_id, version).await?; - Ok(result) - } - } - } - - async fn get_block_by_number( - &self, - number: BlockNumberOrTag, - full: bool, - ) -> ClientResult { - self.client.get_block_by_number(number, full).await - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - PayloadSource, - server::tests::{MockEngineServer, spawn_server}, - }; - use http::Uri; - use reth_rpc_layer::JwtSecret; - use std::str::FromStr; - - /// Test that we fallback to the getPayload method if the flashblocks payload is not available - #[tokio::test] - async fn test_flashblocks_fallback_to_get_payload() -> eyre::Result<()> { - let builder_mock: MockEngineServer = MockEngineServer::new(); - let (_fallback_server, fallback_server_addr) = spawn_server(builder_mock.clone()).await; - let jwt_secret = JwtSecret::random(); - - let builder_auth_rpc = Uri::from_str(&format!("http://{fallback_server_addr}")).unwrap(); - let builder_client = RpcClient::new( - builder_auth_rpc.clone(), - jwt_secret, - 2000, - PayloadSource::Builder, - None, - )?; - - let service = - FlashblocksService::new(builder_client, "127.0.0.1:8000".parse().unwrap()).unwrap(); - - // by default, builder_mock returns a valid payload always - service - .get_payload(PayloadId::default(), PayloadVersion::V3) - .await?; - - let get_payload_requests_builder = builder_mock.get_payload_requests.clone(); - assert_eq!(get_payload_requests_builder.lock().len(), 1); - - Ok(()) - } - - /// Test that we don't return block from flashblocks if payload_id is different - #[tokio::test] - async fn test_flashblocks_different_payload_id() -> eyre::Result<()> { - let builder_mock: MockEngineServer = MockEngineServer::new(); - let (_fallback_server, fallback_server_addr) = spawn_server(builder_mock.clone()).await; - let jwt_secret = JwtSecret::random(); - - let builder_auth_rpc = Uri::from_str(&format!("http://{fallback_server_addr}")).unwrap(); - let builder_client = RpcClient::new( - builder_auth_rpc.clone(), - jwt_secret, - 2000, - PayloadSource::Builder, - None, - )?; - - let service = - FlashblocksService::new(builder_client, "127.0.0.1:8001".parse().unwrap()).unwrap(); - - // Some "random" payload id - *service.current_payload_id.write().await = PayloadId::new([1, 1, 1, 1, 1, 1, 1, 1]); - - // We ensure that request will skip rollup-boost and serve payload from backup if payload id - // don't match - service - .get_payload(PayloadId::default(), PayloadVersion::V3) - .await?; - - let get_payload_requests_builder = builder_mock.get_payload_requests.clone(); - assert_eq!(get_payload_requests_builder.lock().len(), 1); - - Ok(()) - } - - #[tokio::test] - async fn test_flashblocks_builder() -> eyre::Result<()> { - let mut builder = FlashblockBuilder::new(); - - // Error: First payload must have a base - let result = builder.extend(FlashblocksPayloadV1 { - payload_id: PayloadId::default(), - index: 0, - ..Default::default() - }); - assert!(result.is_err()); - assert_eq!(result.unwrap_err(), FlashblocksError::MissingBasePayload); - - // Ok: First payload is correct if it has base and index 0 - let result = builder.extend(FlashblocksPayloadV1 { - payload_id: PayloadId::default(), - index: 0, - base: Some(ExecutionPayloadBaseV1 { - ..Default::default() - }), - ..Default::default() - }); - assert!(result.is_ok()); - - // Error: First payload must have index 0 - let result = builder.extend(FlashblocksPayloadV1 { - payload_id: PayloadId::default(), - index: 1, - base: Some(ExecutionPayloadBaseV1 { - ..Default::default() - }), - ..Default::default() - }); - assert!(result.is_err()); - assert_eq!(result.unwrap_err(), FlashblocksError::UnexpectedBasePayload); - - // Error: Second payload must have a follow-up index - let result = builder.extend(FlashblocksPayloadV1 { - payload_id: PayloadId::default(), - index: 2, - base: None, - ..Default::default() - }); - assert!(result.is_err()); - assert_eq!(result.unwrap_err(), FlashblocksError::InvalidIndex); - - // Ok: Second payload has the correct index - let result = builder.extend(FlashblocksPayloadV1 { - payload_id: PayloadId::default(), - index: 1, - base: None, - ..Default::default() - }); - assert!(result.is_ok()); - - Ok(()) - } -} From 54d87451e94c7765b58c72cdb15bbcc5af66ac79 Mon Sep 17 00:00:00 2001 From: 0xOsiris Date: Wed, 20 Aug 2025 13:23:09 -0700 Subject: [PATCH 088/114] fix: image build configuration --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 99120f50..abc9151f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ # # Based on https://depot.dev/blog/rust-dockerfile-best-practices # -FROM rust:1.89.0 AS base +FROM rust:1.89.0-bookworm AS base ARG FEATURES ARG RELEASE=true @@ -15,7 +15,7 @@ RUN cargo install sccache --version ^0.9 RUN cargo install cargo-chef --version ^0.1 RUN apt-get update \ - && apt-get install -y clang libclang-dev + && apt-get install -y clang libclang-dev gcc ENV CARGO_HOME=/usr/local/cargo ENV RUSTC_WRAPPER=sccache From 58feb62682edac41c89dc320076d6f9e93cdd63c Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 29 Aug 2025 10:11:55 -0700 Subject: [PATCH 089/114] feat: reth update --- Cargo.lock | 1499 +++++++++++++++------------- Cargo.toml | 37 +- crates/flashblocks-node/Cargo.toml | 36 +- crates/flashblocks-rpc/Cargo.toml | 32 +- crates/flashblocks-rpc/src/rpc.rs | 7 +- 5 files changed, 840 insertions(+), 771 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 276007d2..1937cc54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,9 +97,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4195a29a4b87137b2bb02105e746102873bc03561805cf45c0e510c961f160e6" +checksum = "ef8ff73a143281cb77c32006b04af9c047a6b8fe5860e85a88ad325328965355" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda689f7287f15bd3582daba6be8d1545bad3740fd1fb778f629a1fe866bb43b" +checksum = "b7345077623aaa080fc06735ac13b8fa335125c8550f9c4f64135a5bf6f79967" dependencies = [ "alloy-eips", "alloy-primitives", @@ -131,14 +131,14 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-consensus-any" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5659581e41e8fe350ecc3593cb5c9dcffddfd550896390f2b78a07af67b0fa" +checksum = "501f83565d28bdb9d6457dd3b5d646e19db37709d0f27608a26a1839052ddade" dependencies = [ "alloy-consensus", "alloy-eips", @@ -151,9 +151,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e8a436f0aad7df8bb47f144095fba61202265d9f5f09a70b0e3227881a668e" +checksum = "a3f56873f3cac7a2c63d8e98a4314b8311aa96adb1a0f82ae923eb2119809d2c" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -178,7 +178,7 @@ dependencies = [ "crc", "rand 0.8.5", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] @@ -207,14 +207,14 @@ dependencies = [ "rand 0.8.5", "serde", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-eips" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f35887da30b5fc50267109a3c61cd63e6ca1f45967983641053a40ee83468c1" +checksum = "c219a87fb386a75780ddbdbbced242477321887e426b0f946c05815ceabe5e09" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -230,14 +230,16 @@ dependencies = [ "ethereum_ssz", "ethereum_ssz_derive", "serde", + "serde_with", "sha2 0.10.9", + "thiserror 2.0.16", ] [[package]] name = "alloy-evm" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55212170663df0af86b8b88ea08f13e3ee305e6717372e693d3408c0910e2981" +checksum = "0dbe7c66c859b658d879b22e8aaa19546dab726b0639f4649a424ada3d99349e" dependencies = [ "alloy-consensus", "alloy-eips", @@ -247,17 +249,17 @@ dependencies = [ "alloy-sol-types", "auto_impl", "derive_more", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-revm", "revm", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-genesis" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d4009efea6f403b3a80531f9c6f70fc242399498ff71196a1688cc1c901f44" +checksum = "2dbf4c6b1b733ba0efaa6cc5f68786997a19ffcd88ff2ee2ba72fdd42594375e" dependencies = [ "alloy-eips", "alloy-primitives", @@ -269,9 +271,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.2.13" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165210652f71dfc094b051602bafd691f506c54050a174b1cba18fb5ef706a3" +checksum = "a20b180071d4f22db71702329101685ccff2e2a8f400d30a68ba907700163bf5" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -283,9 +285,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459f98c6843f208856f338bfb25e65325467f7aff35dfeb0484d0a76e059134b" +checksum = "125a1c373261b252e53e04d6e92c37d881833afc1315fceab53fd46045695640" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -295,24 +297,24 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883dee3b4020fcb5667ee627b4f401e899dad82bf37b246620339dd980720ed9" +checksum = "334555c323fa2bb98f1d4c242b62da9de8c715557a2ed680a76cefbcac19fefd" dependencies = [ "alloy-primitives", "alloy-sol-types", "http", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", ] [[package]] name = "alloy-network" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6e5b8ac1654a05c224390008e43634a2bdc74e181e02cf8ed591d8b3d4ad08" +checksum = "c7ea377c9650203d7a7da9e8dee7f04906b49a9253f554b110edd7972e75ef34" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -331,14 +333,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-network-primitives" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7980333dd9391719756ac28bc2afa9baa705fc70ffd11dc86ab078dd64477" +checksum = "b9f9ab9a9e92c49a357edaee2d35deea0a32ac8f313cfa37448f04e7e029c9d9" dependencies = [ "alloy-consensus", "alloy-eips", @@ -349,9 +351,9 @@ dependencies = [ [[package]] name = "alloy-op-evm" -version = "0.18.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94815887c4dc3d84a16587b7f2c655a77f3717e058b4b6559650176e31693c4b" +checksum = "ed9b726869a13d5d958f2f78fbef7ce522689c4d40d613c16239f5e286fbeb1a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -359,16 +361,16 @@ dependencies = [ "alloy-op-hardforks", "alloy-primitives", "auto_impl", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-revm", "revm", ] [[package]] name = "alloy-op-hardforks" -version = "0.2.13" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3417f4187eaf7f7fb0d7556f0197bca26f0b23c4bb3aca0c9d566dc1c5d727a2" +checksum = "9b6e8ab92a4b6cf57d84cec62868b7161f40de36b01ffda62455deb3907c9001" dependencies = [ "alloy-chains", "alloy-hardforks", @@ -377,8 +379,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.3.0" -source = "git+https://github.com/alloy-rs/core?rev=8c5713c#8c5713c20e3ed08cf09634ea5cb696d7021002a8" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9485c56de23438127a731a6b4c87803d49faf1a7068dcd1d8768aca3a9edb9" dependencies = [ "alloy-rlp", "arbitrary", @@ -389,7 +392,7 @@ dependencies = [ "foldhash", "getrandom 0.3.3", "hashbrown 0.15.5", - "indexmap 2.10.0", + "indexmap 2.11.0", "itoa", "k256", "keccak-asm", @@ -406,9 +409,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478a42fe167057b7b919cd8b0c2844f0247f667473340dad100eaf969de5754e" +checksum = "9a85361c88c16116defbd98053e3d267054d6b82729cdbef0236f7881590f924" dependencies = [ "alloy-chains", "alloy-consensus", @@ -439,7 +442,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", "url", @@ -448,9 +451,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a99b17987f40a066b29b6b56d75e84cd193b866cac27cae17b59f40338de95" +checksum = "25b1eda077b102b167effaf0c9d9109b1232948a6c7fcaff74abdb5deb562a17" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -487,14 +490,14 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "alloy-rpc-client" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0c6d723fbdf4a87454e2e3a275e161be27edcfbf46e2e3255dd66c138634b6" +checksum = "743fc964abb0106e454e9e8683fb0809fb32940270ef586a58e913531360b302" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -518,9 +521,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41492dac39365b86a954de86c47ec23dcc7452cdb2fde591caadc194b3e34c6" +checksum = "e6445ccdc73c8a97e1794e9f0f91af52fb2bbf9ff004339a801b0293c3928abb" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -531,9 +534,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0f415ad97cc68d2f49eb08214f45c6827a6932a69773594f4ce178f8a41dc0" +checksum = "196e0e38efeb2a5efb515758877765db56b3b18e998b809eb1e5d6fc20fcd097" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -543,9 +546,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10493fa300a2757d8134f584800fef545c15905c95122bed1f6dde0b0d9dae27" +checksum = "242ff10318efd61c4b17ac8584df03a8db1e12146704c08b1b69d070cd4a1ebf" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -555,9 +558,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f7eb22670a972ad6c222a6c6dac3eef905579acffe9d63ab42be24c7d158535" +checksum = "97372c51a14a804fb9c17010e3dd6c117f7866620b264e24b64d2259be44bcdf" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -566,9 +569,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53381ffba0110a8aed4c9f108ef34a382ed21aeefb5f50f91c73451ae68b89aa" +checksum = "a2210006d3ee0b0468e49d81fc8b94ab9f088e65f955f8d56779545735b90873" dependencies = [ "alloy-eips", "alloy-primitives", @@ -577,27 +580,28 @@ dependencies = [ "ethereum_ssz_derive", "serde", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", "tree_hash", "tree_hash_derive", ] [[package]] name = "alloy-rpc-types-debug" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b6f0482c82310366ec3dcf4e5212242f256a69fcf1a26e5017e6704091ee95" +checksum = "a005a343cae9a0d4078d2f85a666493922d4bfb756229ea2a45a4bafd21cb9f1" dependencies = [ "alloy-primitives", "derive_more", "serde", + "serde_with", ] [[package]] name = "alloy-rpc-types-engine" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24c171377c0684e3860385f6d93fbfcc8ecc74f6cce8304c822bf1a50bacce0" +checksum = "0e214c7667f88b2f7e48eb8428eeafcbf6faecda04175c5f4d13fdb2563333ac" dependencies = [ "alloy-consensus", "alloy-eips", @@ -615,9 +619,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b777b98526bbe5b7892ca22a7fd5f18ed624ff664a79f40d0f9f2bf94ba79a84" +checksum = "672286c19528007df058bafd82c67e23247b4b3ebbc538cbddc705a82d8a930f" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -632,14 +636,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-rpc-types-mev" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15e8ccb6c16e196fcc968e16a71cd8ce4160f3ec5871d2ea196b75bf569ac02" +checksum = "fa6c5068a20a19df4481ffd698540af5f3656f401d12d9b3707e8ab90311af1d" dependencies = [ "alloy-consensus", "alloy-eips", @@ -652,23 +656,23 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a854af3fe8fce1cfe319fcf84ee8ba8cda352b14d3dd4221405b5fc6cce9e1" +checksum = "d53c5ea8e10ca72889476343deb98c050da7b85e119a55a2a02a9791cb8242e4" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc803e9b8d16154c856a738c376e002abe4b388e5fef91c8aebc8373e99fd45" +checksum = "bb1c7ee378e899353e05a0d9f5b73b5d57bdac257532c6acd98eaa6b093fe642" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -678,9 +682,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8d2c52adebf3e6494976c8542fbdf12f10123b26e11ad56f77274c16a2a039" +checksum = "1aae653f049267ae7e040eab6c9b9a417064ca1a6cb21e3dd59b9f1131ef048f" dependencies = [ "alloy-primitives", "arbitrary", @@ -690,9 +694,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0494d1e0f802716480aabbe25549c7f6bc2a25ff33b08fd332bbb4b7d06894" +checksum = "d97cedce202f848592b96f7e891503d3adb33739c4e76904da73574290141b93" dependencies = [ "alloy-primitives", "async-trait", @@ -700,14 +704,14 @@ dependencies = [ "either", "elliptic-curve", "k256", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-signer-local" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c2435eb8979a020763ced3fb478932071c56e5f75ea86db41f320915d325ba" +checksum = "83ae7d854db5b7cdd5b9ed7ad13d1e5e034cdd8be85ffef081f61dc6c9e18351" dependencies = [ "alloy-consensus", "alloy-network", @@ -716,46 +720,46 @@ dependencies = [ "async-trait", "k256", "rand 0.8.5", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "alloy-sol-macro" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedac07a10d4c2027817a43cc1f038313fc53c7ac866f7363239971fd01f9f18" +checksum = "d20d867dcf42019d4779519a1ceb55eba8d7f3d0e4f0a89bcba82b8f9eb01e48" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f9a598f010f048d8b8226492b6401104f5a5c1273c2869b72af29b48bb4ba9" +checksum = "b74e91b0b553c115d14bd0ed41898309356dc85d0e3d4b9014c4e7715e48c8ad" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.10.0", + "indexmap 2.11.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f494adf9d60e49aa6ce26dfd42c7417aa6d4343cf2ae621f20e4d92a5ad07d85" +checksum = "84194d31220803f5f62d0a00f583fd3a062b36382e2bea446f1af96727754565" dependencies = [ "const-hex", "dunce", @@ -763,15 +767,15 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52db32fbd35a9c0c0e538b58b81ebbae08a51be029e7ad60e08b60481c2ec6c3" +checksum = "fe8c27b3cf6b2bb8361904732f955bc7c05e00be5f469cec7e2280b6167f3ff0" dependencies = [ "serde", "winnow", @@ -779,9 +783,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a285b46e3e0c177887028278f04cc8262b76fd3b8e0e20e93cea0a58c35f5ac5" +checksum = "f5383d34ea00079e6dd89c652bcbdb764db160cef84e6250926961a0b2295d04" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -791,9 +795,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0107675e10c7f248bf7273c1e7fdb02409a717269cc744012e6f3c39959bfb" +checksum = "c08b383bc903c927635e39e1dae7df2180877d93352d1abd389883665a598afc" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -805,7 +809,7 @@ dependencies = [ "parking_lot", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tower 0.5.2", "tracing", @@ -815,9 +819,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78e3736701b5433afd06eecff08f0688a71a10e0e1352e0bbf0bed72f0dd4e35" +checksum = "6e58dee1f7763ef302074b645fc4f25440637c09a60e8de234b62993f06c0ae3" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -830,9 +834,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79064b5a08259581cb5614580010007c2df6deab1e8f3e8c7af8d7e9227008f" +checksum = "5ae5c6655e5cda1227f0c70b7686ecfb8af856771deebacad8dab9a7fbc51864" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -850,9 +854,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd607158cb9bc54cbcfcaab4c5f36c5b26994c7dc58b6f095ce27a54f270f3" +checksum = "dcb2141958a1f13722cb20a2e01c130fb375209fa428849ae553c1518bc33a0d" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -868,9 +872,9 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bada1fc392a33665de0dc50d401a3701b62583c655e3522a323490a5da016962" +checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -888,15 +892,15 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6acb36318dfa50817154064fea7932adf2eec3f51c86680e2b37d7e8906c66bb" +checksum = "d14809f908822dbff0dc472c77ca4aa129ab12e22fd9bff2dd1ef54603e68e3d" dependencies = [ "alloy-primitives", "darling", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -981,7 +985,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1123,7 +1127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1161,7 +1165,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1250,7 +1254,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1322,11 +1326,13 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" +checksum = "5bee399cc3a623ec5a2db2c5b90ee0190a2260241fbe0c023ac8f7bab426aaf8" dependencies = [ "brotli", + "compression-codecs", + "compression-core", "flate2", "futures-core", "memchr", @@ -1366,7 +1372,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1377,7 +1383,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1415,7 +1421,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1576,7 +1582,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "cexpr", "clang-sys", "itertools 0.12.1", @@ -1589,7 +1595,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.105", + "syn 2.0.106", "which", ] @@ -1599,7 +1605,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1608,7 +1614,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -1650,9 +1656,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" dependencies = [ "serde", ] @@ -1728,11 +1734,11 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "boa_interner", "boa_macros", "boa_string", - "indexmap 2.10.0", + "indexmap 2.11.0", "num-bigint", "rustc-hash 2.1.1", ] @@ -1744,7 +1750,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" dependencies = [ "arrayvec", - "bitflags 2.9.1", + "bitflags 2.9.3", "boa_ast", "boa_gc", "boa_interner", @@ -1758,7 +1764,7 @@ dependencies = [ "fast-float2", "hashbrown 0.15.5", "icu_normalizer 1.5.0", - "indexmap 2.10.0", + "indexmap 2.11.0", "intrusive-collections", "itertools 0.13.0", "num-bigint", @@ -1778,7 +1784,7 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror 2.0.14", + "thiserror 2.0.16", "time", ] @@ -1804,7 +1810,7 @@ dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.15.5", - "indexmap 2.10.0", + "indexmap 2.11.0", "once_cell", "phf", "rustc-hash 2.1.1", @@ -1819,7 +1825,7 @@ checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "synstructure", ] @@ -1829,7 +1835,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "boa_ast", "boa_interner", "boa_macros", @@ -1892,7 +1898,7 @@ dependencies = [ "serde_json", "serde_repr", "serde_urlencoded", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-util", "tower-service", @@ -1922,9 +1928,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.1" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1957,7 +1963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", - "regex-automata 0.4.9", + "regex-automata 0.4.10", "serde", ] @@ -1996,7 +2002,7 @@ checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2032,9 +2038,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d07aa9a93b00c76f71bc35d598bed923f6d4f3a9ca5c24b7737ae1a292841c0" +checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" dependencies = [ "serde", ] @@ -2072,7 +2078,7 @@ dependencies = [ "semver 1.0.26", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] @@ -2118,9 +2124,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -2166,9 +2172,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.45" +version = "4.5.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" +checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" dependencies = [ "clap_builder", "clap_derive", @@ -2176,9 +2182,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.44" +version = "4.5.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" +checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" dependencies = [ "anstream", "anstyle", @@ -2195,7 +2201,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2231,11 +2237,11 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.1.4" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" +checksum = "3f8e18d0dca9578507f13f9803add0df13362b02c501c1c17734f0dbb52eaf0b" dependencies = [ - "crossterm", + "crossterm 0.29.0", "unicode-segmentation", "unicode-width 0.2.0", ] @@ -2254,6 +2260,28 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "compression-codecs" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7eea68f0e02c2b0aa8856e9a9478444206d4b6828728e7b0697c0f8cca265cb" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "zstd", + "zstd-safe", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + [[package]] name = "concat-kdf" version = "0.1.0" @@ -2274,9 +2302,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.14.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +checksum = "dccd746bf9b1038c0507b7cec21eb2b11222db96a2902c96e8c185d6d20fb9c4" dependencies = [ "cfg-if", "cpufeatures", @@ -2440,7 +2468,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "crossterm_winapi", "mio", "parking_lot", @@ -2450,6 +2478,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags 2.9.3", + "crossterm_winapi", + "document-features", + "parking_lot", + "rustix 1.0.8", + "winapi", +] + [[package]] name = "crossterm_winapi" version = "0.9.1" @@ -2537,7 +2579,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2561,7 +2603,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2572,7 +2614,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2625,7 +2667,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2684,7 +2726,7 @@ checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2695,7 +2737,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2716,7 +2758,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2726,7 +2768,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2747,7 +2789,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "unicode-xid", ] @@ -2867,7 +2909,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -2893,6 +2935,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + [[package]] name = "dotenvy" version = "0.15.7" @@ -2976,7 +3027,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -3052,7 +3103,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -3072,7 +3123,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -3159,7 +3210,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -3255,14 +3306,14 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3301,7 +3352,7 @@ dependencies = [ "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -3361,7 +3412,7 @@ dependencies = [ "rollup-boost", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -3387,10 +3438,10 @@ dependencies = [ "eyre", "flashblocks-p2p", "futures-util", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", "metrics", "metrics-derive", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-network", "op-alloy-rpc-types", "reth-db", @@ -3468,9 +3519,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -3552,7 +3603,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -3603,9 +3654,9 @@ checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" [[package]] name = "generator" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" dependencies = [ "cc", "cfg-if", @@ -3650,7 +3701,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.3+wasi-0.2.4", "wasm-bindgen", ] @@ -3676,7 +3727,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "libc", "libgit2-sys", "log", @@ -3737,12 +3788,12 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" -version = "1.6.5" +version = "1.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d61197a68f6323b9afa616cf83d55d69191e1bf364d4eb7d35ae18defe776" +checksum = "a636fb6a653382a379ee1e5593dacdc628667994167024c143214cafd40c1a86" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3768,7 +3819,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.10.0", + "indexmap 2.11.0", "slab", "tokio", "tokio-util", @@ -3882,7 +3933,7 @@ dependencies = [ "rand 0.9.2", "ring", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tinyvec", "tokio", "tracing", @@ -3906,7 +3957,7 @@ dependencies = [ "resolv-conf", "serde", "smallvec", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -4014,13 +4065,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", @@ -4028,6 +4080,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -4362,7 +4415,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -4373,9 +4426,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -4419,7 +4472,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -4460,9 +4513,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" dependencies = [ "arbitrary", "equivalent", @@ -4482,7 +4535,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "inotify-sys", "libc", ] @@ -4516,7 +4569,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -4545,11 +4598,11 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "cfg-if", "libc", ] @@ -4654,9 +4707,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -4677,51 +4730,57 @@ name = "jsonrpsee" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" + +[[package]] +name = "jsonrpsee" +version = "0.25.1" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-http-client 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-proc-macros 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-server 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-wasm-client", - "jsonrpsee-ws-client", + "jsonrpsee-core 0.25.1", + "jsonrpsee-http-client 0.25.1", + "jsonrpsee-proc-macros 0.25.1", + "jsonrpsee-server 0.25.1", + "jsonrpsee-types 0.25.1", "tokio", "tracing", ] [[package]] name = "jsonrpsee" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3f48dc3e6b8bd21e15436c1ddd0bc22a6a54e8ec46fedd6adf3425f396ec6a" dependencies = [ - "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-http-client 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-proc-macros 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-server 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-client-transport", + "jsonrpsee-core 0.26.0", + "jsonrpsee-http-client 0.26.0", + "jsonrpsee-proc-macros 0.26.0", + "jsonrpsee-server 0.26.0", + "jsonrpsee-types 0.26.0", + "jsonrpsee-wasm-client", + "jsonrpsee-ws-client", "tokio", "tracing", ] [[package]] name = "jsonrpsee-client-transport" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a320a3f1464e4094f780c4d48413acd786ce5627aaaecfac9e9c7431d13ae1" +checksum = "cf36eb27f8e13fa93dcb50ccb44c417e25b818cfa1a481b5470cd07b19c60b98" dependencies = [ "base64 0.22.1", "futures-channel", "futures-util", "gloo-net", "http", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.26.0", "pin-project", "rustls", "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-rustls", "tokio-util", @@ -4732,73 +4791,72 @@ dependencies = [ [[package]] name = "jsonrpsee-core" version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" dependencies = [ "async-trait", "bytes", - "futures-timer", "futures-util", "http", "http-body", "http-body-util", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-types 0.25.1", "parking_lot", "pin-project", "rand 0.9.2", "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", - "tokio-stream", "tower 0.5.2", "tracing", - "wasm-bindgen-futures", ] [[package]] name = "jsonrpsee-core" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "316c96719901f05d1137f19ba598b5fe9c9bc39f4335f67f6be8613921946480" dependencies = [ "async-trait", "bytes", + "futures-timer", "futures-util", "http", "http-body", "http-body-util", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-types 0.26.0", "parking_lot", "pin-project", "rand 0.9.2", "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", + "tokio-stream", "tower 0.5.2", "tracing", + "wasm-bindgen-futures", ] [[package]] name = "jsonrpsee-http-client" version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" dependencies = [ "base64 0.22.1", "http-body", "hyper", "hyper-rustls", "hyper-util", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.25.1", + "jsonrpsee-types 0.25.1", "rustls", "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tower 0.5.2", "url", @@ -4806,21 +4864,22 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790bedefcec85321e007ff3af84b4e417540d5c87b3c9779b9e247d1bcc3dab8" dependencies = [ "base64 0.22.1", "http-body", "hyper", "hyper-rustls", "hyper-util", - "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "rustls", "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tower 0.5.2", "url", @@ -4829,33 +4888,32 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fa4f5daed39f982a1bb9d15449a28347490ad42b212f8eaa2a2a344a0dce9e9" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" dependencies = [ "heck", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "jsonrpsee-proc-macros" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da3f8ab5ce1bb124b6d082e62dffe997578ceaf0aeb9f3174a214589dc00f07" dependencies = [ "heck", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "jsonrpsee-server" version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38b0bcf407ac68d241f90e2d46041e6a06988f97fe1721fb80b91c42584fae6" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" dependencies = [ "futures-util", "http", @@ -4863,14 +4921,14 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.25.1", + "jsonrpsee-types 0.25.1", "pin-project", "route-recognizer", "serde", "serde_json", "soketto", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -4880,8 +4938,9 @@ dependencies = [ [[package]] name = "jsonrpsee-server" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c51b7c290bb68ce3af2d029648148403863b982f138484a73f02a9dd52dbd7f" dependencies = [ "futures-util", "http", @@ -4889,14 +4948,14 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "pin-project", "route-recognizer", "serde", "serde_json", "soketto", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -4907,48 +4966,48 @@ dependencies = [ [[package]] name = "jsonrpsee-types" version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" +source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" dependencies = [ "http", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "jsonrpsee-types" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" dependencies = [ "http", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "jsonrpsee-wasm-client" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b67695cbcf4653f39f8f8738925547e0e23fd9fe315bccf951097b9f6a38781" +checksum = "7902885de4779f711a95d82c8da2d7e5f9f3a7c7cfa44d51c067fd1c29d72a3c" dependencies = [ "jsonrpsee-client-transport", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "tower 0.5.2", ] [[package]] name = "jsonrpsee-ws-client" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da2694c9ff271a9d3ebfe520f6b36820e85133a51be77a3cb549fd615095261" +checksum = "9b6fceceeb05301cc4c065ab3bd2fa990d41ff4eb44e4ca1b30fa99c057c3e79" dependencies = [ "http", "jsonrpsee-client-transport", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "tower 0.5.2", "url", ] @@ -5082,7 +5141,7 @@ dependencies = [ "multihash", "quick-protobuf", "sha2 0.10.9", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", "zeroize", ] @@ -5104,7 +5163,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "libc", "redox_syscall 0.5.17", ] @@ -5207,6 +5266,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[package]] +name = "litrs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" + [[package]] name = "lock_api" version = "0.4.13" @@ -5303,7 +5368,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -5329,9 +5394,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" dependencies = [ "libc", ] @@ -5364,7 +5429,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -5378,7 +5443,7 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "indexmap 2.10.0", + "indexmap 2.11.0", "ipnet", "metrics", "metrics-util", @@ -5414,7 +5479,7 @@ dependencies = [ "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.15.5", - "indexmap 2.10.0", + "indexmap 2.11.0", "metrics", "ordered-float", "quanta", @@ -5619,7 +5684,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "fsevent-sys", "inotify", "kqueue", @@ -5766,7 +5831,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -5829,14 +5894,14 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "op-alloy-consensus" -version = "0.18.14" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c88d2940558fd69f8f07b3cbd7bb3c02fc7d31159c1a7ba9deede50e7881024" +checksum = "d9ade20c592484ba1ea538006e0454284174447a3adf9bb59fa99ed512f95493" dependencies = [ "alloy-consensus", "alloy-eips", @@ -5849,7 +5914,7 @@ dependencies = [ "derive_more", "serde", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] @@ -5860,9 +5925,9 @@ checksum = "a79f352fc3893dcd670172e615afef993a41798a1d3fc0db88a3e60ef2e70ecc" [[package]] name = "op-alloy-network" -version = "0.18.13" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66be312d3446099f1c46b3bb4bbaccdd4b3d6fb3668921158e3d47dff0a8d4a0" +checksum = "84741a798124ceb43979d70db654039937a00979b1341fa8bfdc48473bbd52bf" dependencies = [ "alloy-consensus", "alloy-network", @@ -5870,25 +5935,25 @@ dependencies = [ "alloy-provider", "alloy-rpc-types-eth", "alloy-signer", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-rpc-types", ] [[package]] name = "op-alloy-rpc-jsonrpsee" -version = "0.18.13" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3833995acfc568fdac3684f037c4ed3f1f2bd2ef5deeb3f46ecee32aafa34c8e" +checksum = "aa85f170bf8f914a7619e1447918781a8c5bd1041bb6629940b851e865487156" dependencies = [ "alloy-primitives", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", ] [[package]] name = "op-alloy-rpc-types" -version = "0.18.14" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f22201e53e8cbb67a053e88b534b4e7f02265c5406994bf35978482a9ad0ae26" +checksum = "9076d4fcb8e260cec8ad01cd155200c0dbb562e62adb553af245914f30854e29" dependencies = [ "alloy-consensus", "alloy-eips", @@ -5897,17 +5962,17 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-serde", "derive_more", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "op-alloy-rpc-types-engine" -version = "0.18.13" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cf45d43a3d548fdc39d9bfab6ba13cc06b3214ef4b9c36d3efbf3faea1b9f1" +checksum = "d4256b1eda5766a9fa7de5874e54515994500bef632afda41e940aed015f9455" dependencies = [ "alloy-consensus", "alloy-eips", @@ -5918,17 +5983,17 @@ dependencies = [ "derive_more", "ethereum_ssz", "ethereum_ssz_derive", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "serde", "snap", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "op-revm" -version = "9.0.1" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6889cdfed74c6c924a54b2357982fce232e06473c6bb73b9a0c71a9151bfabd" +checksum = "5ba21d705bbbfc947a423cba466d75e4af0c7d43ee89ba0a0f1cfa04963cede9" dependencies = [ "auto_impl", "revm", @@ -5947,7 +6012,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "cfg-if", "foreign-types", "libc", @@ -5964,7 +6029,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -5995,7 +6060,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", ] @@ -6029,7 +6094,7 @@ dependencies = [ "prost", "reqwest", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tonic", "tracing", @@ -6065,7 +6130,7 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -6141,7 +6206,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -6181,7 +6246,7 @@ checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" dependencies = [ "parse-display-derive", "regex", - "regex-syntax 0.8.5", + "regex-syntax 0.8.6", ] [[package]] @@ -6193,9 +6258,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "regex-syntax 0.8.5", + "regex-syntax 0.8.6", "structmeta", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -6216,9 +6281,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" @@ -6227,7 +6292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", - "thiserror 2.0.14", + "thiserror 2.0.16", "ucd-trie", ] @@ -6272,7 +6337,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -6301,7 +6366,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -6367,9 +6432,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec 0.11.4", ] @@ -6431,12 +6496,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.36" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -6487,14 +6552,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "proc-macro2" -version = "1.0.97" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -6505,7 +6570,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "chrono", "flate2", "hex", @@ -6519,7 +6584,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "chrono", "hex", ] @@ -6532,13 +6597,13 @@ checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.9.1", + "bitflags 2.9.3", "lazy_static", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax 0.8.6", "rusty-fork", "tempfile", "unarray", @@ -6562,7 +6627,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -6585,7 +6650,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -6594,7 +6659,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "memchr", "unicase", ] @@ -6631,9 +6696,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -6642,8 +6707,8 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls", - "socket2 0.5.10", - "thiserror 2.0.14", + "socket2 0.6.0", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -6651,9 +6716,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", @@ -6664,7 +6729,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.14", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -6672,16 +6737,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.0", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6801,10 +6866,10 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "cassowary", "compact_str", - "crossterm", + "crossterm 0.28.1", "indoc", "instability", "itertools 0.13.0", @@ -6822,7 +6887,7 @@ version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", ] [[package]] @@ -6866,7 +6931,7 @@ version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", ] [[package]] @@ -6888,7 +6953,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] @@ -6908,19 +6973,19 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "regex-automata 0.4.10", + "regex-syntax 0.8.6", ] [[package]] @@ -6934,13 +6999,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax 0.8.6", ] [[package]] @@ -6951,9 +7016,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "regress" @@ -7023,7 +7088,7 @@ checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "reth" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-rpc-types", "aquamarine", @@ -7069,7 +7134,7 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7093,7 +7158,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7124,7 +7189,7 @@ dependencies = [ [[package]] name = "reth-chainspec" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7144,7 +7209,7 @@ dependencies = [ [[package]] name = "reth-cli" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-genesis", "clap", @@ -7158,7 +7223,7 @@ dependencies = [ [[package]] name = "reth-cli-commands" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "ahash", "alloy-chains", @@ -7169,7 +7234,7 @@ dependencies = [ "backon", "clap", "comfy-table", - "crossterm", + "crossterm 0.28.1", "eyre", "fdlimit", "futures", @@ -7231,7 +7296,7 @@ dependencies = [ [[package]] name = "reth-cli-runner" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "reth-tasks", "tokio", @@ -7241,7 +7306,7 @@ dependencies = [ [[package]] name = "reth-cli-util" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7252,14 +7317,14 @@ dependencies = [ "reth-fs-util", "secp256k1 0.30.0", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tikv-jemallocator", ] [[package]] name = "reth-codecs" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7269,7 +7334,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "reth-codecs-derive", "reth-zstd-compressors", "serde", @@ -7279,18 +7344,18 @@ dependencies = [ [[package]] name = "reth-codecs-derive" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "reth-config" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "eyre", "humantime-serde", @@ -7305,20 +7370,20 @@ dependencies = [ [[package]] name = "reth-consensus" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", "reth-execution-types", "reth-primitives-traits", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-consensus-common" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7330,7 +7395,7 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7355,7 +7420,7 @@ dependencies = [ [[package]] name = "reth-db" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "derive_more", @@ -7375,13 +7440,13 @@ dependencies = [ "strum 0.27.2", "sysinfo", "tempfile", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-db-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7409,7 +7474,7 @@ dependencies = [ [[package]] name = "reth-db-common" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7432,14 +7497,14 @@ dependencies = [ "reth-trie-db", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-db-models" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7454,7 +7519,7 @@ dependencies = [ [[package]] name = "reth-discv4" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7471,7 +7536,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -7480,7 +7545,7 @@ dependencies = [ [[package]] name = "reth-discv5" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7496,7 +7561,7 @@ dependencies = [ "reth-metrics", "reth-network-peers", "secp256k1 0.30.0", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -7504,7 +7569,7 @@ dependencies = [ [[package]] name = "reth-dns-discovery" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "data-encoding", @@ -7519,7 +7584,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -7528,7 +7593,7 @@ dependencies = [ [[package]] name = "reth-downloaders" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7553,7 +7618,7 @@ dependencies = [ "reth-tasks", "reth-testing-utils", "tempfile", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -7563,7 +7628,7 @@ dependencies = [ [[package]] name = "reth-ecies" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "aes", "alloy-primitives", @@ -7583,7 +7648,7 @@ dependencies = [ "secp256k1 0.30.0", "sha2 0.10.9", "sha3", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -7594,7 +7659,7 @@ dependencies = [ [[package]] name = "reth-engine-local" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7618,7 +7683,7 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7636,14 +7701,14 @@ dependencies = [ "reth-primitives-traits", "reth-trie-common", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", ] [[package]] name = "reth-engine-service" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "futures", "pin-project", @@ -7660,13 +7725,13 @@ dependencies = [ "reth-prune", "reth-stages-api", "reth-tasks", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-engine-tree" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7688,6 +7753,7 @@ dependencies = [ "reth-errors", "reth-ethereum-primitives", "reth-evm", + "reth-execution-types", "reth-metrics", "reth-network-p2p", "reth-payload-builder", @@ -7710,7 +7776,8 @@ dependencies = [ "revm", "revm-primitives", "schnellru", - "thiserror 2.0.14", + "smallvec", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -7718,7 +7785,7 @@ dependencies = [ [[package]] name = "reth-engine-util" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -7746,7 +7813,7 @@ dependencies = [ [[package]] name = "reth-era" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7756,13 +7823,13 @@ dependencies = [ "ethereum_ssz_derive", "reth-ethereum-primitives", "snap", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-era-downloader" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "bytes", @@ -7777,7 +7844,7 @@ dependencies = [ [[package]] name = "reth-era-utils" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7801,18 +7868,18 @@ dependencies = [ [[package]] name = "reth-errors" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "reth-consensus", "reth-execution-errors", "reth-storage-errors", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-eth-wire" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-chains", "alloy-primitives", @@ -7830,7 +7897,7 @@ dependencies = [ "reth-primitives-traits", "serde", "snap", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -7840,7 +7907,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7855,13 +7922,13 @@ dependencies = [ "reth-ethereum-primitives", "reth-primitives-traits", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-ethereum" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -7893,6 +7960,7 @@ dependencies = [ "reth-rpc-eth-types", "reth-storage-api", "reth-tasks", + "reth-transaction-pool", "reth-trie", "reth-trie-db", ] @@ -7900,7 +7968,7 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "clap", "eyre", @@ -7921,7 +7989,7 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7937,7 +8005,7 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7949,13 +8017,13 @@ dependencies = [ "reth-primitives-traits", "serde", "sha2 0.10.9", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-ethereum-forks" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -7968,14 +8036,16 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", + "alloy-rlp", "alloy-rpc-types-engine", "reth-basic-payload-builder", "reth-chainspec", + "reth-consensus-common", "reth-errors", "reth-ethereum-primitives", "reth-evm", @@ -7995,7 +8065,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8013,7 +8083,7 @@ dependencies = [ [[package]] name = "reth-etl" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "rayon", "reth-db-api", @@ -8023,7 +8093,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8046,7 +8116,7 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8067,20 +8137,20 @@ dependencies = [ [[package]] name = "reth-execution-errors" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-evm", "alloy-primitives", "alloy-rlp", "nybbles", "reth-storage-errors", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-execution-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8098,7 +8168,7 @@ dependencies = [ [[package]] name = "reth-exex" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8127,7 +8197,7 @@ dependencies = [ "reth-tasks", "reth-tracing", "rmp-serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-util", "tracing", @@ -8136,7 +8206,7 @@ dependencies = [ [[package]] name = "reth-exex-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8150,17 +8220,17 @@ dependencies = [ [[package]] name = "reth-fs-util" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-invalid-block-hooks" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8168,7 +8238,7 @@ dependencies = [ "alloy-rpc-types-debug", "eyre", "futures", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", "pretty_assertions", "reth-chainspec", "reth-engine-primitives", @@ -8188,16 +8258,16 @@ dependencies = [ [[package]] name = "reth-ipc" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "bytes", "futures", "futures-util", "interprocess", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", "pin-project", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8208,24 +8278,24 @@ dependencies = [ [[package]] name = "reth-libmdbx" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "byteorder", "dashmap 6.1.0", "derive_more", - "indexmap 2.10.0", + "indexmap 2.11.0", "parking_lot", "reth-mdbx-sys", "smallvec", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-mdbx-sys" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "bindgen 0.70.1", "cc", @@ -8234,7 +8304,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "futures", "metrics", @@ -8246,7 +8316,7 @@ dependencies = [ [[package]] name = "reth-net-banlist" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", ] @@ -8254,13 +8324,13 @@ dependencies = [ [[package]] name = "reth-net-nat" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "futures-util", "if-addrs", "reqwest", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -8268,7 +8338,7 @@ dependencies = [ [[package]] name = "reth-network" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8313,7 +8383,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8323,7 +8393,7 @@ dependencies = [ [[package]] name = "reth-network-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8340,7 +8410,7 @@ dependencies = [ "reth-network-types", "reth-tokio-util", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", ] @@ -8348,7 +8418,7 @@ dependencies = [ [[package]] name = "reth-network-p2p" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8371,14 +8441,14 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "alloy-rlp", "enr", "secp256k1 0.30.0", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "url", ] @@ -8386,7 +8456,7 @@ dependencies = [ [[package]] name = "reth-network-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8400,7 +8470,7 @@ dependencies = [ [[package]] name = "reth-nippy-jar" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "anyhow", "bincode", @@ -8409,7 +8479,7 @@ dependencies = [ "memmap2", "reth-fs-util", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", "zstd", ] @@ -8417,7 +8487,7 @@ dependencies = [ [[package]] name = "reth-node-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8441,7 +8511,7 @@ dependencies = [ [[package]] name = "reth-node-builder" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8453,7 +8523,7 @@ dependencies = [ "eyre", "fdlimit", "futures", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", "rayon", "reth-basic-payload-builder", "reth-chain-state", @@ -8509,7 +8579,7 @@ dependencies = [ [[package]] name = "reth-node-core" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8550,7 +8620,7 @@ dependencies = [ "serde", "shellexpand", "strum 0.27.2", - "thiserror 2.0.14", + "thiserror 2.0.16", "toml", "tracing", "url", @@ -8561,7 +8631,7 @@ dependencies = [ [[package]] name = "reth-node-ethereum" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-network", @@ -8592,7 +8662,6 @@ dependencies = [ "reth-rpc-server-types", "reth-tracing", "reth-transaction-pool", - "reth-trie-db", "revm", "tokio", ] @@ -8600,7 +8669,7 @@ dependencies = [ [[package]] name = "reth-node-ethstats" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8613,7 +8682,7 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-tungstenite", @@ -8624,7 +8693,7 @@ dependencies = [ [[package]] name = "reth-node-events" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8648,11 +8717,11 @@ dependencies = [ [[package]] name = "reth-node-metrics" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "eyre", "http", - "jsonrpsee-server 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-server 0.26.0", "metrics", "metrics-exporter-prometheus", "metrics-process", @@ -8669,20 +8738,19 @@ dependencies = [ [[package]] name = "reth-node-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "reth-chainspec", "reth-db-api", "reth-engine-primitives", "reth-payload-primitives", "reth-primitives-traits", - "reth-trie-db", ] [[package]] name = "reth-op" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "reth-chainspec", "reth-codecs", @@ -8720,7 +8788,7 @@ dependencies = [ [[package]] name = "reth-optimism-chainspec" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8730,7 +8798,7 @@ dependencies = [ "alloy-primitives", "derive_more", "miniz_oxide", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-rpc-types", "paste", "reth-chainspec", @@ -8742,13 +8810,13 @@ dependencies = [ "serde", "serde_json", "tar-no-std", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-optimism-cli" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8758,7 +8826,7 @@ dependencies = [ "derive_more", "eyre", "futures-util", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "reth-chainspec", "reth-cli", "reth-cli-commands", @@ -8795,7 +8863,7 @@ dependencies = [ [[package]] name = "reth-optimism-consensus" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8813,21 +8881,21 @@ dependencies = [ "reth-storage-errors", "reth-trie-common", "revm", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-optimism-evm" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-evm", "alloy-op-evm", "alloy-primitives", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", @@ -8842,13 +8910,44 @@ dependencies = [ "reth-rpc-eth-api", "reth-storage-errors", "revm", - "thiserror 2.0.14", + "thiserror 2.0.16", +] + +[[package]] +name = "reth-optimism-flashblocks" +version = "1.6.0" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-serde", + "brotli", + "eyre", + "futures-util", + "reth-chain-state", + "reth-errors", + "reth-evm", + "reth-execution-types", + "reth-optimism-evm", + "reth-optimism-primitives", + "reth-primitives-traits", + "reth-revm", + "reth-rpc-eth-api", + "reth-rpc-eth-types", + "reth-storage-api", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "url", ] [[package]] name = "reth-optimism-forks" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-op-hardforks", "alloy-primitives", @@ -8859,7 +8958,7 @@ dependencies = [ [[package]] name = "reth-optimism-node" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8867,7 +8966,7 @@ dependencies = [ "alloy-rpc-types-eth", "clap", "eyre", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-rpc-types-engine", "op-revm", "reth-chainspec", @@ -8896,16 +8995,16 @@ dependencies = [ "reth-tracing", "reth-transaction-pool", "reth-trie-common", - "reth-trie-db", "revm", "serde", "tokio", + "url", ] [[package]] name = "reth-optimism-payload-builder" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8914,7 +9013,7 @@ dependencies = [ "alloy-rpc-types-debug", "alloy-rpc-types-engine", "derive_more", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-rpc-types-engine", "reth-basic-payload-builder", "reth-chain-state", @@ -8937,14 +9036,14 @@ dependencies = [ "revm", "serde", "sha2 0.10.9", - "thiserror 2.0.14", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-optimism-primitives" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8953,7 +9052,7 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "reth-codecs", "reth-primitives-traits", "reth-zstd-compressors", @@ -8964,7 +9063,7 @@ dependencies = [ [[package]] name = "reth-optimism-rpc" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8979,11 +9078,11 @@ dependencies = [ "async-trait", "derive_more", "eyre", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "metrics", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-network", "op-alloy-rpc-jsonrpsee", "op-alloy-rpc-types", @@ -8996,6 +9095,7 @@ dependencies = [ "reth-node-api", "reth-node-builder", "reth-optimism-evm", + "reth-optimism-flashblocks", "reth-optimism-forks", "reth-optimism-payload-builder", "reth-optimism-primitives", @@ -9012,7 +9112,7 @@ dependencies = [ "reth-transaction-pool", "revm", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tower 0.5.2", "tracing", @@ -9021,7 +9121,7 @@ dependencies = [ [[package]] name = "reth-optimism-storage" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9037,7 +9137,7 @@ dependencies = [ [[package]] name = "reth-optimism-txpool" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9050,7 +9150,7 @@ dependencies = [ "derive_more", "futures-util", "metrics", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "op-alloy-flz", "op-alloy-rpc-types", "op-revm", @@ -9065,7 +9165,7 @@ dependencies = [ "reth-storage-api", "reth-transaction-pool", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9073,7 +9173,7 @@ dependencies = [ [[package]] name = "reth-payload-builder" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9094,7 +9194,7 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "pin-project", "reth-payload-primitives", @@ -9106,7 +9206,7 @@ dependencies = [ [[package]] name = "reth-payload-primitives" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9118,14 +9218,14 @@ dependencies = [ "reth-errors", "reth-primitives-traits", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", ] [[package]] name = "reth-payload-util" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9135,7 +9235,7 @@ dependencies = [ [[package]] name = "reth-payload-validator" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9145,7 +9245,7 @@ dependencies = [ [[package]] name = "reth-primitives" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "c-kzg", @@ -9159,7 +9259,7 @@ dependencies = [ [[package]] name = "reth-primitives-traits" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9175,7 +9275,7 @@ dependencies = [ "derive_more", "modular-bitfield", "once_cell", - "op-alloy-consensus 0.18.14", + "op-alloy-consensus 0.19.1", "proptest", "proptest-arbitrary-interop", "rayon", @@ -9186,13 +9286,13 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-provider" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9237,7 +9337,7 @@ dependencies = [ [[package]] name = "reth-prune" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9257,7 +9357,7 @@ dependencies = [ "reth-static-file-types", "reth-tokio-util", "rustc-hash 2.1.1", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9265,7 +9365,7 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "arbitrary", @@ -9273,13 +9373,13 @@ dependencies = [ "modular-bitfield", "reth-codecs", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-ress-protocol" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9298,7 +9398,7 @@ dependencies = [ [[package]] name = "reth-ress-provider" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9325,7 +9425,7 @@ dependencies = [ [[package]] name = "reth-revm" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9338,7 +9438,7 @@ dependencies = [ [[package]] name = "reth-rpc" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9348,6 +9448,7 @@ dependencies = [ "alloy-network", "alloy-primitives", "alloy-rlp", + "alloy-rpc-client", "alloy-rpc-types", "alloy-rpc-types-admin", "alloy-rpc-types-beacon", @@ -9367,14 +9468,15 @@ dependencies = [ "http-body", "hyper", "itertools 0.14.0", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", + "jsonrpsee-types 0.26.0", "jsonwebtoken", "parking_lot", "pin-project", "reth-chain-state", "reth-chainspec", "reth-consensus", + "reth-consensus-common", "reth-engine-primitives", "reth-errors", "reth-evm", @@ -9403,7 +9505,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tower 0.5.2", @@ -9414,7 +9516,7 @@ dependencies = [ [[package]] name = "reth-rpc-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-genesis", @@ -9431,7 +9533,7 @@ dependencies = [ "alloy-rpc-types-trace", "alloy-rpc-types-txpool", "alloy-serde", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", "reth-chain-state", "reth-engine-primitives", "reth-network-peers", @@ -9442,12 +9544,12 @@ dependencies = [ [[package]] name = "reth-rpc-builder" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-network", "alloy-provider", "http", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", "metrics", "pin-project", "reth-chain-state", @@ -9469,7 +9571,7 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-util", "tower 0.5.2", @@ -9480,7 +9582,7 @@ dependencies = [ [[package]] name = "reth-rpc-convert" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-json-rpc", @@ -9488,8 +9590,8 @@ dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-signer", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "op-alloy-consensus 0.18.14", + "jsonrpsee-types 0.26.0", + "op-alloy-consensus 0.19.1", "op-alloy-network", "op-alloy-rpc-types", "op-revm", @@ -9499,20 +9601,20 @@ dependencies = [ "reth-primitives-traits", "reth-storage-api", "revm-context", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-rpc-engine-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "async-trait", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "metrics", "parking_lot", "reth-chainspec", @@ -9527,7 +9629,7 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9535,7 +9637,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9552,8 +9654,8 @@ dependencies = [ "auto_impl", "dyn-clone", "futures", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee 0.26.0", + "jsonrpsee-types 0.26.0", "parking_lot", "reth-chain-state", "reth-chainspec", @@ -9579,22 +9681,25 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-evm", "alloy-network", "alloy-primitives", + "alloy-rpc-client", "alloy-rpc-types-eth", "alloy-sol-types", + "alloy-transport", "derive_more", "futures", "itertools 0.14.0", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "metrics", "rand 0.9.2", + "reqwest", "reth-chain-state", "reth-chainspec", "reth-errors", @@ -9614,7 +9719,7 @@ dependencies = [ "revm-inspectors", "schnellru", "serde", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -9623,11 +9728,11 @@ dependencies = [ [[package]] name = "reth-rpc-layer" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-rpc-types-engine", "http", - "jsonrpsee-http-client 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-http-client 0.26.0", "pin-project", "tower 0.5.2", "tower-http", @@ -9637,13 +9742,13 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpsee-core 0.26.0", + "jsonrpsee-types 0.26.0", "reth-errors", "reth-network-api", "serde", @@ -9653,7 +9758,7 @@ dependencies = [ [[package]] name = "reth-stages" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9693,7 +9798,7 @@ dependencies = [ "reth-trie", "reth-trie-db", "tempfile", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9701,7 +9806,7 @@ dependencies = [ [[package]] name = "reth-stages-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9720,7 +9825,7 @@ dependencies = [ "reth-static-file", "reth-static-file-types", "reth-tokio-util", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9728,7 +9833,7 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "arbitrary", @@ -9742,7 +9847,7 @@ dependencies = [ [[package]] name = "reth-static-file" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "parking_lot", @@ -9762,7 +9867,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "clap", @@ -9774,7 +9879,7 @@ dependencies = [ [[package]] name = "reth-storage-api" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9791,14 +9896,13 @@ dependencies = [ "reth-stages-types", "reth-storage-errors", "reth-trie-common", - "reth-trie-db", "revm-database", ] [[package]] name = "reth-storage-errors" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9808,13 +9912,13 @@ dependencies = [ "reth-prune-types", "reth-static-file-types", "revm-database-interface", - "thiserror 2.0.14", + "thiserror 2.0.16", ] [[package]] name = "reth-tasks" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "auto_impl", "dyn-clone", @@ -9823,7 +9927,7 @@ dependencies = [ "pin-project", "rayon", "reth-metrics", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", "tracing-futures", @@ -9832,7 +9936,7 @@ dependencies = [ [[package]] name = "reth-testing-utils" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9848,7 +9952,7 @@ dependencies = [ [[package]] name = "reth-tokio-util" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "tokio", "tokio-stream", @@ -9858,7 +9962,7 @@ dependencies = [ [[package]] name = "reth-tracing" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "clap", "eyre", @@ -9873,7 +9977,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9881,7 +9985,7 @@ dependencies = [ "alloy-rlp", "aquamarine", "auto_impl", - "bitflags 2.9.1", + "bitflags 2.9.3", "futures-util", "metrics", "parking_lot", @@ -9898,14 +10002,14 @@ dependencies = [ "reth-primitives-traits", "reth-storage-api", "reth-tasks", - "revm-interpreter 23.0.2", + "revm-interpreter", "revm-primitives", "rustc-hash 2.1.1", "schnellru", "serde", "serde_json", "smallvec", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -9914,7 +10018,7 @@ dependencies = [ [[package]] name = "reth-trie" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9939,7 +10043,7 @@ dependencies = [ [[package]] name = "reth-trie-common" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9965,7 +10069,7 @@ dependencies = [ [[package]] name = "reth-trie-db" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "reth-db-api", @@ -9978,7 +10082,7 @@ dependencies = [ [[package]] name = "reth-trie-parallel" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9995,7 +10099,7 @@ dependencies = [ "reth-trie-common", "reth-trie-db", "reth-trie-sparse", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10003,7 +10107,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10022,7 +10126,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse-parallel" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10040,25 +10144,25 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" +source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" dependencies = [ "zstd", ] [[package]] name = "revm" -version = "28.0.1" +version = "29.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee5d3f7d031e90ab47c7488061bdc4875abc4e9dcea6c18f5dee09732d0436fb" +checksum = "0c278b6ee9bba9e25043e3fae648fdce632d1944d3ba16f5203069b43bddd57f" dependencies = [ "revm-bytecode", "revm-context", - "revm-context-interface 10.0.1", + "revm-context-interface", "revm-database", "revm-database-interface", "revm-handler", "revm-inspector", - "revm-interpreter 25.0.1", + "revm-interpreter", "revm-precompile", "revm-primitives", "revm-state", @@ -10066,9 +10170,9 @@ dependencies = [ [[package]] name = "revm-bytecode" -version = "6.2.1" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d800e6c2119457ded5b0af71634eb2468040bf97de468eee5a730272a106da0" +checksum = "66c52031b73cae95d84cd1b07725808b5fd1500da3e5e24574a3b2dc13d9f16d" dependencies = [ "bitvec", "phf", @@ -10078,31 +10182,15 @@ dependencies = [ [[package]] name = "revm-context" -version = "9.0.1" +version = "9.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c63485b4d1b0e67f342f9a8c0e9f78b6b5f1750863a39bdf6ceabdbaaf4aed1" +checksum = "0fb02c5dab3b535aa5b18277b1d21c5117a25d42af717e6ce133df0ea56663e1" dependencies = [ "bitvec", "cfg-if", "derive-where", "revm-bytecode", - "revm-context-interface 10.0.1", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-context-interface" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a303a93102fceccec628265efd550ce49f2817b38ac3a492c53f7d524f18a1ca" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "auto_impl", - "either", + "revm-context-interface", "revm-database-interface", "revm-primitives", "revm-state", @@ -10111,9 +10199,9 @@ dependencies = [ [[package]] name = "revm-context-interface" -version = "10.0.1" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550cb8b9465e00bdb0a384922b69f864c5bcc228bed19c8ecbfa69fff2256382" +checksum = "6b8e9311d27cf75fbf819e7ba4ca05abee1ae02e44ff6a17301c7ab41091b259" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -10127,9 +10215,9 @@ dependencies = [ [[package]] name = "revm-database" -version = "7.0.4" +version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40000c7d917c865f6c232a78581b78e70c43f52db17282bd1b52d4f0565bc8a2" +checksum = "39a276ed142b4718dcf64bc9624f474373ed82ef20611025045c3fb23edbef9c" dependencies = [ "alloy-eips", "revm-bytecode", @@ -10141,9 +10229,9 @@ dependencies = [ [[package]] name = "revm-database-interface" -version = "7.0.4" +version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ccea7a168cba1196b1e57dd3e22c36047208c135f600f8e58cbe7d49957dba" +checksum = "8c523c77e74eeedbac5d6f7c092e3851dbe9c7fec6f418b85992bd79229db361" dependencies = [ "auto_impl", "either", @@ -10154,17 +10242,17 @@ dependencies = [ [[package]] name = "revm-handler" -version = "9.0.1" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cb09d07e6799823ce5a344f1604236b53fe1a92bacd7122c0b16286f92254c2" +checksum = "528d2d81cc918d311b8231c35330fac5fba8b69766ddc538833e2b5593ee016e" dependencies = [ "auto_impl", "derive-where", "revm-bytecode", "revm-context", - "revm-context-interface 10.0.1", + "revm-context-interface", "revm-database-interface", - "revm-interpreter 25.0.1", + "revm-interpreter", "revm-precompile", "revm-primitives", "revm-state", @@ -10173,16 +10261,16 @@ dependencies = [ [[package]] name = "revm-inspector" -version = "9.1.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2770c0d7e9f4f23660dc0b8b954b7a1eee8989ec97f936ebce366c78b6d7b915" +checksum = "bf443b664075999a14916b50c5ae9e35a7d71186873b8f8302943d50a672e5e0" dependencies = [ "auto_impl", "either", "revm-context", "revm-database-interface", "revm-handler", - "revm-interpreter 25.0.1", + "revm-interpreter", "revm-primitives", "revm-state", "serde", @@ -10191,9 +10279,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a76ba086ca57a718368e46e792a81c5eb7a30366956aa6293adbcec8b1181ce" +checksum = "2b5c15d9c33ae98988a2a6a8db85b6a9e3389d1f3f2fdb95628a992f2b65b2c1" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -10206,38 +10294,26 @@ dependencies = [ "revm", "serde", "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "revm-interpreter" -version = "23.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95c4a9a1662d10b689b66b536ddc2eb1e89f5debfcabc1a2d7b8417a2fa47cd" -dependencies = [ - "revm-bytecode", - "revm-context-interface 8.0.1", - "revm-primitives", - "serde", + "thiserror 2.0.16", ] [[package]] name = "revm-interpreter" -version = "25.0.1" +version = "25.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c938c0d4d617c285203cad8aba1cefeec383fcff2fdf94a4469f588ab979b5" +checksum = "53d6406b711fac73b4f13120f359ed8e65964380dd6182bd12c4c09ad0d4641f" dependencies = [ "revm-bytecode", - "revm-context-interface 10.0.1", + "revm-context-interface", "revm-primitives", "serde", ] [[package]] name = "revm-precompile" -version = "26.0.1" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7bb5e8b92891c5ac9dd8dae157bd1d90aab01973ad4f99d4135d507facc3e7" +checksum = "25b57d4bd9e6b5fe469da5452a8a137bc2d030a3cd47c46908efc615bbc699da" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -10273,11 +10349,11 @@ dependencies = [ [[package]] name = "revm-state" -version = "7.0.4" +version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d7f39ea56df3bfbb3c81c99b1f028d26f205b6004156baffbf1a4f84b46cfa" +checksum = "1f64fbacb86008394aaebd3454f9643b7d5a782bd251135e17c5b33da592d84d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "revm-bytecode", "revm-primitives", "serde", @@ -10434,7 +10510,7 @@ dependencies = [ "sha2 0.10.9", "tempfile", "testcontainers", - "thiserror 2.0.14", + "thiserror 2.0.16", "time", "tokio", "tokio-tungstenite", @@ -10457,9 +10533,9 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "rug" -version = "1.27.0" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3" +checksum = "58ad2e973fe3c3214251a840a621812a4f40468da814b1a3d6947d433c2af11f" dependencies = [ "az", "gmp-mpfr-sys", @@ -10552,7 +10628,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "errno", "libc", "linux-raw-sys 0.4.15", @@ -10565,7 +10641,7 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "errno", "libc", "linux-raw-sys 0.9.4", @@ -10815,7 +10891,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -10828,7 +10904,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -10901,16 +10977,16 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.0", "itoa", "memchr", "ryu", @@ -10925,7 +11001,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -10959,7 +11035,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.10.0", + "indexmap 2.11.0", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -10978,7 +11054,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11118,7 +11194,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.14", + "thiserror 2.0.16", "time", ] @@ -11250,7 +11326,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11261,7 +11337,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11292,7 +11368,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11304,7 +11380,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11326,9 +11402,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.105" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -11337,14 +11413,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a985ff4ffd7373e10e0fb048110fb11a162e5a4c47f92ddb8787a6f766b769" +checksum = "a0b198d366dbec045acfcd97295eb653a7a2b40e4dc764ef1e79aafcad439d3c" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11364,7 +11440,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11386,7 +11462,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -11430,22 +11506,22 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac9ee8b664c9f1740cd813fea422116f8ba29997bb7c878d1940424889802897" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.3", "log", "num-traits", ] [[package]] name = "tempfile" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix 1.0.8", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -11475,7 +11551,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.14", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-tar", @@ -11500,11 +11576,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.14" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.14", + "thiserror-impl 2.0.16", ] [[package]] @@ -11515,18 +11591,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.14" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11643,9 +11719,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -11684,7 +11760,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -11795,7 +11871,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.0", "serde", "serde_spanned", "toml_datetime", @@ -11868,7 +11944,7 @@ dependencies = [ "futures-core", "futures-util", "hdrhistogram", - "indexmap 2.10.0", + "indexmap 2.11.0", "pin-project-lite", "slab", "sync_wrapper", @@ -11887,7 +11963,7 @@ checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "async-compression", "base64 0.22.1", - "bitflags 2.9.1", + "bitflags 2.9.3", "bytes", "futures-core", "futures-util", @@ -11954,7 +12030,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12091,7 +12167,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12132,7 +12208,7 @@ dependencies = [ "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.14", + "thiserror 2.0.16", "utf-8", ] @@ -12249,9 +12325,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -12361,7 +12437,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12400,11 +12476,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.3+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -12429,7 +12505,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -12464,7 +12540,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -12597,11 +12673,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -12709,7 +12785,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12720,7 +12796,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12731,7 +12807,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12742,7 +12818,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12753,7 +12829,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -12764,7 +12840,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -13139,9 +13215,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -13157,13 +13233,10 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" [[package]] name = "write16" @@ -13196,7 +13269,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror 2.0.14", + "thiserror 2.0.16", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -13259,7 +13332,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "synstructure", ] @@ -13271,7 +13344,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "synstructure", ] @@ -13292,7 +13365,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -13312,7 +13385,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", "synstructure", ] @@ -13333,7 +13406,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -13377,7 +13450,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] @@ -13388,7 +13461,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.106", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c5065740..55bda15e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,9 +8,6 @@ members = [ "crates/flashblocks-node", ] -[patch.crates-io] -alloy-primitives = { git = "https://github.com/alloy-rs/core", rev = "8c5713c" } - [workspace.dependencies] rollup-boost = { path = "crates/rollup-boost" } flashblocks-p2p = { path = "crates/flashblocks-p2p" } @@ -33,27 +30,27 @@ sha2 = { version = "0.10", default-features = false } arbitrary = { version = "=1.4.2", features = ["derive"] } # Reth deps -reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } # Issue with reth feature compatibility. Include this in all crates for temp fix. -reth-op = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ +reth-op = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ "full", "alloy-compat", ] } -reth = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-network = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ +reth = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-network = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ "serde", "arbitrary", "reth-codec", ] } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "6daf5fc" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "9b86326" } # Alloy libraries alloy-rpc-types-engine = "1.0.13" @@ -68,10 +65,10 @@ alloy-genesis = "1.0.13" alloy-rpc-client = "1.0.13" alloy-rlp = "0.3.12" alloy-provider = "1.0.13" -op-alloy-network = "0.18.7" -op-alloy-rpc-types-engine = "0.18.7" -op-alloy-consensus = "0.18.7" -op-alloy-rpc-types = "=0.18.14" +op-alloy-network = "0.19.1" +op-alloy-rpc-types-engine = "0.19.1" +op-alloy-consensus = "0.19.1" +op-alloy-rpc-types = "0.19.1" tokio-tungstenite = { version = "0.26.2", features = ["native-tls"] } testcontainers = "0.23" testcontainers-modules = { version = "0.11", features = ["redis"] } diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index 6fbcaed7..d2da4ae4 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -9,26 +9,26 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true flashblocks-rpc.workspace = true -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 8715bebc..3b790559 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -9,23 +9,23 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true reth-optimism-primitives.workspace = true -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc", features = [ +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "6daf5fc" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } reth-eth-wire = { workspace = true } reth-network = { workspace = true } @@ -56,6 +56,6 @@ metrics-derive.workspace = true serde_json.workspace = true serde.workspace = true -jsonrpsee = { version = "0.25.1" } +jsonrpsee = { version = "0.26.0" } futures-util = "0.3.31" brotli = "8.0.1" diff --git a/crates/flashblocks-rpc/src/rpc.rs b/crates/flashblocks-rpc/src/rpc.rs index d1aa8dcb..b526aab1 100644 --- a/crates/flashblocks-rpc/src/rpc.rs +++ b/crates/flashblocks-rpc/src/rpc.rs @@ -1,9 +1,8 @@ use alloy_eips::{BlockId, BlockNumberOrTag}; use alloy_primitives::{Address, TxHash, U256}; -use jsonrpsee::{ - core::{RpcResult, async_trait}, - proc_macros::rpc, -}; +use jsonrpsee::core::RpcResult; +use jsonrpsee::core::async_trait; +use jsonrpsee::proc_macros::rpc; use op_alloy_network::Optimism; use reth_optimism_primitives::OpTransactionSigned; use reth_provider::TransactionsProvider; From bb873b2e7a0f5694b47a4957070fb762eefee35c Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 5 Sep 2025 15:21:39 -0700 Subject: [PATCH 090/114] feat: publish vs subscribe client types --- crates/flashblocks-node/src/bin/main.rs | 4 +- crates/flashblocks-node/tests/p2p.rs | 56 +++++---- crates/flashblocks-p2p/src/net/mod.rs | 13 ++- .../src/protocol/connection.rs | 44 ++++--- .../flashblocks-p2p/src/protocol/handler.rs | 109 ++++++++++++++---- crates/flashblocks-p2p/tests/protocol.rs | 34 +++--- crates/flashblocks-rpc/src/flashblocks.rs | 9 +- 7 files changed, 176 insertions(+), 93 deletions(-) diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index 71dde4d8..a8d04431 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -24,8 +24,8 @@ pub fn main() { Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); - let flashblocks_handle = - FlashblocksHandle::new(VerifyingKey::default(), SigningKey::from_bytes(&[0u8; 32])); + let flashblocks_handle = FlashblocksHandle::new(VerifyingKey::default()) + .publisher(SigningKey::from_bytes(&[0u8; 32])); let flashblocks_overlay = FlashblocksOverlay::new(flashblocks_handle.clone(), chain_spec); diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index c80ee4b8..a83d4793 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -5,7 +5,9 @@ use alloy_provider::{Provider, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol, PeerMsg}; +use flashblocks_p2p::protocol::handler::{ + FlashblocksHandle, FlashblocksP2PProtocol, PeerMsg, Publish, +}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; use op_alloy_consensus::{OpPooledTransaction, OpTxEnvelope}; use reth_eth_wire::BasicNetworkPrimitives; @@ -39,7 +41,7 @@ type Network = NetworkHandle< >; pub struct NodeContext { - p2p_handle: FlashblocksHandle, + p2p_handle: FlashblocksHandle, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -97,7 +99,7 @@ async fn setup_node( let node = OpNode::new(RollupArgs::default()); - let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key(), builder_sk); + let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key()).publisher(builder_sk); let p2p_handle_clone = p2p_handle.clone(); let NodeHandle { @@ -301,11 +303,14 @@ async fn test_double_failover() -> eyre::Result<()> { payload_0.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let msg = payload_0.clone(); - let authorized_0 = - AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization_0, msg); + let authorized_0 = AuthorizedPayload::new( + &nodes[0].p2p_handle.ctx.client.builder_sk, + authorization_0, + msg, + ); nodes[0].p2p_handle.start_publishing(authorization_0); nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -315,10 +320,10 @@ async fn test_double_failover() -> eyre::Result<()> { payload_1.payload_id, 0, &authorizer, - nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[1].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let authorized_1 = AuthorizedPayload::new( - &nodes[1].p2p_handle.ctx.builder_sk, + &nodes[1].p2p_handle.ctx.client.builder_sk, authorization_1, payload_1.clone(), ); @@ -334,10 +339,10 @@ async fn test_double_failover() -> eyre::Result<()> { payload_2.payload_id, 0, &authorizer, - nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[2].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let authorized_2 = AuthorizedPayload::new( - &nodes[2].p2p_handle.ctx.builder_sk, + &nodes[2].p2p_handle.ctx.client.builder_sk, authorization_2, msg.clone(), ); @@ -389,11 +394,14 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_0.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let msg = payload_0.clone(); - let authorized = - AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization, msg); + let authorized = AuthorizedPayload::new( + &nodes[0].p2p_handle.ctx.client.builder_sk, + authorization, + msg, + ); nodes[0].p2p_handle.start_publishing(authorization); nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -415,10 +423,10 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_1.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.builder_sk, + &nodes[0].p2p_handle.ctx.client.builder_sk, authorization, payload_1.clone(), ); @@ -443,17 +451,17 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_2.payload_id, 1, &authorizer, - nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[1].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let authorization_2 = Authorization::new( payload_2.payload_id, 1, &authorizer, - nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[2].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let msg = payload_2.clone(); let authorized_1 = AuthorizedPayload::new( - &nodes[1].p2p_handle.ctx.builder_sk, + &nodes[1].p2p_handle.ctx.client.builder_sk, authorization_1, msg.clone(), ); @@ -505,10 +513,10 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { base_payload.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.builder_sk, + &nodes[0].p2p_handle.ctx.client.builder_sk, authorization, base_payload, ); @@ -530,10 +538,10 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { next_payload.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.builder_sk, + &nodes[0].p2p_handle.ctx.client.builder_sk, authorization, next_payload, ); @@ -579,12 +587,12 @@ async fn test_peer_reputation() -> eyre::Result<()> { payload_0.payload_id, 0, &invalid_authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), ); let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); let authorized_payload = Authorized::new( - &nodes[0].p2p_handle.ctx.builder_sk, + &nodes[0].p2p_handle.ctx.client.builder_sk, authorization, authorized_msg, ); diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index d8cf9b47..3d6236ac 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -11,17 +11,17 @@ use reth_node_builder::{ use reth_transaction_pool::{PoolTransaction, TransactionPool}; use crate::protocol::handler::{ - FlashblocksHandle, FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, + FlashblocksHandle, FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, P2PClient, }; #[derive(Debug)] -pub struct FlashblocksNetworkBuilder { +pub struct FlashblocksNetworkBuilder { inner: T, - flashblocks_p2p_handle: Option, + flashblocks_p2p_handle: Option>, } -impl FlashblocksNetworkBuilder { - pub fn new(inner: T, flashblocks_p2p_handle: FlashblocksHandle) -> Self { +impl FlashblocksNetworkBuilder { + pub fn new(inner: T, flashblocks_p2p_handle: FlashblocksHandle) -> Self { Self { inner, flashblocks_p2p_handle: Some(flashblocks_p2p_handle), @@ -36,9 +36,10 @@ impl FlashblocksNetworkBuilder { } } -impl NetworkBuilder for FlashblocksNetworkBuilder +impl NetworkBuilder for FlashblocksNetworkBuilder where T: NetworkBuilder, + C: P2PClient, Node: FullNodeTypes>, Pool: TransactionPool>> + Unpin diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 1a8a2afe..57edd8f2 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,5 +1,5 @@ use crate::protocol::handler::{ - FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, MAX_FLASHBLOCK_INDEX, PeerMsg, + FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, MAX_FLASHBLOCK_INDEX, P2PClient, PeerMsg, PublishingStatus, }; use alloy_primitives::bytes::BytesMut; @@ -27,9 +27,9 @@ use tracing::trace; /// /// The connection implements the `Stream` trait to provide outgoing message bytes that /// should be sent to the connected peer over the underlying protocol connection. -pub struct FlashblocksConnection { +pub struct FlashblocksConnection { /// The flashblocks protocol handler that manages the overall protocol state. - protocol: FlashblocksP2PProtocol, + protocol: FlashblocksP2PProtocol, /// The underlying protocol connection for sending and receiving raw bytes. conn: ProtocolConnection, /// The unique identifier of the connected peer. @@ -44,7 +44,7 @@ pub struct FlashblocksConnection { received: Vec, } -impl FlashblocksConnection { +impl FlashblocksConnection { /// Creates a new `FlashblocksConnection` instance. /// /// # Arguments @@ -53,12 +53,12 @@ impl FlashblocksConnection { /// * `peer_id` - The unique identifier of the connected peer. /// * `peer_rx` - Receiver for peer messages to be sent to all peers. pub fn new( - protocol: FlashblocksP2PProtocol, + protocol: FlashblocksP2PProtocol, conn: ProtocolConnection, peer_id: PeerId, peer_rx: BroadcastStream, ) -> Self { - gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).increment(1); + gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).increment(1); Self { protocol, @@ -71,13 +71,16 @@ impl FlashblocksConnection { } } -impl Drop for FlashblocksConnection { +impl Drop for FlashblocksConnection { fn drop(&mut self) { - gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).decrement(1); + gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).decrement(1); } } -impl Stream for FlashblocksConnection { +impl Stream for FlashblocksConnection +where + C: P2PClient, +{ type Item = BytesMut; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { @@ -159,8 +162,14 @@ impl Stream for FlashblocksConnection { match msg { FlashblocksP2PMsg::Authorized(authorized) => { - if authorized.authorization.builder_vk - == this.protocol.handle.ctx.builder_sk.verifying_key() + if Some(authorized.authorization.builder_vk) + == this + .protocol + .handle + .ctx + .client + .builder_sk() + .map(|s| s.verifying_key()) { tracing::warn!( target: "flashblocks::p2p", @@ -203,7 +212,7 @@ impl Stream for FlashblocksConnection { } } -impl FlashblocksConnection { +impl FlashblocksConnection { /// Handles incoming flashblock payload messages from a peer. /// /// This method validates the flashblock payload, checks for duplicates and ordering, @@ -334,6 +343,10 @@ impl FlashblocksConnection { fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { let state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; + let Some(builder_sk) = self.protocol.handle.ctx.client.builder_sk() else { + // We're not publishers so we can ignore + return; + }; // Check if the request is expired for dos protection. // It's important to ensure that this `StartPublish` request @@ -363,11 +376,8 @@ impl FlashblocksConnection { "Received StartPublish over p2p, stopping publishing flashblocks" ); - let authorized = Authorized::new( - &self.protocol.handle.ctx.builder_sk, - *our_authorization, - StopPublish.into(), - ); + let authorized = + Authorized::new(builder_sk, *our_authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.protocol.handle.ctx.peer_tx.send(peer_msg).ok(); diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 96272d5e..bda41903 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -129,17 +129,42 @@ impl FlashblocksP2PState { } } +#[derive(Clone, Debug)] +pub struct Subscibe; + +#[derive(Clone, Debug)] +pub struct Publish { + /// Builder's signing key used to sign outgoing authorized P2P messages. + pub builder_sk: SigningKey, +} + +pub trait P2PClient: Unpin + Clone + std::fmt::Debug + Send + Sync + 'static { + fn builder_sk(&self) -> Option<&SigningKey>; +} + +impl P2PClient for Subscibe { + fn builder_sk(&self) -> Option<&SigningKey> { + None + } +} + +impl P2PClient for Publish { + fn builder_sk(&self) -> Option<&SigningKey> { + Some(&self.builder_sk) + } +} + /// Context struct containing shared resources for the flashblocks P2P protocol. /// /// This struct holds the network handle, cryptographic keys, and communication channels /// used across all connections in the flashblocks P2P protocol. It provides the shared /// infrastructure needed for message verification, signing, and broadcasting. #[derive(Clone, Debug)] -pub struct FlashblocksP2PCtx { +pub struct FlashblocksP2PCtx { + /// Client type, either publisher or subscriber + pub client: C, /// Authorizer's verifying key used to verify authorization signatures from rollup-boost. pub authorizer_vk: VerifyingKey, - /// Builder's signing key used to sign outgoing authorized P2P messages. - pub builder_sk: SigningKey, /// Broadcast sender for peer messages that will be sent to all connected peers. /// Messages may not be strictly ordered due to network conditions. pub peer_tx: broadcast::Sender, @@ -153,22 +178,22 @@ pub struct FlashblocksP2PCtx { /// Encapsulates the shared context and mutable state of the flashblocks /// P2P protocol. #[derive(Clone, Debug)] -pub struct FlashblocksHandle { +pub struct FlashblocksHandle { /// Shared context containing network handle, keys, and communication channels. - pub ctx: FlashblocksP2PCtx, + pub ctx: FlashblocksP2PCtx, /// Thread-safe mutable state of the flashblocks protocol. /// Protected by a mutex to allow concurrent access from multiple connections. pub state: Arc>, } -impl FlashblocksHandle { - pub fn new(authorizer_vk: VerifyingKey, builder_sk: SigningKey) -> Self { +impl FlashblocksHandle { + pub fn new(authorizer_vk: VerifyingKey) -> Self { let flashblock_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let peer_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); let ctx = FlashblocksP2PCtx { + client: Subscibe, authorizer_vk, - builder_sk, peer_tx, flashblock_tx, }; @@ -176,6 +201,23 @@ impl FlashblocksHandle { Self { ctx, state } } + pub fn publisher(&self, builder_sk: SigningKey) -> FlashblocksHandle { + let sub = self.clone(); + let ctx = FlashblocksP2PCtx { + client: Publish { builder_sk }, + authorizer_vk: sub.ctx.authorizer_vk, + peer_tx: sub.ctx.peer_tx, + flashblock_tx: sub.ctx.flashblock_tx, + }; + + FlashblocksHandle { + state: sub.state, + ctx, + } + } +} + +impl FlashblocksHandle { pub fn flashblocks_tx(&self) -> broadcast::Sender { self.ctx.flashblock_tx.clone() } @@ -187,14 +229,14 @@ impl FlashblocksHandle { /// and maintains the protocol state across all peer connections. It implements the core /// logic for multi-builder coordination and failover scenarios in HA sequencer setups. #[derive(Clone, Debug)] -pub struct FlashblocksP2PProtocol { +pub struct FlashblocksP2PProtocol { /// Network handle used to update peer reputation and manage connections. pub network: N, /// Shared context containing network handle, keys, and communication channels. - pub handle: FlashblocksHandle, + pub handle: FlashblocksHandle, } -impl FlashblocksP2PProtocol { +impl FlashblocksP2PProtocol { /// Creates a new flashblocks P2P protocol handler. /// /// Initializes the handler with the necessary cryptographic keys, network handle, @@ -203,7 +245,7 @@ impl FlashblocksP2PProtocol { /// # Arguments /// * `network` - Network handle for peer management and reputation updates /// * `handle` - Shared handle containing the protocol context and mutable state - pub fn new(network: N, handle: FlashblocksHandle) -> Self { + pub fn new(network: N, handle: FlashblocksHandle) -> Self { Self { network: network.clone(), handle, @@ -211,7 +253,7 @@ impl FlashblocksP2PProtocol { } } -impl FlashblocksP2PProtocol { +impl FlashblocksP2PProtocol { /// Returns the P2P capability for the flashblocks v1 protocol. /// /// This capability is used during devp2p handshake to advertise support @@ -221,7 +263,7 @@ impl FlashblocksP2PProtocol { } } -impl FlashblocksHandle { +impl FlashblocksHandle { /// Publishes a newly created flashblock from the payload builder to the P2P network. /// /// This method validates that the builder has authorization to publish and that @@ -333,8 +375,11 @@ impl FlashblocksHandle { PublishingStatus::NotPublishing { active_publishers } => { // Send an authorized `StartPublish` message to the network let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); - let authorized_payload = - Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); + let authorized_payload = Authorized::new( + &self.ctx.client.builder_sk, + new_authorization, + authorized_msg, + ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -383,8 +428,11 @@ impl FlashblocksHandle { timestamp = %authorization.timestamp, "stopping to publish flashblocks", ); - let authorized_payload = - Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); + let authorized_payload = Authorized::new( + &self.ctx.client.builder_sk, + *authorization, + StopPublish.into(), + ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -404,8 +452,11 @@ impl FlashblocksHandle { timestamp = %authorization.timestamp, "aborting wait to publish flashblocks", ); - let authorized_payload = - Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); + let authorized_payload = Authorized::new( + &self.ctx.client.builder_sk, + *authorization, + StopPublish.into(), + ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -417,7 +468,9 @@ impl FlashblocksHandle { } }); } +} +impl FlashblocksHandle { /// Returns a stream of ordered flashblocks starting from the beginning of the current payload. /// /// # Behavior @@ -440,7 +493,7 @@ impl FlashblocksHandle { } } -impl FlashblocksP2PCtx { +impl FlashblocksP2PCtx { /// Processes and publishes a verified flashblock payload to the P2P network and local stream. /// /// This method handles the core logic of flashblock processing, including validation, @@ -557,7 +610,11 @@ impl FlashblocksP2PCtx { } } -impl ProtocolHandler for FlashblocksP2PProtocol { +impl ProtocolHandler for FlashblocksP2PProtocol +where + N: FlashblocksP2PNetworkHandle, + C: P2PClient, +{ type ConnectionHandler = Self; fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { @@ -573,8 +630,12 @@ impl ProtocolHandler for FlashblocksP2PProtocol< } } -impl ConnectionHandler for FlashblocksP2PProtocol { - type Connection = FlashblocksConnection; +impl ConnectionHandler for FlashblocksP2PProtocol +where + N: FlashblocksP2PNetworkHandle, + C: P2PClient, +{ + type Connection = FlashblocksConnection; fn protocol(&self) -> Protocol { Protocol::new(Self::capability(), 1) diff --git a/crates/flashblocks-p2p/tests/protocol.rs b/crates/flashblocks-p2p/tests/protocol.rs index 01223898..b044942b 100644 --- a/crates/flashblocks-p2p/tests/protocol.rs +++ b/crates/flashblocks-p2p/tests/protocol.rs @@ -1,5 +1,5 @@ use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, PublishingStatus}; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, Publish, PublishingStatus}; use futures::StreamExt as _; use reth::payload::PayloadId; use rollup_boost::{ @@ -31,12 +31,12 @@ fn payload(payload_id: reth::payload::PayloadId, idx: u64) -> FlashblocksPayload } /// Build a fresh handle plus its broadcast receiver. -fn fresh_handle() -> FlashblocksHandle { +fn fresh_handle() -> FlashblocksHandle { // authorizer + builder keys let auth_sk = signing_key(1); let builder_sk = signing_key(2); - FlashblocksHandle::new(auth_sk.verifying_key(), builder_sk) + FlashblocksHandle::new(auth_sk.verifying_key()).publisher(builder_sk) } #[tokio::test] @@ -48,10 +48,10 @@ async fn publish_without_clearance_is_rejected() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload.clone()); + let signed = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, payload.clone()); // We never called `start_publishing`, so this must fail. let err = handle.publish_new(signed).unwrap_err(); @@ -71,7 +71,7 @@ async fn expired_authorization_is_rejected() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); handle.start_publishing(auth_1); @@ -80,10 +80,10 @@ async fn expired_authorization_is_rejected() { payload_id, DUMMY_TIMESTAMP + 1, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth_2, payload); + let signed = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth_2, payload); let err = handle.publish_new(signed).unwrap_err(); assert!(matches!( @@ -102,14 +102,14 @@ async fn flashblock_stream_is_ordered() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); handle.start_publishing(auth); // send index 1 first (out-of-order) for &idx in &[1u64, 0] { let p = payload(payload_id, idx); - let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, p.clone()); + let signed = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, p.clone()); handle.publish_new(signed).unwrap(); } @@ -132,7 +132,7 @@ async fn stop_and_restart_updates_state() { payload_id_0, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); handle.start_publishing(auth_0); assert!(matches!( @@ -153,7 +153,7 @@ async fn stop_and_restart_updates_state() { payload_id_1, DUMMY_TIMESTAMP + 5, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); handle.start_publishing(auth_1); assert!(matches!( @@ -184,7 +184,7 @@ async fn stop_and_restart_with_active_publishers() { payload_id, timestamp, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); handle.start_publishing(auth); match handle.publishing_status() { @@ -218,12 +218,12 @@ async fn flashblock_stream_buffers_and_live() { pid, timestamp, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); handle.start_publishing(auth); // publish index 0 before creating the stream - let signed0 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 0)); + let signed0 = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, payload(pid, 0)); handle.publish_new(signed0).unwrap(); // now create the combined stream @@ -234,7 +234,7 @@ async fn flashblock_stream_buffers_and_live() { assert_eq!(first.index, 0); // publish index 1 after the stream exists - let signed1 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 1)); + let signed1 = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, payload(pid, 1)); handle.publish_new(signed1).unwrap(); // second item should be delivered live @@ -263,7 +263,7 @@ async fn await_clearance_unblocks_on_publish() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + handle.ctx.client.builder_sk.verifying_key(), ); handle.start_publishing(auth); diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index d90427f5..aaf15952 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -1,6 +1,6 @@ use crate::{FlashblocksApi, cache::FlashblocksCache}; use alloy_primitives::{Address, TxHash, U256}; -use flashblocks_p2p::protocol::handler::FlashblocksHandle; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, Publish}; use futures_util::StreamExt as _; use jsonrpsee::core::async_trait; use op_alloy_network::Optimism; @@ -12,12 +12,15 @@ use tracing::error; #[derive(Debug, Clone)] pub struct FlashblocksOverlay { - flashblocks_handle: FlashblocksHandle, + flashblocks_handle: FlashblocksHandle, cache: FlashblocksCache, } impl FlashblocksOverlay { - pub fn new(flashblocks_handle: FlashblocksHandle, chain_spec: Arc) -> Self { + pub fn new( + flashblocks_handle: FlashblocksHandle, + chain_spec: Arc, + ) -> Self { Self { flashblocks_handle, cache: FlashblocksCache::new(chain_spec), From 39d6a2798dee04015a2d50dfc8e64fe424952656 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Fri, 5 Sep 2025 15:57:15 -0700 Subject: [PATCH 091/114] feat: fn subscriber() --- crates/flashblocks-p2p/src/protocol/handler.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index bda41903..d7e516bd 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -217,6 +217,23 @@ impl FlashblocksHandle { } } +impl FlashblocksHandle { + pub fn subscriber(&self) -> FlashblocksHandle { + let publish = self.clone(); + let ctx = FlashblocksP2PCtx { + client: Subscibe, + authorizer_vk: publish.ctx.authorizer_vk, + peer_tx: publish.ctx.peer_tx, + flashblock_tx: publish.ctx.flashblock_tx, + }; + + FlashblocksHandle { + state: publish.state, + ctx, + } + } +} + impl FlashblocksHandle { pub fn flashblocks_tx(&self) -> broadcast::Sender { self.ctx.flashblock_tx.clone() From dc3f48c57ff58f753a0fa6930650aafa2455557a Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 8 Sep 2025 11:54:18 -0700 Subject: [PATCH 092/114] Revert "feat: fn subscriber()" This reverts commit 39d6a2798dee04015a2d50dfc8e64fe424952656. --- crates/flashblocks-p2p/src/protocol/handler.rs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index d7e516bd..bda41903 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -217,23 +217,6 @@ impl FlashblocksHandle { } } -impl FlashblocksHandle { - pub fn subscriber(&self) -> FlashblocksHandle { - let publish = self.clone(); - let ctx = FlashblocksP2PCtx { - client: Subscibe, - authorizer_vk: publish.ctx.authorizer_vk, - peer_tx: publish.ctx.peer_tx, - flashblock_tx: publish.ctx.flashblock_tx, - }; - - FlashblocksHandle { - state: publish.state, - ctx, - } - } -} - impl FlashblocksHandle { pub fn flashblocks_tx(&self) -> broadcast::Sender { self.ctx.flashblock_tx.clone() From 075b9c67147fae078d72d824018d419c87dd8bd6 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 8 Sep 2025 11:54:33 -0700 Subject: [PATCH 093/114] Revert "feat: publish vs subscribe client types" This reverts commit bb873b2e7a0f5694b47a4957070fb762eefee35c. --- crates/flashblocks-node/src/bin/main.rs | 4 +- crates/flashblocks-node/tests/p2p.rs | 56 ++++----- crates/flashblocks-p2p/src/net/mod.rs | 13 +-- .../src/protocol/connection.rs | 44 +++---- .../flashblocks-p2p/src/protocol/handler.rs | 109 ++++-------------- crates/flashblocks-p2p/tests/protocol.rs | 34 +++--- crates/flashblocks-rpc/src/flashblocks.rs | 9 +- 7 files changed, 93 insertions(+), 176 deletions(-) diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index a8d04431..71dde4d8 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -24,8 +24,8 @@ pub fn main() { Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); - let flashblocks_handle = FlashblocksHandle::new(VerifyingKey::default()) - .publisher(SigningKey::from_bytes(&[0u8; 32])); + let flashblocks_handle = + FlashblocksHandle::new(VerifyingKey::default(), SigningKey::from_bytes(&[0u8; 32])); let flashblocks_overlay = FlashblocksOverlay::new(flashblocks_handle.clone(), chain_spec); diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index a83d4793..c80ee4b8 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -5,9 +5,7 @@ use alloy_provider::{Provider, RootProvider}; use alloy_rpc_client::RpcClient; use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::{ - FlashblocksHandle, FlashblocksP2PProtocol, PeerMsg, Publish, -}; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol, PeerMsg}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; use op_alloy_consensus::{OpPooledTransaction, OpTxEnvelope}; use reth_eth_wire::BasicNetworkPrimitives; @@ -41,7 +39,7 @@ type Network = NetworkHandle< >; pub struct NodeContext { - p2p_handle: FlashblocksHandle, + p2p_handle: FlashblocksHandle, pub local_node_record: NodeRecord, http_api_addr: SocketAddr, _node_exit_future: NodeExitFuture, @@ -99,7 +97,7 @@ async fn setup_node( let node = OpNode::new(RollupArgs::default()); - let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key()).publisher(builder_sk); + let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key(), builder_sk); let p2p_handle_clone = p2p_handle.clone(); let NodeHandle { @@ -303,14 +301,11 @@ async fn test_double_failover() -> eyre::Result<()> { payload_0.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); let msg = payload_0.clone(); - let authorized_0 = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.client.builder_sk, - authorization_0, - msg, - ); + let authorized_0 = + AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization_0, msg); nodes[0].p2p_handle.start_publishing(authorization_0); nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -320,10 +315,10 @@ async fn test_double_failover() -> eyre::Result<()> { payload_1.payload_id, 0, &authorizer, - nodes[1].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), ); let authorized_1 = AuthorizedPayload::new( - &nodes[1].p2p_handle.ctx.client.builder_sk, + &nodes[1].p2p_handle.ctx.builder_sk, authorization_1, payload_1.clone(), ); @@ -339,10 +334,10 @@ async fn test_double_failover() -> eyre::Result<()> { payload_2.payload_id, 0, &authorizer, - nodes[2].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), ); let authorized_2 = AuthorizedPayload::new( - &nodes[2].p2p_handle.ctx.client.builder_sk, + &nodes[2].p2p_handle.ctx.builder_sk, authorization_2, msg.clone(), ); @@ -394,14 +389,11 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_0.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); let msg = payload_0.clone(); - let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.client.builder_sk, - authorization, - msg, - ); + let authorized = + AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization, msg); nodes[0].p2p_handle.start_publishing(authorization); nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -423,10 +415,10 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_1.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.client.builder_sk, + &nodes[0].p2p_handle.ctx.builder_sk, authorization, payload_1.clone(), ); @@ -451,17 +443,17 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_2.payload_id, 1, &authorizer, - nodes[1].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), ); let authorization_2 = Authorization::new( payload_2.payload_id, 1, &authorizer, - nodes[2].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), ); let msg = payload_2.clone(); let authorized_1 = AuthorizedPayload::new( - &nodes[1].p2p_handle.ctx.client.builder_sk, + &nodes[1].p2p_handle.ctx.builder_sk, authorization_1, msg.clone(), ); @@ -513,10 +505,10 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { base_payload.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.client.builder_sk, + &nodes[0].p2p_handle.ctx.builder_sk, authorization, base_payload, ); @@ -538,10 +530,10 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { next_payload.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.client.builder_sk, + &nodes[0].p2p_handle.ctx.builder_sk, authorization, next_payload, ); @@ -587,12 +579,12 @@ async fn test_peer_reputation() -> eyre::Result<()> { payload_0.payload_id, 0, &invalid_authorizer, - nodes[0].p2p_handle.ctx.client.builder_sk.verifying_key(), + nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), ); let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); let authorized_payload = Authorized::new( - &nodes[0].p2p_handle.ctx.client.builder_sk, + &nodes[0].p2p_handle.ctx.builder_sk, authorization, authorized_msg, ); diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs index 3d6236ac..d8cf9b47 100644 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ b/crates/flashblocks-p2p/src/net/mod.rs @@ -11,17 +11,17 @@ use reth_node_builder::{ use reth_transaction_pool::{PoolTransaction, TransactionPool}; use crate::protocol::handler::{ - FlashblocksHandle, FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, P2PClient, + FlashblocksHandle, FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, }; #[derive(Debug)] -pub struct FlashblocksNetworkBuilder { +pub struct FlashblocksNetworkBuilder { inner: T, - flashblocks_p2p_handle: Option>, + flashblocks_p2p_handle: Option, } -impl FlashblocksNetworkBuilder { - pub fn new(inner: T, flashblocks_p2p_handle: FlashblocksHandle) -> Self { +impl FlashblocksNetworkBuilder { + pub fn new(inner: T, flashblocks_p2p_handle: FlashblocksHandle) -> Self { Self { inner, flashblocks_p2p_handle: Some(flashblocks_p2p_handle), @@ -36,10 +36,9 @@ impl FlashblocksNetworkBuilder { } } -impl NetworkBuilder for FlashblocksNetworkBuilder +impl NetworkBuilder for FlashblocksNetworkBuilder where T: NetworkBuilder, - C: P2PClient, Node: FullNodeTypes>, Pool: TransactionPool>> + Unpin diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 57edd8f2..1a8a2afe 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -1,5 +1,5 @@ use crate::protocol::handler::{ - FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, MAX_FLASHBLOCK_INDEX, P2PClient, PeerMsg, + FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, MAX_FLASHBLOCK_INDEX, PeerMsg, PublishingStatus, }; use alloy_primitives::bytes::BytesMut; @@ -27,9 +27,9 @@ use tracing::trace; /// /// The connection implements the `Stream` trait to provide outgoing message bytes that /// should be sent to the connected peer over the underlying protocol connection. -pub struct FlashblocksConnection { +pub struct FlashblocksConnection { /// The flashblocks protocol handler that manages the overall protocol state. - protocol: FlashblocksP2PProtocol, + protocol: FlashblocksP2PProtocol, /// The underlying protocol connection for sending and receiving raw bytes. conn: ProtocolConnection, /// The unique identifier of the connected peer. @@ -44,7 +44,7 @@ pub struct FlashblocksConnection { received: Vec, } -impl FlashblocksConnection { +impl FlashblocksConnection { /// Creates a new `FlashblocksConnection` instance. /// /// # Arguments @@ -53,12 +53,12 @@ impl FlashblocksConnection { /// * `peer_id` - The unique identifier of the connected peer. /// * `peer_rx` - Receiver for peer messages to be sent to all peers. pub fn new( - protocol: FlashblocksP2PProtocol, + protocol: FlashblocksP2PProtocol, conn: ProtocolConnection, peer_id: PeerId, peer_rx: BroadcastStream, ) -> Self { - gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).increment(1); + gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).increment(1); Self { protocol, @@ -71,16 +71,13 @@ impl FlashblocksConnection { } } -impl Drop for FlashblocksConnection { +impl Drop for FlashblocksConnection { fn drop(&mut self) { - gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).decrement(1); + gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).decrement(1); } } -impl Stream for FlashblocksConnection -where - C: P2PClient, -{ +impl Stream for FlashblocksConnection { type Item = BytesMut; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { @@ -162,14 +159,8 @@ where match msg { FlashblocksP2PMsg::Authorized(authorized) => { - if Some(authorized.authorization.builder_vk) - == this - .protocol - .handle - .ctx - .client - .builder_sk() - .map(|s| s.verifying_key()) + if authorized.authorization.builder_vk + == this.protocol.handle.ctx.builder_sk.verifying_key() { tracing::warn!( target: "flashblocks::p2p", @@ -212,7 +203,7 @@ where } } -impl FlashblocksConnection { +impl FlashblocksConnection { /// Handles incoming flashblock payload messages from a peer. /// /// This method validates the flashblock payload, checks for duplicates and ordering, @@ -343,10 +334,6 @@ impl FlashblocksConnection { fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { let state = self.protocol.handle.state.lock(); let authorization = &authorized_payload.authorized.authorization; - let Some(builder_sk) = self.protocol.handle.ctx.client.builder_sk() else { - // We're not publishers so we can ignore - return; - }; // Check if the request is expired for dos protection. // It's important to ensure that this `StartPublish` request @@ -376,8 +363,11 @@ impl FlashblocksConnection { "Received StartPublish over p2p, stopping publishing flashblocks" ); - let authorized = - Authorized::new(builder_sk, *our_authorization, StopPublish.into()); + let authorized = Authorized::new( + &self.protocol.handle.ctx.builder_sk, + *our_authorization, + StopPublish.into(), + ); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.protocol.handle.ctx.peer_tx.send(peer_msg).ok(); diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index bda41903..96272d5e 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -129,42 +129,17 @@ impl FlashblocksP2PState { } } -#[derive(Clone, Debug)] -pub struct Subscibe; - -#[derive(Clone, Debug)] -pub struct Publish { - /// Builder's signing key used to sign outgoing authorized P2P messages. - pub builder_sk: SigningKey, -} - -pub trait P2PClient: Unpin + Clone + std::fmt::Debug + Send + Sync + 'static { - fn builder_sk(&self) -> Option<&SigningKey>; -} - -impl P2PClient for Subscibe { - fn builder_sk(&self) -> Option<&SigningKey> { - None - } -} - -impl P2PClient for Publish { - fn builder_sk(&self) -> Option<&SigningKey> { - Some(&self.builder_sk) - } -} - /// Context struct containing shared resources for the flashblocks P2P protocol. /// /// This struct holds the network handle, cryptographic keys, and communication channels /// used across all connections in the flashblocks P2P protocol. It provides the shared /// infrastructure needed for message verification, signing, and broadcasting. #[derive(Clone, Debug)] -pub struct FlashblocksP2PCtx { - /// Client type, either publisher or subscriber - pub client: C, +pub struct FlashblocksP2PCtx { /// Authorizer's verifying key used to verify authorization signatures from rollup-boost. pub authorizer_vk: VerifyingKey, + /// Builder's signing key used to sign outgoing authorized P2P messages. + pub builder_sk: SigningKey, /// Broadcast sender for peer messages that will be sent to all connected peers. /// Messages may not be strictly ordered due to network conditions. pub peer_tx: broadcast::Sender, @@ -178,22 +153,22 @@ pub struct FlashblocksP2PCtx { /// Encapsulates the shared context and mutable state of the flashblocks /// P2P protocol. #[derive(Clone, Debug)] -pub struct FlashblocksHandle { +pub struct FlashblocksHandle { /// Shared context containing network handle, keys, and communication channels. - pub ctx: FlashblocksP2PCtx, + pub ctx: FlashblocksP2PCtx, /// Thread-safe mutable state of the flashblocks protocol. /// Protected by a mutex to allow concurrent access from multiple connections. pub state: Arc>, } -impl FlashblocksHandle { - pub fn new(authorizer_vk: VerifyingKey) -> Self { +impl FlashblocksHandle { + pub fn new(authorizer_vk: VerifyingKey, builder_sk: SigningKey) -> Self { let flashblock_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let peer_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); let ctx = FlashblocksP2PCtx { - client: Subscibe, authorizer_vk, + builder_sk, peer_tx, flashblock_tx, }; @@ -201,23 +176,6 @@ impl FlashblocksHandle { Self { ctx, state } } - pub fn publisher(&self, builder_sk: SigningKey) -> FlashblocksHandle { - let sub = self.clone(); - let ctx = FlashblocksP2PCtx { - client: Publish { builder_sk }, - authorizer_vk: sub.ctx.authorizer_vk, - peer_tx: sub.ctx.peer_tx, - flashblock_tx: sub.ctx.flashblock_tx, - }; - - FlashblocksHandle { - state: sub.state, - ctx, - } - } -} - -impl FlashblocksHandle { pub fn flashblocks_tx(&self) -> broadcast::Sender { self.ctx.flashblock_tx.clone() } @@ -229,14 +187,14 @@ impl FlashblocksHandle { /// and maintains the protocol state across all peer connections. It implements the core /// logic for multi-builder coordination and failover scenarios in HA sequencer setups. #[derive(Clone, Debug)] -pub struct FlashblocksP2PProtocol { +pub struct FlashblocksP2PProtocol { /// Network handle used to update peer reputation and manage connections. pub network: N, /// Shared context containing network handle, keys, and communication channels. - pub handle: FlashblocksHandle, + pub handle: FlashblocksHandle, } -impl FlashblocksP2PProtocol { +impl FlashblocksP2PProtocol { /// Creates a new flashblocks P2P protocol handler. /// /// Initializes the handler with the necessary cryptographic keys, network handle, @@ -245,7 +203,7 @@ impl FlashblocksP2PProtocol { /// # Arguments /// * `network` - Network handle for peer management and reputation updates /// * `handle` - Shared handle containing the protocol context and mutable state - pub fn new(network: N, handle: FlashblocksHandle) -> Self { + pub fn new(network: N, handle: FlashblocksHandle) -> Self { Self { network: network.clone(), handle, @@ -253,7 +211,7 @@ impl FlashblocksP2PProtocol { } } -impl FlashblocksP2PProtocol { +impl FlashblocksP2PProtocol { /// Returns the P2P capability for the flashblocks v1 protocol. /// /// This capability is used during devp2p handshake to advertise support @@ -263,7 +221,7 @@ impl FlashblocksP2PProtocol { } } -impl FlashblocksHandle { +impl FlashblocksHandle { /// Publishes a newly created flashblock from the payload builder to the P2P network. /// /// This method validates that the builder has authorization to publish and that @@ -375,11 +333,8 @@ impl FlashblocksHandle { PublishingStatus::NotPublishing { active_publishers } => { // Send an authorized `StartPublish` message to the network let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); - let authorized_payload = Authorized::new( - &self.ctx.client.builder_sk, - new_authorization, - authorized_msg, - ); + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -428,11 +383,8 @@ impl FlashblocksHandle { timestamp = %authorization.timestamp, "stopping to publish flashblocks", ); - let authorized_payload = Authorized::new( - &self.ctx.client.builder_sk, - *authorization, - StopPublish.into(), - ); + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -452,11 +404,8 @@ impl FlashblocksHandle { timestamp = %authorization.timestamp, "aborting wait to publish flashblocks", ); - let authorized_payload = Authorized::new( - &self.ctx.client.builder_sk, - *authorization, - StopPublish.into(), - ); + let authorized_payload = + Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -468,9 +417,7 @@ impl FlashblocksHandle { } }); } -} -impl FlashblocksHandle { /// Returns a stream of ordered flashblocks starting from the beginning of the current payload. /// /// # Behavior @@ -493,7 +440,7 @@ impl FlashblocksHandle { } } -impl FlashblocksP2PCtx { +impl FlashblocksP2PCtx { /// Processes and publishes a verified flashblock payload to the P2P network and local stream. /// /// This method handles the core logic of flashblock processing, including validation, @@ -610,11 +557,7 @@ impl FlashblocksP2PCtx { } } -impl ProtocolHandler for FlashblocksP2PProtocol -where - N: FlashblocksP2PNetworkHandle, - C: P2PClient, -{ +impl ProtocolHandler for FlashblocksP2PProtocol { type ConnectionHandler = Self; fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { @@ -630,12 +573,8 @@ where } } -impl ConnectionHandler for FlashblocksP2PProtocol -where - N: FlashblocksP2PNetworkHandle, - C: P2PClient, -{ - type Connection = FlashblocksConnection; +impl ConnectionHandler for FlashblocksP2PProtocol { + type Connection = FlashblocksConnection; fn protocol(&self) -> Protocol { Protocol::new(Self::capability(), 1) diff --git a/crates/flashblocks-p2p/tests/protocol.rs b/crates/flashblocks-p2p/tests/protocol.rs index b044942b..01223898 100644 --- a/crates/flashblocks-p2p/tests/protocol.rs +++ b/crates/flashblocks-p2p/tests/protocol.rs @@ -1,5 +1,5 @@ use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, Publish, PublishingStatus}; +use flashblocks_p2p::protocol::handler::{FlashblocksHandle, PublishingStatus}; use futures::StreamExt as _; use reth::payload::PayloadId; use rollup_boost::{ @@ -31,12 +31,12 @@ fn payload(payload_id: reth::payload::PayloadId, idx: u64) -> FlashblocksPayload } /// Build a fresh handle plus its broadcast receiver. -fn fresh_handle() -> FlashblocksHandle { +fn fresh_handle() -> FlashblocksHandle { // authorizer + builder keys let auth_sk = signing_key(1); let builder_sk = signing_key(2); - FlashblocksHandle::new(auth_sk.verifying_key()).publisher(builder_sk) + FlashblocksHandle::new(auth_sk.verifying_key(), builder_sk) } #[tokio::test] @@ -48,10 +48,10 @@ async fn publish_without_clearance_is_rejected() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, payload.clone()); + let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload.clone()); // We never called `start_publishing`, so this must fail. let err = handle.publish_new(signed).unwrap_err(); @@ -71,7 +71,7 @@ async fn expired_authorization_is_rejected() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); handle.start_publishing(auth_1); @@ -80,10 +80,10 @@ async fn expired_authorization_is_rejected() { payload_id, DUMMY_TIMESTAMP + 1, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth_2, payload); + let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth_2, payload); let err = handle.publish_new(signed).unwrap_err(); assert!(matches!( @@ -102,14 +102,14 @@ async fn flashblock_stream_is_ordered() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); handle.start_publishing(auth); // send index 1 first (out-of-order) for &idx in &[1u64, 0] { let p = payload(payload_id, idx); - let signed = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, p.clone()); + let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, p.clone()); handle.publish_new(signed).unwrap(); } @@ -132,7 +132,7 @@ async fn stop_and_restart_updates_state() { payload_id_0, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); handle.start_publishing(auth_0); assert!(matches!( @@ -153,7 +153,7 @@ async fn stop_and_restart_updates_state() { payload_id_1, DUMMY_TIMESTAMP + 5, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); handle.start_publishing(auth_1); assert!(matches!( @@ -184,7 +184,7 @@ async fn stop_and_restart_with_active_publishers() { payload_id, timestamp, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); handle.start_publishing(auth); match handle.publishing_status() { @@ -218,12 +218,12 @@ async fn flashblock_stream_buffers_and_live() { pid, timestamp, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); handle.start_publishing(auth); // publish index 0 before creating the stream - let signed0 = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, payload(pid, 0)); + let signed0 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 0)); handle.publish_new(signed0).unwrap(); // now create the combined stream @@ -234,7 +234,7 @@ async fn flashblock_stream_buffers_and_live() { assert_eq!(first.index, 0); // publish index 1 after the stream exists - let signed1 = AuthorizedPayload::new(&handle.ctx.client.builder_sk, auth, payload(pid, 1)); + let signed1 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 1)); handle.publish_new(signed1).unwrap(); // second item should be delivered live @@ -263,7 +263,7 @@ async fn await_clearance_unblocks_on_publish() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.client.builder_sk.verifying_key(), + handle.ctx.builder_sk.verifying_key(), ); handle.start_publishing(auth); diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index aaf15952..d90427f5 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -1,6 +1,6 @@ use crate::{FlashblocksApi, cache::FlashblocksCache}; use alloy_primitives::{Address, TxHash, U256}; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, Publish}; +use flashblocks_p2p::protocol::handler::FlashblocksHandle; use futures_util::StreamExt as _; use jsonrpsee::core::async_trait; use op_alloy_network::Optimism; @@ -12,15 +12,12 @@ use tracing::error; #[derive(Debug, Clone)] pub struct FlashblocksOverlay { - flashblocks_handle: FlashblocksHandle, + flashblocks_handle: FlashblocksHandle, cache: FlashblocksCache, } impl FlashblocksOverlay { - pub fn new( - flashblocks_handle: FlashblocksHandle, - chain_spec: Arc, - ) -> Self { + pub fn new(flashblocks_handle: FlashblocksHandle, chain_spec: Arc) -> Self { Self { flashblocks_handle, cache: FlashblocksCache::new(chain_spec), From 40774a24179d0eea1050e98166113f057fb548a8 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Mon, 8 Sep 2025 12:23:07 -0700 Subject: [PATCH 094/114] feat: Option builder_sk --- crates/flashblocks-node/src/bin/main.rs | 6 +- crates/flashblocks-node/tests/p2p.rs | 59 +++++++++--------- .../src/protocol/connection.rs | 14 ++--- crates/flashblocks-p2p/src/protocol/error.rs | 2 + .../flashblocks-p2p/src/protocol/handler.rs | 31 +++++++--- crates/flashblocks-p2p/tests/protocol.rs | 61 ++++++++++--------- 6 files changed, 98 insertions(+), 75 deletions(-) diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-node/src/bin/main.rs index 71dde4d8..66f8e7c7 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-node/src/bin/main.rs @@ -24,8 +24,10 @@ pub fn main() { Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); - let flashblocks_handle = - FlashblocksHandle::new(VerifyingKey::default(), SigningKey::from_bytes(&[0u8; 32])); + let flashblocks_handle = FlashblocksHandle::new( + VerifyingKey::default(), + Some(SigningKey::from_bytes(&[0u8; 32])), + ); let flashblocks_overlay = FlashblocksOverlay::new(flashblocks_handle.clone(), chain_spec); diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs index c80ee4b8..80242a13 100644 --- a/crates/flashblocks-node/tests/p2p.rs +++ b/crates/flashblocks-node/tests/p2p.rs @@ -97,7 +97,7 @@ async fn setup_node( let node = OpNode::new(RollupArgs::default()); - let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key(), builder_sk); + let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key(), Some(builder_sk)); let p2p_handle_clone = p2p_handle.clone(); let NodeHandle { @@ -301,12 +301,12 @@ async fn test_double_failover() -> eyre::Result<()> { payload_0.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.builder_sk()?.verifying_key(), ); let msg = payload_0.clone(); let authorized_0 = - AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization_0, msg); - nodes[0].p2p_handle.start_publishing(authorization_0); + AuthorizedPayload::new(nodes[0].p2p_handle.builder_sk()?, authorization_0, msg); + nodes[0].p2p_handle.start_publishing(authorization_0)?; nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -315,14 +315,14 @@ async fn test_double_failover() -> eyre::Result<()> { payload_1.payload_id, 0, &authorizer, - nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[1].p2p_handle.builder_sk()?.verifying_key(), ); let authorized_1 = AuthorizedPayload::new( - &nodes[1].p2p_handle.ctx.builder_sk, + nodes[1].p2p_handle.builder_sk()?, authorization_1, payload_1.clone(), ); - nodes[1].p2p_handle.start_publishing(authorization_1); + nodes[1].p2p_handle.start_publishing(authorization_1)?; tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[1].p2p_handle.publish_new(authorized_1).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -334,14 +334,14 @@ async fn test_double_failover() -> eyre::Result<()> { payload_2.payload_id, 0, &authorizer, - nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[2].p2p_handle.builder_sk()?.verifying_key(), ); let authorized_2 = AuthorizedPayload::new( - &nodes[2].p2p_handle.ctx.builder_sk, + nodes[2].p2p_handle.builder_sk()?, authorization_2, msg.clone(), ); - nodes[2].p2p_handle.start_publishing(authorization_2); + nodes[2].p2p_handle.start_publishing(authorization_2)?; tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[2].p2p_handle.publish_new(authorized_2).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -389,12 +389,11 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_0.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.builder_sk()?.verifying_key(), ); let msg = payload_0.clone(); - let authorized = - AuthorizedPayload::new(&nodes[0].p2p_handle.ctx.builder_sk, authorization, msg); - nodes[0].p2p_handle.start_publishing(authorization); + let authorized = AuthorizedPayload::new(nodes[0].p2p_handle.builder_sk()?, authorization, msg); + nodes[0].p2p_handle.start_publishing(authorization)?; nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -415,10 +414,10 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_1.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.builder_sk()?.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.builder_sk, + nodes[0].p2p_handle.builder_sk()?, authorization, payload_1.clone(), ); @@ -443,22 +442,22 @@ async fn test_force_race_condition() -> eyre::Result<()> { payload_2.payload_id, 1, &authorizer, - nodes[1].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[1].p2p_handle.builder_sk()?.verifying_key(), ); let authorization_2 = Authorization::new( payload_2.payload_id, 1, &authorizer, - nodes[2].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[2].p2p_handle.builder_sk()?.verifying_key(), ); let msg = payload_2.clone(); let authorized_1 = AuthorizedPayload::new( - &nodes[1].p2p_handle.ctx.builder_sk, + nodes[1].p2p_handle.builder_sk()?, authorization_1, msg.clone(), ); - nodes[1].p2p_handle.start_publishing(authorization_1); - nodes[2].p2p_handle.start_publishing(authorization_2); + nodes[1].p2p_handle.start_publishing(authorization_1)?; + nodes[2].p2p_handle.start_publishing(authorization_2)?; // Wait for clearance to go through tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; tracing::error!( @@ -470,7 +469,7 @@ async fn test_force_race_condition() -> eyre::Result<()> { ); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - nodes[2].p2p_handle.stop_publishing(); + nodes[2].p2p_handle.stop_publishing()?; tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; nodes[1].p2p_handle.publish_new(authorized_1)?; @@ -505,14 +504,14 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { base_payload.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.builder_sk()?.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.builder_sk, + nodes[0].p2p_handle.builder_sk()?, authorization, base_payload, ); - nodes[0].p2p_handle.start_publishing(authorization); + nodes[0].p2p_handle.start_publishing(authorization)?; nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -530,14 +529,14 @@ async fn test_get_block_by_number_pending() -> eyre::Result<()> { next_payload.payload_id, 0, &authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.builder_sk()?.verifying_key(), ); let authorized = AuthorizedPayload::new( - &nodes[0].p2p_handle.ctx.builder_sk, + nodes[0].p2p_handle.builder_sk()?, authorization, next_payload, ); - nodes[0].p2p_handle.start_publishing(authorization); + nodes[0].p2p_handle.start_publishing(authorization)?; nodes[0].p2p_handle.publish_new(authorized).unwrap(); tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; @@ -579,12 +578,12 @@ async fn test_peer_reputation() -> eyre::Result<()> { payload_0.payload_id, 0, &invalid_authorizer, - nodes[0].p2p_handle.ctx.builder_sk.verifying_key(), + nodes[0].p2p_handle.builder_sk()?.verifying_key(), ); let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); let authorized_payload = Authorized::new( - &nodes[0].p2p_handle.ctx.builder_sk, + nodes[0].p2p_handle.builder_sk()?, authorization, authorized_msg, ); diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs index 1a8a2afe..7ed21deb 100644 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ b/crates/flashblocks-p2p/src/protocol/connection.rs @@ -159,8 +159,8 @@ impl Stream for FlashblocksConnection { match msg { FlashblocksP2PMsg::Authorized(authorized) => { - if authorized.authorization.builder_vk - == this.protocol.handle.ctx.builder_sk.verifying_key() + if Ok(authorized.authorization.builder_vk) + == this.protocol.handle.builder_sk().map(|s| s.verifying_key()) { tracing::warn!( target: "flashblocks::p2p", @@ -333,6 +333,9 @@ impl FlashblocksConnection { /// - If we are not publishing, adds the new publisher to the list of active publishers fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { let state = self.protocol.handle.state.lock(); + let Ok(builder_sk) = self.protocol.handle.builder_sk() else { + return; + }; let authorization = &authorized_payload.authorized.authorization; // Check if the request is expired for dos protection. @@ -363,11 +366,8 @@ impl FlashblocksConnection { "Received StartPublish over p2p, stopping publishing flashblocks" ); - let authorized = Authorized::new( - &self.protocol.handle.ctx.builder_sk, - *our_authorization, - StopPublish.into(), - ); + let authorized = + Authorized::new(builder_sk, *our_authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.protocol.handle.ctx.peer_tx.send(peer_msg).ok(); diff --git a/crates/flashblocks-p2p/src/protocol/error.rs b/crates/flashblocks-p2p/src/protocol/error.rs index 928148ed..322f6eab 100644 --- a/crates/flashblocks-p2p/src/protocol/error.rs +++ b/crates/flashblocks-p2p/src/protocol/error.rs @@ -8,4 +8,6 @@ pub enum FlashblocksP2PError { "attempt to publish flashblocks with expired authorization. Make sure to call `start_publishing` first" )] ExpiredAuthorization, + #[error("builder signing key has not been configured")] + MissingBuilderSk, } diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs index 96272d5e..8619a4af 100644 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ b/crates/flashblocks-p2p/src/protocol/handler.rs @@ -139,7 +139,7 @@ pub struct FlashblocksP2PCtx { /// Authorizer's verifying key used to verify authorization signatures from rollup-boost. pub authorizer_vk: VerifyingKey, /// Builder's signing key used to sign outgoing authorized P2P messages. - pub builder_sk: SigningKey, + pub builder_sk: Option, /// Broadcast sender for peer messages that will be sent to all connected peers. /// Messages may not be strictly ordered due to network conditions. pub peer_tx: broadcast::Sender, @@ -162,7 +162,7 @@ pub struct FlashblocksHandle { } impl FlashblocksHandle { - pub fn new(authorizer_vk: VerifyingKey, builder_sk: SigningKey) -> Self { + pub fn new(authorizer_vk: VerifyingKey, builder_sk: Option) -> Self { let flashblock_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let peer_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); @@ -179,6 +179,13 @@ impl FlashblocksHandle { pub fn flashblocks_tx(&self) -> broadcast::Sender { self.ctx.flashblock_tx.clone() } + + pub fn builder_sk(&self) -> Result<&SigningKey, FlashblocksP2PError> { + self.ctx + .builder_sk + .as_ref() + .ok_or(FlashblocksP2PError::MissingBuilderSk) + } } /// Main protocol handler for the flashblocks P2P protocol. @@ -294,8 +301,12 @@ impl FlashblocksHandle { /// # Note /// Calling this method does not guarantee immediate publishing clearance. /// The node may need to wait for other publishers to stop first. - pub fn start_publishing(&self, new_authorization: Authorization) { + pub fn start_publishing( + &self, + new_authorization: Authorization, + ) -> Result<(), FlashblocksP2PError> { let state = self.state.lock(); + let builder_sk = self.builder_sk()?; state.publishing_status.send_modify(|status| { match status { PublishingStatus::Publishing { authorization } => { @@ -334,7 +345,7 @@ impl FlashblocksHandle { // Send an authorized `StartPublish` message to the network let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); let authorized_payload = - Authorized::new(&self.ctx.builder_sk, new_authorization, authorized_msg); + Authorized::new(builder_sk, new_authorization, authorized_msg); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -364,6 +375,8 @@ impl FlashblocksHandle { } } }); + + Ok(()) } /// Stops flashblock publishing and notifies the P2P network. @@ -371,8 +384,10 @@ impl FlashblocksHandle { /// This method broadcasts a StopPublish message to all connected peers and transitions /// the node to a non-publishing state. It should be called when receiving a /// ForkChoiceUpdated without payload attributes or without an Authorization token. - pub fn stop_publishing(&self) { + pub fn stop_publishing(&self) -> Result<(), FlashblocksP2PError> { let state = self.state.lock(); + let builder_sk = self.builder_sk()?; + state.publishing_status.send_modify(|status| { match status { PublishingStatus::Publishing { authorization } => { @@ -384,7 +399,7 @@ impl FlashblocksHandle { "stopping to publish flashblocks", ); let authorized_payload = - Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); + Authorized::new(builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -405,7 +420,7 @@ impl FlashblocksHandle { "aborting wait to publish flashblocks", ); let authorized_payload = - Authorized::new(&self.ctx.builder_sk, *authorization, StopPublish.into()); + Authorized::new(builder_sk, *authorization, StopPublish.into()); let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); self.ctx.peer_tx.send(peer_msg).ok(); @@ -416,6 +431,8 @@ impl FlashblocksHandle { PublishingStatus::NotPublishing { .. } => {} } }); + + Ok(()) } /// Returns a stream of ordered flashblocks starting from the beginning of the current payload. diff --git a/crates/flashblocks-p2p/tests/protocol.rs b/crates/flashblocks-p2p/tests/protocol.rs index 01223898..04b96e9a 100644 --- a/crates/flashblocks-p2p/tests/protocol.rs +++ b/crates/flashblocks-p2p/tests/protocol.rs @@ -36,22 +36,23 @@ fn fresh_handle() -> FlashblocksHandle { let auth_sk = signing_key(1); let builder_sk = signing_key(2); - FlashblocksHandle::new(auth_sk.verifying_key(), builder_sk) + FlashblocksHandle::new(auth_sk.verifying_key(), Some(builder_sk)) } #[tokio::test] async fn publish_without_clearance_is_rejected() { let handle = fresh_handle(); + let builder_sk = handle.builder_sk().unwrap(); let payload_id = reth::payload::PayloadId::new([0; 8]); let auth = Authorization::new( payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload.clone()); + let signed = AuthorizedPayload::new(builder_sk, auth, payload.clone()); // We never called `start_publishing`, so this must fail. let err = handle.publish_new(signed).unwrap_err(); @@ -64,6 +65,7 @@ async fn publish_without_clearance_is_rejected() { #[tokio::test] async fn expired_authorization_is_rejected() { let handle = fresh_handle(); + let builder_sk = handle.builder_sk().unwrap(); // Step 1: obtain clearance with auth_1 let payload_id = reth::payload::PayloadId::new([1; 8]); @@ -71,19 +73,19 @@ async fn expired_authorization_is_rejected() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); - handle.start_publishing(auth_1); + handle.start_publishing(auth_1).unwrap(); // Step 2: craft a payload signed with *different* authorization → should fail let auth_2 = Authorization::new( payload_id, DUMMY_TIMESTAMP + 1, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth_2, payload); + let signed = AuthorizedPayload::new(&builder_sk, auth_2, payload); let err = handle.publish_new(signed).unwrap_err(); assert!(matches!( @@ -95,6 +97,7 @@ async fn expired_authorization_is_rejected() { #[tokio::test] async fn flashblock_stream_is_ordered() { let handle = fresh_handle(); + let builder_sk = handle.builder_sk().unwrap(); // clearance let payload_id = reth::payload::PayloadId::new([2; 8]); @@ -102,14 +105,14 @@ async fn flashblock_stream_is_ordered() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); - handle.start_publishing(auth); + handle.start_publishing(auth).unwrap(); // send index 1 first (out-of-order) for &idx in &[1u64, 0] { let p = payload(payload_id, idx); - let signed = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, p.clone()); + let signed = AuthorizedPayload::new(&builder_sk, auth, p.clone()); handle.publish_new(signed).unwrap(); } @@ -125,6 +128,7 @@ async fn flashblock_stream_is_ordered() { #[tokio::test] async fn stop_and_restart_updates_state() { let handle = fresh_handle(); + let builder_sk = handle.builder_sk().unwrap(); // 1) start publishing let payload_id_0 = reth::payload::PayloadId::new([3; 8]); @@ -132,16 +136,16 @@ async fn stop_and_restart_updates_state() { payload_id_0, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); - handle.start_publishing(auth_0); + handle.start_publishing(auth_0).unwrap(); assert!(matches!( handle.publishing_status(), PublishingStatus::Publishing { .. } )); // 2) stop - handle.stop_publishing(); + handle.stop_publishing().unwrap(); assert!(matches!( handle.publishing_status(), PublishingStatus::NotPublishing { .. } @@ -153,9 +157,9 @@ async fn stop_and_restart_updates_state() { payload_id_1, DUMMY_TIMESTAMP + 5, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); - handle.start_publishing(auth_1); + handle.start_publishing(auth_1).unwrap(); assert!(matches!( handle.publishing_status(), PublishingStatus::Publishing { .. } @@ -166,6 +170,7 @@ async fn stop_and_restart_updates_state() { async fn stop_and_restart_with_active_publishers() { let timestamp = 1000; let handle = fresh_handle(); + let builder_sk = handle.builder_sk().unwrap(); // Pretend we already know about another publisher. let other_vk = signing_key(99).verifying_key(); @@ -184,9 +189,9 @@ async fn stop_and_restart_with_active_publishers() { payload_id, timestamp, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); - handle.start_publishing(auth); + handle.start_publishing(auth).unwrap(); match handle.publishing_status() { PublishingStatus::WaitingToPublish { active_publishers, .. @@ -199,7 +204,7 @@ async fn stop_and_restart_with_active_publishers() { // Now we voluntarily stop. We should end up back in NotPublishing, // still carrying the same active publisher entry. - handle.stop_publishing(); + handle.stop_publishing().unwrap(); match handle.publishing_status() { PublishingStatus::NotPublishing { active_publishers } => { assert_eq!(active_publishers.len(), 1); @@ -213,17 +218,14 @@ async fn stop_and_restart_with_active_publishers() { async fn flashblock_stream_buffers_and_live() { let timestamp = 1000; let handle = fresh_handle(); + let builder_sk = handle.builder_sk().unwrap(); + let pid = PayloadId::new([7; 8]); - let auth = Authorization::new( - pid, - timestamp, - &signing_key(1), - handle.ctx.builder_sk.verifying_key(), - ); - handle.start_publishing(auth); + let auth = Authorization::new(pid, timestamp, &signing_key(1), builder_sk.verifying_key()); + handle.start_publishing(auth).unwrap(); // publish index 0 before creating the stream - let signed0 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 0)); + let signed0 = AuthorizedPayload::new(&builder_sk, auth, payload(pid, 0)); handle.publish_new(signed0).unwrap(); // now create the combined stream @@ -234,7 +236,7 @@ async fn flashblock_stream_buffers_and_live() { assert_eq!(first.index, 0); // publish index 1 after the stream exists - let signed1 = AuthorizedPayload::new(&handle.ctx.builder_sk, auth, payload(pid, 1)); + let signed1 = AuthorizedPayload::new(&builder_sk, auth, payload(pid, 1)); handle.publish_new(signed1).unwrap(); // second item should be delivered live @@ -245,6 +247,7 @@ async fn flashblock_stream_buffers_and_live() { #[tokio::test] async fn await_clearance_unblocks_on_publish() { let handle = fresh_handle(); + let builder_sk = handle.builder_sk().unwrap(); let waiter = { let h = handle.clone(); @@ -263,9 +266,9 @@ async fn await_clearance_unblocks_on_publish() { payload_id, DUMMY_TIMESTAMP, &signing_key(1), - handle.ctx.builder_sk.verifying_key(), + builder_sk.verifying_key(), ); - handle.start_publishing(auth); + handle.start_publishing(auth).unwrap(); // waiter should finish very quickly tokio::time::timeout(Duration::from_secs(1), waiter) From a236f55ba49c19f985a52b3182e27706429e5e8a Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 10 Sep 2025 16:14:21 -0700 Subject: [PATCH 095/114] feat: reth v1.7.0 --- Cargo.lock | 1088 ++++++++++++++-------------- Cargo.toml | 26 +- crates/flashblocks-node/Cargo.toml | 36 +- crates/flashblocks-rpc/Cargo.toml | 30 +- 4 files changed, 602 insertions(+), 578 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1937cc54..8efe482f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7345077623aaa080fc06735ac13b8fa335125c8550f9c4f64135a5bf6f79967" +checksum = "d213580c17d239ae83c0d897ac3315db7cda83d2d4936a9823cc3517552f2e24" dependencies = [ "alloy-eips", "alloy-primitives", @@ -136,9 +136,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501f83565d28bdb9d6457dd3b5d646e19db37709d0f27608a26a1839052ddade" +checksum = "81443e3b8dccfeac7cd511aced15928c97ff253f4177acbb97de97178e543f6c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -212,9 +212,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c219a87fb386a75780ddbdbbced242477321887e426b0f946c05815ceabe5e09" +checksum = "2a15b4b0f6bab47aae017d52bb5a739bda381553c09fb9918b7172721ef5f5de" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dbf4c6b1b733ba0efaa6cc5f68786997a19ffcd88ff2ee2ba72fdd42594375e" +checksum = "33ba1cbc25a07e0142e8875fcbe80e1fdb02be8160ae186b90f4b9a69a72ed2b" dependencies = [ "alloy-eips", "alloy-primitives", @@ -271,9 +271,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20b180071d4f22db71702329101685ccff2e2a8f400d30a68ba907700163bf5" +checksum = "31c8616642b176f21e98e2740e27d28917b5d30d8612450cafff21772d4926bc" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -297,9 +297,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "334555c323fa2bb98f1d4c242b62da9de8c715557a2ed680a76cefbcac19fefd" +checksum = "f8882ec8e4542cfd02aadc6dccbe90caa73038f60016d936734eb6ced53d2167" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -312,9 +312,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7ea377c9650203d7a7da9e8dee7f04906b49a9253f554b110edd7972e75ef34" +checksum = "51d6d87d588bda509881a7a66ae77c86514bd1193ac30fbff0e0f24db95eb5a5" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -338,9 +338,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f9ab9a9e92c49a357edaee2d35deea0a32ac8f313cfa37448f04e7e029c9d9" +checksum = "5b14fa9ba5774e0b30ae6a04176d998211d516c8af69c9c530af7c6c42a8c508" dependencies = [ "alloy-consensus", "alloy-eips", @@ -368,9 +368,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6e8ab92a4b6cf57d84cec62868b7161f40de36b01ffda62455deb3907c9001" +checksum = "07953246c78130f119855393ba0235d22539c60b6a627f737cdf0ae692f042f6" dependencies = [ "alloy-chains", "alloy-hardforks", @@ -392,7 +392,7 @@ dependencies = [ "foldhash", "getrandom 0.3.3", "hashbrown 0.15.5", - "indexmap 2.11.0", + "indexmap 2.11.1", "itoa", "k256", "keccak-asm", @@ -409,9 +409,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a85361c88c16116defbd98053e3d267054d6b82729cdbef0236f7881590f924" +checksum = "475a5141313c3665b75d818be97d5fa3eb5e0abb7e832e9767edd94746db28e3" dependencies = [ "alloy-chains", "alloy-consensus", @@ -451,9 +451,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b1eda077b102b167effaf0c9d9109b1232948a6c7fcaff74abdb5deb562a17" +checksum = "f97c18795ce1ce8151c5539ce1e4200940389674173f677c7455f79bfb00e5df" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -495,9 +495,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743fc964abb0106e454e9e8683fb0809fb32940270ef586a58e913531360b302" +checksum = "25289674cd8c58fcca2568b5350423cb0dd7bca8c596c5e2869bfe4c5c57ed14" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -521,9 +521,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6445ccdc73c8a97e1794e9f0f91af52fb2bbf9ff004339a801b0293c3928abb" +checksum = "39676beaa50db545cf15447fc94ec5513b64e85a48357a0625b9a04aef08a910" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -534,9 +534,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196e0e38efeb2a5efb515758877765db56b3b18e998b809eb1e5d6fc20fcd097" +checksum = "65acc9264342069decb617aa344847f55180ba3aeab1c8d1db062d0619881029" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -546,9 +546,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "242ff10318efd61c4b17ac8584df03a8db1e12146704c08b1b69d070cd4a1ebf" +checksum = "a9c8cad42fa936000be72ab80fcd97386a6a226c35c2989212756da9e76c1521" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -558,9 +558,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97372c51a14a804fb9c17010e3dd6c117f7866620b264e24b64d2259be44bcdf" +checksum = "01bac57c987c93773787619e20f89167db74d460a2d1d40f591d94fb7c22c379" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -569,9 +569,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2210006d3ee0b0468e49d81fc8b94ab9f088e65f955f8d56779545735b90873" +checksum = "8d3c0e6cc87a8be5582d08f929f96db25843f44cb636a0985a4a6bf02609c02f" dependencies = [ "alloy-eips", "alloy-primitives", @@ -579,6 +579,7 @@ dependencies = [ "ethereum_ssz", "ethereum_ssz_derive", "serde", + "serde_json", "serde_with", "thiserror 2.0.16", "tree_hash", @@ -587,9 +588,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a005a343cae9a0d4078d2f85a666493922d4bfb756229ea2a45a4bafd21cb9f1" +checksum = "c2fe118e6c152d54cb4549b9835fb87d38b12754bb121375183ee3ec84bd0849" dependencies = [ "alloy-primitives", "derive_more", @@ -599,9 +600,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e214c7667f88b2f7e48eb8428eeafcbf6faecda04175c5f4d13fdb2563333ac" +checksum = "72a41624eb84bc743e414198bf10eb48b611a5554d6a9fd6205f7384d57dfd7f" dependencies = [ "alloy-consensus", "alloy-eips", @@ -619,9 +620,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "672286c19528007df058bafd82c67e23247b4b3ebbc538cbddc705a82d8a930f" +checksum = "1cd1e1b4dcdf13eaa96343e5c0dafc2d2e8ce5d20b90347169d46a1df0dec210" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -641,9 +642,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-mev" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6c5068a20a19df4481ffd698540af5f3656f401d12d9b3707e8ab90311af1d" +checksum = "01620baa48d3f49fc908c781eb91ded71f3226e719bb6404697c2851cac4e098" dependencies = [ "alloy-consensus", "alloy-eips", @@ -656,9 +657,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53c5ea8e10ca72889476343deb98c050da7b85e119a55a2a02a9791cb8242e4" +checksum = "1bc33d9d0e0b3cfe9c2e82a1a427c9ed516fcfebe764f0adf7ceb8107f702dd1" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -670,9 +671,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1c7ee378e899353e05a0d9f5b73b5d57bdac257532c6acd98eaa6b093fe642" +checksum = "d4fa9e9b3e613425d2a2ee1a322bdad5f1cedf835406fd4b59538822500b44bc" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -682,9 +683,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aae653f049267ae7e040eab6c9b9a417064ca1a6cb21e3dd59b9f1131ef048f" +checksum = "f1b3b1078b8775077525bc9fe9f6577e815ceaecd6c412a4f3b4d8aa2836e8f6" dependencies = [ "alloy-primitives", "arbitrary", @@ -694,9 +695,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97cedce202f848592b96f7e891503d3adb33739c4e76904da73574290141b93" +checksum = "10ab1b8d4649bf7d0db8ab04e31658a6cc20364d920795484d886c35bed3bab4" dependencies = [ "alloy-primitives", "async-trait", @@ -709,9 +710,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ae7d854db5b7cdd5b9ed7ad13d1e5e034cdd8be85ffef081f61dc6c9e18351" +checksum = "7bdeec36c8d9823102b571b3eab8b323e053dc19c12da14a9687bd474129bf2a" dependencies = [ "alloy-consensus", "alloy-network", @@ -746,7 +747,7 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.11.0", + "indexmap 2.11.1", "proc-macro-error2", "proc-macro2", "quote", @@ -795,9 +796,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08b383bc903c927635e39e1dae7df2180877d93352d1abd389883665a598afc" +checksum = "dce5129146a76ca6139a19832c75ad408857a56bcd18cd2c684183b8eacd78d8" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -819,9 +820,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e58dee1f7763ef302074b645fc4f25440637c09a60e8de234b62993f06c0ae3" +checksum = "e2379d998f46d422ec8ef2b61603bc28cda931e5e267aea1ebe71f62da61d101" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -834,9 +835,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ae5c6655e5cda1227f0c70b7686ecfb8af856771deebacad8dab9a7fbc51864" +checksum = "041aa5db2e907692a9a93a0a908057665c03e59364e1fbbeed613511a0159289" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -854,9 +855,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb2141958a1f13722cb20a2e01c130fb375209fa428849ae553c1518bc33a0d" +checksum = "c6d44395e6793566e9c89bd82297cc4b0566655c1e78a1d69362640814784cc6" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -892,23 +893,17 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.27" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14809f908822dbff0dc472c77ca4aa129ab12e22fd9bff2dd1ef54603e68e3d" +checksum = "3b5becb9c269a7d05a2f28d549f86df5a5dbc923e2667eff84fdecac8cda534c" dependencies = [ "alloy-primitives", - "darling", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.106", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -1326,20 +1321,15 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bee399cc3a623ec5a2db2c5b90ee0190a2260241fbe0c023ac8f7bab426aaf8" +checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" dependencies = [ - "brotli", "compression-codecs", "compression-core", - "flate2", "futures-core", - "memchr", "pin-project-lite", "tokio", - "zstd", - "zstd-safe", ] [[package]] @@ -1582,7 +1572,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools 0.12.1", @@ -1605,7 +1595,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1656,9 +1646,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.3" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ "serde", ] @@ -1734,11 +1724,11 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "boa_interner", "boa_macros", "boa_string", - "indexmap 2.11.0", + "indexmap 2.11.1", "num-bigint", "rustc-hash 2.1.1", ] @@ -1750,7 +1740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" dependencies = [ "arrayvec", - "bitflags 2.9.3", + "bitflags 2.9.4", "boa_ast", "boa_gc", "boa_interner", @@ -1764,7 +1754,7 @@ dependencies = [ "fast-float2", "hashbrown 0.15.5", "icu_normalizer 1.5.0", - "indexmap 2.11.0", + "indexmap 2.11.1", "intrusive-collections", "itertools 0.13.0", "num-bigint", @@ -1810,7 +1800,7 @@ dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.15.5", - "indexmap 2.11.0", + "indexmap 2.11.1", "once_cell", "phf", "rustc-hash 2.1.1", @@ -1835,7 +1825,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "boa_ast", "boa_interner", "boa_macros", @@ -1963,7 +1953,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", - "regex-automata 0.4.10", + "regex-automata", "serde", ] @@ -2136,17 +2126,16 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -2172,9 +2161,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.46" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -2182,9 +2171,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.46" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -2194,9 +2183,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.45" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck", "proc-macro2", @@ -2262,16 +2251,14 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7eea68f0e02c2b0aa8856e9a9478444206d4b6828728e7b0697c0f8cca265cb" +checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" dependencies = [ "brotli", "compression-core", "flate2", - "futures-core", "memchr", - "pin-project-lite", "zstd", "zstd-safe", ] @@ -2468,7 +2455,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "crossterm_winapi", "mio", "parking_lot", @@ -2484,11 +2471,11 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "crossterm_winapi", "document-features", "parking_lot", - "rustix 1.0.8", + "rustix 1.1.2", "winapi", ] @@ -2588,8 +2575,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -2606,13 +2603,39 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "serde", + "strsim", + "syn 2.0.106", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", "quote", "syn 2.0.106", ] @@ -2699,9 +2722,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", "serde", @@ -2755,7 +2778,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.106", @@ -2854,7 +2877,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -3134,12 +3157,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -3207,7 +3230,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd55d08012b4e0dfcc92b8d6081234df65f2986ad34cc76eeed69c5e2ce7506" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.106", @@ -3701,7 +3724,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.3+wasi-0.2.4", + "wasi 0.14.5+wasi-0.2.4", "wasm-bindgen", ] @@ -3727,7 +3750,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "libc", "libgit2-sys", "log", @@ -3788,9 +3811,9 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" -version = "1.6.7" +version = "1.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a636fb6a653382a379ee1e5593dacdc628667994167024c143214cafd40c1a86" +checksum = "60f8970a75c006bb2f8ae79c6768a116dd215fa8346a87aed99bf9d82ca43394" dependencies = [ "libc", "windows-sys 0.60.2", @@ -3819,7 +3842,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.0", + "indexmap 2.11.1", "slab", "tokio", "tokio-util", @@ -4513,9 +4536,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" dependencies = [ "arbitrary", "equivalent", @@ -4535,7 +4558,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "inotify-sys", "libc", ] @@ -4565,7 +4588,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ - "darling", + "darling 0.20.11", "indoc", "proc-macro2", "quote", @@ -4602,7 +4625,7 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -4717,9 +4740,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", @@ -5163,7 +5186,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "libc", "redox_syscall 0.5.17", ] @@ -5250,9 +5273,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -5285,9 +5308,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -5299,7 +5322,7 @@ dependencies = [ "generator", "scoped-tls", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -5373,11 +5396,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -5443,7 +5466,7 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "indexmap 2.11.0", + "indexmap 2.11.1", "ipnet", "metrics", "metrics-util", @@ -5479,7 +5502,7 @@ dependencies = [ "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.15.5", - "indexmap 2.11.0", + "indexmap 2.11.1", "metrics", "ordered-float", "quanta", @@ -5684,7 +5707,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "fsevent-sys", "inotify", "kqueue", @@ -5713,12 +5736,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -5845,9 +5867,9 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63cb50036b1ad148038105af40aaa70ff24d8a14fbc44ae5c914e1348533d12e" +checksum = "f0418987d1aaed324d95b4beffc93635e19be965ed5d63ec07a35980fe3b71a4" dependencies = [ "alloy-rlp", "arbitrary", @@ -6012,7 +6034,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -6151,12 +6173,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.13.2" @@ -6246,7 +6262,7 @@ checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" dependencies = [ "parse-display-derive", "regex", - "regex-syntax 0.8.6", + "regex-syntax", ] [[package]] @@ -6258,7 +6274,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "regex-syntax 0.8.6", + "regex-syntax", "structmeta", "syn 2.0.106", ] @@ -6570,7 +6586,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "chrono", "flate2", "hex", @@ -6584,7 +6600,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "chrono", "hex", ] @@ -6597,13 +6613,13 @@ checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.9.3", + "bitflags 2.9.4", "lazy_static", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", "rand_xorshift", - "regex-syntax 0.8.6", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -6659,7 +6675,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "memchr", "unicase", ] @@ -6866,7 +6882,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "cassowary", "compact_str", "crossterm 0.28.1", @@ -6883,11 +6899,11 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.5.0" +version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", ] [[package]] @@ -6931,7 +6947,7 @@ version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", ] [[package]] @@ -6984,17 +7000,8 @@ checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.10", - "regex-syntax 0.8.6", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -7005,15 +7012,9 @@ checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.6", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.6" @@ -7087,8 +7088,8 @@ checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "reth" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-rpc-types", "aquamarine", @@ -7133,8 +7134,8 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7157,8 +7158,8 @@ dependencies = [ [[package]] name = "reth-chain-state" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7188,8 +7189,8 @@ dependencies = [ [[package]] name = "reth-chainspec" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7208,8 +7209,8 @@ dependencies = [ [[package]] name = "reth-cli" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-genesis", "clap", @@ -7222,10 +7223,9 @@ dependencies = [ [[package]] name = "reth-cli-commands" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "ahash", "alloy-chains", "alloy-consensus", "alloy-eips", @@ -7239,6 +7239,7 @@ dependencies = [ "fdlimit", "futures", "human_bytes", + "humantime", "itertools 0.14.0", "lz4", "ratatui", @@ -7282,6 +7283,7 @@ dependencies = [ "reth-static-file", "reth-static-file-types", "reth-trie", + "reth-trie-common", "reth-trie-db", "secp256k1 0.30.0", "serde", @@ -7291,12 +7293,13 @@ dependencies = [ "tokio-stream", "toml", "tracing", + "zstd", ] [[package]] name = "reth-cli-runner" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "reth-tasks", "tokio", @@ -7305,8 +7308,8 @@ dependencies = [ [[package]] name = "reth-cli-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7323,8 +7326,8 @@ dependencies = [ [[package]] name = "reth-codecs" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7343,8 +7346,8 @@ dependencies = [ [[package]] name = "reth-codecs-derive" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "convert_case", "proc-macro2", @@ -7354,8 +7357,8 @@ dependencies = [ [[package]] name = "reth-config" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "eyre", "humantime-serde", @@ -7369,8 +7372,8 @@ dependencies = [ [[package]] name = "reth-consensus" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7382,8 +7385,8 @@ dependencies = [ [[package]] name = "reth-consensus-common" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7394,8 +7397,8 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7419,8 +7422,8 @@ dependencies = [ [[package]] name = "reth-db" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "derive_more", @@ -7445,8 +7448,8 @@ dependencies = [ [[package]] name = "reth-db-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7473,8 +7476,8 @@ dependencies = [ [[package]] name = "reth-db-common" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7503,8 +7506,8 @@ dependencies = [ [[package]] name = "reth-db-models" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7518,8 +7521,8 @@ dependencies = [ [[package]] name = "reth-discv4" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7544,8 +7547,8 @@ dependencies = [ [[package]] name = "reth-discv5" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7568,8 +7571,8 @@ dependencies = [ [[package]] name = "reth-dns-discovery" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "data-encoding", @@ -7592,8 +7595,8 @@ dependencies = [ [[package]] name = "reth-downloaders" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7627,8 +7630,8 @@ dependencies = [ [[package]] name = "reth-ecies" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "aes", "alloy-primitives", @@ -7658,8 +7661,8 @@ dependencies = [ [[package]] name = "reth-engine-local" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7682,8 +7685,8 @@ dependencies = [ [[package]] name = "reth-engine-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7707,8 +7710,8 @@ dependencies = [ [[package]] name = "reth-engine-service" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "futures", "pin-project", @@ -7730,8 +7733,8 @@ dependencies = [ [[package]] name = "reth-engine-tree" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7784,8 +7787,8 @@ dependencies = [ [[package]] name = "reth-engine-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -7812,8 +7815,8 @@ dependencies = [ [[package]] name = "reth-era" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7828,8 +7831,8 @@ dependencies = [ [[package]] name = "reth-era-downloader" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "bytes", @@ -7843,18 +7846,16 @@ dependencies = [ [[package]] name = "reth-era-utils" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", - "alloy-rlp", "eyre", "futures-util", "reth-db-api", "reth-era", "reth-era-downloader", - "reth-ethereum-primitives", "reth-etl", "reth-fs-util", "reth-primitives-traits", @@ -7867,8 +7868,8 @@ dependencies = [ [[package]] name = "reth-errors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "reth-consensus", "reth-execution-errors", @@ -7878,8 +7879,8 @@ dependencies = [ [[package]] name = "reth-eth-wire" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-chains", "alloy-primitives", @@ -7906,8 +7907,8 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7927,8 +7928,8 @@ dependencies = [ [[package]] name = "reth-ethereum" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -7967,8 +7968,8 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "clap", "eyre", @@ -7988,8 +7989,8 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8004,8 +8005,8 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8022,8 +8023,8 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8035,8 +8036,8 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8064,8 +8065,8 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8082,8 +8083,8 @@ dependencies = [ [[package]] name = "reth-etl" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "rayon", "reth-db-api", @@ -8092,8 +8093,8 @@ dependencies = [ [[package]] name = "reth-evm" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8115,8 +8116,8 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8136,8 +8137,8 @@ dependencies = [ [[package]] name = "reth-execution-errors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-evm", "alloy-primitives", @@ -8149,8 +8150,8 @@ dependencies = [ [[package]] name = "reth-execution-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8167,8 +8168,8 @@ dependencies = [ [[package]] name = "reth-exex" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8205,8 +8206,8 @@ dependencies = [ [[package]] name = "reth-exex-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8219,8 +8220,8 @@ dependencies = [ [[package]] name = "reth-fs-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "serde", "serde_json", @@ -8229,8 +8230,8 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8240,7 +8241,6 @@ dependencies = [ "futures", "jsonrpsee 0.26.0", "pretty_assertions", - "reth-chainspec", "reth-engine-primitives", "reth-evm", "reth-primitives-traits", @@ -8257,8 +8257,8 @@ dependencies = [ [[package]] name = "reth-ipc" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "bytes", "futures", @@ -8277,14 +8277,14 @@ dependencies = [ [[package]] name = "reth-libmdbx" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "byteorder", "dashmap 6.1.0", "derive_more", - "indexmap 2.11.0", + "indexmap 2.11.1", "parking_lot", "reth-mdbx-sys", "smallvec", @@ -8294,8 +8294,8 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "bindgen 0.70.1", "cc", @@ -8303,8 +8303,8 @@ dependencies = [ [[package]] name = "reth-metrics" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "futures", "metrics", @@ -8315,16 +8315,16 @@ dependencies = [ [[package]] name = "reth-net-banlist" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", ] [[package]] name = "reth-net-nat" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "futures-util", "if-addrs", @@ -8337,8 +8337,8 @@ dependencies = [ [[package]] name = "reth-network" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8392,8 +8392,8 @@ dependencies = [ [[package]] name = "reth-network-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8417,8 +8417,8 @@ dependencies = [ [[package]] name = "reth-network-p2p" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8440,8 +8440,8 @@ dependencies = [ [[package]] name = "reth-network-peers" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8455,8 +8455,8 @@ dependencies = [ [[package]] name = "reth-network-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8469,8 +8469,8 @@ dependencies = [ [[package]] name = "reth-nippy-jar" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "anyhow", "bincode", @@ -8486,8 +8486,8 @@ dependencies = [ [[package]] name = "reth-node-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8510,8 +8510,8 @@ dependencies = [ [[package]] name = "reth-node-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8578,8 +8578,8 @@ dependencies = [ [[package]] name = "reth-node-core" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8630,8 +8630,8 @@ dependencies = [ [[package]] name = "reth-node-ethereum" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-network", @@ -8668,8 +8668,8 @@ dependencies = [ [[package]] name = "reth-node-ethstats" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8692,8 +8692,8 @@ dependencies = [ [[package]] name = "reth-node-events" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8716,8 +8716,8 @@ dependencies = [ [[package]] name = "reth-node-metrics" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "eyre", "http", @@ -8737,8 +8737,8 @@ dependencies = [ [[package]] name = "reth-node-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "reth-chainspec", "reth-db-api", @@ -8749,8 +8749,8 @@ dependencies = [ [[package]] name = "reth-op" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "reth-chainspec", "reth-codecs", @@ -8787,8 +8787,8 @@ dependencies = [ [[package]] name = "reth-optimism-chainspec" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8815,8 +8815,8 @@ dependencies = [ [[package]] name = "reth-optimism-cli" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8862,8 +8862,8 @@ dependencies = [ [[package]] name = "reth-optimism-consensus" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8887,8 +8887,8 @@ dependencies = [ [[package]] name = "reth-optimism-evm" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8915,8 +8915,8 @@ dependencies = [ [[package]] name = "reth-optimism-flashblocks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8933,9 +8933,9 @@ dependencies = [ "reth-optimism-primitives", "reth-primitives-traits", "reth-revm", - "reth-rpc-eth-api", "reth-rpc-eth-types", "reth-storage-api", + "reth-tasks", "serde", "serde_json", "tokio", @@ -8946,8 +8946,8 @@ dependencies = [ [[package]] name = "reth-optimism-forks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-op-hardforks", "alloy-primitives", @@ -8957,8 +8957,8 @@ dependencies = [ [[package]] name = "reth-optimism-node" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9003,8 +9003,8 @@ dependencies = [ [[package]] name = "reth-optimism-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9042,8 +9042,8 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9062,8 +9062,8 @@ dependencies = [ [[package]] name = "reth-optimism-rpc" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9120,8 +9120,8 @@ dependencies = [ [[package]] name = "reth-optimism-storage" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9136,8 +9136,8 @@ dependencies = [ [[package]] name = "reth-optimism-txpool" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9172,8 +9172,8 @@ dependencies = [ [[package]] name = "reth-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9193,8 +9193,8 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "pin-project", "reth-payload-primitives", @@ -9205,8 +9205,8 @@ dependencies = [ [[package]] name = "reth-payload-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9224,8 +9224,8 @@ dependencies = [ [[package]] name = "reth-payload-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9234,8 +9234,8 @@ dependencies = [ [[package]] name = "reth-payload-validator" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9244,8 +9244,8 @@ dependencies = [ [[package]] name = "reth-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "c-kzg", @@ -9258,8 +9258,8 @@ dependencies = [ [[package]] name = "reth-primitives-traits" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9291,8 +9291,8 @@ dependencies = [ [[package]] name = "reth-provider" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9336,8 +9336,8 @@ dependencies = [ [[package]] name = "reth-prune" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9364,8 +9364,8 @@ dependencies = [ [[package]] name = "reth-prune-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "arbitrary", @@ -9378,8 +9378,8 @@ dependencies = [ [[package]] name = "reth-ress-protocol" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9397,8 +9397,8 @@ dependencies = [ [[package]] name = "reth-ress-provider" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9424,8 +9424,8 @@ dependencies = [ [[package]] name = "reth-revm" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9437,8 +9437,8 @@ dependencies = [ [[package]] name = "reth-rpc" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9515,8 +9515,8 @@ dependencies = [ [[package]] name = "reth-rpc-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-genesis", @@ -9543,8 +9543,8 @@ dependencies = [ [[package]] name = "reth-rpc-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-network", "alloy-provider", @@ -9581,8 +9581,8 @@ dependencies = [ [[package]] name = "reth-rpc-convert" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-json-rpc", @@ -9606,8 +9606,8 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9636,8 +9636,8 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9680,8 +9680,8 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9727,8 +9727,8 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-rpc-types-engine", "http", @@ -9741,8 +9741,8 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9757,8 +9757,8 @@ dependencies = [ [[package]] name = "reth-stages" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9805,8 +9805,8 @@ dependencies = [ [[package]] name = "reth-stages-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9832,8 +9832,8 @@ dependencies = [ [[package]] name = "reth-stages-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "arbitrary", @@ -9846,8 +9846,8 @@ dependencies = [ [[package]] name = "reth-static-file" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "parking_lot", @@ -9866,8 +9866,8 @@ dependencies = [ [[package]] name = "reth-static-file-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "clap", @@ -9878,8 +9878,8 @@ dependencies = [ [[package]] name = "reth-storage-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9901,8 +9901,8 @@ dependencies = [ [[package]] name = "reth-storage-errors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9917,8 +9917,8 @@ dependencies = [ [[package]] name = "reth-tasks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "auto_impl", "dyn-clone", @@ -9935,8 +9935,8 @@ dependencies = [ [[package]] name = "reth-testing-utils" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9951,8 +9951,8 @@ dependencies = [ [[package]] name = "reth-tokio-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "tokio", "tokio-stream", @@ -9961,8 +9961,8 @@ dependencies = [ [[package]] name = "reth-tracing" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "clap", "eyre", @@ -9971,13 +9971,13 @@ dependencies = [ "tracing-appender", "tracing-journald", "tracing-logfmt", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] name = "reth-transaction-pool" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9985,7 +9985,7 @@ dependencies = [ "alloy-rlp", "aquamarine", "auto_impl", - "bitflags 2.9.3", + "bitflags 2.9.4", "futures-util", "metrics", "parking_lot", @@ -10017,8 +10017,8 @@ dependencies = [ [[package]] name = "reth-trie" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10042,8 +10042,8 @@ dependencies = [ [[package]] name = "reth-trie-common" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10068,8 +10068,8 @@ dependencies = [ [[package]] name = "reth-trie-db" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "reth-db-api", @@ -10081,8 +10081,8 @@ dependencies = [ [[package]] name = "reth-trie-parallel" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10106,8 +10106,8 @@ dependencies = [ [[package]] name = "reth-trie-sparse" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10125,8 +10125,8 @@ dependencies = [ [[package]] name = "reth-trie-sparse-parallel" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10143,8 +10143,8 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=9b86326#9b863264d4f8ed81d1cb84c0301ff4b59f1796fd" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "zstd", ] @@ -10279,9 +10279,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.29.0" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5c15d9c33ae98988a2a6a8db85b6a9e3389d1f3f2fdb95628a992f2b65b2c1" +checksum = "8fdb678b03faa678a7007a7c761a78efa9ca9adcd9434ef3d1ad894aec6e43d1" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -10353,7 +10353,7 @@ version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f64fbacb86008394aaebd3454f9643b7d5a782bd251135e17c5b33da592d84d" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "revm-bytecode", "revm-primitives", "serde", @@ -10519,7 +10519,7 @@ dependencies = [ "tower-http", "tracing", "tracing-opentelemetry", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "url", "vergen", "vergen-git2", @@ -10628,7 +10628,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.4.15", @@ -10637,15 +10637,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.0", ] [[package]] @@ -10673,7 +10673,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.3.0", + "security-framework 3.4.0", ] [[package]] @@ -10710,7 +10710,7 @@ dependencies = [ "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework 3.3.0", + "security-framework 3.4.0", "security-framework-sys", "webpki-root-certs 0.26.11", "windows-sys 0.59.0", @@ -10775,11 +10775,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -10891,7 +10891,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -10900,11 +10900,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" +checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -10913,9 +10913,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -10986,7 +10986,7 @@ version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.11.1", "itoa", "memchr", "ryu", @@ -11035,7 +11035,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.0", + "indexmap 2.11.1", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -11051,7 +11051,7 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.106", @@ -11462,7 +11462,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -11506,22 +11506,22 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac9ee8b664c9f1740cd813fea422116f8ba29997bb7c878d1940424889802897" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.4", "log", "num-traits", ] [[package]] name = "tempfile" -version = "3.21.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix 1.1.2", + "windows-sys 0.61.0", ] [[package]] @@ -11656,12 +11656,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "itoa", "js-sys", "libc", "num-conv", @@ -11674,15 +11673,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -11871,7 +11870,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.11.1", "serde", "serde_spanned", "toml_datetime", @@ -11944,7 +11943,7 @@ dependencies = [ "futures-core", "futures-util", "hdrhistogram", - "indexmap 2.11.0", + "indexmap 2.11.1", "pin-project-lite", "slab", "sync_wrapper", @@ -11963,7 +11962,7 @@ checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "async-compression", "base64 0.22.1", - "bitflags 2.9.3", + "bitflags 2.9.4", "bytes", "futures-core", "futures-util", @@ -12019,7 +12018,7 @@ dependencies = [ "crossbeam-channel", "thiserror 1.0.69", "time", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -12061,7 +12060,7 @@ checksum = "fc0b4143302cf1022dac868d521e36e8b27691f72c84b3311750d5188ebba657" dependencies = [ "libc", "tracing-core", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -12084,7 +12083,7 @@ dependencies = [ "time", "tracing", "tracing-core", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -12101,7 +12100,7 @@ dependencies = [ "tracing", "tracing-core", "tracing-log", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "web-time", ] @@ -12126,14 +12125,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -12164,7 +12163,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bee2ea1551f90040ab0e34b6fb7f2fa3bad8acc925837ac654f2c78a13e3089" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.106", @@ -12262,9 +12261,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-segmentation" @@ -12361,9 +12360,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -12476,30 +12475,40 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.3+wasi-0.2.4" +version = "0.14.5+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.0+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", "log", @@ -12511,9 +12520,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" dependencies = [ "cfg-if", "js-sys", @@ -12524,9 +12533,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -12534,9 +12543,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ "proc-macro2", "quote", @@ -12547,9 +12556,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ "unicode-ident", ] @@ -12569,9 +12578,9 @@ dependencies = [ [[package]] name = "wasmtimer" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d49b5d6c64e8558d9b1b065014426f35c18de636895d24893dbbd329743446" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", @@ -12583,9 +12592,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ "js-sys", "wasm-bindgen", @@ -12673,11 +12682,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -12715,7 +12724,7 @@ dependencies = [ "windows-collections", "windows-core 0.61.2", "windows-future", - "windows-link", + "windows-link 0.1.3", "windows-numerics", ] @@ -12761,7 +12770,7 @@ checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement 0.60.0", "windows-interface 0.59.1", - "windows-link", + "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", ] @@ -12773,7 +12782,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", - "windows-link", + "windows-link 0.1.3", "windows-threading", ] @@ -12849,6 +12858,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + [[package]] name = "windows-numerics" version = "0.2.0" @@ -12856,7 +12871,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ "windows-core 0.61.2", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -12865,7 +12880,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", ] @@ -12894,7 +12909,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -12913,7 +12928,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -12961,6 +12976,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -13013,7 +13037,7 @@ version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -13030,7 +13054,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -13234,9 +13258,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.45.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" [[package]] name = "write16" @@ -13291,7 +13315,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", - "rustix 1.0.8", + "rustix 1.1.2", ] [[package]] @@ -13350,18 +13374,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -13484,9 +13508,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 55bda15e..0cb98c93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,27 +30,27 @@ sha2 = { version = "0.10", default-features = false } arbitrary = { version = "=1.4.2", features = ["derive"] } # Reth deps -reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } # Issue with reth feature compatibility. Include this in all crates for temp fix. -reth-op = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ +reth-op = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ "full", "alloy-compat", ] } -reth = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-network = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ +reth = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-network = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ "serde", "arbitrary", "reth-codec", ] } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "9b86326" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "v1.7.0" } # Alloy libraries alloy-rpc-types-engine = "1.0.13" diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index d2da4ae4..9a58a260 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -9,26 +9,26 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true flashblocks-rpc.workspace = true -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 3b790559..87dc7744 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -9,23 +9,23 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true reth-optimism-primitives.workspace = true -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326", features = [ +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "9b86326" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } reth-eth-wire = { workspace = true } reth-network = { workspace = true } From 4ea4ba1c5e900e793b26670e11e4a8cba91bac6d Mon Sep 17 00:00:00 2001 From: 0xOsiris Date: Fri, 12 Sep 2025 13:29:47 -0700 Subject: [PATCH 096/114] chore: upgrade reth --- Cargo.lock | 252 +++++++++++++++-------------- Cargo.toml | 56 +++---- crates/flashblocks-node/Cargo.toml | 36 ++--- crates/flashblocks-rpc/Cargo.toml | 30 ++-- 4 files changed, 189 insertions(+), 185 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8efe482f..6a63e796 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2659,6 +2659,7 @@ version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ + "arbitrary", "cfg-if", "crossbeam-utils", "hashbrown 0.14.5", @@ -7089,7 +7090,7 @@ checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "reth" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-rpc-types", "aquamarine", @@ -7135,7 +7136,7 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7159,7 +7160,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7190,7 +7191,7 @@ dependencies = [ [[package]] name = "reth-chainspec" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7210,7 +7211,7 @@ dependencies = [ [[package]] name = "reth-cli" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-genesis", "clap", @@ -7224,7 +7225,7 @@ dependencies = [ [[package]] name = "reth-cli-commands" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7299,7 +7300,7 @@ dependencies = [ [[package]] name = "reth-cli-runner" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "reth-tasks", "tokio", @@ -7309,7 +7310,7 @@ dependencies = [ [[package]] name = "reth-cli-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7327,7 +7328,7 @@ dependencies = [ [[package]] name = "reth-codecs" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7347,7 +7348,7 @@ dependencies = [ [[package]] name = "reth-codecs-derive" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "convert_case", "proc-macro2", @@ -7358,7 +7359,7 @@ dependencies = [ [[package]] name = "reth-config" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "eyre", "humantime-serde", @@ -7373,7 +7374,7 @@ dependencies = [ [[package]] name = "reth-consensus" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7386,7 +7387,7 @@ dependencies = [ [[package]] name = "reth-consensus-common" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7398,7 +7399,7 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7423,9 +7424,10 @@ dependencies = [ [[package]] name = "reth-db" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", + "dashmap 6.1.0", "derive_more", "eyre", "metrics", @@ -7449,7 +7451,7 @@ dependencies = [ [[package]] name = "reth-db-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7477,7 +7479,7 @@ dependencies = [ [[package]] name = "reth-db-common" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7507,7 +7509,7 @@ dependencies = [ [[package]] name = "reth-db-models" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7522,7 +7524,7 @@ dependencies = [ [[package]] name = "reth-discv4" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7548,7 +7550,7 @@ dependencies = [ [[package]] name = "reth-discv5" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7572,7 +7574,7 @@ dependencies = [ [[package]] name = "reth-dns-discovery" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "data-encoding", @@ -7596,7 +7598,7 @@ dependencies = [ [[package]] name = "reth-downloaders" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7631,7 +7633,7 @@ dependencies = [ [[package]] name = "reth-ecies" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "aes", "alloy-primitives", @@ -7662,7 +7664,7 @@ dependencies = [ [[package]] name = "reth-engine-local" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7686,7 +7688,7 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7711,7 +7713,7 @@ dependencies = [ [[package]] name = "reth-engine-service" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "futures", "pin-project", @@ -7734,7 +7736,7 @@ dependencies = [ [[package]] name = "reth-engine-tree" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7788,7 +7790,7 @@ dependencies = [ [[package]] name = "reth-engine-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -7816,7 +7818,7 @@ dependencies = [ [[package]] name = "reth-era" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7832,7 +7834,7 @@ dependencies = [ [[package]] name = "reth-era-downloader" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "bytes", @@ -7847,7 +7849,7 @@ dependencies = [ [[package]] name = "reth-era-utils" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7869,7 +7871,7 @@ dependencies = [ [[package]] name = "reth-errors" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "reth-consensus", "reth-execution-errors", @@ -7880,7 +7882,7 @@ dependencies = [ [[package]] name = "reth-eth-wire" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-chains", "alloy-primitives", @@ -7908,7 +7910,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7929,7 +7931,7 @@ dependencies = [ [[package]] name = "reth-ethereum" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -7969,7 +7971,7 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "clap", "eyre", @@ -7983,6 +7985,7 @@ dependencies = [ "reth-node-core", "reth-node-ethereum", "reth-node-metrics", + "reth-rpc-server-types", "reth-tracing", "tracing", ] @@ -7990,7 +7993,7 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8006,7 +8009,7 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8024,7 +8027,7 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8037,7 +8040,7 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8066,7 +8069,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8084,7 +8087,7 @@ dependencies = [ [[package]] name = "reth-etl" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "rayon", "reth-db-api", @@ -8094,7 +8097,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8117,7 +8120,7 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8138,7 +8141,7 @@ dependencies = [ [[package]] name = "reth-execution-errors" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-evm", "alloy-primitives", @@ -8151,7 +8154,7 @@ dependencies = [ [[package]] name = "reth-execution-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8169,7 +8172,7 @@ dependencies = [ [[package]] name = "reth-exex" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8207,7 +8210,7 @@ dependencies = [ [[package]] name = "reth-exex-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8221,7 +8224,7 @@ dependencies = [ [[package]] name = "reth-fs-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "serde", "serde_json", @@ -8231,7 +8234,7 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8258,7 +8261,7 @@ dependencies = [ [[package]] name = "reth-ipc" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "bytes", "futures", @@ -8278,7 +8281,7 @@ dependencies = [ [[package]] name = "reth-libmdbx" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "bitflags 2.9.4", "byteorder", @@ -8295,7 +8298,7 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "bindgen 0.70.1", "cc", @@ -8304,7 +8307,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "futures", "metrics", @@ -8316,7 +8319,7 @@ dependencies = [ [[package]] name = "reth-net-banlist" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", ] @@ -8324,7 +8327,7 @@ dependencies = [ [[package]] name = "reth-net-nat" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "futures-util", "if-addrs", @@ -8338,7 +8341,7 @@ dependencies = [ [[package]] name = "reth-network" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8393,7 +8396,7 @@ dependencies = [ [[package]] name = "reth-network-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8418,7 +8421,7 @@ dependencies = [ [[package]] name = "reth-network-p2p" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8441,7 +8444,7 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8456,7 +8459,7 @@ dependencies = [ [[package]] name = "reth-network-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8470,7 +8473,7 @@ dependencies = [ [[package]] name = "reth-nippy-jar" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "anyhow", "bincode", @@ -8487,7 +8490,7 @@ dependencies = [ [[package]] name = "reth-node-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8511,7 +8514,7 @@ dependencies = [ [[package]] name = "reth-node-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8579,7 +8582,7 @@ dependencies = [ [[package]] name = "reth-node-core" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8631,7 +8634,7 @@ dependencies = [ [[package]] name = "reth-node-ethereum" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-network", @@ -8669,7 +8672,7 @@ dependencies = [ [[package]] name = "reth-node-ethstats" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8693,7 +8696,7 @@ dependencies = [ [[package]] name = "reth-node-events" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8717,7 +8720,7 @@ dependencies = [ [[package]] name = "reth-node-metrics" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "eyre", "http", @@ -8738,7 +8741,7 @@ dependencies = [ [[package]] name = "reth-node-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "reth-chainspec", "reth-db-api", @@ -8750,7 +8753,7 @@ dependencies = [ [[package]] name = "reth-op" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "reth-chainspec", "reth-codecs", @@ -8788,7 +8791,7 @@ dependencies = [ [[package]] name = "reth-optimism-chainspec" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8816,7 +8819,7 @@ dependencies = [ [[package]] name = "reth-optimism-cli" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8850,6 +8853,7 @@ dependencies = [ "reth-primitives-traits", "reth-provider", "reth-prune", + "reth-rpc-server-types", "reth-stages", "reth-static-file", "reth-static-file-types", @@ -8863,7 +8867,7 @@ dependencies = [ [[package]] name = "reth-optimism-consensus" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8888,7 +8892,7 @@ dependencies = [ [[package]] name = "reth-optimism-evm" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8916,7 +8920,7 @@ dependencies = [ [[package]] name = "reth-optimism-flashblocks" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8947,7 +8951,7 @@ dependencies = [ [[package]] name = "reth-optimism-forks" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-op-hardforks", "alloy-primitives", @@ -8958,7 +8962,7 @@ dependencies = [ [[package]] name = "reth-optimism-node" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9004,7 +9008,7 @@ dependencies = [ [[package]] name = "reth-optimism-payload-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9043,7 +9047,7 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9063,7 +9067,7 @@ dependencies = [ [[package]] name = "reth-optimism-rpc" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9121,7 +9125,7 @@ dependencies = [ [[package]] name = "reth-optimism-storage" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9137,7 +9141,7 @@ dependencies = [ [[package]] name = "reth-optimism-txpool" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9173,7 +9177,7 @@ dependencies = [ [[package]] name = "reth-payload-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9194,7 +9198,7 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "pin-project", "reth-payload-primitives", @@ -9206,7 +9210,7 @@ dependencies = [ [[package]] name = "reth-payload-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9225,7 +9229,7 @@ dependencies = [ [[package]] name = "reth-payload-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9235,7 +9239,7 @@ dependencies = [ [[package]] name = "reth-payload-validator" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9245,7 +9249,7 @@ dependencies = [ [[package]] name = "reth-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "c-kzg", @@ -9259,7 +9263,7 @@ dependencies = [ [[package]] name = "reth-primitives-traits" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9292,7 +9296,7 @@ dependencies = [ [[package]] name = "reth-provider" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9337,7 +9341,7 @@ dependencies = [ [[package]] name = "reth-prune" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9365,7 +9369,7 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "arbitrary", @@ -9379,7 +9383,7 @@ dependencies = [ [[package]] name = "reth-ress-protocol" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9398,7 +9402,7 @@ dependencies = [ [[package]] name = "reth-ress-provider" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9425,7 +9429,7 @@ dependencies = [ [[package]] name = "reth-revm" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9438,7 +9442,7 @@ dependencies = [ [[package]] name = "reth-rpc" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9516,7 +9520,7 @@ dependencies = [ [[package]] name = "reth-rpc-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-genesis", @@ -9544,7 +9548,7 @@ dependencies = [ [[package]] name = "reth-rpc-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-network", "alloy-provider", @@ -9582,7 +9586,7 @@ dependencies = [ [[package]] name = "reth-rpc-convert" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-json-rpc", @@ -9607,7 +9611,7 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9637,7 +9641,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9681,7 +9685,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9728,7 +9732,7 @@ dependencies = [ [[package]] name = "reth-rpc-layer" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-rpc-types-engine", "http", @@ -9742,7 +9746,7 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9758,7 +9762,7 @@ dependencies = [ [[package]] name = "reth-stages" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9806,7 +9810,7 @@ dependencies = [ [[package]] name = "reth-stages-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9833,7 +9837,7 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "arbitrary", @@ -9847,7 +9851,7 @@ dependencies = [ [[package]] name = "reth-static-file" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "parking_lot", @@ -9867,7 +9871,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "clap", @@ -9879,7 +9883,7 @@ dependencies = [ [[package]] name = "reth-storage-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9902,7 +9906,7 @@ dependencies = [ [[package]] name = "reth-storage-errors" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9918,7 +9922,7 @@ dependencies = [ [[package]] name = "reth-tasks" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "auto_impl", "dyn-clone", @@ -9936,7 +9940,7 @@ dependencies = [ [[package]] name = "reth-testing-utils" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9952,7 +9956,7 @@ dependencies = [ [[package]] name = "reth-tokio-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "tokio", "tokio-stream", @@ -9962,7 +9966,7 @@ dependencies = [ [[package]] name = "reth-tracing" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "clap", "eyre", @@ -9977,7 +9981,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10018,7 +10022,7 @@ dependencies = [ [[package]] name = "reth-trie" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10043,7 +10047,7 @@ dependencies = [ [[package]] name = "reth-trie-common" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10069,7 +10073,7 @@ dependencies = [ [[package]] name = "reth-trie-db" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "reth-db-api", @@ -10082,7 +10086,7 @@ dependencies = [ [[package]] name = "reth-trie-parallel" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10107,7 +10111,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10126,7 +10130,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse-parallel" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10144,7 +10148,7 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "zstd", ] diff --git a/Cargo.toml b/Cargo.toml index 0cb98c93..4fef400b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,45 +30,45 @@ sha2 = { version = "0.10", default-features = false } arbitrary = { version = "=1.4.2", features = ["derive"] } # Reth deps -reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } # Issue with reth feature compatibility. Include this in all crates for temp fix. -reth-op = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ +reth-op = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab", features = [ "full", "alloy-compat", ] } -reth = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-network = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ +reth = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-eth-wire = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-network = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab", features = [ "serde", "arbitrary", "reth-codec", ] } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "v1.7.0" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "44a48ab" } # Alloy libraries -alloy-rpc-types-engine = "1.0.13" -alloy-rpc-types-eth = "1.0.13" +alloy-rpc-types-engine = "1.0.30" +alloy-rpc-types-eth = "1.0.30" alloy-primitives = { version = "1.3.0", features = ["rand", "arbitrary"] } -alloy-serde = "1.0.13" -alloy-eips = "1.0.13" -alloy-json-rpc = "1.0.13" -alloy-consensus = "1.0.13" -alloy-rpc-types = "1.0.13" -alloy-genesis = "1.0.13" -alloy-rpc-client = "1.0.13" -alloy-rlp = "0.3.12" -alloy-provider = "1.0.13" -op-alloy-network = "0.19.1" -op-alloy-rpc-types-engine = "0.19.1" -op-alloy-consensus = "0.19.1" -op-alloy-rpc-types = "0.19.1" +alloy-serde = "1.0.30" +alloy-eips = "1.0.30" +alloy-json-rpc = "1.0.30" +alloy-consensus = "1.0.30" +alloy-rpc-types = "1.0.30" +alloy-genesis = "1.0.30" +alloy-rpc-client = "1.0.30" +alloy-rlp = "0.3.10" +alloy-provider = "1.0.30" +op-alloy-network = "0.19.0" +op-alloy-rpc-types-engine = "0.19.0" +op-alloy-consensus = "0.19.0" +op-alloy-rpc-types = "0.19.0" tokio-tungstenite = { version = "0.26.2", features = ["native-tls"] } testcontainers = "0.23" testcontainers-modules = { version = "0.11", features = ["redis"] } diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml index 9a58a260..75aa5d70 100644 --- a/crates/flashblocks-node/Cargo.toml +++ b/crates/flashblocks-node/Cargo.toml @@ -9,26 +9,26 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true flashblocks-rpc.workspace = true -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } reth-eth-wire = { workspace = true } diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 87dc7744..5583478a 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -9,23 +9,23 @@ rollup-boost.workspace = true flashblocks-p2p.workspace = true reth-optimism-primitives.workspace = true -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0", features = [ +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "v1.7.0" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } reth-eth-wire = { workspace = true } reth-network = { workspace = true } From 513d85fa6601f52283585493f0a2b65f5c9ed4f5 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Sep 2025 20:10:39 -0700 Subject: [PATCH 097/114] chore: extricate p2p crates and move to world-chain --- Cargo.lock | 3109 ++-- Cargo.toml | 8 +- crates/flashblocks-node/Cargo.toml | 66 - crates/flashblocks-node/src/lib.rs | 19 - .../rust-analyzer/metadata/sysroot/Cargo.lock | 480 - .../metadata/workspace/Cargo.lock | 13607 ---------------- crates/flashblocks-node/tests/p2p.rs | 609 - crates/flashblocks-p2p/.gitignore | 1 - crates/flashblocks-p2p/Cargo.toml | 39 - crates/flashblocks-p2p/src/lib.rs | 2 - crates/flashblocks-p2p/src/net/mod.rs | 68 - .../src/protocol/connection.rs | 520 - crates/flashblocks-p2p/src/protocol/error.rs | 13 - .../flashblocks-p2p/src/protocol/handler.rs | 629 - crates/flashblocks-p2p/src/protocol/mod.rs | 3 - crates/flashblocks-p2p/tests/protocol.rs | 278 - crates/flashblocks-rpc/Cargo.toml | 48 +- crates/flashblocks-rpc/README.md | 32 + crates/flashblocks-rpc/spec.md | 195 + .../src/bin/main.rs | 40 +- crates/flashblocks-rpc/src/cache.rs | 73 +- crates/flashblocks-rpc/src/flashblocks.rs | 123 +- crates/flashblocks-rpc/src/lib.rs | 2 +- crates/flashblocks-rpc/src/rpc.rs | 15 +- .../src}/tests/assets/genesis.json | 0 crates/flashblocks-rpc/src/tests/mod.rs | 314 + 26 files changed, 2396 insertions(+), 17897 deletions(-) delete mode 100644 crates/flashblocks-node/Cargo.toml delete mode 100644 crates/flashblocks-node/src/lib.rs delete mode 100644 crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock delete mode 100644 crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock delete mode 100644 crates/flashblocks-node/tests/p2p.rs delete mode 100644 crates/flashblocks-p2p/.gitignore delete mode 100644 crates/flashblocks-p2p/Cargo.toml delete mode 100644 crates/flashblocks-p2p/src/lib.rs delete mode 100644 crates/flashblocks-p2p/src/net/mod.rs delete mode 100644 crates/flashblocks-p2p/src/protocol/connection.rs delete mode 100644 crates/flashblocks-p2p/src/protocol/error.rs delete mode 100644 crates/flashblocks-p2p/src/protocol/handler.rs delete mode 100644 crates/flashblocks-p2p/src/protocol/mod.rs delete mode 100644 crates/flashblocks-p2p/tests/protocol.rs create mode 100644 crates/flashblocks-rpc/README.md create mode 100644 crates/flashblocks-rpc/spec.md rename crates/{flashblocks-node => flashblocks-rpc}/src/bin/main.rs (55%) rename crates/{flashblocks-node => flashblocks-rpc/src}/tests/assets/genesis.json (100%) create mode 100644 crates/flashblocks-rpc/src/tests/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 6a63e796..773683b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -719,9 +719,12 @@ dependencies = [ "alloy-primitives", "alloy-signer", "async-trait", + "coins-bip32", + "coins-bip39", "k256", "rand 0.8.5", "thiserror 2.0.16", + "zeroize", ] [[package]] @@ -992,6 +995,12 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "ark-bls12-381" version = "0.5.0" @@ -1551,6 +1560,12 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bimap" version = "0.6.3" @@ -1718,145 +1733,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "boa_ast" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" -dependencies = [ - "bitflags 2.9.4", - "boa_interner", - "boa_macros", - "boa_string", - "indexmap 2.11.1", - "num-bigint", - "rustc-hash 2.1.1", -] - -[[package]] -name = "boa_engine" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" -dependencies = [ - "arrayvec", - "bitflags 2.9.4", - "boa_ast", - "boa_gc", - "boa_interner", - "boa_macros", - "boa_parser", - "boa_profiler", - "boa_string", - "bytemuck", - "cfg-if", - "dashmap 6.1.0", - "fast-float2", - "hashbrown 0.15.5", - "icu_normalizer 1.5.0", - "indexmap 2.11.1", - "intrusive-collections", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "num_enum", - "once_cell", - "pollster", - "portable-atomic", - "rand 0.8.5", - "regress", - "rustc-hash 2.1.1", - "ryu-js", - "serde", - "serde_json", - "sptr", - "static_assertions", - "tap", - "thin-vec", - "thiserror 2.0.16", - "time", -] - -[[package]] -name = "boa_gc" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2425c0b7720d42d73eaa6a883fbb77a5c920da8694964a3d79a67597ac55cce2" -dependencies = [ - "boa_macros", - "boa_profiler", - "boa_string", - "hashbrown 0.15.5", - "thin-vec", -] - -[[package]] -name = "boa_interner" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42407a3b724cfaecde8f7d4af566df4b56af32a2f11f0956f5570bb974e7f749" -dependencies = [ - "boa_gc", - "boa_macros", - "hashbrown 0.15.5", - "indexmap 2.11.1", - "once_cell", - "phf", - "rustc-hash 2.1.1", - "static_assertions", -] - -[[package]] -name = "boa_macros" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", - "synstructure", -] - -[[package]] -name = "boa_parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" -dependencies = [ - "bitflags 2.9.4", - "boa_ast", - "boa_interner", - "boa_macros", - "boa_profiler", - "fast-float2", - "icu_properties 1.5.1", - "num-bigint", - "num-traits", - "regress", - "rustc-hash 2.1.1", -] - -[[package]] -name = "boa_profiler" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4064908e7cdf9b6317179e9b04dcb27f1510c1c144aeab4d0394014f37a0f922" - -[[package]] -name = "boa_string" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7debc13fbf7997bf38bf8e9b20f1ad5e2a7d27a900e1f6039fe244ce30f589b5" -dependencies = [ - "fast-float2", - "paste", - "rustc-hash 2.1.1", - "sptr", - "static_assertions", -] - [[package]] name = "bollard" version = "0.18.1" @@ -1943,6 +1819,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ + "sha2 0.10.9", "tinyvec", ] @@ -1980,20 +1857,6 @@ name = "bytemuck" version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] [[package]] name = "byteorder" @@ -2208,6 +2071,57 @@ dependencies = [ "cc", ] +[[package]] +name = "coins-bip32" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2073678591747aed4000dd468b97b14d7007f7936851d3f2f01846899f5ebf08" +dependencies = [ + "bs58", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2 0.10.9", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-bip39" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74b169b26623ff17e9db37a539fe4f15342080df39f129ef7631df7683d6d9d4" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2", + "rand 0.8.5", + "sha2 0.10.9", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-core" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b962ad8545e43a28e14e87377812ba9ae748dd4fd963f4c10e9fcc6d13475b" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "const-hex", + "digest 0.10.7", + "generic-array", + "ripemd", + "serde", + "sha2 0.10.9", + "sha3", + "thiserror 1.0.69", +] + [[package]] name = "colorchoice" version = "1.0.4" @@ -2659,7 +2573,6 @@ version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ - "arbitrary", "cfg-if", "crossbeam-utils", "hashbrown 0.14.5", @@ -3268,12 +3181,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fast-float2" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" - [[package]] name = "fastrand" version = "2.3.0" @@ -3352,96 +3259,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "flashblocks-node" -version = "0.1.0" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-json-rpc", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "brotli", - "clap", - "ed25519-dalek", - "eyre", - "flashblocks-p2p", - "flashblocks-rpc", - "futures-util", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "metrics-derive", - "op-alloy-consensus 0.19.1", - "op-alloy-network", - "op-alloy-rpc-types", - "reth-db", - "reth-eth-wire", - "reth-ethereum", - "reth-network", - "reth-network-peers", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-cli", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-node", - "reth-optimism-primitives", - "reth-optimism-rpc", - "reth-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-rpc-eth-api", - "reth-rpc-server-types", - "reth-tasks", - "reth-tracing", - "rollup-boost", - "serde", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "url", -] - -[[package]] -name = "flashblocks-p2p" -version = "0.1.0" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "blake3", - "clap", - "ed25519-dalek", - "eyre", - "futures", - "metrics", - "parking_lot", - "reth", - "reth-eth-wire", - "reth-ethereum", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-op", - "reth-optimism-primitives", - "reth-provider", - "reth-transaction-pool", - "rollup-boost", - "serde", - "serde_json", - "thiserror 2.0.16", - "tokio", - "tokio-stream", - "tracing", -] - [[package]] name = "flashblocks-rpc" version = "0.1.0" @@ -3456,11 +3273,10 @@ dependencies = [ "alloy-rpc-types", "alloy-rpc-types-engine", "alloy-rpc-types-eth", + "arc-swap", "brotli", "clap", - "ed25519-dalek", "eyre", - "flashblocks-p2p", "futures-util", "jsonrpsee 0.26.0", "metrics", @@ -3469,22 +3285,23 @@ dependencies = [ "op-alloy-network", "op-alloy-rpc-types", "reth-db", - "reth-eth-wire", - "reth-network", + "reth-e2e-test-utils", "reth-node-api", "reth-node-builder", "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-cli", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-node", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-optimism-rpc", "reth-primitives", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-rpc-eth-api", "reth-rpc-server-types", - "reth-tasks", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tracing", "rollup-boost", "serde", @@ -4238,18 +4055,6 @@ dependencies = [ "cc", ] -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] - [[package]] name = "icu_collections" version = "2.0.0" @@ -4258,9 +4063,9 @@ checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", "potential_utf", - "yoke 0.8.0", + "yoke", "zerofrom", - "zerovec 0.11.4", + "zerovec", ] [[package]] @@ -4270,149 +4075,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", - "litemap 0.8.0", - "tinystr 0.8.1", - "writeable 0.6.1", - "zerovec 0.11.4", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_normalizer" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", - "litemap 0.7.5", - "tinystr 0.7.6", - "writeable 0.5.5", - "zerovec 0.10.4", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", ] [[package]] -name = "icu_locid_transform" -version = "1.5.0" +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", ] [[package]] -name = "icu_locid_transform_data" -version = "1.5.1" +name = "icu_properties_data" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections 1.5.0", - "icu_normalizer_data 1.5.1", - "icu_properties 1.5.1", - "icu_provider 1.5.0", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections 2.0.0", - "icu_normalizer_data 2.0.0", - "icu_properties 2.0.1", - "icu_provider 2.0.0", - "smallvec", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections 1.5.0", - "icu_locid_transform", - "icu_properties_data 1.5.1", - "icu_provider 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections 2.0.0", - "icu_locale_core", - "icu_properties_data 2.0.1", - "icu_provider 2.0.0", - "potential_utf", - "zerotrie", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr 0.7.6", - "writeable 0.5.5", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" @@ -4423,23 +4133,12 @@ dependencies = [ "displaydoc", "icu_locale_core", "stable_deref_trait", - "tinystr 0.8.1", - "writeable 0.6.1", - "yoke 0.8.0", + "tinystr", + "writeable", + "yoke", "zerofrom", "zerotrie", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "zerovec", ] [[package]] @@ -4465,8 +4164,8 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "icu_normalizer 2.0.0", - "icu_properties 2.0.1", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -4611,15 +4310,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "intrusive-collections" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" -dependencies = [ - "memoffset", -] - [[package]] name = "io-uring" version = "0.7.10" @@ -4749,12 +4439,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonrpsee" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" - [[package]] name = "jsonrpsee" version = "0.25.1" @@ -5278,12 +4962,6 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - [[package]] name = "litemap" version = "0.8.0" @@ -5425,15 +5103,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - [[package]] name = "metrics" version = "0.24.2" @@ -5766,7 +5435,6 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "serde", ] [[package]] @@ -6286,6 +5954,16 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + [[package]] name = "pem" version = "3.0.5" @@ -6423,12 +6101,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - [[package]] name = "polyval" version = "0.6.2" @@ -6453,7 +6125,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ - "zerovec 0.11.4", + "zerovec", ] [[package]] @@ -7022,16 +6694,6 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" -[[package]] -name = "regress" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" -dependencies = [ - "hashbrown 0.15.5", - "memchr", -] - [[package]] name = "reqwest" version = "0.12.23" @@ -7088,47 +6750,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] -name = "reth" +name = "reth-basic-payload-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "alloy-rpc-types", - "aquamarine", - "clap", - "eyre", - "reth-chainspec", - "reth-cli-runner", - "reth-cli-util", - "reth-consensus", - "reth-consensus-common", - "reth-db", - "reth-ethereum-cli", - "reth-ethereum-payload-builder", - "reth-ethereum-primitives", - "reth-evm", - "reth-network", - "reth-network-api", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-ethereum", - "reth-node-metrics", - "reth-payload-builder", - "reth-payload-primitives", - "reth-primitives", - "reth-provider", - "reth-ress-protocol", - "reth-ress-provider", - "reth-revm", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-builder", - "reth-rpc-convert", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-tasks", - "reth-tokio-util", - "reth-transaction-pool", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "futures-core", + "futures-util", + "metrics", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tracing", ] @@ -7144,15 +6784,15 @@ dependencies = [ "futures-core", "futures-util", "metrics", - "reth-chain-state", - "reth-metrics", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-tasks", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "tokio", "tracing", ] @@ -7160,7 +6800,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7172,14 +6812,14 @@ dependencies = [ "parking_lot", "pin-project", "rand 0.9.2", - "reth-chainspec", - "reth-errors", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-trie", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm-database", "revm-state", "serde", @@ -7188,6 +6828,52 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-chain-state" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "derive_more", + "metrics", + "parking_lot", + "pin-project", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm-database", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-chainspec" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-genesis", + "alloy-primitives", + "alloy-trie", + "auto_impl", + "derive_more", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "serde_json", +] + [[package]] name = "reth-chainspec" version = "1.7.0" @@ -7202,16 +6888,16 @@ dependencies = [ "alloy-trie", "auto_impl", "derive_more", - "reth-ethereum-forks", - "reth-network-peers", - "reth-primitives-traits", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "serde_json", ] [[package]] name = "reth-cli" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-genesis", "clap", @@ -7225,7 +6911,7 @@ dependencies = [ [[package]] name = "reth-cli-commands" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7245,13 +6931,13 @@ dependencies = [ "lz4", "ratatui", "reqwest", - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-cli", "reth-cli-runner", "reth-cli-util", - "reth-codecs", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-config", - "reth-consensus", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db", "reth-db-api", "reth-db-common", @@ -7264,27 +6950,27 @@ dependencies = [ "reth-era-utils", "reth-eth-wire", "reth-etl", - "reth-evm", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-exex", - "reth-fs-util", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-net-nat", "reth-network", "reth-network-p2p", - "reth-network-peers", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-node-api", "reth-node-builder", "reth-node-core", "reth-node-events", "reth-node-metrics", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-prune", - "reth-revm", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-stages", "reth-static-file", - "reth-static-file-types", - "reth-trie", - "reth-trie-common", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-trie-db", "secp256k1 0.30.0", "serde", @@ -7300,9 +6986,9 @@ dependencies = [ [[package]] name = "reth-cli-runner" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "reth-tasks", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tracing", ] @@ -7310,7 +6996,7 @@ dependencies = [ [[package]] name = "reth-cli-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7318,17 +7004,16 @@ dependencies = [ "eyre", "libc", "rand 0.8.5", - "reth-fs-util", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "secp256k1 0.30.0", "serde", "thiserror 2.0.16", - "tikv-jemallocator", ] [[package]] name = "reth-codecs" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7339,12 +7024,41 @@ dependencies = [ "bytes", "modular-bitfield", "op-alloy-consensus 0.19.1", - "reth-codecs-derive", - "reth-zstd-compressors", + "reth-codecs-derive 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-zstd-compressors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "visibility", ] +[[package]] +name = "reth-codecs" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-trie", + "bytes", + "modular-bitfield", + "op-alloy-consensus 0.19.1", + "reth-codecs-derive 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-zstd-compressors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "serde", +] + +[[package]] +name = "reth-codecs-derive" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "reth-codecs-derive" version = "1.7.0" @@ -7359,18 +7073,31 @@ dependencies = [ [[package]] name = "reth-config" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "eyre", "humantime-serde", "reth-network-types", - "reth-prune-types", - "reth-stages-types", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "toml", "url", ] +[[package]] +name = "reth-consensus" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "auto_impl", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "thiserror 2.0.16", +] + [[package]] name = "reth-consensus" version = "1.7.0" @@ -7379,11 +7106,23 @@ dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", - "reth-execution-types", - "reth-primitives-traits", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "thiserror 2.0.16", ] +[[package]] +name = "reth-consensus-common" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", +] + [[package]] name = "reth-consensus-common" version = "1.7.0" @@ -7391,15 +7130,15 @@ source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9 dependencies = [ "alloy-consensus", "alloy-eips", - "reth-chainspec", - "reth-consensus", - "reth-primitives-traits", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", ] [[package]] name = "reth-consensus-debug-client" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7413,7 +7152,7 @@ dependencies = [ "futures", "reqwest", "reth-node-api", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tracing", "ringbuffer", "serde", @@ -7424,22 +7163,21 @@ dependencies = [ [[package]] name = "reth-db" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", - "dashmap 6.1.0", "derive_more", "eyre", "metrics", "page_size", "parking_lot", "reth-db-api", - "reth-fs-util", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-libmdbx", - "reth-metrics", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-nippy-jar", - "reth-static-file-types", - "reth-storage-errors", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tracing", "rustc-hash 2.1.1", "strum 0.27.2", @@ -7451,7 +7189,7 @@ dependencies = [ [[package]] name = "reth-db-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7463,15 +7201,15 @@ dependencies = [ "modular-bitfield", "parity-scale-codec", "proptest", - "reth-codecs", - "reth-db-models", - "reth-ethereum-primitives", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-db-models 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "roaring", "serde", ] @@ -7479,26 +7217,26 @@ dependencies = [ [[package]] name = "reth-db-common" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-genesis", "alloy-primitives", "boyer-moore-magiclen", "eyre", - "reth-chainspec", - "reth-codecs", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-config", "reth-db-api", "reth-etl", - "reth-execution-errors", - "reth-fs-util", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-node-types", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-stages-types", - "reth-static-file-types", - "reth-trie", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-trie-db", "serde", "serde_json", @@ -7509,22 +7247,32 @@ dependencies = [ [[package]] name = "reth-db-models" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", "arbitrary", "bytes", "modular-bitfield", - "reth-codecs", - "reth-primitives-traits", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", ] [[package]] -name = "reth-discv4" +name = "reth-db-models" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", +] + +[[package]] +name = "reth-discv4" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7534,10 +7282,10 @@ dependencies = [ "itertools 0.14.0", "parking_lot", "rand 0.8.5", - "reth-ethereum-forks", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-net-banlist", "reth-net-nat", - "reth-network-peers", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "schnellru", "secp256k1 0.30.0", "serde", @@ -7550,7 +7298,7 @@ dependencies = [ [[package]] name = "reth-discv5" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7561,10 +7309,10 @@ dependencies = [ "itertools 0.14.0", "metrics", "rand 0.9.2", - "reth-chainspec", - "reth-ethereum-forks", - "reth-metrics", - "reth-network-peers", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "secp256k1 0.30.0", "thiserror 2.0.16", "tokio", @@ -7574,7 +7322,7 @@ dependencies = [ [[package]] name = "reth-dns-discovery" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "data-encoding", @@ -7582,8 +7330,8 @@ dependencies = [ "hickory-resolver", "linked_hash_set", "parking_lot", - "reth-ethereum-forks", - "reth-network-peers", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tokio-util", "schnellru", "secp256k1 0.30.0", @@ -7598,7 +7346,7 @@ dependencies = [ [[package]] name = "reth-downloaders" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7611,16 +7359,16 @@ dependencies = [ "pin-project", "rayon", "reth-config", - "reth-consensus", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db", "reth-db-api", - "reth-ethereum-primitives", - "reth-metrics", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-p2p", - "reth-network-peers", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-testing-utils", "tempfile", "thiserror 2.0.16", @@ -7630,10 +7378,67 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-e2e-test-utils" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network", + "alloy-primitives", + "alloy-provider", + "alloy-rlp", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-signer", + "alloy-signer-local", + "derive_more", + "eyre", + "futures-util", + "jsonrpsee 0.26.0", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-cli-commands", + "reth-config", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-db", + "reth-db-common", + "reth-engine-local", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-api", + "reth-network-p2p", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-node-api", + "reth-node-builder", + "reth-node-core", + "reth-node-ethereum", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-provider", + "reth-rpc-api", + "reth-rpc-builder", + "reth-rpc-eth-api", + "reth-rpc-server-types", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tokio-util", + "reth-tracing", + "revm", + "serde_json", + "tempfile", + "tokio", + "tokio-stream", + "tracing", + "url", +] + [[package]] name = "reth-ecies" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "aes", "alloy-primitives", @@ -7649,7 +7454,7 @@ dependencies = [ "hmac", "pin-project", "rand 0.8.5", - "reth-network-peers", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "secp256k1 0.30.0", "sha2 0.10.9", "sha3", @@ -7664,7 +7469,7 @@ dependencies = [ [[package]] name = "reth-engine-local" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7672,14 +7477,14 @@ dependencies = [ "eyre", "futures-util", "op-alloy-rpc-types-engine", - "reth-chainspec", - "reth-engine-primitives", - "reth-ethereum-engine-primitives", - "reth-optimism-chainspec", - "reth-payload-builder", - "reth-payload-primitives", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-transaction-pool", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tokio-stream", "tracing", @@ -7688,7 +7493,7 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7696,47 +7501,70 @@ dependencies = [ "alloy-rpc-types-engine", "auto_impl", "futures", - "reth-chain-state", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-trie-common", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "thiserror 2.0.16", "tokio", ] [[package]] -name = "reth-engine-service" +name = "reth-engine-primitives" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "serde", + "thiserror 2.0.16", +] + +[[package]] +name = "reth-engine-service" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "futures", "pin-project", - "reth-chainspec", - "reth-consensus", - "reth-engine-primitives", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-engine-tree", - "reth-ethereum-primitives", - "reth-evm", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-p2p", "reth-node-types", - "reth-payload-builder", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-prune", "reth-stages-api", - "reth-tasks", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "thiserror 2.0.16", ] [[package]] name = "reth-engine-tree" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7750,33 +7578,33 @@ dependencies = [ "mini-moka", "parking_lot", "rayon", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db", - "reth-engine-primitives", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-metrics", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-p2p", - "reth-payload-builder", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-prune", - "reth-prune-types", - "reth-revm", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-stages", "reth-stages-api", "reth-static-file", - "reth-tasks", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tracing", - "reth-trie", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-trie-db", "reth-trie-parallel", - "reth-trie-sparse", + "reth-trie-sparse 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-trie-sparse-parallel", "revm", "revm-primitives", @@ -7790,7 +7618,7 @@ dependencies = [ [[package]] name = "reth-engine-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -7798,16 +7626,16 @@ dependencies = [ "futures", "itertools 0.14.0", "pin-project", - "reth-chainspec", - "reth-engine-primitives", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-engine-tree", - "reth-errors", - "reth-evm", - "reth-fs-util", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "serde_json", "tokio", @@ -7818,7 +7646,7 @@ dependencies = [ [[package]] name = "reth-era" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7826,7 +7654,7 @@ dependencies = [ "alloy-rlp", "ethereum_ssz", "ethereum_ssz_derive", - "reth-ethereum-primitives", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "snap", "thiserror 2.0.16", ] @@ -7834,14 +7662,14 @@ dependencies = [ [[package]] name = "reth-era-downloader" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "bytes", "eyre", "futures-util", "reqwest", - "reth-fs-util", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "sha2 0.10.9", "tokio", ] @@ -7849,7 +7677,7 @@ dependencies = [ [[package]] name = "reth-era-utils" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7859,30 +7687,41 @@ dependencies = [ "reth-era", "reth-era-downloader", "reth-etl", - "reth-fs-util", - "reth-primitives-traits", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-stages-types", - "reth-storage-api", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tracing", ] +[[package]] +name = "reth-errors" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "thiserror 2.0.16", +] + [[package]] name = "reth-errors" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ - "reth-consensus", - "reth-execution-errors", - "reth-storage-errors", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "thiserror 2.0.16", ] [[package]] name = "reth-eth-wire" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-chains", "alloy-primitives", @@ -7891,13 +7730,13 @@ dependencies = [ "derive_more", "futures", "pin-project", - "reth-codecs", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-ecies", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-metrics", - "reth-network-peers", - "reth-primitives-traits", + "reth-eth-wire-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "snap", "thiserror 2.0.16", @@ -7910,7 +7749,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7920,90 +7759,67 @@ dependencies = [ "alloy-rlp", "bytes", "derive_more", - "reth-chainspec", - "reth-codecs-derive", - "reth-ethereum-primitives", - "reth-primitives-traits", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-codecs-derive 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "thiserror 2.0.16", ] [[package]] -name = "reth-ethereum" +name = "reth-eth-wire-types" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" 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", + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-hardforks", + "alloy-primitives", + "alloy-rlp", + "bytes", + "derive_more", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-codecs-derive 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "serde", + "thiserror 2.0.16", ] [[package]] -name = "reth-ethereum-cli" +name = "reth-ethereum-consensus" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "clap", - "eyre", - "reth-chainspec", - "reth-cli", - "reth-cli-commands", - "reth-cli-runner", - "reth-db", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-ethereum", - "reth-node-metrics", - "reth-rpc-server-types", - "reth-tracing", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tracing", ] [[package]] -name = "reth-ethereum-consensus" +name = "reth-ethereum-engine-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "alloy-consensus", "alloy-eips", "alloy-primitives", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-execution-types", - "reth-primitives-traits", - "tracing", + "alloy-rlp", + "alloy-rpc-types-engine", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "serde", + "sha2 0.10.9", + "thiserror 2.0.16", ] [[package]] @@ -8015,15 +7831,28 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", - "reth-engine-primitives", - "reth-ethereum-primitives", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "serde", "sha2 0.10.9", "thiserror 2.0.16", ] +[[package]] +name = "reth-ethereum-forks" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-eip2124", + "alloy-hardforks", + "alloy-primitives", + "auto_impl", + "once_cell", + "rustc-hash 2.1.1", +] + [[package]] name = "reth-ethereum-forks" version = "1.7.0" @@ -8040,28 +7869,28 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", - "reth-basic-payload-builder", - "reth-chainspec", - "reth-consensus-common", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", + "reth-basic-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-evm-ethereum", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-payload-validator", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-transaction-pool", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-validator 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "tracing", ] @@ -8069,7 +7898,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8077,17 +7906,32 @@ dependencies = [ "alloy-rlp", "arbitrary", "modular-bitfield", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-zstd-compressors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "serde_with", ] [[package]] -name = "reth-etl" +name = "reth-ethereum-primitives" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-zstd-compressors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "serde", + "serde_with", +] + +[[package]] +name = "reth-etl" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "rayon", "reth-db-api", @@ -8097,7 +7941,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8107,18 +7951,18 @@ dependencies = [ "derive_more", "futures-util", "metrics", - "reth-execution-errors", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", ] [[package]] -name = "reth-evm-ethereum" +name = "reth-evm" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ @@ -8126,18 +7970,51 @@ dependencies = [ "alloy-eips", "alloy-evm", "alloy-primitives", - "alloy-rpc-types-engine", + "auto_impl", "derive_more", - "reth-chainspec", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-primitives-traits", - "reth-storage-errors", + "futures-util", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm", +] + +[[package]] +name = "reth-evm-ethereum" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "alloy-rpc-types-engine", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", ] +[[package]] +name = "reth-execution-errors" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-evm", + "alloy-primitives", + "alloy-rlp", + "nybbles", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "thiserror 2.0.16", +] + [[package]] name = "reth-execution-errors" version = "1.7.0" @@ -8147,32 +8024,48 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "nybbles", - "reth-storage-errors", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "thiserror 2.0.16", ] [[package]] name = "reth-execution-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-evm", "alloy-primitives", "derive_more", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-trie-common", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "serde", "serde_with", ] [[package]] -name = "reth-exex" +name = "reth-execution-types" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "derive_more", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm", +] + +[[package]] +name = "reth-exex" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8182,23 +8075,23 @@ dependencies = [ "itertools 0.14.0", "metrics", "parking_lot", - "reth-chain-state", - "reth-chainspec", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-config", - "reth-ethereum-primitives", - "reth-evm", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-exex-types", - "reth-fs-util", - "reth-metrics", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-node-api", "reth-node-core", - "reth-payload-builder", - "reth-primitives-traits", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-prune-types", - "reth-revm", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-stages-api", - "reth-tasks", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tracing", "rmp-serde", "thiserror 2.0.16", @@ -8210,17 +8103,27 @@ dependencies = [ [[package]] name = "reth-exex-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", - "reth-chain-state", - "reth-execution-types", - "reth-primitives-traits", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "serde_with", ] +[[package]] +name = "reth-fs-util" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.16", +] + [[package]] name = "reth-fs-util" version = "1.7.0" @@ -8234,7 +8137,7 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8244,14 +8147,14 @@ dependencies = [ "futures", "jsonrpsee 0.26.0", "pretty_assertions", - "reth-engine-primitives", - "reth-evm", - "reth-primitives-traits", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-revm", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-api", "reth-tracing", - "reth-trie", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm-bytecode", "revm-database", "serde", @@ -8261,7 +8164,7 @@ dependencies = [ [[package]] name = "reth-ipc" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "bytes", "futures", @@ -8281,7 +8184,7 @@ dependencies = [ [[package]] name = "reth-libmdbx" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "bitflags 2.9.4", "byteorder", @@ -8298,7 +8201,7 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "bindgen 0.70.1", "cc", @@ -8307,7 +8210,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "futures", "metrics", @@ -8317,9 +8220,18 @@ dependencies = [ ] [[package]] -name = "reth-net-banlist" +name = "reth-metrics" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "metrics", + "metrics-derive", +] + +[[package]] +name = "reth-net-banlist" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", ] @@ -8327,7 +8239,7 @@ dependencies = [ [[package]] name = "reth-net-nat" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "futures-util", "if-addrs", @@ -8341,7 +8253,7 @@ dependencies = [ [[package]] name = "reth-network" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8359,28 +8271,28 @@ dependencies = [ "pin-project", "rand 0.8.5", "rand 0.9.2", - "reth-chainspec", - "reth-consensus", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-discv4", "reth-discv5", "reth-dns-discovery", "reth-ecies", "reth-eth-wire", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-fs-util", - "reth-metrics", + "reth-eth-wire-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-net-banlist", "reth-network-api", "reth-network-p2p", - "reth-network-peers", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-types", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tokio-util", - "reth-transaction-pool", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "rustc-hash 2.1.1", "schnellru", "secp256k1 0.30.0", @@ -8396,7 +8308,7 @@ dependencies = [ [[package]] name = "reth-network-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8406,10 +8318,10 @@ dependencies = [ "derive_more", "enr", "futures", - "reth-eth-wire-types", - "reth-ethereum-forks", + "reth-eth-wire-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-p2p", - "reth-network-peers", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-types", "reth-tokio-util", "serde", @@ -8421,7 +8333,7 @@ dependencies = [ [[package]] name = "reth-network-p2p" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8430,13 +8342,13 @@ dependencies = [ "derive_more", "futures", "parking_lot", - "reth-consensus", - "reth-eth-wire-types", - "reth-ethereum-primitives", - "reth-network-peers", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-eth-wire-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-types", - "reth-primitives-traits", - "reth-storage-errors", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tracing", ] @@ -8444,7 +8356,7 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8457,14 +8369,27 @@ dependencies = [ ] [[package]] -name = "reth-network-types" +name = "reth-network-peers" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "secp256k1 0.30.0", + "serde_with", + "thiserror 2.0.16", + "url", +] + +[[package]] +name = "reth-network-types" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eip2124", "humantime-serde", "reth-net-banlist", - "reth-network-peers", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "serde_json", "tracing", @@ -8473,14 +8398,14 @@ dependencies = [ [[package]] name = "reth-nippy-jar" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "anyhow", "bincode", "derive_more", "lz4_flex", "memmap2", - "reth-fs-util", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "thiserror 2.0.16", "tracing", @@ -8490,31 +8415,31 @@ dependencies = [ [[package]] name = "reth-node-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-rpc-types-engine", "eyre", - "reth-basic-payload-builder", - "reth-consensus", + "reth-basic-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db-api", - "reth-engine-primitives", - "reth-evm", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-api", "reth-node-core", "reth-node-types", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-tasks", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tokio-util", - "reth-transaction-pool", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", ] [[package]] name = "reth-node-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8528,25 +8453,25 @@ dependencies = [ "futures", "jsonrpsee 0.26.0", "rayon", - "reth-basic-payload-builder", - "reth-chain-state", - "reth-chainspec", + "reth-basic-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-cli-util", "reth-config", - "reth-consensus", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-consensus-debug-client", "reth-db", "reth-db-api", "reth-db-common", "reth-downloaders", "reth-engine-local", - "reth-engine-primitives", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-engine-service", "reth-engine-tree", "reth-engine-util", - "reth-evm", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-exex", - "reth-fs-util", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-invalid-block-hooks", "reth-network", "reth-network-api", @@ -8556,8 +8481,8 @@ dependencies = [ "reth-node-ethstats", "reth-node-events", "reth-node-metrics", - "reth-payload-builder", - "reth-primitives-traits", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-prune", "reth-rpc", @@ -8565,13 +8490,13 @@ dependencies = [ "reth-rpc-builder", "reth-rpc-engine-api", "reth-rpc-eth-types", - "reth-rpc-layer", + "reth-rpc-layer 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-stages", "reth-static-file", - "reth-tasks", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tokio-util", "reth-tracing", - "reth-transaction-pool", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "secp256k1 0.30.0", "serde_json", "tokio", @@ -8582,7 +8507,7 @@ dependencies = [ [[package]] name = "reth-node-core" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8595,30 +8520,30 @@ dependencies = [ "futures", "humantime", "rand 0.9.2", - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-cli-util", "reth-config", - "reth-consensus", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db", "reth-discv4", "reth-discv5", "reth-engine-local", - "reth-engine-primitives", - "reth-ethereum-forks", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-net-nat", "reth-network", "reth-network-p2p", - "reth-network-peers", - "reth-primitives-traits", - "reth-prune-types", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-convert", "reth-rpc-eth-types", "reth-rpc-server-types", - "reth-stages-types", - "reth-storage-api", - "reth-storage-errors", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tracing", - "reth-transaction-pool", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "secp256k1 0.30.0", "serde", "shellexpand", @@ -8634,29 +8559,29 @@ dependencies = [ [[package]] name = "reth-node-ethereum" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-network", "alloy-rpc-types-engine", "alloy-rpc-types-eth", "eyre", - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-engine-local", - "reth-engine-primitives", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-ethereum-consensus", - "reth-ethereum-engine-primitives", + "reth-ethereum-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-ethereum-payload-builder", - "reth-ethereum-primitives", - "reth-evm", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-evm-ethereum", "reth-network", "reth-node-api", "reth-node-builder", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-revm", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc", "reth-rpc-api", "reth-rpc-builder", @@ -8664,7 +8589,7 @@ dependencies = [ "reth-rpc-eth-types", "reth-rpc-server-types", "reth-tracing", - "reth-transaction-pool", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "tokio", ] @@ -8672,17 +8597,17 @@ dependencies = [ [[package]] name = "reth-node-ethstats" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", "chrono", "futures-util", - "reth-chain-state", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-api", - "reth-primitives-traits", - "reth-storage-api", - "reth-transaction-pool", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "serde_json", "thiserror 2.0.16", @@ -8696,7 +8621,7 @@ dependencies = [ [[package]] name = "reth-node-events" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8706,13 +8631,13 @@ dependencies = [ "futures", "humantime", "pin-project", - "reth-engine-primitives", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-api", - "reth-primitives-traits", - "reth-prune-types", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-stages", - "reth-static-file-types", - "reth-storage-api", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tracing", ] @@ -8720,7 +8645,7 @@ dependencies = [ [[package]] name = "reth-node-metrics" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "eyre", "http", @@ -8730,9 +8655,8 @@ dependencies = [ "metrics-process", "metrics-util", "procfs", - "reth-metrics", - "reth-tasks", - "tikv-jemalloc-ctl", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tower 0.5.2", "tracing", @@ -8741,51 +8665,41 @@ dependencies = [ [[package]] name = "reth-node-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db-api", - "reth-engine-primitives", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", ] [[package]] -name = "reth-op" +name = "reth-optimism-chainspec" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "reth-chainspec", - "reth-codecs", - "reth-consensus", - "reth-consensus-common", - "reth-db", - "reth-engine-local", - "reth-eth-wire", - "reth-evm", - "reth-network", - "reth-network-api", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-node", - "reth-optimism-primitives", - "reth-optimism-rpc", - "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", + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-hardforks", + "alloy-primitives", + "derive_more", + "miniz_oxide", + "op-alloy-consensus 0.19.1", + "op-alloy-rpc-types", + "paste", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "serde", + "serde_json", + "tar-no-std", + "thiserror 2.0.16", ] [[package]] @@ -8800,26 +8714,21 @@ dependencies = [ "alloy-hardforks", "alloy-primitives", "derive_more", - "miniz_oxide", "op-alloy-consensus 0.19.1", "op-alloy-rpc-types", - "paste", - "reth-chainspec", - "reth-ethereum-forks", - "reth-network-peers", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "serde", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "serde_json", - "tar-no-std", - "thiserror 2.0.16", ] [[package]] name = "reth-optimism-cli" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8830,33 +8739,32 @@ dependencies = [ "eyre", "futures-util", "op-alloy-consensus 0.19.1", - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-cli", "reth-cli-commands", "reth-cli-runner", - "reth-consensus", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db", "reth-db-api", "reth-db-common", "reth-downloaders", - "reth-execution-types", - "reth-fs-util", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-node-builder", "reth-node-core", "reth-node-events", "reth-node-metrics", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-optimism-node", - "reth-optimism-primitives", - "reth-primitives-traits", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-prune", - "reth-rpc-server-types", "reth-stages", "reth-static-file", - "reth-static-file-types", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tracing", "serde", "tokio", @@ -8864,6 +8772,31 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-optimism-consensus" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-trie", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "revm", + "thiserror 2.0.16", + "tracing", +] + [[package]] name = "reth-optimism-consensus" version = "1.7.0" @@ -8873,17 +8806,17 @@ dependencies = [ "alloy-eips", "alloy-primitives", "alloy-trie", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-execution-types", - "reth-optimism-chainspec", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-consensus-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "revm", "thiserror 2.0.16", "tracing", @@ -8892,7 +8825,7 @@ dependencies = [ [[package]] name = "reth-optimism-evm" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8902,25 +8835,52 @@ dependencies = [ "op-alloy-consensus 0.19.1", "op-alloy-rpc-types-engine", "op-revm", - "reth-chainspec", - "reth-evm", - "reth-execution-errors", - "reth-execution-types", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-eth-api", - "reth-storage-errors", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "thiserror 2.0.16", ] [[package]] -name = "reth-optimism-flashblocks" +name = "reth-optimism-evm" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-op-evm", + "alloy-primitives", + "op-alloy-consensus 0.19.1", + "op-alloy-rpc-types-engine", + "op-revm", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm", + "thiserror 2.0.16", +] + +[[package]] +name = "reth-optimism-flashblocks" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8929,17 +8889,17 @@ dependencies = [ "brotli", "eyre", "futures-util", - "reth-chain-state", - "reth-errors", - "reth-evm", - "reth-execution-types", - "reth-optimism-evm", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-revm", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-eth-types", - "reth-storage-api", - "reth-tasks", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "serde_json", "tokio", @@ -8948,6 +8908,17 @@ dependencies = [ "url", ] +[[package]] +name = "reth-optimism-forks" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-op-hardforks", + "alloy-primitives", + "once_cell", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", +] + [[package]] name = "reth-optimism-forks" version = "1.7.0" @@ -8956,13 +8927,13 @@ dependencies = [ "alloy-op-hardforks", "alloy-primitives", "once_cell", - "reth-ethereum-forks", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", ] [[package]] name = "reth-optimism-node" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8973,38 +8944,77 @@ dependencies = [ "op-alloy-consensus 0.19.1", "op-alloy-rpc-types-engine", "op-revm", - "reth-chainspec", - "reth-consensus", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-engine-local", - "reth-evm", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network", "reth-node-api", "reth-node-builder", "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-payload-builder", - "reth-optimism-primitives", + "reth-optimism-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-optimism-rpc", "reth-optimism-storage", - "reth-optimism-txpool", - "reth-payload-builder", - "reth-primitives-traits", + "reth-optimism-txpool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-rpc-api", "reth-rpc-engine-api", "reth-rpc-server-types", "reth-tracing", - "reth-transaction-pool", - "reth-trie-common", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "serde", "tokio", "url", ] +[[package]] +name = "reth-optimism-payload-builder" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "derive_more", + "op-alloy-consensus 0.19.1", + "op-alloy-rpc-types-engine", + "reth-basic-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-txpool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-validator 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "revm", + "serde", + "sha2 0.10.9", + "thiserror 2.0.16", + "tracing", +] + [[package]] name = "reth-optimism-payload-builder" version = "1.7.0" @@ -9019,24 +9029,24 @@ dependencies = [ "derive_more", "op-alloy-consensus 0.19.1", "op-alloy-rpc-types-engine", - "reth-basic-payload-builder", - "reth-chain-state", - "reth-chainspec", - "reth-evm", - "reth-execution-types", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-optimism-txpool", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-payload-util", - "reth-payload-validator", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-transaction-pool", + "reth-basic-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-txpool 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-util 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-validator 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "revm", "serde", "sha2 0.10.9", @@ -9047,7 +9057,7 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9057,17 +9067,30 @@ dependencies = [ "bytes", "modular-bitfield", "op-alloy-consensus 0.19.1", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-zstd-compressors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "serde_with", ] [[package]] -name = "reth-optimism-rpc" +name = "reth-optimism-primitives" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "op-alloy-consensus 0.19.1", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", +] + +[[package]] +name = "reth-optimism-rpc" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9093,27 +9116,27 @@ dependencies = [ "op-alloy-rpc-types-engine", "op-revm", "reqwest", - "reth-chainspec", - "reth-evm", - "reth-metrics", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-node-api", "reth-node-builder", - "reth-optimism-evm", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-optimism-flashblocks", - "reth-optimism-forks", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-optimism-txpool", - "reth-primitives-traits", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-txpool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc", "reth-rpc-api", "reth-rpc-engine-api", "reth-rpc-eth-api", "reth-rpc-eth-types", "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "serde_json", "thiserror 2.0.16", @@ -9125,17 +9148,53 @@ dependencies = [ [[package]] name = "reth-optimism-storage" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db-api", "reth-node-api", - "reth-optimism-primitives", - "reth-primitives-traits", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-storage-api", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", +] + +[[package]] +name = "reth-optimism-txpool" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-serde", + "c-kzg", + "derive_more", + "futures-util", + "metrics", + "op-alloy-consensus 0.19.1", + "op-alloy-flz", + "op-alloy-rpc-types", + "op-revm", + "parking_lot", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "serde", + "thiserror 2.0.16", + "tokio", + "tracing", ] [[package]] @@ -9159,21 +9218,42 @@ dependencies = [ "op-alloy-rpc-types", "op-revm", "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-metrics", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-transaction-pool", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "serde", "thiserror 2.0.16", "tokio", "tracing", ] +[[package]] +name = "reth-payload-builder" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types", + "futures-util", + "metrics", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "tokio", + "tokio-stream", + "tracing", +] + [[package]] name = "reth-payload-builder" version = "1.7.0" @@ -9184,12 +9264,24 @@ dependencies = [ "alloy-rpc-types", "futures-util", "metrics", - "reth-chain-state", - "reth-ethereum-engine-primitives", - "reth-metrics", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-payload-builder-primitives" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "pin-project", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tokio", "tokio-stream", "tracing", @@ -9201,12 +9293,31 @@ version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "pin-project", - "reth-payload-primitives", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "tokio", "tokio-stream", "tracing", ] +[[package]] +name = "reth-payload-primitives" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "op-alloy-rpc-types-engine", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "serde", + "thiserror 2.0.16", + "tokio", +] + [[package]] name = "reth-payload-primitives" version = "1.7.0" @@ -9217,15 +9328,25 @@ dependencies = [ "alloy-rpc-types-engine", "auto_impl", "op-alloy-rpc-types-engine", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-primitives-traits", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "serde", "thiserror 2.0.16", "tokio", ] +[[package]] +name = "reth-payload-util" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", +] + [[package]] name = "reth-payload-util" version = "1.7.0" @@ -9233,7 +9354,17 @@ source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9 dependencies = [ "alloy-consensus", "alloy-primitives", - "reth-transaction-pool", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", +] + +[[package]] +name = "reth-payload-validator" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-consensus", + "alloy-rpc-types-engine", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", ] [[package]] @@ -9243,27 +9374,27 @@ source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9 dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", ] [[package]] name = "reth-primitives" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "c-kzg", "once_cell", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-static-file-types", + "reth-ethereum-forks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", ] [[package]] name = "reth-primitives-traits" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9283,7 +9414,7 @@ dependencies = [ "proptest", "proptest-arbitrary-interop", "rayon", - "reth-codecs", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm-bytecode", "revm-primitives", "revm-state", @@ -9294,9 +9425,36 @@ dependencies = [ ] [[package]] -name = "reth-provider" +name = "reth-primitives-traits" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-trie", + "auto_impl", + "bytes", + "derive_more", + "once_cell", + "op-alloy-consensus 0.19.1", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm-bytecode", + "revm-primitives", + "revm-state", + "secp256k1 0.30.0", + "serde", + "serde_with", + "thiserror 2.0.16", +] + +[[package]] +name = "reth-provider" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9309,27 +9467,27 @@ dependencies = [ "notify", "parking_lot", "rayon", - "reth-chain-state", - "reth-chainspec", - "reth-codecs", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db", "reth-db-api", - "reth-errors", - "reth-ethereum-engine-primitives", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-fs-util", - "reth-metrics", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-nippy-jar", "reth-node-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-static-file-types", - "reth-storage-api", - "reth-storage-errors", - "reth-trie", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-trie-db", "revm-database", "revm-state", @@ -9341,7 +9499,7 @@ dependencies = [ [[package]] name = "reth-prune" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9349,16 +9507,16 @@ dependencies = [ "itertools 0.14.0", "metrics", "rayon", - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-config", "reth-db-api", - "reth-errors", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-exex-types", - "reth-metrics", - "reth-primitives-traits", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-prune-types", - "reth-static-file-types", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tokio-util", "rustc-hash 2.1.1", "thiserror 2.0.16", @@ -9369,61 +9527,38 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "arbitrary", "derive_more", "modular-bitfield", - "reth-codecs", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "thiserror 2.0.16", ] [[package]] -name = "reth-ress-protocol" +name = "reth-prune-types" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ - "alloy-consensus", "alloy-primitives", - "alloy-rlp", - "futures", - "reth-eth-wire", - "reth-ethereum-primitives", - "reth-network", - "reth-network-api", - "reth-storage-errors", - "tokio", - "tokio-stream", - "tracing", + "derive_more", + "thiserror 2.0.16", ] [[package]] -name = "reth-ress-provider" +name = "reth-revm" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ - "alloy-consensus", "alloy-primitives", - "eyre", - "futures", - "parking_lot", - "reth-chain-state", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-node-api", - "reth-primitives-traits", - "reth-ress-protocol", - "reth-revm", - "reth-storage-api", - "reth-tasks", - "reth-tokio-util", - "reth-trie", - "schnellru", - "tokio", - "tracing", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "revm", ] [[package]] @@ -9432,17 +9567,17 @@ version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" dependencies = [ "alloy-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "revm", ] [[package]] name = "reth-rpc" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9477,32 +9612,32 @@ dependencies = [ "jsonwebtoken", "parking_lot", "pin-project", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-engine-primitives", - "reth-errors", - "reth-evm", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-evm-ethereum", - "reth-execution-types", - "reth-metrics", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-api", - "reth-network-peers", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-types", "reth-node-api", - "reth-primitives-traits", - "reth-revm", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-api", "reth-rpc-convert", "reth-rpc-engine-api", "reth-rpc-eth-api", "reth-rpc-eth-types", "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie-common", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "revm-inspectors", "revm-primitives", @@ -9520,7 +9655,7 @@ dependencies = [ [[package]] name = "reth-rpc-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-genesis", @@ -9538,17 +9673,17 @@ dependencies = [ "alloy-rpc-types-txpool", "alloy-serde", "jsonrpsee 0.26.0", - "reth-chain-state", - "reth-engine-primitives", - "reth-network-peers", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-network-peers 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-eth-api", - "reth-trie-common", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", ] [[package]] name = "reth-rpc-builder" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-network", "alloy-provider", @@ -9556,24 +9691,24 @@ dependencies = [ "jsonrpsee 0.26.0", "metrics", "pin-project", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-evm", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-ipc", - "reth-metrics", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-api", "reth-node-core", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc", "reth-rpc-api", "reth-rpc-eth-api", "reth-rpc-eth-types", - "reth-rpc-layer", + "reth-rpc-layer 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "thiserror 2.0.16", "tokio", @@ -9586,7 +9721,7 @@ dependencies = [ [[package]] name = "reth-rpc-convert" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-json-rpc", @@ -9599,11 +9734,11 @@ dependencies = [ "op-alloy-network", "op-alloy-rpc-types", "op-revm", - "reth-ethereum-primitives", - "reth-evm", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-optimism-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm-context", "thiserror 2.0.16", ] @@ -9611,7 +9746,7 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9621,17 +9756,17 @@ dependencies = [ "jsonrpsee-types 0.26.0", "metrics", "parking_lot", - "reth-chainspec", - "reth-engine-primitives", - "reth-metrics", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-engine-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-builder-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-payload-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-api", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", "thiserror 2.0.16", "tokio", @@ -9641,7 +9776,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9661,21 +9796,21 @@ dependencies = [ "jsonrpsee 0.26.0", "jsonrpsee-types 0.26.0", "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-evm", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-api", "reth-node-api", - "reth-primitives-traits", - "reth-revm", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-convert", "reth-rpc-eth-types", "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie-common", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "revm-inspectors", "tokio", @@ -9685,7 +9820,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9704,21 +9839,21 @@ dependencies = [ "metrics", "rand 0.9.2", "reqwest", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-revm", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-rpc-convert", "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-transaction-pool 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm", "revm-inspectors", "schnellru", @@ -9729,6 +9864,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-rpc-layer" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-rpc-types-engine", + "http", + "jsonrpsee-http-client 0.26.0", + "pin-project", + "tower 0.5.2", + "tower-http", + "tracing", +] + [[package]] name = "reth-rpc-layer" version = "1.7.0" @@ -9746,14 +9895,14 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "jsonrpsee-core 0.26.0", "jsonrpsee-types 0.26.0", - "reth-errors", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-api", "serde", "strum 0.27.2", @@ -9762,7 +9911,7 @@ dependencies = [ [[package]] name = "reth-stages" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9774,32 +9923,32 @@ dependencies = [ "num-traits", "rayon", "reqwest", - "reth-chainspec", - "reth-codecs", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-config", - "reth-consensus", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db", "reth-db-api", "reth-era", "reth-era-downloader", "reth-era-utils", - "reth-ethereum-primitives", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-etl", - "reth-evm", - "reth-execution-types", + "reth-evm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-exex", - "reth-fs-util", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-p2p", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-prune", - "reth-prune-types", - "reth-revm", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-revm 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-stages-api", - "reth-static-file-types", - "reth-storage-errors", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-testing-utils", - "reth-trie", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-trie-db", "tempfile", "thiserror 2.0.16", @@ -9810,7 +9959,7 @@ dependencies = [ [[package]] name = "reth-stages-api" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9818,16 +9967,16 @@ dependencies = [ "auto_impl", "futures-util", "metrics", - "reth-consensus", - "reth-errors", - "reth-metrics", + "reth-consensus 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-network-p2p", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", "reth-prune", - "reth-stages-types", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-static-file", - "reth-static-file-types", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tokio-util", "thiserror 2.0.16", "tokio", @@ -9837,33 +9986,42 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "arbitrary", "bytes", "modular-bitfield", - "reth-codecs", - "reth-trie-common", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "serde", ] [[package]] -name = "reth-static-file" +name = "reth-stages-types" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-primitives", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", +] + +[[package]] +name = "reth-static-file" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "parking_lot", "rayon", - "reth-codecs", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db-api", - "reth-primitives-traits", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-prune-types", - "reth-stages-types", - "reth-static-file-types", - "reth-storage-errors", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-tokio-util", "tracing", ] @@ -9871,7 +10029,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "clap", @@ -9881,28 +10039,77 @@ dependencies = [ ] [[package]] -name = "reth-storage-api" +name = "reth-static-file-types" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-primitives", + "derive_more", + "serde", + "strum 0.27.2", +] + +[[package]] +name = "reth-storage-api" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", - "reth-chainspec", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-db-api", - "reth-db-models", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", + "reth-db-models 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "revm-database", +] + +[[package]] +name = "reth-storage-api" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-db-models 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "revm-database", ] +[[package]] +name = "reth-storage-errors" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "derive_more", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "revm-database-interface", + "thiserror 2.0.16", +] + [[package]] name = "reth-storage-errors" version = "1.7.0" @@ -9912,9 +10119,9 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more", - "reth-primitives-traits", - "reth-prune-types", - "reth-static-file-types", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-prune-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-static-file-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "revm-database-interface", "thiserror 2.0.16", ] @@ -9922,7 +10129,7 @@ dependencies = [ [[package]] name = "reth-tasks" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "auto_impl", "dyn-clone", @@ -9930,7 +10137,7 @@ dependencies = [ "metrics", "pin-project", "rayon", - "reth-metrics", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "thiserror 2.0.16", "tokio", "tracing", @@ -9938,9 +10145,25 @@ dependencies = [ ] [[package]] -name = "reth-testing-utils" +name = "reth-tasks" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "auto_impl", + "dyn-clone", + "futures-util", + "metrics", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "thiserror 2.0.16", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "reth-testing-utils" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9948,15 +10171,15 @@ dependencies = [ "alloy-primitives", "rand 0.8.5", "rand 0.9.2", - "reth-ethereum-primitives", - "reth-primitives-traits", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "secp256k1 0.30.0", ] [[package]] name = "reth-tokio-util" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "tokio", "tokio-stream", @@ -9966,7 +10189,7 @@ dependencies = [ [[package]] name = "reth-tracing" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "clap", "eyre", @@ -9981,7 +10204,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9996,16 +10219,16 @@ dependencies = [ "paste", "pin-project", "rand 0.9.2", - "reth-chain-state", - "reth-chainspec", - "reth-eth-wire-types", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-fs-util", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-eth-wire-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm-interpreter", "revm-primitives", "rustc-hash 2.1.1", @@ -10020,9 +10243,48 @@ dependencies = [ ] [[package]] -name = "reth-trie" +name = "reth-transaction-pool" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "aquamarine", + "auto_impl", + "bitflags 2.9.4", + "futures-util", + "metrics", + "parking_lot", + "pin-project", + "reth-chain-state 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-chainspec 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-eth-wire-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-ethereum-primitives 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-execution-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-fs-util 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-api 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-tasks 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm-interpreter", + "revm-primitives", + "rustc-hash 2.1.1", + "schnellru", + "serde", + "serde_json", + "smallvec", + "thiserror 2.0.16", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-trie" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10032,22 +10294,44 @@ dependencies = [ "auto_impl", "itertools 0.14.0", "metrics", - "reth-execution-errors", - "reth-metrics", - "reth-primitives-traits", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", - "reth-trie-sparse", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-sparse 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm-database", "tracing", "triehash", ] [[package]] -name = "reth-trie-common" +name = "reth-trie" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "auto_impl", + "itertools 0.14.0", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-stages-types 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-sparse 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm-database", + "tracing", +] + +[[package]] +name = "reth-trie-common" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10063,30 +10347,47 @@ dependencies = [ "nybbles", "plain_hasher", "rayon", - "reth-codecs", - "reth-primitives-traits", + "reth-codecs 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "revm-database", "serde", "serde_with", ] [[package]] -name = "reth-trie-db" +name = "reth-trie-common" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "derive_more", + "itertools 0.14.0", + "nybbles", + "rayon", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "revm-database", +] + +[[package]] +name = "reth-trie-db" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "reth-db-api", - "reth-execution-errors", - "reth-primitives-traits", - "reth-trie", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "tracing", ] [[package]] name = "reth-trie-parallel" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10095,14 +10396,14 @@ dependencies = [ "metrics", "rayon", "reth-db-api", - "reth-execution-errors", - "reth-metrics", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-provider", - "reth-storage-errors", - "reth-trie", - "reth-trie-common", + "reth-storage-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "reth-trie-db", - "reth-trie-sparse", + "reth-trie-sparse 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "thiserror 2.0.16", "tokio", "tracing", @@ -10111,7 +10412,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.7.0" -source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10119,32 +10420,56 @@ dependencies = [ "auto_impl", "metrics", "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-primitives-traits", - "reth-trie-common", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "smallvec", "tracing", ] [[package]] -name = "reth-trie-sparse-parallel" +name = "reth-trie-sparse" version = "1.7.0" source = "git+https://github.com/paradigmxyz/reth?rev=44a48ab#44a48ab9fd3cc4eea9b3b3b353766248ace23f41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "auto_impl", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-primitives-traits 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "smallvec", + "tracing", +] + +[[package]] +name = "reth-trie-sparse-parallel" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-trie", "metrics", "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-trie-common", - "reth-trie-sparse", + "reth-execution-errors 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-metrics 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-common 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", + "reth-trie-sparse 1.7.0 (git+https://github.com/paradigmxyz/reth?tag=v1.7.0)", "smallvec", "tracing", ] +[[package]] +name = "reth-zstd-compressors" +version = "1.7.0" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.7.0#9d56da53ec0ad60e229456a0c70b338501d923a5" +dependencies = [ + "zstd", +] + [[package]] name = "reth-zstd-compressors" version = "1.7.0" @@ -10292,8 +10617,6 @@ dependencies = [ "alloy-rpc-types-trace", "alloy-sol-types", "anstyle", - "boa_engine", - "boa_gc", "colorchoice", "revm", "serde", @@ -10490,7 +10813,7 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "jsonrpsee 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", + "jsonrpsee 0.25.1", "metrics", "metrics-derive", "metrics-exporter-prometheus", @@ -10506,8 +10829,8 @@ dependencies = [ "predicates", "rand 0.9.2", "reqwest", - "reth-optimism-payload-builder", - "reth-rpc-layer", + "reth-optimism-payload-builder 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", + "reth-rpc-layer 1.7.0 (git+https://github.com/paradigmxyz/reth?rev=44a48ab)", "rustls", "serde", "serde_json", @@ -10762,12 +11085,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "ryu-js" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" - [[package]] name = "same-file" version = "1.0.6" @@ -11297,12 +11614,6 @@ dependencies = [ "der", ] -[[package]] -name = "sptr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -11563,12 +11874,6 @@ dependencies = [ "url", ] -[[package]] -name = "thin-vec" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" - [[package]] name = "thiserror" version = "1.0.69" @@ -11627,37 +11932,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "tikv-jemalloc-ctl" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21f216790c8df74ce3ab25b534e0718da5a1916719771d3fec23315c99e468b" -dependencies = [ - "libc", - "paste", - "tikv-jemalloc-sys", -] - -[[package]] -name = "tikv-jemalloc-sys" -version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "tikv-jemallocator" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" -dependencies = [ - "libc", - "tikv-jemalloc-sys", -] - [[package]] name = "time" version = "0.3.43" @@ -11665,7 +11939,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "js-sys", "libc", "num-conv", "num_threads", @@ -11700,16 +11973,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec 0.10.4", -] - [[package]] name = "tinystr" version = "0.8.1" @@ -11717,7 +11980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", - "zerovec 0.11.4", + "zerovec", ] [[package]] @@ -12344,12 +12607,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -13266,18 +13523,6 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - [[package]] name = "writeable" version = "0.6.1" @@ -13328,18 +13573,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.7.5", - "zerofrom", -] - [[package]] name = "yoke" version = "0.8.0" @@ -13348,22 +13581,10 @@ checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", - "yoke-derive 0.8.0", + "yoke-derive", "zerofrom", ] -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", - "synstructure", -] - [[package]] name = "yoke-derive" version = "0.8.0" @@ -13444,19 +13665,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" dependencies = [ "displaydoc", - "yoke 0.8.0", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke 0.7.5", + "yoke", "zerofrom", - "zerovec-derive 0.10.3", ] [[package]] @@ -13465,20 +13675,9 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ - "yoke 0.8.0", + "yoke", "zerofrom", - "zerovec-derive 0.11.1", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "zerovec-derive", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4fef400b..50817aae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,10 @@ [workspace] resolver = "3" -members = [ - "crates/rollup-boost", - "crates/flashblocks-rpc", - "crates/flashblocks-p2p", - "crates/flashblocks-node", -] +members = ["crates/rollup-boost", "crates/flashblocks-rpc"] [workspace.dependencies] rollup-boost = { path = "crates/rollup-boost" } -flashblocks-p2p = { path = "crates/flashblocks-p2p" } flashblocks-rpc = { path = "crates/flashblocks-rpc" } tracing = "0.1.4" diff --git a/crates/flashblocks-node/Cargo.toml b/crates/flashblocks-node/Cargo.toml deleted file mode 100644 index 75aa5d70..00000000 --- a/crates/flashblocks-node/Cargo.toml +++ /dev/null @@ -1,66 +0,0 @@ -[package] -name = "flashblocks-node" -version = "0.1.0" -edition = "2024" -license = "MIT" - -[dependencies] -rollup-boost.workspace = true -flashblocks-p2p.workspace = true -flashblocks-rpc.workspace = true - -reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab", features = [ - "test-utils", -] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } - -reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } -reth-eth-wire = { workspace = true } -reth-network = { workspace = true } -reth-network-peers = { workspace = true } -ed25519-dalek = { version = "2", features = ["serde"] } - -alloy-eips.workspace = true -alloy-primitives.workspace = true -alloy-json-rpc.workspace = true -alloy-rpc-types.workspace = true -alloy-rpc-types-engine.workspace = true -alloy-rpc-types-eth.workspace = true -alloy-consensus.workspace = true -alloy-genesis.workspace = true -alloy-rpc-client.workspace = true -alloy-provider.workspace = true -op-alloy-network.workspace = true -op-alloy-consensus.workspace = true -op-alloy-rpc-types.workspace = true - -tokio.workspace = true -tokio-tungstenite.workspace = true -url.workspace = true -tracing.workspace = true -clap.workspace = true -eyre.workspace = true -metrics.workspace = true -metrics-derive.workspace = true -serde_json.workspace = true -serde.workspace = true - -jsonrpsee = { version = "0.25.1" } -futures-util = "0.3.31" -brotli = "8.0.1" diff --git a/crates/flashblocks-node/src/lib.rs b/crates/flashblocks-node/src/lib.rs deleted file mode 100644 index bf5e7730..00000000 --- a/crates/flashblocks-node/src/lib.rs +++ /dev/null @@ -1,19 +0,0 @@ -use clap::Args; -use ed25519_dalek::VerifyingKey; -use rollup_boost::parse_vk; - -#[derive(Args, Clone, Debug)] -#[group(requires = "flashblocks")] -pub struct FlashblocksNodeArgs { - /// Enable Flashblocks client - #[arg(long, env, required = false)] - pub flashblocks: bool, - - #[arg( - long = "flashblocks.authorizor_vk", - env = "FLASHBLOCKS_AUTHORIZOR_VK", - value_parser = parse_vk, - required = false, - )] - pub authorizor_vk: VerifyingKey, -} diff --git a/crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock b/crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock deleted file mode 100644 index 09228825..00000000 --- a/crates/flashblocks-node/target/rust-analyzer/metadata/sysroot/Cargo.lock +++ /dev/null @@ -1,480 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9acbfca36652500c911ddb767ed433e3ed99b032b5d935be73c6923662db1d43" -dependencies = [ - "gimli", - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -dependencies = [ - "rustc-std-workspace-core", -] - -[[package]] -name = "alloc" -version = "0.0.0" -dependencies = [ - "compiler_builtins", - "core", -] - -[[package]] -name = "alloctests" -version = "0.0.0" -dependencies = [ - "rand", - "rand_xorshift", -] - -[[package]] -name = "cc" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aeb932158bd710538c73702db6945cb68a8fb08c519e6e12706b94263b36db8" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" -dependencies = [ - "rustc-std-workspace-core", -] - -[[package]] -name = "compiler_builtins" -version = "0.1.160" -dependencies = [ - "cc", - "core", -] - -[[package]] -name = "core" -version = "0.0.0" - -[[package]] -name = "coretests" -version = "0.0.0" -dependencies = [ - "rand", - "rand_xorshift", -] - -[[package]] -name = "dlmalloc" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa3a2dbee57b69fbb5dbe852fa9c0925697fb0c7fbcb1593e90e5ffaedf13d51" -dependencies = [ - "cfg-if", - "libc", - "rustc-std-workspace-core", - "windows-sys", -] - -[[package]] -name = "fortanix-sgx-abi" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efc85edd5b83e8394f4371dd0da6859dff63dd387dab8568fece6af4cde6f84" -dependencies = [ - "rustc-std-workspace-core", -] - -[[package]] -name = "getopts" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" -dependencies = [ - "rustc-std-workspace-core", - "rustc-std-workspace-std", - "unicode-width", -] - -[[package]] -name = "gimli" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93563d740bc9ef04104f9ed6f86f1e3275c2cdafb95664e26584b9ca807a8ffe" -dependencies = [ - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", -] - -[[package]] -name = "hashbrown" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" -dependencies = [ - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", -] - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" -dependencies = [ - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", -] - -[[package]] -name = "libc" -version = "0.2.174" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" -dependencies = [ - "rustc-std-workspace-core", -] - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" -dependencies = [ - "rustc-std-workspace-core", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", -] - -[[package]] -name = "object" -version = "0.37.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e3d0a7419f081f4a808147e845310313a39f322d7ae1f996b7f001d6cbed04" -dependencies = [ - "memchr", - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", -] - -[[package]] -name = "panic_abort" -version = "0.0.0" -dependencies = [ - "alloc", - "libc", - "rustc-std-workspace-core", -] - -[[package]] -name = "panic_unwind" -version = "0.0.0" -dependencies = [ - "alloc", - "cfg-if", - "libc", - "rustc-std-workspace-core", - "unwind", -] - -[[package]] -name = "proc_macro" -version = "0.0.0" -dependencies = [ - "core", - "rustc-literal-escaper", - "std", -] - -[[package]] -name = "profiler_builtins" -version = "0.0.0" -dependencies = [ - "cc", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -dependencies = [ - "rustc-std-workspace-core", -] - -[[package]] -name = "r-efi-alloc" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2f58ef3ca9bb0f9c44d9aa8537601bcd3df94cc9314a40178cadf7d4466354" -dependencies = [ - "r-efi", - "rustc-std-workspace-core", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" - -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" -dependencies = [ - "rustc-std-workspace-core", -] - -[[package]] -name = "rustc-literal-escaper" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b" -dependencies = [ - "rustc-std-workspace-core", - "rustc-std-workspace-std", -] - -[[package]] -name = "rustc-std-workspace-alloc" -version = "1.99.0" -dependencies = [ - "alloc", -] - -[[package]] -name = "rustc-std-workspace-core" -version = "1.99.0" -dependencies = [ - "compiler_builtins", - "core", -] - -[[package]] -name = "rustc-std-workspace-std" -version = "1.99.0" -dependencies = [ - "std", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "std" -version = "0.0.0" -dependencies = [ - "addr2line", - "alloc", - "cfg-if", - "core", - "dlmalloc", - "fortanix-sgx-abi", - "hashbrown", - "hermit-abi", - "libc", - "miniz_oxide", - "object", - "panic_abort", - "panic_unwind", - "r-efi", - "r-efi-alloc", - "rand", - "rand_xorshift", - "rustc-demangle", - "std_detect", - "unwind", - "wasi", - "windows-targets 0.0.0", -] - -[[package]] -name = "std_detect" -version = "0.1.5" -dependencies = [ - "alloc", - "cfg-if", - "core", - "libc", -] - -[[package]] -name = "sysroot" -version = "0.0.0" -dependencies = [ - "proc_macro", - "profiler_builtins", - "std", - "test", -] - -[[package]] -name = "test" -version = "0.0.0" -dependencies = [ - "core", - "getopts", - "libc", - "std", -] - -[[package]] -name = "unicode-width" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" -dependencies = [ - "rustc-std-workspace-core", - "rustc-std-workspace-std", -] - -[[package]] -name = "unwind" -version = "0.0.0" -dependencies = [ - "cfg-if", - "libc", - "rustc-std-workspace-core", - "unwinding", -] - -[[package]] -name = "unwinding" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60612c845ef41699f39dc8c5391f252942c0a88b7d15da672eff0d14101bbd6d" -dependencies = [ - "gimli", - "rustc-std-workspace-core", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -dependencies = [ - "rustc-std-workspace-alloc", - "rustc-std-workspace-core", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.0.0" - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock b/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock deleted file mode 100644 index 7db8c4fd..00000000 --- a/crates/flashblocks-node/target/rust-analyzer/metadata/workspace/Cargo.lock +++ /dev/null @@ -1,13607 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.3", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy-chains" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4195a29a4b87137b2bb02105e746102873bc03561805cf45c0e510c961f160e6" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "num_enum", - "serde", - "strum 0.27.2", -] - -[[package]] -name = "alloy-consensus" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda689f7287f15bd3582daba6be8d1545bad3740fd1fb778f629a1fe866bb43b" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "alloy-tx-macros", - "arbitrary", - "auto_impl", - "c-kzg", - "derive_more", - "either", - "k256", - "once_cell", - "rand 0.8.5", - "secp256k1 0.30.0", - "serde", - "serde_with", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-consensus-any" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5659581e41e8fe350ecc3593cb5c9dcffddfd550896390f2b78a07af67b0fa" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "arbitrary", - "serde", -] - -[[package]] -name = "alloy-dyn-abi" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e8a436f0aad7df8bb47f144095fba61202265d9f5f09a70b0e3227881a668e" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "derive_more", - "itoa", - "serde", - "serde_json", - "winnow", -] - -[[package]] -name = "alloy-eip2124" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "crc", - "rand 0.8.5", - "serde", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-eip2930" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "rand 0.8.5", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "k256", - "rand 0.8.5", - "serde", - "serde_with", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-eips" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f35887da30b5fc50267109a3c61cd63e6ca1f45967983641053a40ee83468c1" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "arbitrary", - "auto_impl", - "c-kzg", - "derive_more", - "either", - "ethereum_ssz", - "ethereum_ssz_derive", - "serde", - "sha2 0.10.9", -] - -[[package]] -name = "alloy-evm" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145913bf9bc11a7cec63a61aba36a39e41f2604aceb6d81b6bb8a4b2ddc93423" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-hardforks", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-sol-types", - "auto_impl", - "derive_more", - "op-alloy-consensus 0.18.14", - "op-revm", - "revm", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-genesis" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d4009efea6f403b3a80531f9c6f70fc242399498ff71196a1688cc1c901f44" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "alloy-trie", - "serde", - "serde_with", -] - -[[package]] -name = "alloy-hardforks" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165210652f71dfc094b051602bafd691f506c54050a174b1cba18fb5ef706a3" -dependencies = [ - "alloy-chains", - "alloy-eip2124", - "alloy-primitives", - "auto_impl", - "dyn-clone", - "serde", -] - -[[package]] -name = "alloy-json-abi" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459f98c6843f208856f338bfb25e65325467f7aff35dfeb0484d0a76e059134b" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883dee3b4020fcb5667ee627b4f401e899dad82bf37b246620339dd980720ed9" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "http", - "serde", - "serde_json", - "thiserror 2.0.14", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6e5b8ac1654a05c224390008e43634a2bdc74e181e02cf8ed591d8b3d4ad08" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "derive_more", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-network-primitives" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7980333dd9391719756ac28bc2afa9baa705fc70ffd11dc86ab078dd64477" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-op-evm" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bcba6845a173265afed23c1ac3f1ff072662a9f09d33ec968989d12e2cb73e" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-op-hardforks", - "alloy-primitives", - "auto_impl", - "op-alloy-consensus 0.18.14", - "op-revm", - "revm", -] - -[[package]] -name = "alloy-op-hardforks" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3417f4187eaf7f7fb0d7556f0197bca26f0b23c4bb3aca0c9d566dc1c5d727a2" -dependencies = [ - "alloy-chains", - "alloy-hardforks", - "auto_impl", -] - -[[package]] -name = "alloy-primitives" -version = "1.3.0" -source = "git+https://github.com/alloy-rs/core?rev=8c5713c#8c5713c20e3ed08cf09634ea5cb696d7021002a8" -dependencies = [ - "alloy-rlp", - "arbitrary", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "foldhash", - "getrandom 0.3.3", - "hashbrown 0.15.5", - "indexmap 2.10.0", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "proptest-derive", - "rand 0.9.2", - "ruint", - "rustc-hash 2.1.1", - "serde", - "sha3", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478a42fe167057b7b919cd8b0c2844f0247f667473340dad100eaf969de5754e" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-signer", - "alloy-sol-types", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "async-stream", - "async-trait", - "auto_impl", - "dashmap 6.1.0", - "either", - "futures", - "futures-utils-wasm", - "lru 0.13.0", - "parking_lot", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-pubsub" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a99b17987f40a066b29b6b56d75e84cd193b866cac27cae17b59f40338de95" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "auto_impl", - "bimap", - "futures", - "parking_lot", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower 0.5.2", - "tracing", - "wasmtimer", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "alloy-rpc-client" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0c6d723fbdf4a87454e2e3a275e161be27edcfbf46e2e3255dd66c138634b6" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-pubsub", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower 0.5.2", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41492dac39365b86a954de86c47ec23dcc7452cdb2fde591caadc194b3e34c6" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-admin" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0f415ad97cc68d2f49eb08214f45c6827a6932a69773594f4ce178f8a41dc0" -dependencies = [ - "alloy-genesis", - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-rpc-types-anvil" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10493fa300a2757d8134f584800fef545c15905c95122bed1f6dde0b0d9dae27" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f7eb22670a972ad6c222a6c6dac3eef905579acffe9d63ab42be24c7d158535" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-beacon" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53381ffba0110a8aed4c9f108ef34a382ed21aeefb5f50f91c73451ae68b89aa" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "ethereum_ssz", - "ethereum_ssz_derive", - "serde", - "serde_with", - "thiserror 2.0.14", - "tree_hash", - "tree_hash_derive", -] - -[[package]] -name = "alloy-rpc-types-debug" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b6f0482c82310366ec3dcf4e5212242f256a69fcf1a26e5017e6704091ee95" -dependencies = [ - "alloy-primitives", - "derive_more", - "serde", -] - -[[package]] -name = "alloy-rpc-types-engine" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24c171377c0684e3860385f6d93fbfcc8ecc74f6cce8304c822bf1a50bacce0" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "derive_more", - "ethereum_ssz", - "ethereum_ssz_derive", - "jsonwebtoken", - "rand 0.8.5", - "serde", - "strum 0.27.2", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b777b98526bbe5b7892ca22a7fd5f18ed624ff664a79f40d0f9f2bf94ba79a84" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "arbitrary", - "itertools 0.14.0", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-rpc-types-mev" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15e8ccb6c16e196fcc968e16a71cd8ce4160f3ec5871d2ea196b75bf569ac02" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-rpc-types-trace" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a854af3fe8fce1cfe319fcf84ee8ba8cda352b14d3dd4221405b5fc6cce9e1" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-rpc-types-txpool" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc803e9b8d16154c856a738c376e002abe4b388e5fef91c8aebc8373e99fd45" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-serde" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8d2c52adebf3e6494976c8542fbdf12f10123b26e11ad56f77274c16a2a039" -dependencies = [ - "alloy-primitives", - "arbitrary", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0494d1e0f802716480aabbe25549c7f6bc2a25ff33b08fd332bbb4b7d06894" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "either", - "elliptic-curve", - "k256", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-signer-local" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c2435eb8979a020763ced3fb478932071c56e5f75ea86db41f320915d325ba" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand 0.8.5", - "thiserror 2.0.14", -] - -[[package]] -name = "alloy-sol-macro" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedac07a10d4c2027817a43cc1f038313fc53c7ac866f7363239971fd01f9f18" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f9a598f010f048d8b8226492b6401104f5a5c1273c2869b72af29b48bb4ba9" -dependencies = [ - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.10.0", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.105", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f494adf9d60e49aa6ce26dfd42c7417aa6d4343cf2ae621f20e4d92a5ad07d85" -dependencies = [ - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "syn 2.0.105", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52db32fbd35a9c0c0e538b58b81ebbae08a51be029e7ad60e08b60481c2ec6c3" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a285b46e3e0c177887028278f04cc8262b76fd3b8e0e20e93cea0a58c35f5ac5" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0107675e10c7f248bf7273c1e7fdb02409a717269cc744012e6f3c39959bfb" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "auto_impl", - "base64 0.22.1", - "derive_more", - "futures", - "futures-utils-wasm", - "parking_lot", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tower 0.5.2", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78e3736701b5433afd06eecff08f0688a71a10e0e1352e0bbf0bed72f0dd4e35" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest", - "serde_json", - "tower 0.5.2", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-ipc" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79064b5a08259581cb5614580010007c2df6deab1e8f3e8c7af8d7e9227008f" -dependencies = [ - "alloy-json-rpc", - "alloy-pubsub", - "alloy-transport", - "bytes", - "futures", - "interprocess", - "pin-project", - "serde", - "serde_json", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "alloy-transport-ws" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd607158cb9bc54cbcfcaab4c5f36c5b26994c7dc58b6f095ce27a54f270f3" -dependencies = [ - "alloy-pubsub", - "alloy-transport", - "futures", - "http", - "rustls", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "ws_stream_wasm", -] - -[[package]] -name = "alloy-trie" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bada1fc392a33665de0dc50d401a3701b62583c655e3522a323490a5da016962" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "arrayvec", - "derive_arbitrary", - "derive_more", - "nybbles", - "proptest", - "proptest-derive", - "serde", - "smallvec", - "tracing", -] - -[[package]] -name = "alloy-tx-macros" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6acb36318dfa50817154064fea7932adf2eec3f51c86680e2b37d7e8906c66bb" -dependencies = [ - "alloy-primitives", - "darling", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" - -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" -dependencies = [ - "windows-sys 0.60.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.60.2", -] - -[[package]] -name = "anyhow" -version = "1.0.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" - -[[package]] -name = "aquamarine" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" -dependencies = [ - "include_dir", - "itertools 0.10.5", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.105", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.5", -] - -[[package]] -name = "ark-r1cs-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-relations", - "ark-std 0.5.0", - "educe", - "num-bigint", - "num-integer", - "num-traits", - "tracing", -] - -[[package]] -name = "ark-relations" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" -dependencies = [ - "ark-ff 0.5.0", - "ark-std 0.5.0", - "tracing", - "tracing-subscriber 0.2.25", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "asn1_der" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" - -[[package]] -name = "assert_cmd" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" -dependencies = [ - "anstyle", - "bstr", - "doc-comment", - "libc", - "predicates", - "predicates-core", - "predicates-tree", - "wait-timeout", -] - -[[package]] -name = "async-compression" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" -dependencies = [ - "brotli", - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", - "zstd", - "zstd-safe", -] - -[[package]] -name = "async-lock" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.1", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "aurora-engine-modexp" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518bc5745a6264b5fd7b09dffb9667e400ee9e2bbe18555fac75e1fe9afa0df9" -dependencies = [ - "hex", - "num", -] - -[[package]] -name = "auto_impl" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "aws-lc-rs" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" -dependencies = [ - "bindgen 0.69.5", - "cc", - "cmake", - "dunce", - "fs_extra", -] - -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core 0.4.5", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" -dependencies = [ - "axum-core 0.5.2", - "base64 0.22.1", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit 0.8.4", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sha1", - "sync_wrapper", - "tokio", - "tokio-tungstenite", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "az" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" - -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "getrandom 0.2.16", - "instant", - "rand 0.8.5", -] - -[[package]] -name = "backon" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" -dependencies = [ - "fastrand", - "tokio", -] - -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" - -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.105", - "which", -] - -[[package]] -name = "bindgen" -version = "0.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.105", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitcoin-io" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" - -[[package]] -name = "bitcoin_hashes" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" -dependencies = [ - "bitcoin-io", - "hex-conservative", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" -dependencies = [ - "serde", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "serde", - "tap", - "wyz", -] - -[[package]] -name = "blake3" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "boa_ast" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" -dependencies = [ - "bitflags 2.9.1", - "boa_interner", - "boa_macros", - "boa_string", - "indexmap 2.10.0", - "num-bigint", - "rustc-hash 2.1.1", -] - -[[package]] -name = "boa_engine" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" -dependencies = [ - "arrayvec", - "bitflags 2.9.1", - "boa_ast", - "boa_gc", - "boa_interner", - "boa_macros", - "boa_parser", - "boa_profiler", - "boa_string", - "bytemuck", - "cfg-if", - "dashmap 6.1.0", - "fast-float2", - "hashbrown 0.15.5", - "icu_normalizer 1.5.0", - "indexmap 2.10.0", - "intrusive-collections", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "num_enum", - "once_cell", - "pollster", - "portable-atomic", - "rand 0.8.5", - "regress", - "rustc-hash 2.1.1", - "ryu-js", - "serde", - "serde_json", - "sptr", - "static_assertions", - "tap", - "thin-vec", - "thiserror 2.0.14", - "time", -] - -[[package]] -name = "boa_gc" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2425c0b7720d42d73eaa6a883fbb77a5c920da8694964a3d79a67597ac55cce2" -dependencies = [ - "boa_macros", - "boa_profiler", - "boa_string", - "hashbrown 0.15.5", - "thin-vec", -] - -[[package]] -name = "boa_interner" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42407a3b724cfaecde8f7d4af566df4b56af32a2f11f0956f5570bb974e7f749" -dependencies = [ - "boa_gc", - "boa_macros", - "hashbrown 0.15.5", - "indexmap 2.10.0", - "once_cell", - "phf", - "rustc-hash 2.1.1", - "static_assertions", -] - -[[package]] -name = "boa_macros" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", - "synstructure", -] - -[[package]] -name = "boa_parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" -dependencies = [ - "bitflags 2.9.1", - "boa_ast", - "boa_interner", - "boa_macros", - "boa_profiler", - "fast-float2", - "icu_properties 1.5.1", - "num-bigint", - "num-traits", - "regress", - "rustc-hash 2.1.1", -] - -[[package]] -name = "boa_profiler" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4064908e7cdf9b6317179e9b04dcb27f1510c1c144aeab4d0394014f37a0f922" - -[[package]] -name = "boa_string" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7debc13fbf7997bf38bf8e9b20f1ad5e2a7d27a900e1f6039fe244ce30f589b5" -dependencies = [ - "fast-float2", - "paste", - "rustc-hash 2.1.1", - "sptr", - "static_assertions", -] - -[[package]] -name = "bollard" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ccca1260af6a459d75994ad5acc1651bcabcbdbc41467cc9786519ab854c30" -dependencies = [ - "base64 0.22.1", - "bollard-stubs", - "bytes", - "futures-core", - "futures-util", - "hex", - "home", - "http", - "http-body-util", - "hyper", - "hyper-named-pipe", - "hyper-rustls", - "hyper-util", - "hyperlocal", - "log", - "pin-project-lite", - "rustls", - "rustls-native-certs", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_derive", - "serde_json", - "serde_repr", - "serde_urlencoded", - "thiserror 2.0.14", - "tokio", - "tokio-util", - "tower-service", - "url", - "winapi", -] - -[[package]] -name = "bollard-stubs" -version = "1.47.1-rc.27.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f179cfbddb6e77a5472703d4b30436bff32929c0aa8a9008ecf23d1d3cdd0da" -dependencies = [ - "serde", - "serde_repr", - "serde_with", -] - -[[package]] -name = "boyer-moore-magiclen" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e6233f2d926b5b123caf9d58e3885885255567fbe7776a7fdcae2a4d7241c4" -dependencies = [ - "debug-helper", -] - -[[package]] -name = "brotli" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bstr" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" -dependencies = [ - "memchr", - "regex-automata 0.4.9", - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "bytecount" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" - -[[package]] -name = "bytemuck" -version = "1.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" -dependencies = [ - "arbitrary", - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "camino" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d07aa9a93b00c76f71bc35d598bed923f6d4f3a9ca5c24b7737ae1a292841c0" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "cassowary" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" - -[[package]] -name = "castaway" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" -dependencies = [ - "rustversion", -] - -[[package]] -name = "cc" -version = "1.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.5.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "clap_lex" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" - -[[package]] -name = "cmake" -version = "0.1.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" -dependencies = [ - "cc", -] - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "comfy-table" -version = "7.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" -dependencies = [ - "crossterm", - "unicode-segmentation", - "unicode-width 0.2.0", -] - -[[package]] -name = "compact_str" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] - -[[package]] -name = "concat-kdf" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d72c1252426a83be2092dd5884a5f6e3b8e7180f6891b6263d2c21b92ec8816" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-hex" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "convert_case" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crossterm" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" -dependencies = [ - "bitflags 2.9.1", - "crossterm_winapi", - "mio", - "parking_lot", - "rustix 0.38.44", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctor" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" -dependencies = [ - "ctor-proc-macro", - "dtor", -] - -[[package]] -name = "ctor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version 0.4.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.105", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "data-encoding-macro" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" -dependencies = [ - "data-encoding", - "data-encoding-macro-internal", -] - -[[package]] -name = "data-encoding-macro-internal" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" -dependencies = [ - "data-encoding", - "syn 2.0.105", -] - -[[package]] -name = "debug-helper" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" - -[[package]] -name = "delay_map" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88e365f083a5cb5972d50ce8b1b2c9f125dc5ec0f50c0248cfb568ae59efcf0b" -dependencies = [ - "futures", - "tokio", - "tokio-util", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive-where" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "derive_arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.105", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.105", - "unicode-xid", -] - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.2", - "windows-sys 0.60.2", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users 0.4.6", - "winapi", -] - -[[package]] -name = "discv5" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b4e7798d2ff74e29cee344dc490af947ae657d6ab5273dde35d58ce06a4d71" -dependencies = [ - "aes", - "aes-gcm", - "alloy-rlp", - "arrayvec", - "ctr", - "delay_map", - "enr", - "fnv", - "futures", - "hashlink", - "hex", - "hkdf", - "lazy_static", - "libp2p-identity", - "lru 0.12.5", - "more-asserts", - "multiaddr", - "parking_lot", - "rand 0.8.5", - "smallvec", - "socket2 0.5.10", - "tokio", - "tracing", - "uint 0.10.0", - "zeroize", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "docker_credential" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d89dfcba45b4afad7450a99b39e751590463e45c04728cf555d36bb66940de8" -dependencies = [ - "base64 0.21.7", - "serde", - "serde_json", -] - -[[package]] -name = "doctest-file" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dtor" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "serdect", - "signature", - "spki", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "serde", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", - "serde", - "sha2 0.10.9", - "subtle", - "zeroize", -] - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "endian-type" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" - -[[package]] -name = "enr" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851bd664a3d3a3c175cff92b2f0df02df3c541b4895d0ae307611827aae46152" -dependencies = [ - "alloy-rlp", - "base64 0.22.1", - "bytes", - "ed25519-dalek", - "hex", - "k256", - "log", - "rand 0.8.5", - "secp256k1 0.30.0", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "version_check", -] - -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "ethereum_hashing" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c853bd72c9e5787f8aafc3df2907c2ed03cff3150c3acd94e2e53a98ab70a8ab" -dependencies = [ - "cpufeatures", - "ring", - "sha2 0.10.9", -] - -[[package]] -name = "ethereum_serde_utils" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc1355dbb41fbbd34ec28d4fb2a57d9a70c67ac3c19f6a5ca4d4a176b9e997a" -dependencies = [ - "alloy-primitives", - "hex", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "ethereum_ssz" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca8ba45b63c389c6e115b095ca16381534fdcc03cf58176a3f8554db2dbe19b" -dependencies = [ - "alloy-primitives", - "ethereum_serde_utils", - "itertools 0.13.0", - "serde", - "serde_derive", - "smallvec", - "typenum", -] - -[[package]] -name = "ethereum_ssz_derive" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd55d08012b4e0dfcc92b8d6081234df65f2986ad34cc76eeed69c5e2ce7506" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[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", - "pin-project-lite", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fast-float2" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fdlimit" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" -dependencies = [ - "libc", - "thiserror 1.0.69", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "flashblocks-node" -version = "0.1.0" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-json-rpc", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "brotli", - "clap", - "ed25519-dalek", - "eyre", - "flashblocks-p2p", - "flashblocks-rpc", - "futures-util", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "metrics-derive", - "op-alloy-consensus 0.18.14", - "op-alloy-network", - "op-alloy-rpc-types", - "reth-db", - "reth-eth-wire", - "reth-ethereum", - "reth-network", - "reth-network-peers", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-cli", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-node", - "reth-optimism-primitives", - "reth-optimism-rpc", - "reth-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-rpc-eth-api", - "reth-rpc-server-types", - "reth-tasks", - "reth-tracing", - "rollup-boost", - "serde", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "url", -] - -[[package]] -name = "flashblocks-p2p" -version = "0.1.0" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "blake3", - "clap", - "ed25519-dalek", - "eyre", - "futures", - "metrics", - "parking_lot", - "reth", - "reth-eth-wire", - "reth-ethereum", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-op", - "reth-optimism-primitives", - "reth-provider", - "reth-transaction-pool", - "rollup-boost", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "flashblocks-rpc" -version = "0.1.0" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-json-rpc", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "brotli", - "clap", - "ed25519-dalek", - "eyre", - "flashblocks-p2p", - "futures-util", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "metrics-derive", - "op-alloy-consensus 0.18.14", - "op-alloy-network", - "op-alloy-rpc-types", - "reth-db", - "reth-eth-wire", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-optimism-rpc", - "reth-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-rpc-eth-api", - "reth-rpc-server-types", - "reth-tasks", - "reth-tracing", - "rollup-boost", - "serde", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "url", -] - -[[package]] -name = "flashblocks-websocket-proxy" -version = "0.1.0" -dependencies = [ - "axum 0.8.4", - "backoff", - "brotli", - "clap", - "dotenvy", - "eyre", - "futures", - "hostname", - "http", - "metrics", - "metrics-derive", - "metrics-exporter-prometheus 0.17.2", - "redis", - "reqwest", - "serde_json", - "testcontainers", - "testcontainers-modules", - "thiserror 2.0.14", - "tokio", - "tokio-tungstenite", - "tokio-util", - "tracing", - "tracing-subscriber 0.3.19", - "uuid", -] - -[[package]] -name = "flate2" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" -dependencies = [ - "num-traits", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "generator" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows 0.61.3", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "serde", - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", - "wasm-bindgen", -] - -[[package]] -name = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "git2" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" -dependencies = [ - "bitflags 2.9.1", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gmp-mpfr-sys" -version = "1.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d61197a68f6323b9afa616cf83d55d69191e1bf364d4eb7d35ae18defe776" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.10.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hash-db" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", -] - -[[package]] -name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "hdrhistogram" -version = "7.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" -dependencies = [ - "byteorder", - "num-traits", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-conservative" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "hickory-proto" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna", - "ipnet", - "once_cell", - "rand 0.9.2", - "ring", - "serde", - "thiserror 2.0.14", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "hickory-resolver" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "moka", - "once_cell", - "parking_lot", - "rand 0.9.2", - "resolv-conf", - "serde", - "smallvec", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "hostname" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" -dependencies = [ - "cfg-if", - "libc", - "windows-link", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "http-range-header" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "human_bytes" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" - -[[package]] -name = "humantime" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" - -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime", - "serde", -] - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-named-pipe" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" -dependencies = [ - "hex", - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", - "winapi", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "log", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.2", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.6.0", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "hyperlocal" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" -dependencies = [ - "hex", - "http-body-util", - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.61.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke 0.8.0", - "zerofrom", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap 0.8.0", - "tinystr 0.8.1", - "writeable 0.6.1", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap 0.7.5", - "tinystr 0.7.6", - "writeable 0.5.5", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections 1.5.0", - "icu_normalizer_data 1.5.1", - "icu_properties 1.5.1", - "icu_provider 1.5.0", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections 2.0.0", - "icu_normalizer_data 2.0.0", - "icu_properties 2.0.1", - "icu_provider 2.0.0", - "smallvec", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections 1.5.0", - "icu_locid_transform", - "icu_properties_data 1.5.1", - "icu_provider 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections 2.0.0", - "icu_locale_core", - "icu_properties_data 2.0.1", - "icu_provider 2.0.0", - "potential_utf", - "zerotrie", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr 0.7.6", - "writeable 0.5.5", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr 0.8.1", - "writeable 0.6.1", - "yoke 0.8.0", - "zerofrom", - "zerotrie", - "zerovec 0.11.4", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer 2.0.0", - "icu_properties 2.0.1", -] - -[[package]] -name = "if-addrs" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b2eeee38fef3aa9b4cc5f1beea8a2444fc00e7377cafae396de3f5c2065e24" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "include_dir" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "indenter" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" -dependencies = [ - "arbitrary", - "equivalent", - "hashbrown 0.15.5", - "serde", -] - -[[package]] -name = "indoc" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" - -[[package]] -name = "inotify" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" -dependencies = [ - "bitflags 2.9.1", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instability" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" -dependencies = [ - "darling", - "indoc", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "interprocess" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - -[[package]] -name = "intrusive-collections" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" -dependencies = [ - "memoffset", -] - -[[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "libc", -] - -[[package]] -name = "ipconfig" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" -dependencies = [ - "socket2 0.5.10", - "widestring", - "windows-sys 0.48.0", - "winreg", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom 0.3.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jsonrpsee" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" -dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-http-client 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-proc-macros 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-server 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-wasm-client", - "jsonrpsee-ws-client", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" -dependencies = [ - "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-http-client 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-proc-macros 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-server 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a320a3f1464e4094f780c4d48413acd786ce5627aaaecfac9e9c7431d13ae1" -dependencies = [ - "base64 0.22.1", - "futures-channel", - "futures-util", - "gloo-net", - "http", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "soketto", - "thiserror 2.0.14", - "tokio", - "tokio-rustls", - "tokio-util", - "tracing", - "url", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" -dependencies = [ - "async-trait", - "bytes", - "futures-timer", - "futures-util", - "http", - "http-body", - "http-body-util", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot", - "pin-project", - "rand 0.9.2", - "rustc-hash 2.1.1", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tower 0.5.2", - "tracing", - "wasm-bindgen-futures", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "parking_lot", - "pin-project", - "rand 0.9.2", - "rustc-hash 2.1.1", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tower 0.5.2", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" -dependencies = [ - "base64 0.22.1", - "http-body", - "hyper", - "hyper-rustls", - "hyper-util", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls", - "rustls-platform-verifier", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tower 0.5.2", - "url", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" -dependencies = [ - "base64 0.22.1", - "http-body", - "hyper", - "hyper-rustls", - "hyper-util", - "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "rustls", - "rustls-platform-verifier", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tower 0.5.2", - "url", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fa4f5daed39f982a1bb9d15449a28347490ad42b212f8eaa2a2a344a0dce9e9" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38b0bcf407ac68d241f90e2d46041e6a06988f97fe1721fb80b91c42584fae6" -dependencies = [ - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project", - "route-recognizer", - "serde", - "serde_json", - "soketto", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-util", - "tower 0.5.2", - "tracing", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" -dependencies = [ - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "jsonrpsee-core 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "jsonrpsee-types 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "pin-project", - "route-recognizer", - "serde", - "serde_json", - "soketto", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-util", - "tower 0.5.2", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" -dependencies = [ - "http", - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.25.1" -source = "git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff#f04afa740e55db60dce20d9839758792f035ffff" -dependencies = [ - "http", - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "jsonrpsee-wasm-client" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b67695cbcf4653f39f8f8738925547e0e23fd9fe315bccf951097b9f6a38781" -dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tower 0.5.2", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da2694c9ff271a9d3ebfe520f6b36820e85133a51be77a3cb549fd615095261" -dependencies = [ - "http", - "jsonrpsee-client-transport", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "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.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "serdect", - "sha2 0.10.9", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" -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" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.175" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" - -[[package]] -name = "libgit2-sys" -version = "0.18.2+1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.3", -] - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "libp2p-identity" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" -dependencies = [ - "asn1_der", - "bs58", - "ed25519-dalek", - "hkdf", - "k256", - "multihash", - "quick-protobuf", - "sha2 0.10.9", - "thiserror 2.0.14", - "tracing", - "zeroize", -] - -[[package]] -name = "libproc" -version = "0.14.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" -dependencies = [ - "bindgen 0.70.1", - "errno", - "libc", -] - -[[package]] -name = "libredox" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" -dependencies = [ - "bitflags 2.9.1", - "libc", - "redox_syscall 0.5.17", -] - -[[package]] -name = "libsecp256k1" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" -dependencies = [ - "arrayref", - "base64 0.22.1", - "digest 0.9.0", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.8.5", - "serde", - "sha2 0.9.9", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libz-sys" -version = "1.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linked_hash_set" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae85b5be22d9843c80e5fc80e9b64c8a3b1f98f867c709956eca3efff4e92e2" -dependencies = [ - "linked-hash-map", - "serde", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", - "serde", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber 0.3.19", -] - -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.5", -] - -[[package]] -name = "lru" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" -dependencies = [ - "hashbrown 0.15.5", -] - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "lz4" -version = "1.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" -dependencies = [ - "lz4-sys", -] - -[[package]] -name = "lz4-sys" -version = "1.11.1+lz4-1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "lz4_flex" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" - -[[package]] -name = "mach2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" -dependencies = [ - "libc", -] - -[[package]] -name = "macro-string" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "memmap2" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metrics" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dea7ac8057892855ec285c440160265225438c3c45072613c25a4b26e98ef5" -dependencies = [ - "ahash", - "portable-atomic", -] - -[[package]] -name = "metrics-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3dbdd96ed57d565ec744cba02862d707acf373c5772d152abae6ec5c4e24f6c" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.105", -] - -[[package]] -name = "metrics-exporter-prometheus" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7399781913e5393588a8d8c6a2867bf85fb38eaf2502fdce465aad2dc6f034" -dependencies = [ - "base64 0.22.1", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "indexmap 2.10.0", - "ipnet", - "metrics", - "metrics-util 0.19.1", - "quanta", - "thiserror 1.0.69", - "tokio", - "tracing", -] - -[[package]] -name = "metrics-exporter-prometheus" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b166dea96003ee2531cf14833efedced545751d800f03535801d833313f8c15" -dependencies = [ - "base64 0.22.1", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "indexmap 2.10.0", - "ipnet", - "metrics", - "metrics-util 0.20.0", - "quanta", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "metrics-process" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a82c8add4382f29a122fa64fff1891453ed0f6b2867d971e7d60cb8dfa322ff" -dependencies = [ - "libc", - "libproc", - "mach2", - "metrics", - "once_cell", - "procfs", - "rlimit", - "windows 0.58.0", -] - -[[package]] -name = "metrics-util" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8496cc523d1f94c1385dd8f0f0c2c480b2b8aeccb5b7e4485ad6365523ae376" -dependencies = [ - "aho-corasick", - "crossbeam-epoch", - "crossbeam-utils", - "hashbrown 0.15.5", - "indexmap 2.10.0", - "metrics", - "ordered-float", - "quanta", - "radix_trie", - "rand 0.9.2", - "rand_xoshiro", - "sketches-ddsketch", -] - -[[package]] -name = "metrics-util" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe8db7a05415d0f919ffb905afa37784f71901c9a773188876984b4f769ab986" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", - "hashbrown 0.15.5", - "metrics", - "quanta", - "rand 0.9.2", - "rand_xoshiro", - "sketches-ddsketch", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "mini-moka" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" -dependencies = [ - "crossbeam-channel", - "crossbeam-utils", - "dashmap 5.5.3", - "skeptic", - "smallvec", - "tagptr", - "triomphe", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "modular-bitfield" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" -dependencies = [ - "modular-bitfield-impl", - "static_assertions", -] - -[[package]] -name = "modular-bitfield-impl" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "moka" -version = "0.12.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" -dependencies = [ - "async-lock", - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "event-listener", - "futures-util", - "loom", - "parking_lot", - "portable-atomic", - "rustc_version 0.4.1", - "smallvec", - "tagptr", - "thiserror 1.0.69", - "uuid", -] - -[[package]] -name = "more-asserts" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" - -[[package]] -name = "multiaddr" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" -dependencies = [ - "arrayref", - "byteorder", - "data-encoding", - "libp2p-identity", - "multibase", - "multihash", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint", - "url", -] - -[[package]] -name = "multibase" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" -dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", -] - -[[package]] -name = "multihash" -version = "0.19.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" -dependencies = [ - "core2", - "unsigned-varint", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nibble_vec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" -dependencies = [ - "smallvec", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - -[[package]] -name = "notify" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" -dependencies = [ - "bitflags 2.9.1", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "log", - "mio", - "notify-types", - "walkdir", - "windows-sys 0.60.2", -] - -[[package]] -name = "notify-types" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", - "serde", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "nybbles" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ff79de40513a478a9e374a480f897c2df829d48dcc64a83e4792a57fe231c64" -dependencies = [ - "alloy-rlp", - "arbitrary", - "cfg-if", - "proptest", - "ruint", - "serde", - "smallvec", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -dependencies = [ - "critical-section", - "portable-atomic", -] - -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - -[[package]] -name = "op-alloy-consensus" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2423a125ef2daa0d15dacc361805a0b6f76d6acfc6e24a1ff6473582087fe75" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "derive_more", - "thiserror 2.0.14", -] - -[[package]] -name = "op-alloy-consensus" -version = "0.18.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c88d2940558fd69f8f07b3cbd7bb3c02fc7d31159c1a7ba9deede50e7881024" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-network", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde", - "arbitrary", - "derive_more", - "serde", - "serde_with", - "thiserror 2.0.14", -] - -[[package]] -name = "op-alloy-flz" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a79f352fc3893dcd670172e615afef993a41798a1d3fc0db88a3e60ef2e70ecc" - -[[package]] -name = "op-alloy-network" -version = "0.18.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66be312d3446099f1c46b3bb4bbaccdd4b3d6fb3668921158e3d47dff0a8d4a0" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types-eth", - "alloy-signer", - "op-alloy-consensus 0.18.14", - "op-alloy-rpc-types", -] - -[[package]] -name = "op-alloy-rpc-jsonrpsee" -version = "0.18.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3833995acfc568fdac3684f037c4ed3f1f2bd2ef5deeb3f46ecee32aafa34c8e" -dependencies = [ - "alloy-primitives", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "op-alloy-rpc-types" -version = "0.18.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f22201e53e8cbb67a053e88b534b4e7f02265c5406994bf35978482a9ad0ae26" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "derive_more", - "op-alloy-consensus 0.18.14", - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "op-alloy-rpc-types-engine" -version = "0.18.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cf45d43a3d548fdc39d9bfab6ba13cc06b3214ef4b9c36d3efbf3faea1b9f1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-engine", - "alloy-serde", - "derive_more", - "ethereum_ssz", - "ethereum_ssz_derive", - "op-alloy-consensus 0.18.14", - "serde", - "snap", - "thiserror 2.0.14", -] - -[[package]] -name = "op-revm" -version = "9.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6889cdfed74c6c924a54b2357982fce232e06473c6bb73b9a0c71a9151bfabd" -dependencies = [ - "auto_impl", - "revm", - "serde", -] - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "opentelemetry" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e667b670a5cdf90c258f5a55794ec5ac5027e960c224bff8367a59e1e6426" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.14", - "tracing", -] - -[[package]] -name = "opentelemetry-http" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8863faf2910030d139fb48715ad5ff2f35029fc5f244f6d5f689ddcf4d26253" -dependencies = [ - "async-trait", - "bytes", - "http", - "opentelemetry", - "reqwest", - "tracing", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bef114c6d41bea83d6dc60eb41720eedd0261a67af57b66dd2b84ac46c01d91" -dependencies = [ - "async-trait", - "futures-core", - "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", - "opentelemetry_sdk", - "prost", - "reqwest", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tonic", - "tracing", -] - -[[package]] -name = "opentelemetry-proto" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f8870d3024727e99212eb3bb1762ec16e255e3e6f58eeb3dc8db1aa226746d" -dependencies = [ - "base64 0.22.1", - "hex", - "opentelemetry", - "opentelemetry_sdk", - "prost", - "serde", - "tonic", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" -dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "glob", - "opentelemetry", - "percent-encoding", - "rand 0.8.5", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" -dependencies = [ - "num-traits", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2 0.10.9", -] - -[[package]] -name = "page_size" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arbitrary", - "arrayvec", - "bitvec", - "byte-slice-cast", - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.17", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "parse-display" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" -dependencies = [ - "parse-display-derive", - "regex", - "regex-syntax 0.8.5", -] - -[[package]] -name = "parse-display-derive" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ae7800a4c974efd12df917266338e79a7a74415173caf7e70aa0a0707345281" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "regex-syntax 0.8.5", - "structmeta", - "syn 2.0.105", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem" -version = "3.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" -dependencies = [ - "base64 0.22.1", - "serde", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" -dependencies = [ - "memchr", - "thiserror 2.0.14", - "ucd-trie", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.1", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared", - "serde", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain_hasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e19e6491bdde87c2c43d70f4c194bc8a758f2eb732df00f61e43f7362e3b4cc" -dependencies = [ - "crunchy", -] - -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec 0.11.4", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "predicates" -version = "3.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" -dependencies = [ - "anstyle", - "difflib", - "float-cmp", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates-core" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" - -[[package]] -name = "predicates-tree" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "pretty_assertions" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" -dependencies = [ - "diff", - "yansi", -] - -[[package]] -name = "prettyplease" -version = "0.2.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" -dependencies = [ - "proc-macro2", - "syn 2.0.105", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint 0.9.5", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "proc-macro2" -version = "1.0.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "procfs" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" -dependencies = [ - "bitflags 2.9.1", - "chrono", - "flate2", - "hex", - "procfs-core", - "rustix 0.38.44", -] - -[[package]] -name = "procfs-core" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" -dependencies = [ - "bitflags 2.9.1", - "chrono", - "hex", -] - -[[package]] -name = "proptest" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.9.1", - "lazy_static", - "num-traits", - "rand 0.9.2", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax 0.8.5", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "proptest-arbitrary-interop" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1981e49bd2432249da8b0e11e5557099a8e74690d6b94e721f7dc0bb7f3555f" -dependencies = [ - "arbitrary", - "proptest", -] - -[[package]] -name = "proptest-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.9.1", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi 0.11.1+wasi-snapshot-preview1", - "web-sys", - "winapi", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quick-protobuf" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" -dependencies = [ - "byteorder", -] - -[[package]] -name = "quinn" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.1", - "rustls", - "socket2 0.5.10", - "thiserror 2.0.14", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" -dependencies = [ - "bytes", - "getrandom 0.3.3", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash 2.1.1", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.14", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.5.10", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "radix_trie" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" -dependencies = [ - "endian-type", - "nibble_vec", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", - "serde", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.3", - "serde", -] - -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core 0.9.3", -] - -[[package]] -name = "rand_xoshiro" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" -dependencies = [ - "rand_core 0.9.3", -] - -[[package]] -name = "ratatui" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" -dependencies = [ - "bitflags 2.9.1", - "cassowary", - "compact_str", - "crossterm", - "indoc", - "instability", - "itertools 0.13.0", - "lru 0.12.5", - "paste", - "strum 0.26.3", - "unicode-segmentation", - "unicode-truncate", - "unicode-width 0.2.0", -] - -[[package]] -name = "raw-cpuid" -version = "11.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - -[[package]] -name = "redis" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "438a4e5f8e9aa246d6f3666d6978441bf1b37d5f417b50c4dd220be09f5fcc17" -dependencies = [ - "arc-swap", - "combine", - "itoa", - "num-bigint", - "percent-encoding", - "ryu", - "sha1_smol", - "socket2 0.5.10", - "url", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 2.0.14", -] - -[[package]] -name = "ref-cast" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "regress" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" -dependencies = [ - "hashbrown 0.15.5", - "memchr", -] - -[[package]] -name = "reqwest" -version = "0.12.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-util", - "tower 0.5.2", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 1.0.2", -] - -[[package]] -name = "resolv-conf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" - -[[package]] -name = "reth" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-rpc-types", - "aquamarine", - "clap", - "eyre", - "reth-chainspec", - "reth-cli-runner", - "reth-cli-util", - "reth-consensus", - "reth-consensus-common", - "reth-db", - "reth-ethereum-cli", - "reth-ethereum-payload-builder", - "reth-ethereum-primitives", - "reth-evm", - "reth-network", - "reth-network-api", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-ethereum", - "reth-node-metrics", - "reth-payload-builder", - "reth-payload-primitives", - "reth-primitives", - "reth-provider", - "reth-ress-protocol", - "reth-ress-provider", - "reth-revm", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-builder", - "reth-rpc-convert", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-tasks", - "reth-tokio-util", - "reth-transaction-pool", - "tokio", - "tracing", -] - -[[package]] -name = "reth-basic-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "futures-core", - "futures-util", - "metrics", - "reth-chain-state", - "reth-metrics", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-tasks", - "tokio", - "tracing", -] - -[[package]] -name = "reth-chain-state" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-signer", - "alloy-signer-local", - "derive_more", - "metrics", - "parking_lot", - "pin-project", - "rand 0.9.2", - "reth-chainspec", - "reth-errors", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-trie", - "revm-database", - "revm-state", - "serde", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-chainspec" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-genesis", - "alloy-primitives", - "alloy-trie", - "auto_impl", - "derive_more", - "reth-ethereum-forks", - "reth-network-peers", - "reth-primitives-traits", - "serde_json", -] - -[[package]] -name = "reth-cli" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-genesis", - "clap", - "eyre", - "reth-cli-runner", - "reth-db", - "serde_json", - "shellexpand", -] - -[[package]] -name = "reth-cli-commands" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "ahash", - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "backon", - "clap", - "comfy-table", - "crossterm", - "eyre", - "fdlimit", - "futures", - "human_bytes", - "itertools 0.14.0", - "lz4", - "ratatui", - "reqwest", - "reth-chainspec", - "reth-cli", - "reth-cli-runner", - "reth-cli-util", - "reth-codecs", - "reth-config", - "reth-consensus", - "reth-db", - "reth-db-api", - "reth-db-common", - "reth-discv4", - "reth-discv5", - "reth-downloaders", - "reth-ecies", - "reth-era", - "reth-era-downloader", - "reth-era-utils", - "reth-eth-wire", - "reth-etl", - "reth-evm", - "reth-exex", - "reth-fs-util", - "reth-net-nat", - "reth-network", - "reth-network-p2p", - "reth-network-peers", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-events", - "reth-node-metrics", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-revm", - "reth-stages", - "reth-static-file", - "reth-static-file-types", - "reth-trie", - "reth-trie-db", - "secp256k1 0.30.0", - "serde", - "serde_json", - "tar", - "tokio", - "tokio-stream", - "toml", - "tracing", -] - -[[package]] -name = "reth-cli-runner" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "reth-tasks", - "tokio", - "tracing", -] - -[[package]] -name = "reth-cli-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "cfg-if", - "eyre", - "libc", - "rand 0.8.5", - "reth-fs-util", - "secp256k1 0.30.0", - "serde", - "thiserror 2.0.14", - "tikv-jemallocator", -] - -[[package]] -name = "reth-codecs" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-primitives", - "alloy-trie", - "arbitrary", - "bytes", - "modular-bitfield", - "op-alloy-consensus 0.18.14", - "reth-codecs-derive", - "reth-zstd-compressors", - "serde", - "visibility", -] - -[[package]] -name = "reth-codecs-derive" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "reth-config" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "eyre", - "humantime-serde", - "reth-network-types", - "reth-prune-types", - "reth-stages-types", - "serde", - "toml", - "url", -] - -[[package]] -name = "reth-consensus" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "auto_impl", - "reth-execution-types", - "reth-primitives-traits", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-consensus-common" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "reth-chainspec", - "reth-consensus", - "reth-primitives-traits", -] - -[[package]] -name = "reth-consensus-debug-client" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types-engine", - "auto_impl", - "derive_more", - "eyre", - "futures", - "reqwest", - "reth-node-api", - "reth-primitives-traits", - "reth-tracing", - "ringbuffer", - "serde", - "serde_json", - "tokio", -] - -[[package]] -name = "reth-db" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "derive_more", - "eyre", - "metrics", - "page_size", - "parking_lot", - "reth-db-api", - "reth-fs-util", - "reth-libmdbx", - "reth-metrics", - "reth-nippy-jar", - "reth-static-file-types", - "reth-storage-errors", - "reth-tracing", - "rustc-hash 2.1.1", - "strum 0.27.2", - "sysinfo", - "tempfile", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-db-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-genesis", - "alloy-primitives", - "arbitrary", - "bytes", - "derive_more", - "metrics", - "modular-bitfield", - "parity-scale-codec", - "proptest", - "reth-codecs", - "reth-db-models", - "reth-ethereum-primitives", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", - "roaring", - "serde", -] - -[[package]] -name = "reth-db-common" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-genesis", - "alloy-primitives", - "boyer-moore-magiclen", - "eyre", - "reth-chainspec", - "reth-codecs", - "reth-config", - "reth-db-api", - "reth-etl", - "reth-execution-errors", - "reth-fs-util", - "reth-node-types", - "reth-primitives-traits", - "reth-provider", - "reth-stages-types", - "reth-static-file-types", - "reth-trie", - "reth-trie-db", - "serde", - "serde_json", - "thiserror 2.0.14", - "tracing", -] - -[[package]] -name = "reth-db-models" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "arbitrary", - "bytes", - "modular-bitfield", - "reth-codecs", - "reth-primitives-traits", - "serde", -] - -[[package]] -name = "reth-discv4" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "discv5", - "enr", - "generic-array", - "itertools 0.14.0", - "parking_lot", - "rand 0.8.5", - "reth-ethereum-forks", - "reth-net-banlist", - "reth-net-nat", - "reth-network-peers", - "schnellru", - "secp256k1 0.30.0", - "serde", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-discv5" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more", - "discv5", - "enr", - "futures", - "itertools 0.14.0", - "metrics", - "rand 0.9.2", - "reth-chainspec", - "reth-ethereum-forks", - "reth-metrics", - "reth-network-peers", - "secp256k1 0.30.0", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-dns-discovery" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "data-encoding", - "enr", - "hickory-resolver", - "linked_hash_set", - "parking_lot", - "reth-ethereum-forks", - "reth-network-peers", - "reth-tokio-util", - "schnellru", - "secp256k1 0.30.0", - "serde", - "serde_with", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-downloaders" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "futures", - "futures-util", - "itertools 0.14.0", - "metrics", - "pin-project", - "rayon", - "reth-config", - "reth-consensus", - "reth-db", - "reth-db-api", - "reth-ethereum-primitives", - "reth-metrics", - "reth-network-p2p", - "reth-network-peers", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", - "reth-testing-utils", - "tempfile", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", -] - -[[package]] -name = "reth-ecies" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "aes", - "alloy-primitives", - "alloy-rlp", - "block-padding", - "byteorder", - "cipher", - "concat-kdf", - "ctr", - "digest 0.10.7", - "futures", - "generic-array", - "hmac", - "pin-project", - "rand 0.8.5", - "reth-network-peers", - "secp256k1 0.30.0", - "sha2 0.10.9", - "sha3", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", - "typenum", -] - -[[package]] -name = "reth-engine-local" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rpc-types-engine", - "eyre", - "futures-util", - "op-alloy-rpc-types-engine", - "reth-chainspec", - "reth-engine-primitives", - "reth-ethereum-engine-primitives", - "reth-optimism-chainspec", - "reth-payload-builder", - "reth-payload-primitives", - "reth-provider", - "reth-transaction-pool", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-engine-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "auto_impl", - "futures", - "reth-chain-state", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-trie-common", - "serde", - "thiserror 2.0.14", - "tokio", -] - -[[package]] -name = "reth-engine-service" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "futures", - "pin-project", - "reth-chainspec", - "reth-consensus", - "reth-engine-primitives", - "reth-engine-tree", - "reth-ethereum-primitives", - "reth-evm", - "reth-network-p2p", - "reth-node-types", - "reth-payload-builder", - "reth-provider", - "reth-prune", - "reth-stages-api", - "reth-tasks", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-engine-tree" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-engine", - "derive_more", - "futures", - "metrics", - "mini-moka", - "parking_lot", - "rayon", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-db", - "reth-engine-primitives", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-metrics", - "reth-network-p2p", - "reth-payload-builder", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-prune-types", - "reth-revm", - "reth-stages", - "reth-stages-api", - "reth-static-file", - "reth-tasks", - "reth-tracing", - "reth-trie", - "reth-trie-db", - "reth-trie-parallel", - "reth-trie-sparse", - "reth-trie-sparse-parallel", - "revm", - "revm-primitives", - "schnellru", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-engine-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-rpc-types-engine", - "eyre", - "futures", - "itertools 0.14.0", - "pin-project", - "reth-chainspec", - "reth-engine-primitives", - "reth-engine-tree", - "reth-errors", - "reth-evm", - "reth-fs-util", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "serde", - "serde_json", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "reth-era" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "ethereum_ssz", - "ethereum_ssz_derive", - "reth-ethereum-primitives", - "snap", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-era-downloader" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "bytes", - "eyre", - "futures-util", - "reqwest", - "reth-fs-util", - "sha2 0.10.9", - "tokio", -] - -[[package]] -name = "reth-era-utils" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rlp", - "eyre", - "futures-util", - "reth-db-api", - "reth-era", - "reth-era-downloader", - "reth-ethereum-primitives", - "reth-etl", - "reth-fs-util", - "reth-primitives-traits", - "reth-provider", - "reth-stages-types", - "reth-storage-api", - "tokio", - "tracing", -] - -[[package]] -name = "reth-errors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "reth-consensus", - "reth-execution-errors", - "reth-storage-errors", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-eth-wire" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-chains", - "alloy-primitives", - "alloy-rlp", - "bytes", - "derive_more", - "futures", - "pin-project", - "reth-codecs", - "reth-ecies", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-metrics", - "reth-network-peers", - "reth-primitives-traits", - "serde", - "snap", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", -] - -[[package]] -name = "reth-eth-wire-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-hardforks", - "alloy-primitives", - "alloy-rlp", - "bytes", - "derive_more", - "reth-chainspec", - "reth-codecs-derive", - "reth-ethereum-primitives", - "reth-primitives-traits", - "serde", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-ethereum" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -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-trie", - "reth-trie-db", -] - -[[package]] -name = "reth-ethereum-cli" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "clap", - "eyre", - "reth-chainspec", - "reth-cli", - "reth-cli-commands", - "reth-cli-runner", - "reth-db", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-ethereum", - "reth-node-metrics", - "reth-tracing", - "tracing", -] - -[[package]] -name = "reth-ethereum-consensus" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-execution-types", - "reth-primitives-traits", - "tracing", -] - -[[package]] -name = "reth-ethereum-engine-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-engine", - "reth-engine-primitives", - "reth-ethereum-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "serde", - "sha2 0.10.9", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-ethereum-forks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eip2124", - "alloy-hardforks", - "alloy-primitives", - "auto_impl", - "once_cell", - "rustc-hash 2.1.1", -] - -[[package]] -name = "reth-ethereum-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "reth-basic-payload-builder", - "reth-chainspec", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-evm-ethereum", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-payload-validator", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-transaction-pool", - "revm", - "tracing", -] - -[[package]] -name = "reth-ethereum-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "modular-bitfield", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", - "serde", - "serde_with", -] - -[[package]] -name = "reth-etl" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "rayon", - "reth-db-api", - "tempfile", -] - -[[package]] -name = "reth-evm" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-primitives", - "auto_impl", - "derive_more", - "futures-util", - "metrics", - "reth-execution-errors", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", - "revm", -] - -[[package]] -name = "reth-evm-ethereum" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-primitives", - "alloy-rpc-types-engine", - "derive_more", - "reth-chainspec", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-primitives-traits", - "reth-storage-errors", - "revm", -] - -[[package]] -name = "reth-execution-errors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-evm", - "alloy-primitives", - "alloy-rlp", - "nybbles", - "reth-storage-errors", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-execution-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-primitives", - "derive_more", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-trie-common", - "revm", - "serde", - "serde_with", -] - -[[package]] -name = "reth-exex" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "eyre", - "futures", - "itertools 0.14.0", - "metrics", - "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-config", - "reth-ethereum-primitives", - "reth-evm", - "reth-exex-types", - "reth-fs-util", - "reth-metrics", - "reth-node-api", - "reth-node-core", - "reth-payload-builder", - "reth-primitives-traits", - "reth-provider", - "reth-prune-types", - "reth-revm", - "reth-stages-api", - "reth-tasks", - "reth-tracing", - "rmp-serde", - "thiserror 2.0.14", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "reth-exex-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "reth-chain-state", - "reth-execution-types", - "reth-primitives-traits", - "serde", - "serde_with", -] - -[[package]] -name = "reth-fs-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-invalid-block-hooks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-debug", - "eyre", - "futures", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pretty_assertions", - "reth-chainspec", - "reth-engine-primitives", - "reth-evm", - "reth-primitives-traits", - "reth-provider", - "reth-revm", - "reth-rpc-api", - "reth-tracing", - "reth-trie", - "revm-bytecode", - "revm-database", - "serde", - "serde_json", -] - -[[package]] -name = "reth-ipc" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "bytes", - "futures", - "futures-util", - "interprocess", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-util", - "tower 0.5.2", - "tracing", -] - -[[package]] -name = "reth-libmdbx" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "bitflags 2.9.1", - "byteorder", - "dashmap 6.1.0", - "derive_more", - "indexmap 2.10.0", - "parking_lot", - "reth-mdbx-sys", - "smallvec", - "thiserror 2.0.14", - "tracing", -] - -[[package]] -name = "reth-mdbx-sys" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "bindgen 0.70.1", - "cc", -] - -[[package]] -name = "reth-metrics" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "futures", - "metrics", - "metrics-derive", - "tokio", - "tokio-util", -] - -[[package]] -name = "reth-net-banlist" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", -] - -[[package]] -name = "reth-net-nat" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "futures-util", - "if-addrs", - "reqwest", - "serde_with", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-network" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "aquamarine", - "auto_impl", - "derive_more", - "discv5", - "enr", - "futures", - "itertools 0.14.0", - "metrics", - "parking_lot", - "pin-project", - "rand 0.8.5", - "rand 0.9.2", - "reth-chainspec", - "reth-consensus", - "reth-discv4", - "reth-discv5", - "reth-dns-discovery", - "reth-ecies", - "reth-eth-wire", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-fs-util", - "reth-metrics", - "reth-net-banlist", - "reth-network-api", - "reth-network-p2p", - "reth-network-peers", - "reth-network-types", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", - "reth-tokio-util", - "reth-transaction-pool", - "rustc-hash 2.1.1", - "schnellru", - "secp256k1 0.30.0", - "serde", - "smallvec", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", -] - -[[package]] -name = "reth-network-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rpc-types-admin", - "alloy-rpc-types-eth", - "auto_impl", - "derive_more", - "enr", - "futures", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-network-p2p", - "reth-network-peers", - "reth-network-types", - "reth-tokio-util", - "serde", - "thiserror 2.0.14", - "tokio", - "tokio-stream", -] - -[[package]] -name = "reth-network-p2p" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "auto_impl", - "derive_more", - "futures", - "parking_lot", - "reth-consensus", - "reth-eth-wire-types", - "reth-ethereum-primitives", - "reth-network-peers", - "reth-network-types", - "reth-primitives-traits", - "reth-storage-errors", - "tokio", - "tracing", -] - -[[package]] -name = "reth-network-peers" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "enr", - "secp256k1 0.30.0", - "serde_with", - "thiserror 2.0.14", - "tokio", - "url", -] - -[[package]] -name = "reth-network-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eip2124", - "humantime-serde", - "reth-net-banlist", - "reth-network-peers", - "serde", - "serde_json", - "tracing", -] - -[[package]] -name = "reth-nippy-jar" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "anyhow", - "bincode", - "derive_more", - "lz4_flex", - "memmap2", - "reth-fs-util", - "serde", - "thiserror 2.0.14", - "tracing", - "zstd", -] - -[[package]] -name = "reth-node-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-rpc-types-engine", - "eyre", - "reth-basic-payload-builder", - "reth-consensus", - "reth-db-api", - "reth-engine-primitives", - "reth-evm", - "reth-network-api", - "reth-node-core", - "reth-node-types", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-provider", - "reth-tasks", - "reth-tokio-util", - "reth-transaction-pool", -] - -[[package]] -name = "reth-node-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types", - "alloy-rpc-types-engine", - "aquamarine", - "eyre", - "fdlimit", - "futures", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon", - "reth-basic-payload-builder", - "reth-chain-state", - "reth-chainspec", - "reth-cli-util", - "reth-config", - "reth-consensus", - "reth-consensus-debug-client", - "reth-db", - "reth-db-api", - "reth-db-common", - "reth-downloaders", - "reth-engine-local", - "reth-engine-primitives", - "reth-engine-service", - "reth-engine-tree", - "reth-engine-util", - "reth-evm", - "reth-exex", - "reth-fs-util", - "reth-invalid-block-hooks", - "reth-network", - "reth-network-api", - "reth-network-p2p", - "reth-node-api", - "reth-node-core", - "reth-node-ethstats", - "reth-node-events", - "reth-node-metrics", - "reth-payload-builder", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-builder", - "reth-rpc-engine-api", - "reth-rpc-eth-types", - "reth-rpc-layer", - "reth-stages", - "reth-static-file", - "reth-tasks", - "reth-tokio-util", - "reth-tracing", - "reth-transaction-pool", - "secp256k1 0.30.0", - "serde_json", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-node-core" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "clap", - "derive_more", - "dirs-next", - "eyre", - "futures", - "humantime", - "rand 0.9.2", - "reth-chainspec", - "reth-cli-util", - "reth-config", - "reth-consensus", - "reth-db", - "reth-discv4", - "reth-discv5", - "reth-engine-local", - "reth-engine-primitives", - "reth-ethereum-forks", - "reth-net-nat", - "reth-network", - "reth-network-p2p", - "reth-network-peers", - "reth-primitives-traits", - "reth-prune-types", - "reth-rpc-convert", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-stages-types", - "reth-storage-api", - "reth-storage-errors", - "reth-tracing", - "reth-transaction-pool", - "secp256k1 0.30.0", - "serde", - "shellexpand", - "strum 0.27.2", - "thiserror 2.0.14", - "toml", - "tracing", - "url", - "vergen", - "vergen-git2", -] - -[[package]] -name = "reth-node-ethereum" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-network", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "eyre", - "reth-chainspec", - "reth-engine-local", - "reth-engine-primitives", - "reth-ethereum-consensus", - "reth-ethereum-engine-primitives", - "reth-ethereum-payload-builder", - "reth-ethereum-primitives", - "reth-evm", - "reth-evm-ethereum", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-revm", - "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", - "reth-trie-db", - "revm", - "tokio", -] - -[[package]] -name = "reth-node-ethstats" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "chrono", - "futures-util", - "reth-chain-state", - "reth-network-api", - "reth-primitives-traits", - "reth-storage-api", - "reth-transaction-pool", - "serde", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tracing", - "url", -] - -[[package]] -name = "reth-node-events" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "derive_more", - "futures", - "humantime", - "pin-project", - "reth-engine-primitives", - "reth-network-api", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages", - "reth-static-file-types", - "reth-storage-api", - "tokio", - "tracing", -] - -[[package]] -name = "reth-node-metrics" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "eyre", - "http", - "jsonrpsee-server 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "metrics-exporter-prometheus 0.16.2", - "metrics-process", - "metrics-util 0.19.1", - "procfs", - "reth-metrics", - "reth-tasks", - "tikv-jemalloc-ctl", - "tokio", - "tower 0.5.2", - "tracing", -] - -[[package]] -name = "reth-node-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "reth-chainspec", - "reth-db-api", - "reth-engine-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-trie-db", -] - -[[package]] -name = "reth-op" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "reth-chainspec", - "reth-codecs", - "reth-consensus", - "reth-consensus-common", - "reth-db", - "reth-engine-local", - "reth-eth-wire", - "reth-evm", - "reth-network", - "reth-network-api", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-node", - "reth-optimism-primitives", - "reth-optimism-rpc", - "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]] -name = "reth-optimism-chainspec" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-hardforks", - "alloy-primitives", - "derive_more", - "miniz_oxide", - "op-alloy-consensus 0.18.14", - "op-alloy-rpc-types", - "paste", - "reth-chainspec", - "reth-ethereum-forks", - "reth-network-peers", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "serde", - "serde_json", - "tar-no-std", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-optimism-cli" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "clap", - "derive_more", - "eyre", - "futures-util", - "op-alloy-consensus 0.18.14", - "reth-chainspec", - "reth-cli", - "reth-cli-commands", - "reth-cli-runner", - "reth-consensus", - "reth-db", - "reth-db-api", - "reth-db-common", - "reth-downloaders", - "reth-execution-types", - "reth-fs-util", - "reth-node-builder", - "reth-node-core", - "reth-node-events", - "reth-node-metrics", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-node", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-stages", - "reth-static-file", - "reth-static-file-types", - "reth-tracing", - "serde", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "reth-optimism-consensus" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-trie", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-execution-types", - "reth-optimism-chainspec", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", - "revm", - "thiserror 2.0.14", - "tracing", -] - -[[package]] -name = "reth-optimism-evm" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-op-evm", - "alloy-primitives", - "op-alloy-consensus 0.18.14", - "op-alloy-rpc-types-engine", - "op-revm", - "reth-chainspec", - "reth-evm", - "reth-execution-errors", - "reth-execution-types", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-rpc-eth-api", - "reth-storage-errors", - "revm", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-optimism-forks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-op-hardforks", - "alloy-primitives", - "once_cell", - "reth-ethereum-forks", -] - -[[package]] -name = "reth-optimism-node" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "clap", - "eyre", - "op-alloy-consensus 0.18.14", - "op-alloy-rpc-types-engine", - "op-revm", - "reth-chainspec", - "reth-consensus", - "reth-engine-local", - "reth-evm", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-optimism-rpc", - "reth-optimism-storage", - "reth-optimism-txpool", - "reth-payload-builder", - "reth-primitives-traits", - "reth-provider", - "reth-rpc-api", - "reth-rpc-engine-api", - "reth-rpc-server-types", - "reth-tracing", - "reth-transaction-pool", - "reth-trie-common", - "reth-trie-db", - "revm", - "serde", - "tokio", -] - -[[package]] -name = "reth-optimism-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-debug", - "alloy-rpc-types-engine", - "derive_more", - "op-alloy-consensus 0.18.14", - "op-alloy-rpc-types-engine", - "reth-basic-payload-builder", - "reth-chain-state", - "reth-chainspec", - "reth-evm", - "reth-execution-types", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-optimism-txpool", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-payload-util", - "reth-payload-validator", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-transaction-pool", - "revm", - "serde", - "sha2 0.10.9", - "thiserror 2.0.14", - "tracing", -] - -[[package]] -name = "reth-optimism-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "arbitrary", - "bytes", - "modular-bitfield", - "op-alloy-consensus 0.18.14", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", - "serde", - "serde_with", -] - -[[package]] -name = "reth-optimism-rpc" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-debug", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-transport", - "alloy-transport-http", - "async-trait", - "derive_more", - "eyre", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "op-alloy-consensus 0.18.14", - "op-alloy-network", - "op-alloy-rpc-jsonrpsee", - "op-alloy-rpc-types", - "op-alloy-rpc-types-engine", - "op-revm", - "reqwest", - "reth-chainspec", - "reth-evm", - "reth-metrics", - "reth-node-api", - "reth-node-builder", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-optimism-txpool", - "reth-primitives-traits", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-engine-api", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "revm", - "serde_json", - "thiserror 2.0.14", - "tokio", - "tower 0.5.2", - "tracing", -] - -[[package]] -name = "reth-optimism-storage" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "reth-chainspec", - "reth-db-api", - "reth-node-api", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-storage-api", -] - -[[package]] -name = "reth-optimism-txpool" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-serde", - "c-kzg", - "derive_more", - "futures-util", - "metrics", - "op-alloy-consensus 0.18.14", - "op-alloy-flz", - "op-alloy-rpc-types", - "op-revm", - "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-metrics", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-transaction-pool", - "serde", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-payload-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rpc-types", - "futures-util", - "metrics", - "reth-chain-state", - "reth-ethereum-engine-primitives", - "reth-metrics", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-payload-builder-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "pin-project", - "reth-payload-primitives", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-payload-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "auto_impl", - "op-alloy-rpc-types-engine", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-primitives-traits", - "serde", - "thiserror 2.0.14", - "tokio", -] - -[[package]] -name = "reth-payload-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "reth-transaction-pool", -] - -[[package]] -name = "reth-payload-validator" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-rpc-types-engine", - "reth-primitives-traits", -] - -[[package]] -name = "reth-primitives" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "c-kzg", - "once_cell", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-static-file-types", -] - -[[package]] -name = "reth-primitives-traits" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-trie", - "arbitrary", - "auto_impl", - "byteorder", - "bytes", - "derive_more", - "modular-bitfield", - "once_cell", - "op-alloy-consensus 0.18.14", - "proptest", - "proptest-arbitrary-interop", - "rayon", - "reth-codecs", - "revm-bytecode", - "revm-primitives", - "revm-state", - "secp256k1 0.30.0", - "serde", - "serde_with", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-provider" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "dashmap 6.1.0", - "eyre", - "itertools 0.14.0", - "metrics", - "notify", - "parking_lot", - "rayon", - "reth-chain-state", - "reth-chainspec", - "reth-codecs", - "reth-db", - "reth-db-api", - "reth-errors", - "reth-ethereum-engine-primitives", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-fs-util", - "reth-metrics", - "reth-nippy-jar", - "reth-node-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-static-file-types", - "reth-storage-api", - "reth-storage-errors", - "reth-trie", - "reth-trie-db", - "revm-database", - "revm-state", - "strum 0.27.2", - "tokio", - "tracing", -] - -[[package]] -name = "reth-prune" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "itertools 0.14.0", - "metrics", - "rayon", - "reth-chainspec", - "reth-config", - "reth-db-api", - "reth-errors", - "reth-exex-types", - "reth-metrics", - "reth-primitives-traits", - "reth-provider", - "reth-prune-types", - "reth-static-file-types", - "reth-tokio-util", - "rustc-hash 2.1.1", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-prune-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "arbitrary", - "derive_more", - "modular-bitfield", - "reth-codecs", - "serde", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-ress-protocol" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rlp", - "futures", - "reth-eth-wire", - "reth-ethereum-primitives", - "reth-network", - "reth-network-api", - "reth-storage-errors", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-ress-provider" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "eyre", - "futures", - "parking_lot", - "reth-chain-state", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-node-api", - "reth-primitives-traits", - "reth-ress-protocol", - "reth-revm", - "reth-storage-api", - "reth-tasks", - "reth-tokio-util", - "reth-trie", - "schnellru", - "tokio", - "tracing", -] - -[[package]] -name = "reth-revm" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie", - "revm", -] - -[[package]] -name = "reth-rpc" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-eips", - "alloy-evm", - "alloy-genesis", - "alloy-network", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types", - "alloy-rpc-types-admin", - "alloy-rpc-types-beacon", - "alloy-rpc-types-debug", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-rpc-types-mev", - "alloy-rpc-types-trace", - "alloy-rpc-types-txpool", - "alloy-serde", - "alloy-signer", - "alloy-signer-local", - "async-trait", - "derive_more", - "futures", - "http", - "http-body", - "hyper", - "itertools 0.14.0", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonwebtoken", - "parking_lot", - "pin-project", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-engine-primitives", - "reth-errors", - "reth-evm", - "reth-evm-ethereum", - "reth-execution-types", - "reth-metrics", - "reth-network-api", - "reth-network-peers", - "reth-network-types", - "reth-node-api", - "reth-primitives-traits", - "reth-revm", - "reth-rpc-api", - "reth-rpc-convert", - "reth-rpc-engine-api", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie-common", - "revm", - "revm-inspectors", - "revm-primitives", - "serde", - "serde_json", - "sha2 0.10.9", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tower 0.5.2", - "tracing", - "tracing-futures", -] - -[[package]] -name = "reth-rpc-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-genesis", - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-types", - "alloy-rpc-types-admin", - "alloy-rpc-types-anvil", - "alloy-rpc-types-beacon", - "alloy-rpc-types-debug", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-rpc-types-mev", - "alloy-rpc-types-trace", - "alloy-rpc-types-txpool", - "alloy-serde", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "reth-chain-state", - "reth-engine-primitives", - "reth-network-peers", - "reth-rpc-eth-api", - "reth-trie-common", -] - -[[package]] -name = "reth-rpc-builder" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-network", - "alloy-provider", - "http", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "pin-project", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-evm", - "reth-ipc", - "reth-metrics", - "reth-network-api", - "reth-node-core", - "reth-primitives-traits", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-rpc-layer", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "serde", - "thiserror 2.0.14", - "tokio", - "tokio-util", - "tower 0.5.2", - "tower-http", - "tracing", -] - -[[package]] -name = "reth-rpc-convert" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-json-rpc", - "alloy-network", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-signer", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "op-alloy-consensus 0.18.14", - "op-alloy-network", - "op-alloy-rpc-types", - "op-revm", - "reth-ethereum-primitives", - "reth-evm", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", - "revm-context", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-rpc-engine-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "async-trait", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "parking_lot", - "reth-chainspec", - "reth-engine-primitives", - "reth-metrics", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-rpc-api", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "serde", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-rpc-eth-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-eips", - "alloy-evm", - "alloy-json-rpc", - "alloy-network", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-rpc-types-mev", - "alloy-serde", - "async-trait", - "auto_impl", - "dyn-clone", - "futures", - "jsonrpsee 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-evm", - "reth-network-api", - "reth-node-api", - "reth-primitives-traits", - "reth-revm", - "reth-rpc-convert", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie-common", - "revm", - "revm-inspectors", - "tokio", - "tracing", -] - -[[package]] -name = "reth-rpc-eth-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-evm", - "alloy-network", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-sol-types", - "derive_more", - "futures", - "itertools 0.14.0", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "metrics", - "rand 0.9.2", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-revm", - "reth-rpc-convert", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie", - "revm", - "revm-inspectors", - "schnellru", - "serde", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-rpc-layer" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-rpc-types-engine", - "http", - "jsonrpsee-http-client 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project", - "tower 0.5.2", - "tower-http", - "tracing", -] - -[[package]] -name = "reth-rpc-server-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "jsonrpsee-core 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpsee-types 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)", - "reth-errors", - "reth-network-api", - "serde", - "strum 0.27.2", -] - -[[package]] -name = "reth-stages" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "bincode", - "eyre", - "futures-util", - "itertools 0.14.0", - "num-traits", - "rayon", - "reqwest", - "reth-chainspec", - "reth-codecs", - "reth-config", - "reth-consensus", - "reth-db", - "reth-db-api", - "reth-era", - "reth-era-downloader", - "reth-era-utils", - "reth-ethereum-primitives", - "reth-etl", - "reth-evm", - "reth-execution-types", - "reth-exex", - "reth-fs-util", - "reth-network-p2p", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-prune-types", - "reth-revm", - "reth-stages-api", - "reth-static-file-types", - "reth-storage-errors", - "reth-testing-utils", - "reth-trie", - "reth-trie-db", - "tempfile", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-stages-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "aquamarine", - "auto_impl", - "futures-util", - "metrics", - "reth-consensus", - "reth-errors", - "reth-metrics", - "reth-network-p2p", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-stages-types", - "reth-static-file", - "reth-static-file-types", - "reth-tokio-util", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-stages-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "arbitrary", - "bytes", - "modular-bitfield", - "reth-codecs", - "reth-trie-common", - "serde", -] - -[[package]] -name = "reth-static-file" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "parking_lot", - "rayon", - "reth-codecs", - "reth-db-api", - "reth-primitives-traits", - "reth-provider", - "reth-prune-types", - "reth-stages-types", - "reth-static-file-types", - "reth-storage-errors", - "reth-tokio-util", - "tracing", -] - -[[package]] -name = "reth-static-file-types" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "clap", - "derive_more", - "serde", - "strum 0.27.2", -] - -[[package]] -name = "reth-storage-api" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "auto_impl", - "reth-chainspec", - "reth-db-api", - "reth-db-models", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", - "reth-trie-db", - "revm-database", -] - -[[package]] -name = "reth-storage-errors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "derive_more", - "reth-primitives-traits", - "reth-prune-types", - "reth-static-file-types", - "revm-database-interface", - "thiserror 2.0.14", -] - -[[package]] -name = "reth-tasks" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "auto_impl", - "dyn-clone", - "futures-util", - "metrics", - "pin-project", - "rayon", - "reth-metrics", - "thiserror 2.0.14", - "tokio", - "tracing", - "tracing-futures", -] - -[[package]] -name = "reth-testing-utils" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-genesis", - "alloy-primitives", - "rand 0.8.5", - "rand 0.9.2", - "reth-ethereum-primitives", - "reth-primitives-traits", - "secp256k1 0.30.0", -] - -[[package]] -name = "reth-tokio-util" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-tracing" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "clap", - "eyre", - "rolling-file", - "tracing", - "tracing-appender", - "tracing-journald", - "tracing-logfmt", - "tracing-subscriber 0.3.19", -] - -[[package]] -name = "reth-transaction-pool" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "aquamarine", - "auto_impl", - "bitflags 2.9.1", - "futures-util", - "metrics", - "parking_lot", - "paste", - "pin-project", - "rand 0.9.2", - "reth-chain-state", - "reth-chainspec", - "reth-eth-wire-types", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-fs-util", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", - "revm-interpreter 23.0.2", - "revm-primitives", - "rustc-hash 2.1.1", - "schnellru", - "serde", - "serde_json", - "smallvec", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-trie" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-trie", - "auto_impl", - "itertools 0.14.0", - "metrics", - "reth-execution-errors", - "reth-metrics", - "reth-primitives-traits", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", - "reth-trie-sparse", - "revm-database", - "tracing", - "triehash", -] - -[[package]] -name = "reth-trie-common" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-trie", - "arbitrary", - "bytes", - "derive_more", - "hash-db", - "itertools 0.14.0", - "nybbles", - "plain_hasher", - "rayon", - "reth-codecs", - "reth-primitives-traits", - "revm-database", - "serde", - "serde_with", -] - -[[package]] -name = "reth-trie-db" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "reth-db-api", - "reth-execution-errors", - "reth-primitives-traits", - "reth-trie", - "tracing", -] - -[[package]] -name = "reth-trie-parallel" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more", - "itertools 0.14.0", - "metrics", - "rayon", - "reth-db-api", - "reth-execution-errors", - "reth-metrics", - "reth-provider", - "reth-storage-errors", - "reth-trie", - "reth-trie-common", - "reth-trie-db", - "reth-trie-sparse", - "thiserror 2.0.14", - "tokio", - "tracing", -] - -[[package]] -name = "reth-trie-sparse" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-trie", - "auto_impl", - "metrics", - "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-primitives-traits", - "reth-trie-common", - "smallvec", - "tracing", -] - -[[package]] -name = "reth-trie-sparse-parallel" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-trie", - "metrics", - "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-trie-common", - "reth-trie-sparse", - "smallvec", - "tracing", -] - -[[package]] -name = "reth-zstd-compressors" -version = "1.6.0" -source = "git+https://github.com/paradigmxyz/reth?rev=6daf5fc#6daf5fc777c113bd11fe72902f1344cc19bd6bd1" -dependencies = [ - "zstd", -] - -[[package]] -name = "revm" -version = "28.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee5d3f7d031e90ab47c7488061bdc4875abc4e9dcea6c18f5dee09732d0436fb" -dependencies = [ - "revm-bytecode", - "revm-context", - "revm-context-interface 10.0.1", - "revm-database", - "revm-database-interface", - "revm-handler", - "revm-inspector", - "revm-interpreter 25.0.1", - "revm-precompile", - "revm-primitives", - "revm-state", -] - -[[package]] -name = "revm-bytecode" -version = "6.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d800e6c2119457ded5b0af71634eb2468040bf97de468eee5a730272a106da0" -dependencies = [ - "bitvec", - "phf", - "revm-primitives", - "serde", -] - -[[package]] -name = "revm-context" -version = "9.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c63485b4d1b0e67f342f9a8c0e9f78b6b5f1750863a39bdf6ceabdbaaf4aed1" -dependencies = [ - "bitvec", - "cfg-if", - "derive-where", - "revm-bytecode", - "revm-context-interface 10.0.1", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-context-interface" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a303a93102fceccec628265efd550ce49f2817b38ac3a492c53f7d524f18a1ca" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "auto_impl", - "either", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-context-interface" -version = "10.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550cb8b9465e00bdb0a384922b69f864c5bcc228bed19c8ecbfa69fff2256382" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "auto_impl", - "either", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-database" -version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40000c7d917c865f6c232a78581b78e70c43f52db17282bd1b52d4f0565bc8a2" -dependencies = [ - "alloy-eips", - "revm-bytecode", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-database-interface" -version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ccea7a168cba1196b1e57dd3e22c36047208c135f600f8e58cbe7d49957dba" -dependencies = [ - "auto_impl", - "either", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-handler" -version = "9.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cb09d07e6799823ce5a344f1604236b53fe1a92bacd7122c0b16286f92254c2" -dependencies = [ - "auto_impl", - "derive-where", - "revm-bytecode", - "revm-context", - "revm-context-interface 10.0.1", - "revm-database-interface", - "revm-interpreter 25.0.1", - "revm-precompile", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-inspector" -version = "9.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2770c0d7e9f4f23660dc0b8b954b7a1eee8989ec97f936ebce366c78b6d7b915" -dependencies = [ - "auto_impl", - "either", - "revm-context", - "revm-database-interface", - "revm-handler", - "revm-interpreter 25.0.1", - "revm-primitives", - "revm-state", - "serde", - "serde_json", -] - -[[package]] -name = "revm-inspectors" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a76ba086ca57a718368e46e792a81c5eb7a30366956aa6293adbcec8b1181ce" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-rpc-types-trace", - "alloy-sol-types", - "anstyle", - "boa_engine", - "boa_gc", - "colorchoice", - "revm", - "serde", - "serde_json", - "thiserror 2.0.14", -] - -[[package]] -name = "revm-interpreter" -version = "23.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95c4a9a1662d10b689b66b536ddc2eb1e89f5debfcabc1a2d7b8417a2fa47cd" -dependencies = [ - "revm-bytecode", - "revm-context-interface 8.0.1", - "revm-primitives", - "serde", -] - -[[package]] -name = "revm-interpreter" -version = "25.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c938c0d4d617c285203cad8aba1cefeec383fcff2fdf94a4469f588ab979b5" -dependencies = [ - "revm-bytecode", - "revm-context-interface 10.0.1", - "revm-primitives", - "serde", -] - -[[package]] -name = "revm-precompile" -version = "26.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7bb5e8b92891c5ac9dd8dae157bd1d90aab01973ad4f99d4135d507facc3e7" -dependencies = [ - "ark-bls12-381", - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "arrayref", - "aurora-engine-modexp", - "blst", - "c-kzg", - "cfg-if", - "k256", - "libsecp256k1", - "p256", - "revm-primitives", - "ripemd", - "rug", - "secp256k1 0.31.1", - "sha2 0.10.9", -] - -[[package]] -name = "revm-primitives" -version = "20.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa29d9da06fe03b249b6419b33968ecdf92ad6428e2f012dc57bcd619b5d94e" -dependencies = [ - "alloy-primitives", - "num_enum", - "once_cell", - "serde", -] - -[[package]] -name = "revm-state" -version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d7f39ea56df3bfbb3c81c99b1f028d26f205b6004156baffbf1a4f84b46cfa" -dependencies = [ - "bitflags 2.9.1", - "revm-bytecode", - "revm-primitives", - "serde", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "ringbuffer" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6368f71f205ff9c33c076d170dd56ebf68e8161c733c0caa07a7a5509ed53" - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rlimit" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" -dependencies = [ - "libc", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "rmp" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - -[[package]] -name = "roaring" -version = "0.10.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e8d2cfa184d94d0726d650a9f4a1be7f9b76ac9fdb954219878dc00c1c1e7b" -dependencies = [ - "bytemuck", - "byteorder", -] - -[[package]] -name = "rolling-file" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" -dependencies = [ - "chrono", -] - -[[package]] -name = "rollup-boost" -version = "0.1.0" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "anyhow", - "arbitrary", - "assert_cmd", - "blake3", - "bytes", - "clap", - "ctor", - "dotenvy", - "ed25519-dalek", - "eyre", - "futures", - "hex", - "http", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "jsonrpsee 0.25.1 (git+https://github.com/paritytech/jsonrpsee?rev=f04afa740e55db60dce20d9839758792f035ffff)", - "metrics", - "metrics-derive", - "metrics-exporter-prometheus 0.16.2", - "metrics-util 0.19.1", - "moka", - "op-alloy-consensus 0.17.2", - "op-alloy-rpc-types-engine", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry_sdk", - "parking_lot", - "paste", - "predicates", - "rand 0.9.2", - "reqwest", - "reth-optimism-payload-builder", - "reth-rpc-layer", - "rustls", - "serde", - "serde_json", - "sha2 0.10.9", - "tempfile", - "testcontainers", - "thiserror 2.0.14", - "time", - "tokio", - "tokio-tungstenite", - "tokio-util", - "tower 0.5.2", - "tower-http", - "tracing", - "tracing-opentelemetry", - "tracing-subscriber 0.3.19", - "url", - "vergen", - "vergen-git2", -] - -[[package]] -name = "route-recognizer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" - -[[package]] -name = "rug" -version = "1.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3" -dependencies = [ - "az", - "gmp-mpfr-sys", - "libc", - "libm", -] - -[[package]] -name = "ruint" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" -dependencies = [ - "alloy-rlp", - "arbitrary", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rand 0.9.2", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -dependencies = [ - "rand 0.8.5", -] - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.26", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", -] - -[[package]] -name = "rustls" -version = "0.23.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.3.0", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework 3.3.0", - "security-framework-sys", - "webpki-root-certs 0.26.11", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.103.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "ryu-js" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "secp256k1-sys 0.10.1", - "serde", -] - -[[package]] -name = "secp256k1" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" -dependencies = [ - "bitcoin_hashes", - "rand 0.9.2", - "secp256k1-sys 0.11.0", -] - -[[package]] -name = "secp256k1-sys" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" -dependencies = [ - "cc", -] - -[[package]] -name = "secp256k1-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" -dependencies = [ - "cc", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" -dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "serde_json" -version = "1.0.142" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" -dependencies = [ - "indexmap 2.10.0", - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.10.0", - "schemars 0.9.0", - "schemars 1.0.4", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sha3-asm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shellexpand" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" -dependencies = [ - "dirs", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.14", - "time", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "skeptic" -version = "0.13.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" -dependencies = [ - "bytecount", - "cargo_metadata 0.14.2", - "error-chain", - "glob", - "pulldown-cmark", - "tempfile", - "walkdir", -] - -[[package]] -name = "sketches-ddsketch" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" - -[[package]] -name = "slab" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -dependencies = [ - "arbitrary", - "serde", -] - -[[package]] -name = "snap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "soketto" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures", - "http", - "httparse", - "log", - "rand 0.8.5", - "sha1", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "sptr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "structmeta" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" -dependencies = [ - "proc-macro2", - "quote", - "structmeta-derive", - "syn 2.0.105", -] - -[[package]] -name = "structmeta-derive" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.105", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a985ff4ffd7373e10e0fb048110fb11a162e5a4c47f92ddb8787a6f766b769" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "sysinfo" -version = "0.33.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "windows 0.57.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tar" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "tar-no-std" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9ee8b664c9f1740cd813fea422116f8ba29997bb7c878d1940424889802897" -dependencies = [ - "bitflags 2.9.1", - "log", - "num-traits", -] - -[[package]] -name = "tempfile" -version = "3.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" -dependencies = [ - "fastrand", - "getrandom 0.3.3", - "once_cell", - "rustix 1.0.8", - "windows-sys 0.59.0", -] - -[[package]] -name = "termtree" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" - -[[package]] -name = "testcontainers" -version = "0.23.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a4f01f39bb10fc2a5ab23eb0d888b1e2bb168c157f61a1b98e6c501c639c74" -dependencies = [ - "async-trait", - "bollard", - "bollard-stubs", - "bytes", - "docker_credential", - "either", - "etcetera", - "futures", - "log", - "memchr", - "parse-display", - "pin-project-lite", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.14", - "tokio", - "tokio-stream", - "tokio-tar", - "tokio-util", - "url", -] - -[[package]] -name = "testcontainers-modules" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d43ed4e8f58424c3a2c6c56dbea6643c3c23e8666a34df13c54f0a184e6c707" -dependencies = [ - "testcontainers", -] - -[[package]] -name = "thin-vec" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" -dependencies = [ - "thiserror-impl 2.0.14", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "tikv-jemalloc-ctl" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21f216790c8df74ce3ab25b534e0718da5a1916719771d3fec23315c99e468b" -dependencies = [ - "libc", - "paste", - "tikv-jemalloc-sys", -] - -[[package]] -name = "tikv-jemalloc-sys" -version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "tikv-jemallocator" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" -dependencies = [ - "libc", - "tikv-jemalloc-sys", -] - -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "js-sys", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec 0.10.4", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec 0.11.4", -] - -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.47.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" -dependencies = [ - "backtrace", - "bytes", - "io-uring", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "slab", - "socket2 0.6.0", - "tokio-macros", - "windows-sys 0.59.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tar" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75" -dependencies = [ - "filetime", - "futures-core", - "libc", - "redox_syscall 0.3.5", - "tokio", - "tokio-stream", - "xattr", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" -dependencies = [ - "futures-util", - "log", - "native-tls", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.11", -] - -[[package]] -name = "tokio-util" -version = "0.7.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite", - "slab", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.10.0", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "tonic" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" -dependencies = [ - "async-stream", - "async-trait", - "axum 0.7.9", - "base64 0.22.1", - "bytes", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost", - "socket2 0.5.10", - "tokio", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "hdrhistogram", - "indexmap 2.10.0", - "pin-project-lite", - "slab", - "sync_wrapper", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" -dependencies = [ - "async-compression", - "base64 0.22.1", - "bitflags 2.9.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "http-range-header", - "httpdate", - "iri-string", - "mime", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "tokio", - "tokio-util", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", - "uuid", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror 1.0.69", - "time", - "tracing-subscriber 0.3.19", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "tracing-journald" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0b4143302cf1022dac868d521e36e8b27691f72c84b3311750d5188ebba657" -dependencies = [ - "libc", - "tracing-core", - "tracing-subscriber 0.3.19", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-logfmt" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" -dependencies = [ - "time", - "tracing", - "tracing-core", - "tracing-subscriber 0.3.19", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721f2d2569dce9f3dfbbddee5906941e953bfcdf736a62da3377f5751650cc36" -dependencies = [ - "js-sys", - "once_cell", - "opentelemetry", - "opentelemetry_sdk", - "smallvec", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber 0.3.19", - "web-time", -] - -[[package]] -name = "tracing-serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "tree_hash" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee44f4cef85f88b4dea21c0b1f58320bdf35715cf56d840969487cff00613321" -dependencies = [ - "alloy-primitives", - "ethereum_hashing", - "ethereum_ssz", - "smallvec", - "typenum", -] - -[[package]] -name = "tree_hash_derive" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bee2ea1551f90040ab0e34b6fb7f2fa3bad8acc925837ac654f2c78a13e3089" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "triehash" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1631b201eb031b563d2e85ca18ec8092508e262a3196ce9bd10a67ec87b9f5c" -dependencies = [ - "hash-db", - "rlp", -] - -[[package]] -name = "triomphe" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "native-tls", - "rand 0.9.2", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 2.0.14", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "uint" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-truncate" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" -dependencies = [ - "itertools 0.13.0", - "unicode-segmentation", - "unicode-width 0.1.14", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unsigned-varint" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" -dependencies = [ - "getrandom 0.3.3", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vergen" -version = "9.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" -dependencies = [ - "anyhow", - "cargo_metadata 0.19.2", - "derive_builder", - "regex", - "rustversion", - "time", - "vergen-lib", -] - -[[package]] -name = "vergen-git2" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f6ee511ec45098eabade8a0750e76eec671e7fb2d9360c563911336bea9cac1" -dependencies = [ - "anyhow", - "derive_builder", - "git2", - "rustversion", - "time", - "vergen", - "vergen-lib", -] - -[[package]] -name = "vergen-lib" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" -dependencies = [ - "anyhow", - "derive_builder", - "rustversion", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "visibility" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.105", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmtimer" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d49b5d6c64e8558d9b1b065014426f35c18de636895d24893dbbd329743446" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-root-certs" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" -dependencies = [ - "webpki-root-certs 1.0.2", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.2", -] - -[[package]] -name = "webpki-roots" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - -[[package]] -name = "widestring" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", - "windows-link", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link", -] - -[[package]] -name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.3", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winnow" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "ws_stream_wasm" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.1", - "send_wrapper 0.6.0", - "thiserror 2.0.14", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "xattr" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" -dependencies = [ - "libc", - "rustix 1.0.8", -] - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.7.5", - "zerofrom", -] - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.8.0", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", - "synstructure", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke 0.8.0", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke 0.7.5", - "zerofrom", - "zerovec-derive 0.10.3", -] - -[[package]] -name = "zerovec" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" -dependencies = [ - "yoke 0.8.0", - "zerofrom", - "zerovec-derive 0.11.1", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.105", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/crates/flashblocks-node/tests/p2p.rs b/crates/flashblocks-node/tests/p2p.rs deleted file mode 100644 index 80242a13..00000000 --- a/crates/flashblocks-node/tests/p2p.rs +++ /dev/null @@ -1,609 +0,0 @@ -use alloy_consensus::Receipt; -use alloy_genesis::Genesis; -use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; -use alloy_provider::{Provider, RootProvider}; -use alloy_rpc_client::RpcClient; -use alloy_rpc_types_engine::PayloadId; -use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol, PeerMsg}; -use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, Metadata}; -use op_alloy_consensus::{OpPooledTransaction, OpTxEnvelope}; -use reth_eth_wire::BasicNetworkPrimitives; -use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; -use reth_network::{NetworkHandle, Peers, PeersInfo}; -use reth_network_peers::{NodeRecord, PeerId}; -use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; -use reth_node_core::{ - args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}, - exit::NodeExitFuture, -}; -use reth_optimism_chainspec::OpChainSpecBuilder; -use reth_optimism_node::{OpNode, args::RollupArgs}; -use reth_optimism_primitives::{OpPrimitives, OpReceipt}; -use reth_provider::providers::BlockchainProvider; -use reth_tasks::{TaskExecutor, TaskManager}; -use reth_tracing::tracing_subscriber::{self, util::SubscriberInitExt}; -use rollup_boost::{ - Authorization, Authorized, AuthorizedMsg, AuthorizedPayload, ExecutionPayloadBaseV1, - ExecutionPayloadFlashblockDeltaV1, FlashblocksP2PMsg, FlashblocksPayloadV1, StartPublish, -}; -use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; -use tracing::{Dispatch, info}; - -type Network = NetworkHandle< - BasicNetworkPrimitives< - OpPrimitives, - OpPooledTransaction, - reth_network::types::NewBlock>, - >, ->; - -pub struct NodeContext { - p2p_handle: FlashblocksHandle, - pub local_node_record: NodeRecord, - http_api_addr: SocketAddr, - _node_exit_future: NodeExitFuture, - _node: Box, - network_handle: Network, -} - -impl NodeContext { - pub async fn provider(&self) -> eyre::Result { - let url = format!("http://{}", self.http_api_addr); - let client = RpcClient::builder().http(url.parse()?); - - Ok(RootProvider::new(client)) - } -} - -fn init_tracing(filter: &str) -> tracing::subscriber::DefaultGuard { - let sub = tracing_subscriber::fmt() - .with_env_filter(filter) - .with_target(false) - .with_target(false) - .without_time() - .finish(); - - Dispatch::new(sub).set_default() -} - -async fn setup_node( - exec: TaskExecutor, - authorizer_sk: SigningKey, - builder_sk: SigningKey, - peers: Vec<(PeerId, SocketAddr)>, -) -> eyre::Result { - let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); - let chain_spec = Arc::new( - OpChainSpecBuilder::base_mainnet() - .genesis(genesis) - .ecotone_activated() - .build(), - ); - - let network_config = NetworkArgs { - discovery: DiscoveryArgs { - disable_discovery: true, - ..DiscoveryArgs::default() - }, - ..NetworkArgs::default() - }; - - // Use with_unused_ports() to let Reth allocate random ports and avoid port collisions - let node_config = NodeConfig::new(chain_spec.clone()) - .with_network(network_config.clone()) - .with_rpc(RpcServerArgs::default().with_unused_ports().with_http()) - .with_unused_ports(); - - let node = OpNode::new(RollupArgs::default()); - - let p2p_handle = FlashblocksHandle::new(authorizer_sk.verifying_key(), Some(builder_sk)); - let p2p_handle_clone = p2p_handle.clone(); - - let NodeHandle { - node, - node_exit_future, - } = NodeBuilder::new(node_config.clone()) - .testing_node(exec.clone()) - .with_types_and_provider::>() - .with_components(node.components_builder()) - .with_add_ons(node.add_ons()) - .extend_rpc_modules(move |ctx| { - // We are not going to use the websocket connection to send payloads so we use - // a dummy url. - let flashblocks_overlay = FlashblocksOverlay::new(p2p_handle_clone, chain_spec); - flashblocks_overlay.clone().start()?; - - let eth_api = ctx.registry.eth_api().clone(); - let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay.clone()); - - ctx.modules.replace_configured(api_ext.into_rpc())?; - - Ok(()) - }) - .launch() - .await?; - - let p2p_protocol = FlashblocksP2PProtocol { - network: node.network.clone(), - handle: p2p_handle.clone(), - }; - - node.network - .add_rlpx_sub_protocol(p2p_protocol.into_rlpx_sub_protocol()); - - for (peer_id, addr) in peers { - // If a trusted peer is provided, add it to the network - node.network.add_peer(peer_id, addr); - } - - let http_api_addr = node - .rpc_server_handle() - .http_local_addr() - .ok_or_else(|| eyre::eyre!("Failed to get http api address"))?; - - let network_handle = node.network.clone(); - let local_node_record = network_handle.local_node_record(); - - Ok(NodeContext { - p2p_handle, - local_node_record, - http_api_addr, - _node_exit_future: node_exit_future, - _node: Box::new(node), - network_handle, - }) -} - -fn base_payload(block_number: u64, payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { - FlashblocksPayloadV1 { - payload_id, - index, - base: Some(ExecutionPayloadBaseV1 { - parent_beacon_block_root: B256::default(), - parent_hash: B256::default(), - fee_recipient: Address::ZERO, - prev_randao: B256::default(), - block_number, - gas_limit: 0, - timestamp: 0, - extra_data: Bytes::new(), - base_fee_per_gas: U256::ZERO, - }), - diff: ExecutionPayloadFlashblockDeltaV1::default(), - metadata: serde_json::to_value(Metadata { - block_number: 1, - receipts: HashMap::default(), - new_account_balances: HashMap::default(), - }) - .unwrap(), - } -} - -const TEST_ADDRESS: Address = address!("0x1234567890123456789012345678901234567890"); -const PENDING_BALANCE: u64 = 4600; - -const TX1_HASH: TxHash = - b256!("0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548"); -const TX2_HASH: TxHash = - b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); - -fn next_payload(payload_id: PayloadId, index: u64) -> FlashblocksPayloadV1 { - let tx1 = Bytes::from_str("0x7ef8f8a042a8ae5ec231af3d0f90f68543ec8bca1da4f7edd712d5b51b490688355a6db794deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000044d000a118b00000000000000040000000067cb7cb0000000000077dbd4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014edd27304108914dd6503b19b9eeb9956982ef197febbeeed8a9eac3dbaaabdf000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3").unwrap(); - let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); - - // Send another test flashblock payload - FlashblocksPayloadV1 { - payload_id, - index, - base: None, - diff: ExecutionPayloadFlashblockDeltaV1 { - state_root: B256::default(), - receipts_root: B256::default(), - gas_used: 0, - block_hash: B256::default(), - transactions: vec![tx1, tx2], - withdrawals: Vec::new(), - logs_bloom: Default::default(), - withdrawals_root: Default::default(), - }, - metadata: serde_json::to_value(Metadata { - block_number: 1, - receipts: { - let mut receipts = HashMap::default(); - receipts.insert( - TX1_HASH.to_string(), // transaction hash as string - OpReceipt::Legacy(Receipt { - status: true.into(), - cumulative_gas_used: 21000, - logs: vec![], - }), - ); - receipts.insert( - TX2_HASH.to_string(), // transaction hash as string - OpReceipt::Legacy(Receipt { - status: true.into(), - cumulative_gas_used: 45000, - logs: vec![], - }), - ); - receipts - }, - new_account_balances: { - let mut map = HashMap::default(); - map.insert( - TEST_ADDRESS.to_string(), - format!("0x{:x}", U256::from(PENDING_BALANCE)), - ); - map - }, - }) - .unwrap(), - } -} - -async fn setup_nodes(n: u8) -> eyre::Result<(Vec, SigningKey)> { - let mut nodes = Vec::new(); - let mut peers = Vec::new(); - let tasks = Box::leak(Box::new(TaskManager::current())); - let exec = Box::leak(Box::new(tasks.executor())); - let authorizer = SigningKey::from_bytes(&[0; 32]); - - for i in 0..n { - let builder = SigningKey::from_bytes(&[(i + 1) % n; 32]); - let node = setup_node(exec.clone(), authorizer.clone(), builder, peers.clone()).await?; - let enr = node.local_node_record; - peers.push((enr.id, enr.tcp_addr())); - nodes.push(node); - } - - tokio::time::sleep(tokio::time::Duration::from_millis(6000)).await; - - Ok((nodes, authorizer)) -} - -#[tokio::test] -async fn test_double_failover() -> eyre::Result<()> { - let _tracing = init_tracing("warn,flashblocks=trace"); - - let (nodes, authorizer) = setup_nodes(3).await?; - - let mut publish_flashblocks = nodes[0].p2p_handle.ctx.flashblock_tx.subscribe(); - tokio::spawn(async move { - while let Ok(payload) = publish_flashblocks.recv().await { - println!("\n////////////////////////////////////////////////////////////////////\n"); - println!( - "Received flashblock, payload_id: {}, index: {}", - payload.payload_id, payload.index - ); - println!("\n////////////////////////////////////////////////////////////////////\n"); - } - }); - - let latest_block = nodes[0] - .provider() - .await? - .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) - .await? - .expect("latest block expected"); - assert_eq!(latest_block.number(), 0); - - // Querying pending block when it does not exists yet - let pending_block = nodes[0] - .provider() - .await? - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await?; - assert!(pending_block.is_none()); - - let payload_0 = base_payload(0, PayloadId::new([0; 8]), 0); - let authorization_0 = Authorization::new( - payload_0.payload_id, - 0, - &authorizer, - nodes[0].p2p_handle.builder_sk()?.verifying_key(), - ); - let msg = payload_0.clone(); - let authorized_0 = - AuthorizedPayload::new(nodes[0].p2p_handle.builder_sk()?, authorization_0, msg); - nodes[0].p2p_handle.start_publishing(authorization_0)?; - nodes[0].p2p_handle.publish_new(authorized_0).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - let payload_1 = next_payload(payload_0.payload_id, 1); - let authorization_1 = Authorization::new( - payload_1.payload_id, - 0, - &authorizer, - nodes[1].p2p_handle.builder_sk()?.verifying_key(), - ); - let authorized_1 = AuthorizedPayload::new( - nodes[1].p2p_handle.builder_sk()?, - authorization_1, - payload_1.clone(), - ); - nodes[1].p2p_handle.start_publishing(authorization_1)?; - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - nodes[1].p2p_handle.publish_new(authorized_1).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - // Send a new block, this time from node 1 - let payload_2 = next_payload(payload_0.payload_id, 2); - let msg = payload_2.clone(); - let authorization_2 = Authorization::new( - payload_2.payload_id, - 0, - &authorizer, - nodes[2].p2p_handle.builder_sk()?.verifying_key(), - ); - let authorized_2 = AuthorizedPayload::new( - nodes[2].p2p_handle.builder_sk()?, - authorization_2, - msg.clone(), - ); - nodes[2].p2p_handle.start_publishing(authorization_2)?; - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - nodes[2].p2p_handle.publish_new(authorized_2).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - Ok(()) -} - -#[tokio::test] -async fn test_force_race_condition() -> eyre::Result<()> { - let _tracing = init_tracing("warn,flashblocks=trace"); - - let (nodes, authorizer) = setup_nodes(3).await?; - - let mut publish_flashblocks = nodes[0].p2p_handle.ctx.flashblock_tx.subscribe(); - tokio::spawn(async move { - while let Ok(payload) = publish_flashblocks.recv().await { - println!("\n////////////////////////////////////////////////////////////////////\n"); - println!( - "Received flashblock, payload_id: {}, index: {}", - payload.payload_id, payload.index - ); - println!("\n////////////////////////////////////////////////////////////////////\n"); - } - }); - - let latest_block = nodes[0] - .provider() - .await? - .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) - .await? - .expect("latest block expected"); - assert_eq!(latest_block.number(), 0); - - // Querying pending block when it does not exists yet - let pending_block = nodes[0] - .provider() - .await? - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await?; - assert!(pending_block.is_none()); - - let payload_0 = base_payload(0, PayloadId::new([0; 8]), 0); - info!("Sending payload 0, index 0"); - let authorization = Authorization::new( - payload_0.payload_id, - 0, - &authorizer, - nodes[0].p2p_handle.builder_sk()?.verifying_key(), - ); - let msg = payload_0.clone(); - let authorized = AuthorizedPayload::new(nodes[0].p2p_handle.builder_sk()?, authorization, msg); - nodes[0].p2p_handle.start_publishing(authorization)?; - nodes[0].p2p_handle.publish_new(authorized).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - // Query pending block after sending the base payload with an empty delta - let pending_block = nodes[1] - .provider() - .await? - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(pending_block.number(), 0); - assert_eq!(pending_block.transactions.hashes().len(), 0); - - info!("Sending payload 0, index 1"); - let payload_1 = next_payload(payload_0.payload_id, 1); - let authorization = Authorization::new( - payload_1.payload_id, - 0, - &authorizer, - nodes[0].p2p_handle.builder_sk()?.verifying_key(), - ); - let authorized = AuthorizedPayload::new( - nodes[0].p2p_handle.builder_sk()?, - authorization, - payload_1.clone(), - ); - nodes[0].p2p_handle.publish_new(authorized).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - // Query pending block after sending the second payload with two transactions - let block = nodes[1] - .provider() - .await? - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(block.number(), 0); - assert_eq!(block.transactions.hashes().len(), 2); - - // Send a new block, this time from node 1 - let payload_2 = base_payload(1, PayloadId::new([1; 8]), 0); - info!("Sending payload 1, index 0"); - let authorization_1 = Authorization::new( - payload_2.payload_id, - 1, - &authorizer, - nodes[1].p2p_handle.builder_sk()?.verifying_key(), - ); - let authorization_2 = Authorization::new( - payload_2.payload_id, - 1, - &authorizer, - nodes[2].p2p_handle.builder_sk()?.verifying_key(), - ); - let msg = payload_2.clone(); - let authorized_1 = AuthorizedPayload::new( - nodes[1].p2p_handle.builder_sk()?, - authorization_1, - msg.clone(), - ); - nodes[1].p2p_handle.start_publishing(authorization_1)?; - nodes[2].p2p_handle.start_publishing(authorization_2)?; - // Wait for clearance to go through - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - tracing::error!( - "{}", - nodes[1] - .p2p_handle - .publish_new(authorized_1.clone()) - .unwrap_err() - ); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - nodes[2].p2p_handle.stop_publishing()?; - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - nodes[1].p2p_handle.publish_new(authorized_1)?; - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - Ok(()) -} - -#[tokio::test] -async fn test_get_block_by_number_pending() -> eyre::Result<()> { - let _tracing = init_tracing("warn,flashblocks=trace"); - - let (nodes, authorizer) = setup_nodes(1).await?; - - let provider = nodes[0].provider().await?; - - let latest_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) - .await? - .expect("latest block expected"); - assert_eq!(latest_block.number(), 0); - - // Querying pending block when it does not exists yet - let pending_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await?; - assert!(pending_block.is_none()); - - let payload_id = PayloadId::new([0; 8]); - let base_payload = base_payload(0, payload_id, 0); - let authorization = Authorization::new( - base_payload.payload_id, - 0, - &authorizer, - nodes[0].p2p_handle.builder_sk()?.verifying_key(), - ); - let authorized = AuthorizedPayload::new( - nodes[0].p2p_handle.builder_sk()?, - authorization, - base_payload, - ); - nodes[0].p2p_handle.start_publishing(authorization)?; - nodes[0].p2p_handle.publish_new(authorized).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - // Query pending block after sending the base payload with an empty delta - let pending_block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(pending_block.number(), 0); - assert_eq!(pending_block.transactions.hashes().len(), 0); - - let next_payload = next_payload(payload_id, 1); - let authorization = Authorization::new( - next_payload.payload_id, - 0, - &authorizer, - nodes[0].p2p_handle.builder_sk()?.verifying_key(), - ); - let authorized = AuthorizedPayload::new( - nodes[0].p2p_handle.builder_sk()?, - authorization, - next_payload, - ); - nodes[0].p2p_handle.start_publishing(authorization)?; - nodes[0].p2p_handle.publish_new(authorized).unwrap(); - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - - // Query pending block after sending the second payload with two transactions - let block = provider - .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) - .await? - .expect("pending block expected"); - - assert_eq!(block.number(), 0); - assert_eq!(block.transactions.hashes().len(), 2); - - Ok(()) -} - -#[tokio::test] -async fn test_peer_reputation() -> eyre::Result<()> { - let _tracing = init_tracing("warn,flashblocks=trace"); - - let (nodes, _authorizer) = setup_nodes(2).await?; - - let mut publish_flashblocks = nodes[0].p2p_handle.ctx.flashblock_tx.subscribe(); - tokio::spawn(async move { - while let Ok(payload) = publish_flashblocks.recv().await { - println!("\n////////////////////////////////////////////////////////////////////\n"); - println!( - "Received flashblock, payload_id: {}, index: {}", - payload.payload_id, payload.index - ); - println!("\n////////////////////////////////////////////////////////////////////\n"); - } - }); - - let invalid_authorizer = SigningKey::from_bytes(&[99; 32]); - - let payload_0 = base_payload(0, PayloadId::new([0; 8]), 0); - info!("Sending bad authorization"); - let authorization = Authorization::new( - payload_0.payload_id, - 0, - &invalid_authorizer, - nodes[0].p2p_handle.builder_sk()?.verifying_key(), - ); - - let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); - let authorized_payload = Authorized::new( - nodes[0].p2p_handle.builder_sk()?, - authorization, - authorized_msg, - ); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); - - let peers = nodes[1].network_handle.get_all_peers().await?; - let peer_0 = &peers[0].remote_id; - - for _ in 0..100 { - nodes[0].p2p_handle.ctx.peer_tx.send(peer_msg.clone()).ok(); - tokio::time::sleep(tokio::time::Duration::from_millis(10)).await; - let rep_0 = nodes[1].network_handle.reputation_by_id(*peer_0).await?; - if let Some(rep) = rep_0 { - assert!(rep < 0, "Peer reputation should be negative"); - } - } - - // Assert that the peer is banned - assert!(nodes[1].network_handle.get_all_peers().await?.is_empty()); - - Ok(()) -} diff --git a/crates/flashblocks-p2p/.gitignore b/crates/flashblocks-p2p/.gitignore deleted file mode 100644 index eb5a316c..00000000 --- a/crates/flashblocks-p2p/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target diff --git a/crates/flashblocks-p2p/Cargo.toml b/crates/flashblocks-p2p/Cargo.toml deleted file mode 100644 index 60324f48..00000000 --- a/crates/flashblocks-p2p/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "flashblocks-p2p" -version = "0.1.0" -edition = "2024" -license = "MIT" - -[dependencies] -reth.workspace = true -reth-optimism-primitives.workspace = true -reth-ethereum = { workspace = true, features = ["node", "network", "cli"] } -reth-eth-wire = { workspace = true } -reth-network = { workspace = true } -reth-node-api = { workspace = true } -reth-node-builder = { workspace = true } -reth-provider = { workspace = true } -reth-transaction-pool = { workspace = true } - -ed25519-dalek = { version = "2", features = ["serde"] } -blake3 = "1" # fast hashing for payload IDs -serde = { version = "1", features = ["derive"] } - -metrics.workspace = true -tokio = { workspace = true } -tokio-stream = { workspace = true } -eyre.workspace = true -futures = { workspace = true } -clap.workspace = true -tracing.workspace = true -alloy-primitives.workspace = true -alloy-rlp.workspace = true -serde_json = "1.0" -thiserror = "2" -parking_lot = "0.12" - - -rollup-boost = { path = "../rollup-boost" } - -[dev-dependencies] -reth-op.workspace = true diff --git a/crates/flashblocks-p2p/src/lib.rs b/crates/flashblocks-p2p/src/lib.rs deleted file mode 100644 index c6479e8b..00000000 --- a/crates/flashblocks-p2p/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod net; -pub mod protocol; diff --git a/crates/flashblocks-p2p/src/net/mod.rs b/crates/flashblocks-p2p/src/net/mod.rs deleted file mode 100644 index d8cf9b47..00000000 --- a/crates/flashblocks-p2p/src/net/mod.rs +++ /dev/null @@ -1,68 +0,0 @@ -use reth::chainspec::Hardforks; -use reth_eth_wire::NetPrimitivesFor; -use reth_ethereum::network::api::FullNetwork; -use reth_network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; -use reth_node_api::{PrimitivesTy, TxTy}; -use reth_node_builder::{ - BuilderContext, - components::NetworkBuilder, - node::{FullNodeTypes, NodeTypes}, -}; -use reth_transaction_pool::{PoolTransaction, TransactionPool}; - -use crate::protocol::handler::{ - FlashblocksHandle, FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, -}; - -#[derive(Debug)] -pub struct FlashblocksNetworkBuilder { - inner: T, - flashblocks_p2p_handle: Option, -} - -impl FlashblocksNetworkBuilder { - pub fn new(inner: T, flashblocks_p2p_handle: FlashblocksHandle) -> Self { - Self { - inner, - flashblocks_p2p_handle: Some(flashblocks_p2p_handle), - } - } - - pub fn disabled(inner: T) -> Self { - Self { - inner, - flashblocks_p2p_handle: None, - } - } -} - -impl NetworkBuilder for FlashblocksNetworkBuilder -where - T: NetworkBuilder, - Node: FullNodeTypes>, - Pool: TransactionPool>> - + Unpin - + 'static, - Network: FlashblocksP2PNetworkHandle - + NetworkProtocols - + FullNetwork>>, -{ - type Network = T::Network; - - async fn build_network( - self, - ctx: &BuilderContext, - pool: Pool, - ) -> eyre::Result { - let handle = self.inner.build_network(ctx, pool).await?; - if let Some(flashblocks_handle) = self.flashblocks_p2p_handle { - let flashblocks_rlpx = FlashblocksP2PProtocol { - network: handle.clone(), - handle: flashblocks_handle, - }; - handle.add_rlpx_sub_protocol(flashblocks_rlpx.into_rlpx_sub_protocol()); - } - - Ok(handle) - } -} diff --git a/crates/flashblocks-p2p/src/protocol/connection.rs b/crates/flashblocks-p2p/src/protocol/connection.rs deleted file mode 100644 index 7ed21deb..00000000 --- a/crates/flashblocks-p2p/src/protocol/connection.rs +++ /dev/null @@ -1,520 +0,0 @@ -use crate::protocol::handler::{ - FlashblocksP2PNetworkHandle, FlashblocksP2PProtocol, MAX_FLASHBLOCK_INDEX, PeerMsg, - PublishingStatus, -}; -use alloy_primitives::bytes::BytesMut; -use futures::{Stream, StreamExt}; -use metrics::gauge; -use reth::payload::PayloadId; -use reth_ethereum::network::{api::PeerId, eth_wire::multiplex::ProtocolConnection}; -use reth_network::types::ReputationChangeKind; -use rollup_boost::{ - Authorized, AuthorizedPayload, FlashblocksP2PMsg, FlashblocksPayloadV1, StartPublish, - StopPublish, -}; -use std::{ - pin::Pin, - task::{Context, Poll, ready}, -}; -use tokio_stream::wrappers::BroadcastStream; -use tracing::trace; - -/// Represents a single P2P connection for the flashblocks protocol. -/// -/// This struct manages the bidirectional communication with a single peer in the flashblocks -/// P2P network. It handles incoming messages from the peer, validates and processes them, -/// and also streams outgoing messages that need to be broadcast. -/// -/// The connection implements the `Stream` trait to provide outgoing message bytes that -/// should be sent to the connected peer over the underlying protocol connection. -pub struct FlashblocksConnection { - /// The flashblocks protocol handler that manages the overall protocol state. - protocol: FlashblocksP2PProtocol, - /// The underlying protocol connection for sending and receiving raw bytes. - conn: ProtocolConnection, - /// The unique identifier of the connected peer. - peer_id: PeerId, - /// Receiver for peer messages to be sent to all peers. - /// We send bytes over this stream to avoid repeatedly having to serialize the payloads. - peer_rx: BroadcastStream, - /// Most recent payload ID received from this peer to track payload transitions. - payload_id: PayloadId, - /// A list of flashblock indices that we have already received from - /// this peer for the current payload, used to detect duplicate messages. - received: Vec, -} - -impl FlashblocksConnection { - /// Creates a new `FlashblocksConnection` instance. - /// - /// # Arguments - /// * `protocol` - The flashblocks protocol handler managing the connection. - /// * `conn` - The underlying protocol connection for sending and receiving messages. - /// * `peer_id` - The unique identifier of the connected peer. - /// * `peer_rx` - Receiver for peer messages to be sent to all peers. - pub fn new( - protocol: FlashblocksP2PProtocol, - conn: ProtocolConnection, - peer_id: PeerId, - peer_rx: BroadcastStream, - ) -> Self { - gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).increment(1); - - Self { - protocol, - conn, - peer_id, - peer_rx, - payload_id: PayloadId::default(), - received: Vec::new(), - } - } -} - -impl Drop for FlashblocksConnection { - fn drop(&mut self) { - gauge!("p2p.flashblocks_peers", "capability" => FlashblocksP2PProtocol::::capability().to_string()).decrement(1); - } -} - -impl Stream for FlashblocksConnection { - type Item = BytesMut; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.get_mut(); - - loop { - // Check if there are any flashblocks ready to broadcast to our peers. - if let Poll::Ready(Some(res)) = this.peer_rx.poll_next_unpin(cx) { - match res { - Ok(peer_msg) => { - match peer_msg { - PeerMsg::FlashblocksPayloadV1(( - payload_id, - flashblock_index, - bytes, - )) => { - // Check if this flashblock actually originated from this peer. - if this.payload_id != payload_id - || this.received.get(flashblock_index) != Some(&true) - { - trace!( - target: "flashblocks::p2p", - peer_id = %this.peer_id, - %payload_id, - %flashblock_index, - "Broadcasting `FlashblocksPayloadV1` message to peer" - ); - return Poll::Ready(Some(bytes)); - } - } - PeerMsg::StartPublishing(bytes_mut) => { - trace!( - target: "flashblocks::p2p", - peer_id = %this.peer_id, - "Broadcasting `StartPublishing` to peer" - ); - return Poll::Ready(Some(bytes_mut)); - } - PeerMsg::StopPublishing(bytes_mut) => { - trace!( - target: "flashblocks::p2p", - peer_id = %this.peer_id, - "Broadcasting `StopPublishing` to peer" - ); - return Poll::Ready(Some(bytes_mut)); - } - } - } - Err(error) => { - tracing::error!( - target: "flashblocks::p2p", - %error, - "failed to receive flashblocks message from peer_rx" - ); - } - } - } - - // Check if there are any messages from the peer. - let Some(buf) = ready!(this.conn.poll_next_unpin(cx)) else { - return Poll::Ready(None); - }; - - let msg = match FlashblocksP2PMsg::decode(&mut &buf[..]) { - Ok(msg) => msg, - Err(error) => { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %this.peer_id, - %error, - "failed to decode flashblocks message from peer", - ); - this.protocol - .network - .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); - return Poll::Ready(None); - } - }; - - match msg { - FlashblocksP2PMsg::Authorized(authorized) => { - if Ok(authorized.authorization.builder_vk) - == this.protocol.handle.builder_sk().map(|s| s.verifying_key()) - { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %this.peer_id, - "received our own message from peer", - ); - this.protocol - .network - .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); - continue; - } - - if let Err(error) = authorized.verify(this.protocol.handle.ctx.authorizer_vk) { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %this.peer_id, - %error, - "failed to verify flashblock", - ); - this.protocol - .network - .reputation_change(this.peer_id, ReputationChangeKind::BadMessage); - continue; - } - - match &authorized.msg { - rollup_boost::AuthorizedMsg::FlashblocksPayloadV1(_) => { - this.handle_flashblocks_payload_v1(authorized.into_unchecked()); - } - rollup_boost::AuthorizedMsg::StartPublish(_) => { - this.handle_start_publish(authorized.into_unchecked()); - } - rollup_boost::AuthorizedMsg::StopPublish(_) => { - this.handle_stop_publish(authorized.into_unchecked()); - } - } - } - } - } - } -} - -impl FlashblocksConnection { - /// Handles incoming flashblock payload messages from a peer. - /// - /// This method validates the flashblock payload, checks for duplicates and ordering, - /// updates the active publisher tracking, and forwards valid payloads for processing. - /// It also manages peer reputation based on message validity and prevents spam attacks. - /// - /// # Arguments - /// * `authorized_payload` - The authorized flashblock payload received from the peer - /// - /// # Behavior - /// - Validates timestamp to prevent replay attacks - /// - Tracks payload transitions and resets duplicate detection - /// - Prevents duplicate flashblock spam from the same peer - /// - Updates active publisher information from base payload data - /// - Forwards valid payloads to the protocol handler for processing - fn handle_flashblocks_payload_v1( - &mut self, - authorized_payload: AuthorizedPayload, - ) { - let mut state = self.protocol.handle.state.lock(); - let authorization = &authorized_payload.authorized.authorization; - let msg = authorized_payload.msg(); - - // check if this is an old payload - if authorization.timestamp < state.payload_timestamp { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - timestamp = authorization.timestamp, - "received flashblock with outdated timestamp", - ); - self.protocol - .network - .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); - return; - } - - // Check if this is a new payload from this peer - if self.payload_id != msg.payload_id { - self.payload_id = msg.payload_id; - self.received.fill(false); - } - - // Check if the payload index is within the allowed range - if msg.index as usize > MAX_FLASHBLOCK_INDEX { - tracing::error!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - index = msg.index, - payload_id = %msg.payload_id, - max_index = MAX_FLASHBLOCK_INDEX, - "Received flashblocks payload with index exceeding maximum" - ); - return; - } - - // Check if this peer is spamming us with the same payload index - let len = self.received.len(); - self.received - .resize_with(len.max(msg.index as usize + 1), || false); - if self.received[msg.index as usize] { - // We've already seen this index from this peer. - // They could be trying to DOS us. - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - payload_id = %msg.payload_id, - index = msg.index, - "received duplicate flashblock from peer", - ); - self.protocol - .network - .reputation_change(self.peer_id, ReputationChangeKind::AlreadySeenTransaction); - return; - } - self.received[msg.index as usize] = true; - - state.publishing_status.send_modify(|status| { - let active_publishers = match status { - PublishingStatus::Publishing { .. } => { - // We are currently building, so we should not be seeing any new flashblocks - // over the p2p network. - tracing::error!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "received flashblock while already building", - ); - return; - } - PublishingStatus::WaitingToPublish { - active_publishers, .. - } => active_publishers, - PublishingStatus::NotPublishing { active_publishers } => active_publishers, - }; - - // Update the list of active publishers - if let Some((_, timestamp)) = active_publishers - .iter_mut() - .find(|(publisher, _)| *publisher == authorization.builder_vk) - { - // This is an existing publisher, we should update their block number - *timestamp = authorization.timestamp; - } else { - // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_vk, authorization.timestamp)); - } - }); - - self.protocol - .handle - .ctx - .publish(&mut state, authorized_payload); - } - - /// Handles incoming `StartPublish` messages from a peer. - /// - /// TODO: handle propogating this if we care. For now we assume direct peering. - /// - /// # Arguments - /// * `authorized_payload` - The authorized `StartPublish` message received from the peer - /// - /// # Behavior - /// - Validates the timestamp to prevent replay attacks - /// - Updates the publishing status to reflect the new publisher - /// - If we are currently publishing, sends a `StopPublish` message to ourselves - /// - If we are waiting to publish, updates the list of active publishers - /// - If we are not publishing, adds the new publisher to the list of active publishers - fn handle_start_publish(&mut self, authorized_payload: AuthorizedPayload) { - let state = self.protocol.handle.state.lock(); - let Ok(builder_sk) = self.protocol.handle.builder_sk() else { - return; - }; - let authorization = &authorized_payload.authorized.authorization; - - // Check if the request is expired for dos protection. - // It's important to ensure that this `StartPublish` request - // is very recent, or it could be used in a replay attack. - if state.payload_timestamp > authorization.timestamp { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - current_timestamp = state.payload_timestamp, - timestamp = authorized_payload.authorized.authorization.timestamp, - "received initiate build request with outdated timestamp", - ); - self.protocol - .network - .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); - return; - } - - state.publishing_status.send_modify(|status| { - let active_publishers = match status { - PublishingStatus::Publishing { - authorization: our_authorization, - } => { - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StartPublish over p2p, stopping publishing flashblocks" - ); - - let authorized = - Authorized::new(builder_sk, *our_authorization, StopPublish.into()); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized); - let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.protocol.handle.ctx.peer_tx.send(peer_msg).ok(); - - *status = PublishingStatus::NotPublishing { - active_publishers: vec![( - our_authorization.builder_vk, - authorization.timestamp, - )], - }; - - return; - } - PublishingStatus::WaitingToPublish { - active_publishers, .. - } => { - // We are currently waiting to build, but someone else is requesting to build - // This could happen during a double failover. - // We have a potential race condition here so we'll just wait for the - // build request override to kick in next block. - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StartPublish over p2p while already waiting to publish, ignoring", - ); - active_publishers - } - PublishingStatus::NotPublishing { active_publishers } => active_publishers, - }; - - if let Some((_, timestamp)) = active_publishers - .iter_mut() - .find(|(publisher, _)| *publisher == authorization.builder_vk) - { - // This is an existing publisher, we should update their block number - *timestamp = authorization.timestamp; - } else { - // This is a new publisher, we should add them to the list of active publishers - active_publishers.push((authorization.builder_vk, authorization.timestamp)); - } - }); - } - - /// Handles incoming `StopPublish` messages from a peer. - /// - /// TODO: handle propogating this if we care. For now we assume direct peering. - /// - /// # Arguments - /// * `authorized_payload` - The authorized `StopPublish` message received from the peer - /// - /// # Behavior - /// - Validates the timestamp to prevent replay attacks - /// - Updates the publishing status based on the current state - /// - If we are currently publishing, logs a warning - /// - If we are waiting to publish, removes the publisher from the list of active publishers and checks if we can start publishing - /// - If we are not publishing, removes the publisher from the list of active publishers - fn handle_stop_publish(&mut self, authorized_payload: AuthorizedPayload) { - let state = self.protocol.handle.state.lock(); - let authorization = &authorized_payload.authorized.authorization; - - // Check if the request is expired for dos protection. - // It's important to ensure that this `StartPublish` request - // is very recent, or it could be used in a replay attack. - if state.payload_timestamp > authorization.timestamp { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - current_timestamp = state.payload_timestamp, - timestamp = authorized_payload.authorized.authorization.timestamp, - "Received initiate build response with outdated timestamp", - ); - self.protocol - .network - .reputation_change(self.peer_id, ReputationChangeKind::BadMessage); - return; - } - - state.publishing_status.send_modify(|status| { - match status { - PublishingStatus::Publishing { .. } => { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StopPublish over p2p while we are the publisher" - ); - } - PublishingStatus::WaitingToPublish { - active_publishers, - authorization, - .. - } => { - // We are currently waiting to build, but someone else is requesting to build - // This could happen during a double failover. - // We have a potential race condition here so we'll just wait for the - // build request override to kick in next block. - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StopPublish over p2p while waiting to publish", - ); - - // Remove the publisher from the list of active publishers - if let Some(index) = active_publishers.iter().position(|(publisher, _)| { - *publisher == authorized_payload.authorized.authorization.builder_vk - }) { - active_publishers.remove(index); - } else { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StopPublish for unknown publisher", - ); - } - - if active_publishers.is_empty() { - // If there are no active publishers left, we should stop waiting to publish - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "starting to publish" - ); - *status = PublishingStatus::Publishing { - authorization: *authorization, - }; - } else { - tracing::info!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "still waiting on active publishers", - ); - } - } - PublishingStatus::NotPublishing { active_publishers } => { - // Remove the publisher from the list of active publishers - if let Some(index) = active_publishers.iter().position(|(publisher, _)| { - *publisher == authorized_payload.authorized.authorization.builder_vk - }) { - active_publishers.remove(index); - } else { - tracing::warn!( - target: "flashblocks::p2p", - peer_id = %self.peer_id, - "Received StopPublish for unknown publisher", - ); - } - } - } - }); - } -} diff --git a/crates/flashblocks-p2p/src/protocol/error.rs b/crates/flashblocks-p2p/src/protocol/error.rs deleted file mode 100644 index 322f6eab..00000000 --- a/crates/flashblocks-p2p/src/protocol/error.rs +++ /dev/null @@ -1,13 +0,0 @@ -use thiserror::Error; - -#[derive(Error, Debug, Eq, PartialEq)] -pub enum FlashblocksP2PError { - #[error("attempt to publish flashblocks without clearance")] - NotClearedToPublish, - #[error( - "attempt to publish flashblocks with expired authorization. Make sure to call `start_publishing` first" - )] - ExpiredAuthorization, - #[error("builder signing key has not been configured")] - MissingBuilderSk, -} diff --git a/crates/flashblocks-p2p/src/protocol/handler.rs b/crates/flashblocks-p2p/src/protocol/handler.rs deleted file mode 100644 index 8619a4af..00000000 --- a/crates/flashblocks-p2p/src/protocol/handler.rs +++ /dev/null @@ -1,629 +0,0 @@ -use crate::protocol::{connection::FlashblocksConnection, error::FlashblocksP2PError}; -use alloy_rlp::BytesMut; -use ed25519_dalek::{SigningKey, VerifyingKey}; -use futures::{Stream, StreamExt, stream}; -use parking_lot::Mutex; -use reth::payload::PayloadId; -use reth_eth_wire::Capability; -use reth_ethereum::network::{api::PeerId, protocol::ProtocolHandler}; -use reth_network::Peers; -use rollup_boost::{ - Authorization, Authorized, AuthorizedMsg, AuthorizedPayload, FlashblocksP2PMsg, - FlashblocksPayloadV1, StartPublish, StopPublish, -}; -use std::net::SocketAddr; -use std::sync::Arc; -use tokio::sync::{broadcast, watch}; -use tracing::debug; - -use reth_ethereum::network::{ - api::Direction, - eth_wire::{capability::SharedCapabilities, multiplex::ProtocolConnection, protocol::Protocol}, - protocol::{ConnectionHandler, OnNotSupported}, -}; -use tokio_stream::wrappers::BroadcastStream; - -/// Maximum frame size for rlpx messages. -const MAX_FRAME: usize = 1 << 24; // 16 MiB - -/// Maximum index for flashblocks payloads. -/// Not intended to ever be hit. Since we resize the flashblocks vector dynamically, -/// this is just a sanity check to prevent excessive memory usage. -pub(crate) const MAX_FLASHBLOCK_INDEX: usize = 100; - -/// The maximum number of seconds we will wait for a previous publisher to stop -/// before continueing anyways. -const MAX_PUBLISH_WAIT_SEC: u64 = 2; - -/// The maximum number of broadcast channel messages we will buffer -/// before dropping them. In practice, we should rarely need to buffer any messages. -const BROADCAST_BUFFER_CAPACITY: usize = 100; - -/// Trait bound for network handles that can be used with the flashblocks P2P protocol. -/// -/// This trait combines all the necessary bounds for a network handle to be used -/// in the flashblocks P2P system, including peer management capabilities. -pub trait FlashblocksP2PNetworkHandle: Clone + Unpin + Peers + std::fmt::Debug + 'static {} - -impl FlashblocksP2PNetworkHandle for N {} - -/// Messages that can be broadcast over a channel to each internal peer connection. -/// -/// These messages are used internally to coordinate the broadcasting of flashblocks -/// and publishing status changes to all connected peers. -#[derive(Clone, Debug)] -pub enum PeerMsg { - /// Send an already serialized flashblock to all peers. - FlashblocksPayloadV1((PayloadId, usize, BytesMut)), - /// Send a previously serialized StartPublish message to all peers. - StartPublishing(BytesMut), - /// Send a previously serialized StopPublish message to all peers. - StopPublishing(BytesMut), -} - -/// The current publishing status of this node in the flashblocks P2P network. -/// -/// This enum tracks whether we are actively publishing flashblocks, waiting to publish, -/// or not publishing at all. It also maintains information about other active publishers -/// to coordinate multi-builder scenarios and handle failover situations. -#[derive(Clone, Debug)] -pub enum PublishingStatus { - /// We are currently publishing flashblocks. - Publishing { - /// The authorization token that grants us permission to publish. - authorization: Authorization, - }, - /// We are waiting for the previous publisher to stop. - WaitingToPublish { - /// The authorization token we will use once we start publishing. - authorization: Authorization, - /// A map of active publishers (excluding ourselves) to their most recently published - /// or requested to publish block number. - active_publishers: Vec<(VerifyingKey, u64)>, - }, - /// We are not currently publishing flashblocks. - NotPublishing { - /// A map of previous publishers to their most recently published - /// or requested to publish block number. - active_publishers: Vec<(VerifyingKey, u64)>, - }, -} - -impl Default for PublishingStatus { - fn default() -> Self { - Self::NotPublishing { - active_publishers: Vec::new(), - } - } -} - -/// Protocol state that stores the flashblocks P2P protocol events and coordination data. -/// -/// This struct maintains the current state of flashblock publishing, including coordination -/// with other publishers, payload buffering, and ordering information. It serves as the -/// central state management for the flashblocks P2P protocol handler. -#[derive(Debug, Default)] -pub struct FlashblocksP2PState { - /// Current publishing status indicating whether we're publishing, waiting, or not publishing. - pub publishing_status: watch::Sender, - /// Most recent payload ID for the current block being processed. - pub payload_id: PayloadId, - /// Timestamp of the most recent flashblocks payload. - pub payload_timestamp: u64, - /// The index of the next flashblock to emit over the flashblocks stream. - /// Used to maintain strict ordering of flashblock delivery. - pub flashblock_index: usize, - /// Buffer of flashblocks for the current payload, indexed by flashblock sequence number. - /// Contains `None` for flashblocks not yet received, enabling out-of-order receipt - /// while maintaining in-order delivery. - pub flashblocks: Vec>, -} - -impl FlashblocksP2PState { - /// Returns the current publishing status of this node. - /// - /// This indicates whether the node is actively publishing flashblocks, - /// waiting to publish, or not publishing at all. - pub fn publishing_status(&self) -> PublishingStatus { - self.publishing_status.borrow().clone() - } -} - -/// Context struct containing shared resources for the flashblocks P2P protocol. -/// -/// This struct holds the network handle, cryptographic keys, and communication channels -/// used across all connections in the flashblocks P2P protocol. It provides the shared -/// infrastructure needed for message verification, signing, and broadcasting. -#[derive(Clone, Debug)] -pub struct FlashblocksP2PCtx { - /// Authorizer's verifying key used to verify authorization signatures from rollup-boost. - pub authorizer_vk: VerifyingKey, - /// Builder's signing key used to sign outgoing authorized P2P messages. - pub builder_sk: Option, - /// Broadcast sender for peer messages that will be sent to all connected peers. - /// Messages may not be strictly ordered due to network conditions. - pub peer_tx: broadcast::Sender, - /// Broadcast sender for verified and strictly ordered flashblock payloads. - /// Used by RPC overlays and other consumers of flashblock data. - pub flashblock_tx: broadcast::Sender, -} - -/// Handle for the flashblocks P2P protocol. -/// -/// Encapsulates the shared context and mutable state of the flashblocks -/// P2P protocol. -#[derive(Clone, Debug)] -pub struct FlashblocksHandle { - /// Shared context containing network handle, keys, and communication channels. - pub ctx: FlashblocksP2PCtx, - /// Thread-safe mutable state of the flashblocks protocol. - /// Protected by a mutex to allow concurrent access from multiple connections. - pub state: Arc>, -} - -impl FlashblocksHandle { - pub fn new(authorizer_vk: VerifyingKey, builder_sk: Option) -> Self { - let flashblock_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); - let peer_tx = broadcast::Sender::new(BROADCAST_BUFFER_CAPACITY); - let state = Arc::new(Mutex::new(FlashblocksP2PState::default())); - let ctx = FlashblocksP2PCtx { - authorizer_vk, - builder_sk, - peer_tx, - flashblock_tx, - }; - - Self { ctx, state } - } - - pub fn flashblocks_tx(&self) -> broadcast::Sender { - self.ctx.flashblock_tx.clone() - } - - pub fn builder_sk(&self) -> Result<&SigningKey, FlashblocksP2PError> { - self.ctx - .builder_sk - .as_ref() - .ok_or(FlashblocksP2PError::MissingBuilderSk) - } -} - -/// Main protocol handler for the flashblocks P2P protocol. -/// -/// This handler manages incoming and outgoing connections, coordinates flashblock publishing, -/// and maintains the protocol state across all peer connections. It implements the core -/// logic for multi-builder coordination and failover scenarios in HA sequencer setups. -#[derive(Clone, Debug)] -pub struct FlashblocksP2PProtocol { - /// Network handle used to update peer reputation and manage connections. - pub network: N, - /// Shared context containing network handle, keys, and communication channels. - pub handle: FlashblocksHandle, -} - -impl FlashblocksP2PProtocol { - /// Creates a new flashblocks P2P protocol handler. - /// - /// Initializes the handler with the necessary cryptographic keys, network handle, - /// and communication channels. The handler starts in a non-publishing state. - /// - /// # Arguments - /// * `network` - Network handle for peer management and reputation updates - /// * `handle` - Shared handle containing the protocol context and mutable state - pub fn new(network: N, handle: FlashblocksHandle) -> Self { - Self { - network: network.clone(), - handle, - } - } -} - -impl FlashblocksP2PProtocol { - /// Returns the P2P capability for the flashblocks v1 protocol. - /// - /// This capability is used during devp2p handshake to advertise support - /// for the flashblocks protocol with protocol name "flblk" and version 1. - pub fn capability() -> Capability { - Capability::new_static("flblk", 1) - } -} - -impl FlashblocksHandle { - /// Publishes a newly created flashblock from the payload builder to the P2P network. - /// - /// This method validates that the builder has authorization to publish and that - /// the authorization matches the current publishing session. The flashblock is - /// then processed, cached, and broadcast to all connected peers. - /// - /// # Arguments - /// * `authorized_payload` - The signed flashblock payload with authorization - /// - /// # Returns - /// * `Ok(())` if the flashblock was successfully published - /// * `Err` if the builder lacks authorization or the authorization is outdated - /// - /// # Note - /// You must call `start_publishing` before calling this method to establish - /// authorization for the current block. - pub fn publish_new( - &self, - authorized_payload: AuthorizedPayload, - ) -> Result<(), FlashblocksP2PError> { - let mut state = self.state.lock(); - let PublishingStatus::Publishing { authorization } = *state.publishing_status.borrow() - else { - return Err(FlashblocksP2PError::NotClearedToPublish); - }; - - if authorization != authorized_payload.authorized.authorization { - return Err(FlashblocksP2PError::ExpiredAuthorization); - } - self.ctx.publish(&mut state, authorized_payload); - Ok(()) - } - - /// Returns the current publishing status of this node. - /// - /// The status indicates whether the node is actively publishing flashblocks, - /// waiting for another publisher to stop, or not publishing at all. - /// - /// # Returns - /// The current `PublishingStatus` enum value - pub fn publishing_status(&self) -> PublishingStatus { - self.state.lock().publishing_status.borrow().clone() - } - - /// Awaits clearance to publish flashblocks. - /// - /// # Note - /// This is never guaranteed to return. - pub async fn await_clearance(&self) { - let mut status = self.state.lock().publishing_status.subscribe(); - // Safe to unwrap becuase self holds a sender. - status - .wait_for(|status| matches!(status, PublishingStatus::Publishing { .. })) - .await - .unwrap(); - } - - /// Initiates flashblock publishing for a new block. - /// - /// This method should be called immediately after receiving a ForkChoiceUpdated - /// with payload attributes and the corresponding Authorization token. It coordinates - /// with other potential publishers to ensure only one builder publishes at a time. - /// - /// The method may transition the node to either Publishing or WaitingToPublish state - /// depending on whether other builders are currently active. - /// - /// # Arguments - /// * `new_authorization` - Authorization token signed by rollup-boost for this block - /// - /// # Note - /// Calling this method does not guarantee immediate publishing clearance. - /// The node may need to wait for other publishers to stop first. - pub fn start_publishing( - &self, - new_authorization: Authorization, - ) -> Result<(), FlashblocksP2PError> { - let state = self.state.lock(); - let builder_sk = self.builder_sk()?; - state.publishing_status.send_modify(|status| { - match status { - PublishingStatus::Publishing { authorization } => { - // We are already publishing, so we just update the authorization. - *authorization = new_authorization; - } - PublishingStatus::WaitingToPublish { - authorization, - active_publishers, - } => { - let most_recent_publisher = active_publishers - .iter() - .map(|(_, timestamp)| *timestamp) - .max() - .unwrap_or_default(); - // We are waiting to publish, so we update the authorization and - // the block number at which we requested to start publishing. - if new_authorization.timestamp >= most_recent_publisher + MAX_PUBLISH_WAIT_SEC { - // If the block number is greater than the one we requested to start publishing, - // we will update it. - tracing::warn!( - target: "flashblocks::p2p", - payload_id = %new_authorization.payload_id, - timestamp = %new_authorization.timestamp, - "waiting to publish timed out, starting to publish", - ); - *status = PublishingStatus::Publishing { - authorization: new_authorization, - }; - } else { - // Continue to wait for the previous builder to stop. - *authorization = new_authorization; - } - } - PublishingStatus::NotPublishing { active_publishers } => { - // Send an authorized `StartPublish` message to the network - let authorized_msg = AuthorizedMsg::StartPublish(StartPublish); - let authorized_payload = - Authorized::new(builder_sk, new_authorization, authorized_msg); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::StartPublishing(p2p_msg.encode()); - self.ctx.peer_tx.send(peer_msg).ok(); - - if active_publishers.is_empty() { - // If we have no previous publishers, we can start publishing immediately. - tracing::info!( - target: "flashblocks::p2p", - payload_id = %new_authorization.payload_id, - "starting to publish flashblocks", - ); - *status = PublishingStatus::Publishing { - authorization: new_authorization, - }; - } else { - // If we have previous publishers, we will wait for them to stop. - tracing::info!( - target: "flashblocks::p2p", - payload_id = %new_authorization.payload_id, - "waiting to publish flashblocks", - ); - *status = PublishingStatus::WaitingToPublish { - authorization: new_authorization, - active_publishers: active_publishers.clone(), - }; - } - } - } - }); - - Ok(()) - } - - /// Stops flashblock publishing and notifies the P2P network. - /// - /// This method broadcasts a StopPublish message to all connected peers and transitions - /// the node to a non-publishing state. It should be called when receiving a - /// ForkChoiceUpdated without payload attributes or without an Authorization token. - pub fn stop_publishing(&self) -> Result<(), FlashblocksP2PError> { - let state = self.state.lock(); - let builder_sk = self.builder_sk()?; - - state.publishing_status.send_modify(|status| { - match status { - PublishingStatus::Publishing { authorization } => { - // We are currently publishing, so we send a stop message. - tracing::info!( - target: "flashblocks::p2p", - payload_id = %authorization.payload_id, - timestamp = %authorization.timestamp, - "stopping to publish flashblocks", - ); - let authorized_payload = - Authorized::new(builder_sk, *authorization, StopPublish.into()); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.ctx.peer_tx.send(peer_msg).ok(); - *status = PublishingStatus::NotPublishing { - active_publishers: Vec::new(), - }; - } - PublishingStatus::WaitingToPublish { - authorization, - active_publishers, - .. - } => { - // We are waiting to publish, so we just update the status. - tracing::info!( - target: "flashblocks::p2p", - payload_id = %authorization.payload_id, - timestamp = %authorization.timestamp, - "aborting wait to publish flashblocks", - ); - let authorized_payload = - Authorized::new(builder_sk, *authorization, StopPublish.into()); - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload); - let peer_msg = PeerMsg::StopPublishing(p2p_msg.encode()); - self.ctx.peer_tx.send(peer_msg).ok(); - *status = PublishingStatus::NotPublishing { - active_publishers: active_publishers.clone(), - }; - } - PublishingStatus::NotPublishing { .. } => {} - } - }); - - Ok(()) - } - - /// Returns a stream of ordered flashblocks starting from the beginning of the current payload. - /// - /// # Behavior - /// The stream will continue to yield flashblocks for consecutive payloads as well, so - /// consumers should take care to handle the stream appropriately. - pub fn flashblock_stream(&self) -> impl Stream + Send + 'static { - let flashblocks = self - .state - .lock() - .flashblocks - .clone() - .into_iter() - .map_while(|x| x); - - let receiver = self.ctx.flashblock_tx.subscribe(); - - let current = stream::iter(flashblocks); - let future = tokio_stream::StreamExt::map_while(BroadcastStream::new(receiver), |x| x.ok()); - current.chain(future) - } -} - -impl FlashblocksP2PCtx { - /// Processes and publishes a verified flashblock payload to the P2P network and local stream. - /// - /// This method handles the core logic of flashblock processing, including validation, - /// caching, and broadcasting. It ensures flashblocks are delivered in order while - /// allowing out-of-order receipt from the network. - /// - /// # Arguments - /// * `state` - Mutable reference to the protocol state for updating flashblock cache - /// * `authorized_payload` - The authorized flashblock payload to process and publish - /// - /// # Behavior - /// - Validates payload consistency with authorization - /// - Updates global state for new payloads with newer timestamps - /// - Caches flashblocks and maintains ordering for sequential delivery - /// - Broadcasts to peers and publishes ordered flashblocks to the stream - pub fn publish( - &self, - state: &mut FlashblocksP2PState, - authorized_payload: AuthorizedPayload, - ) { - let payload = authorized_payload.msg(); - let authorization = authorized_payload.authorized.authorization; - - // Do some basic validation - if authorization.payload_id != payload.payload_id { - // Since the builders are trusted, the only reason this should happen is a bug. - tracing::error!( - target: "flashblocks::p2p", - authorization_payload_id = %authorization.payload_id, - flashblock_payload_id = %payload.payload_id, - "Authorization payload id does not match flashblocks payload id" - ); - return; - } - - // Check if this is a globally new payload - if authorization.timestamp > state.payload_timestamp { - state.payload_id = authorization.payload_id; - state.payload_timestamp = authorization.timestamp; - state.flashblock_index = 0; - state.flashblocks.fill(None); - } - - // Resize our array if needed - if payload.index as usize > MAX_FLASHBLOCK_INDEX { - tracing::error!( - target: "flashblocks::p2p", - index = payload.index, - max_index = MAX_FLASHBLOCK_INDEX, - "Received flashblocks payload with index exceeding maximum" - ); - return; - } - let len = state.flashblocks.len(); - state - .flashblocks - .resize_with(len.max(payload.index as usize + 1), || None); - let flashblock = &mut state.flashblocks[payload.index as usize]; - - // If we've already seen this index, skip it - // Otherwise, add it to the list - if flashblock.is_none() { - // We haven't seen this index yet - // Add the flashblock to our cache - *flashblock = Some(payload.clone()); - tracing::trace!( - target: "flashblocks::p2p", - payload_id = %payload.payload_id, - flashblock_index = payload.index, - "queueing flashblock", - ); - - let p2p_msg = FlashblocksP2PMsg::Authorized(authorized_payload.authorized.clone()); - let bytes = p2p_msg.encode(); - let len = bytes.len(); - metrics::histogram!("flashblock_size").record(len as f64); - - if len > MAX_FRAME { - tracing::error!( - target: "flashblocks::p2p", - size = bytes.len(), - max_size = MAX_FRAME, - "FlashblocksP2PMsg too large", - ); - return; - } - if len > MAX_FRAME / 2 { - tracing::warn!( - target: "flashblocks::p2p", - size = bytes.len(), - max_size = MAX_FRAME, - "FlashblocksP2PMsg almost too large", - ); - } - - let peer_msg = - PeerMsg::FlashblocksPayloadV1((payload.payload_id, payload.index as usize, bytes)); - - self.peer_tx.send(peer_msg).ok(); - // Broadcast any flashblocks in the cache that are in order - while let Some(Some(flashblock_event)) = state.flashblocks.get(state.flashblock_index) { - // Publish the flashblock - debug!( - target: "flashblocks::p2p", - payload_id = %flashblock_event.payload_id, - flashblock_index = %state.flashblock_index, - "publishing flashblock" - ); - self.flashblock_tx.send(flashblock_event.clone()).ok(); - // Update the index - state.flashblock_index += 1; - } - } - } -} - -impl ProtocolHandler for FlashblocksP2PProtocol { - type ConnectionHandler = Self; - - fn on_incoming(&self, _socket_addr: SocketAddr) -> Option { - Some(self.clone()) - } - - fn on_outgoing( - &self, - _socket_addr: SocketAddr, - _peer_id: PeerId, - ) -> Option { - Some(self.clone()) - } -} - -impl ConnectionHandler for FlashblocksP2PProtocol { - type Connection = FlashblocksConnection; - - fn protocol(&self) -> Protocol { - Protocol::new(Self::capability(), 1) - } - - fn on_unsupported_by_peer( - self, - _supported: &SharedCapabilities, - _direction: Direction, - _peer_id: PeerId, - ) -> OnNotSupported { - OnNotSupported::KeepAlive - } - - fn into_connection( - self, - direction: Direction, - peer_id: PeerId, - conn: ProtocolConnection, - ) -> Self::Connection { - let capability = Self::capability(); - - debug!( - %peer_id, - %direction, - capability = %capability.name, - version = %capability.version, - "new flashblocks connection" - ); - - let peer_rx = self.handle.ctx.peer_tx.subscribe(); - - FlashblocksConnection::new(self, conn, peer_id, BroadcastStream::new(peer_rx)) - } -} diff --git a/crates/flashblocks-p2p/src/protocol/mod.rs b/crates/flashblocks-p2p/src/protocol/mod.rs deleted file mode 100644 index a83f1723..00000000 --- a/crates/flashblocks-p2p/src/protocol/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod connection; -pub mod error; -pub mod handler; diff --git a/crates/flashblocks-p2p/tests/protocol.rs b/crates/flashblocks-p2p/tests/protocol.rs deleted file mode 100644 index 04b96e9a..00000000 --- a/crates/flashblocks-p2p/tests/protocol.rs +++ /dev/null @@ -1,278 +0,0 @@ -use ed25519_dalek::SigningKey; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, PublishingStatus}; -use futures::StreamExt as _; -use reth::payload::PayloadId; -use rollup_boost::{ - Authorization, AuthorizedPayload, ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, - FlashblocksPayloadV1, -}; -use std::time::Duration; -use tokio::task; - -const DUMMY_TIMESTAMP: u64 = 42; - -/// Helper: deterministic ed25519 key made of the given byte. -fn signing_key(byte: u8) -> SigningKey { - SigningKey::from_bytes(&[byte; 32]) -} - -/// Helper: a minimal Flashblock (index 0) for the given payload-id. -fn payload(payload_id: reth::payload::PayloadId, idx: u64) -> FlashblocksPayloadV1 { - FlashblocksPayloadV1 { - payload_id, - index: idx, - base: Some(ExecutionPayloadBaseV1 { - block_number: 0, - ..Default::default() - }), - diff: ExecutionPayloadFlashblockDeltaV1::default(), - metadata: serde_json::Value::Null, - } -} - -/// Build a fresh handle plus its broadcast receiver. -fn fresh_handle() -> FlashblocksHandle { - // authorizer + builder keys - let auth_sk = signing_key(1); - let builder_sk = signing_key(2); - - FlashblocksHandle::new(auth_sk.verifying_key(), Some(builder_sk)) -} - -#[tokio::test] -async fn publish_without_clearance_is_rejected() { - let handle = fresh_handle(); - let builder_sk = handle.builder_sk().unwrap(); - - let payload_id = reth::payload::PayloadId::new([0; 8]); - let auth = Authorization::new( - payload_id, - DUMMY_TIMESTAMP, - &signing_key(1), - builder_sk.verifying_key(), - ); - let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(builder_sk, auth, payload.clone()); - - // We never called `start_publishing`, so this must fail. - let err = handle.publish_new(signed).unwrap_err(); - assert!(matches!( - err, - flashblocks_p2p::protocol::error::FlashblocksP2PError::NotClearedToPublish - )); -} - -#[tokio::test] -async fn expired_authorization_is_rejected() { - let handle = fresh_handle(); - let builder_sk = handle.builder_sk().unwrap(); - - // Step 1: obtain clearance with auth_1 - let payload_id = reth::payload::PayloadId::new([1; 8]); - let auth_1 = Authorization::new( - payload_id, - DUMMY_TIMESTAMP, - &signing_key(1), - builder_sk.verifying_key(), - ); - handle.start_publishing(auth_1).unwrap(); - - // Step 2: craft a payload signed with *different* authorization → should fail - let auth_2 = Authorization::new( - payload_id, - DUMMY_TIMESTAMP + 1, - &signing_key(1), - builder_sk.verifying_key(), - ); - let payload = payload(payload_id, 0); - let signed = AuthorizedPayload::new(&builder_sk, auth_2, payload); - - let err = handle.publish_new(signed).unwrap_err(); - assert!(matches!( - err, - flashblocks_p2p::protocol::error::FlashblocksP2PError::ExpiredAuthorization - )); -} - -#[tokio::test] -async fn flashblock_stream_is_ordered() { - let handle = fresh_handle(); - let builder_sk = handle.builder_sk().unwrap(); - - // clearance - let payload_id = reth::payload::PayloadId::new([2; 8]); - let auth = Authorization::new( - payload_id, - DUMMY_TIMESTAMP, - &signing_key(1), - builder_sk.verifying_key(), - ); - handle.start_publishing(auth).unwrap(); - - // send index 1 first (out-of-order) - for &idx in &[1u64, 0] { - let p = payload(payload_id, idx); - let signed = AuthorizedPayload::new(&builder_sk, auth, p.clone()); - handle.publish_new(signed).unwrap(); - } - - let mut flashblock_stream = handle.flashblock_stream(); - - // Expect to receive 0, then 1 over the ordered broadcast. - let first = flashblock_stream.next().await.unwrap(); - let second = flashblock_stream.next().await.unwrap(); - assert_eq!(first.index, 0); - assert_eq!(second.index, 1); -} - -#[tokio::test] -async fn stop_and_restart_updates_state() { - let handle = fresh_handle(); - let builder_sk = handle.builder_sk().unwrap(); - - // 1) start publishing - let payload_id_0 = reth::payload::PayloadId::new([3; 8]); - let auth_0 = Authorization::new( - payload_id_0, - DUMMY_TIMESTAMP, - &signing_key(1), - builder_sk.verifying_key(), - ); - handle.start_publishing(auth_0).unwrap(); - assert!(matches!( - handle.publishing_status(), - PublishingStatus::Publishing { .. } - )); - - // 2) stop - handle.stop_publishing().unwrap(); - assert!(matches!( - handle.publishing_status(), - PublishingStatus::NotPublishing { .. } - )); - - // 3) start again with a new payload - let payload_id_1 = reth::payload::PayloadId::new([4; 8]); - let auth_1 = Authorization::new( - payload_id_1, - DUMMY_TIMESTAMP + 5, - &signing_key(1), - builder_sk.verifying_key(), - ); - handle.start_publishing(auth_1).unwrap(); - assert!(matches!( - handle.publishing_status(), - PublishingStatus::Publishing { .. } - )); -} - -#[tokio::test] -async fn stop_and_restart_with_active_publishers() { - let timestamp = 1000; - let handle = fresh_handle(); - let builder_sk = handle.builder_sk().unwrap(); - - // Pretend we already know about another publisher. - let other_vk = signing_key(99).verifying_key(); - { - let state = handle.state.lock(); - state - .publishing_status - .send_replace(PublishingStatus::NotPublishing { - active_publishers: vec![(other_vk, timestamp - 1)], - }); - } - - // Our own clearance → should transition to WaitingToPublish. - let payload_id = PayloadId::new([6; 8]); - let auth = Authorization::new( - payload_id, - timestamp, - &signing_key(1), - builder_sk.verifying_key(), - ); - handle.start_publishing(auth).unwrap(); - match handle.publishing_status() { - PublishingStatus::WaitingToPublish { - active_publishers, .. - } => { - assert_eq!(active_publishers.len(), 1); - assert_eq!(active_publishers[0].0, other_vk); - } - s => panic!("unexpected status: {s:?}"), - } - - // Now we voluntarily stop. We should end up back in NotPublishing, - // still carrying the same active publisher entry. - handle.stop_publishing().unwrap(); - match handle.publishing_status() { - PublishingStatus::NotPublishing { active_publishers } => { - assert_eq!(active_publishers.len(), 1); - assert_eq!(active_publishers[0].0, other_vk); - } - s => panic!("unexpected status after stop: {s:?}"), - } -} - -#[tokio::test] -async fn flashblock_stream_buffers_and_live() { - let timestamp = 1000; - let handle = fresh_handle(); - let builder_sk = handle.builder_sk().unwrap(); - - let pid = PayloadId::new([7; 8]); - let auth = Authorization::new(pid, timestamp, &signing_key(1), builder_sk.verifying_key()); - handle.start_publishing(auth).unwrap(); - - // publish index 0 before creating the stream - let signed0 = AuthorizedPayload::new(&builder_sk, auth, payload(pid, 0)); - handle.publish_new(signed0).unwrap(); - - // now create the combined stream - let mut stream = handle.flashblock_stream(); - - // first item comes from the cached vector - let first = stream.next().await.unwrap(); - assert_eq!(first.index, 0); - - // publish index 1 after the stream exists - let signed1 = AuthorizedPayload::new(&builder_sk, auth, payload(pid, 1)); - handle.publish_new(signed1).unwrap(); - - // second item should be delivered live - let second = stream.next().await.unwrap(); - assert_eq!(second.index, 1); -} - -#[tokio::test] -async fn await_clearance_unblocks_on_publish() { - let handle = fresh_handle(); - let builder_sk = handle.builder_sk().unwrap(); - - let waiter = { - let h = handle.clone(); - task::spawn(async move { - h.await_clearance().await; - }) - }; - - // give the waiter a chance to subscribe - tokio::task::yield_now().await; - assert!(!waiter.is_finished(), "future must still be pending"); - - // now grant clearance - let payload_id = reth::payload::PayloadId::new([5; 8]); - let auth = Authorization::new( - payload_id, - DUMMY_TIMESTAMP, - &signing_key(1), - builder_sk.verifying_key(), - ); - handle.start_publishing(auth).unwrap(); - - // waiter should finish very quickly - tokio::time::timeout(Duration::from_secs(1), waiter) - .await - .expect("await_clearance did not complete") - .unwrap(); -} diff --git a/crates/flashblocks-rpc/Cargo.toml b/crates/flashblocks-rpc/Cargo.toml index 5583478a..8dfb5826 100644 --- a/crates/flashblocks-rpc/Cargo.toml +++ b/crates/flashblocks-rpc/Cargo.toml @@ -6,30 +6,28 @@ license = "MIT" [dependencies] rollup-boost.workspace = true -flashblocks-p2p.workspace = true -reth-optimism-primitives.workspace = true -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab", features = [ +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-optimism-forks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0", features = [ "test-utils", ] } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "44a48ab" } - -reth-eth-wire = { workspace = true } -reth-network = { workspace = true } -ed25519-dalek = { version = "2", features = ["serde"] } +reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } alloy-eips.workspace = true alloy-primitives.workspace = true @@ -59,3 +57,11 @@ serde.workspace = true jsonrpsee = { version = "0.26.0" } futures-util = "0.3.31" brotli = "8.0.1" +arc-swap = "1.7.1" + +[[bin]] +name = "flashblocks-rpc" +path = "src/bin/main.rs" + +[lib] +path = "src/lib.rs" diff --git a/crates/flashblocks-rpc/README.md b/crates/flashblocks-rpc/README.md new file mode 100644 index 00000000..8468dee0 --- /dev/null +++ b/crates/flashblocks-rpc/README.md @@ -0,0 +1,32 @@ + +# Flashblocks RPC Implementation + +RPC provider implementation for the Flashblocks specification on OP Stack chains. + +## Overview +This component subscribes to a Flashblocks WebSocket stream and provides preconfirmation data through modified Ethereum JSON-RPC endpoints using the pending tag. + +## Quick Start + +Build: + +```bash +cargo build --release +``` + +Run: + +```bash +./target/release/flashblocks-rpc \ + --flashblocks.enabled=true \ + --flashblocks.websocket-url=ws://localhost:8080/flashblocks \ + --chain=optimism \ + --http \ + --http.port=8545 +``` + +## Command Line Options + +- `flashblocks.enabled`: Enable flashblocks functionality (default: false) +- `flashblocks.websocket-url`: WebSocket URL for flashblocks stream +- Standard reth/OP Stack options for chain and RPC configuration diff --git a/crates/flashblocks-rpc/spec.md b/crates/flashblocks-rpc/spec.md new file mode 100644 index 00000000..3e44d5dc --- /dev/null +++ b/crates/flashblocks-rpc/spec.md @@ -0,0 +1,195 @@ +# Flashblocks RPC Methods Specification + +This document specifies the JSON-RPC methods implemented by the Flashblocks RPC provider. + +Note: This document serves as a reference for the current implementation and may differ from the full Flashblocks specification in terms of scope and methods implemented. + +## Type Definitions + +All types used in these RPC methods are identical to the standard OP Stack RPC types. No modifications have been made to the existing type definitions. + +## Modified Ethereum JSON-RPC Methods + +The following standard Ethereum JSON-RPC methods are enhanced to support the `pending` tag for querying preconfirmed state. + +## eth_getBlockByNumber + +Returns block information for the specified block number. + +### Parameters +- `blockNumber`: `String` - Block number or tag (`"pending"` for preconfirmed state) +- `fullTransactions`: `Boolean` - If true, returns full transaction objects; if false, returns transaction hashes + +### Returns +`Object` - Block object + +### Example +```json +// Request +{ + "method": "eth_getBlockByNumber", + "params": ["pending", false], + "id": 1, + "jsonrpc": "2.0" +} + +// Response +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x...", + "stateRoot": "0x...", + "transactionsRoot": "0x...", + "receiptsRoot": "0x...", + "number": "0x123", + "gasUsed": "0x5208", + "gasLimit": "0x1c9c380", + "timestamp": "0x...", + "extraData": "0x", + "mixHash": "0x...", + "nonce": "0x0", + "transactions": ["0x..."] + } +} +``` + +### Fields +- `hash`: Block hash calculated from the current flashblock header +- `parentHash`: Hash of the parent block +- `stateRoot`: Current state root from latest flashblock +- `transactionsRoot`: Transactions trie root +- `receiptsRoot`: Receipts trie root +- `number`: Block number being built +- `gasUsed`: Cumulative gas used by all transactions +- `gasLimit`: Block gas limit +- `timestamp`: Block timestamp +- `extraData`: Extra data bytes +- `mixHash`: Mix hash value +- `nonce`: Block nonce value +- `transactions`: Array of transaction hashes or objects + +### `eth_getTransactionReceipt` + +Returns the receipt for a transaction. + +**Parameters:** +- `transactionHash`: `String` - Hash of the transaction + +**Returns:** `Object` - Transaction receipt or `null` + +**Example:** +```json +// Request +{ + "method": "eth_getTransactionReceipt", + "params": ["0x..."], + "id": 1, + "jsonrpc": "2.0" +} + +// Response +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "transactionHash": "0x...", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x123", + "transactionIndex": "0x0", + "from": "0x...", + "to": "0x...", + "gasUsed": "0x5208", + "cumulativeGasUsed": "0x5208", + "effectiveGasPrice": "0x...", + "status": "0x1", + "contractAddress": null, + "logs": [], + "logsBloom": "0x..." + } +} +``` + +**Fields:** +- `transactionHash`: Hash of the transaction +- `blockHash`: Always `0x0` for preconfirmed transactions +- `blockNumber`: Block number containing the transaction +- `transactionIndex`: Index of transaction in block +- `from`: Sender address +- `to`: Recipient address +- `gasUsed`: Gas used by this transaction +- `cumulativeGasUsed`: Total gas used up to this transaction +- `effectiveGasPrice`: Effective gas price paid +- `status`: `0x1` for success, `0x0` for failure +- `contractAddress`: Address of created contract (for contract creation) +- `logs`: Array of log objects +- `logsBloom`: Bloom filter for logs + +### `eth_getBalance` + +Returns the balance of an account. + +**Parameters:** +- `address`: `String` - Address to query +- `blockNumber`: `String` - Block number or tag (`"pending"` for preconfirmed state) + +**Returns:** `String` - Account balance in wei (hex-encoded) + +**Example:** +```json +// Request +{ + "method": "eth_getBalance", + "params": ["0x...", "pending"], + "id": 1, + "jsonrpc": "2.0" +} + +// Response +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0x1bc16d674ec80000" +} +``` + +### `eth_getTransactionCount` + +Returns the number of transactions sent from an address (nonce). + +**Parameters:** +- `address`: `String` - Address to query +- `blockNumber`: `String` - Block number or tag (`"pending"` for preconfirmed state) + +**Returns:** `String` - Transaction count (hex-encoded) + +**Example:** +```json +// Request +{ + "method": "eth_getTransactionCount", + "params": ["0x...", "pending"], + "id": 1, + "jsonrpc": "2.0" +} + +// Response +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0x5" +} +``` + +## Behavior Notes + +### Pending Tag Usage +- When `"pending"` is used, the method queries preconfirmed state from the flashblocks cache +- If no preconfirmed data is available, falls back to latest confirmed state +- For non-pending queries, behaves identically to standard Ethereum JSON-RPC + +### Error Handling +- Returns standard JSON-RPC error responses for invalid requests +- Returns `null` for non-existent transactions or blocks +- Falls back to standard behavior when flashblocks are disabled or unavailable diff --git a/crates/flashblocks-node/src/bin/main.rs b/crates/flashblocks-rpc/src/bin/main.rs similarity index 55% rename from crates/flashblocks-node/src/bin/main.rs rename to crates/flashblocks-rpc/src/bin/main.rs index 66f8e7c7..177432ca 100644 --- a/crates/flashblocks-node/src/bin/main.rs +++ b/crates/flashblocks-rpc/src/bin/main.rs @@ -1,43 +1,39 @@ #![allow(missing_docs, rustdoc::missing_crate_level_docs)] + use clap::Parser; -use ed25519_dalek::{SigningKey, VerifyingKey}; -use flashblocks_node::FlashblocksNodeArgs; -use flashblocks_p2p::protocol::handler::{FlashblocksHandle, FlashblocksP2PProtocol}; use flashblocks_rpc::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay}; -use reth_ethereum::network::{NetworkProtocols, protocol::IntoRlpxSubProtocol}; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; use tracing::info; -#[derive(Debug, Clone, clap::Args)] +#[derive(Debug, Clone, PartialEq, Eq, clap::Args)] #[command(next_help_heading = "Rollup")] struct FlashblocksRollupArgs { #[command(flatten)] - pub rollup_args: RollupArgs, + rollup_args: RollupArgs, - #[command(flatten)] - pub flashblock_args: Option, + #[arg(long = "flashblocks.enabled", default_value = "false")] + flashblocks_enabled: bool, + + #[arg(long = "flashblocks.websocket-url", value_name = "WEBSOCKET_URL")] + websocket_url: url::Url, } -pub fn main() { +fn main() { if let Err(err) = Cli::::parse().run(async move |builder, args| { let rollup_args = args.rollup_args; let chain_spec = builder.config().chain.clone(); - let flashblocks_handle = FlashblocksHandle::new( - VerifyingKey::default(), - Some(SigningKey::from_bytes(&[0u8; 32])), - ); - - let flashblocks_overlay = - FlashblocksOverlay::new(flashblocks_handle.clone(), chain_spec); - flashblocks_overlay.clone().start()?; info!(target: "reth::cli", "Launching Flashblocks RPC overlay node"); let handle = builder .node(OpNode::new(rollup_args)) .extend_rpc_modules(move |ctx| { - if args.flashblock_args.is_some() { + if args.flashblocks_enabled { + let mut flashblocks_overlay = + FlashblocksOverlay::new(args.websocket_url, chain_spec); + flashblocks_overlay.start()?; + let eth_api = ctx.registry.eth_api().clone(); let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay); @@ -47,14 +43,6 @@ pub fn main() { }) .launch_with_debug_capabilities() .await?; - - let flashblocks_p2p_protocol = - FlashblocksP2PProtocol::new(handle.node.network.clone(), flashblocks_handle); - - handle - .node - .network - .add_rlpx_sub_protocol(flashblocks_p2p_protocol.into_rlpx_sub_protocol()); handle.node_exit_future.await }) { diff --git a/crates/flashblocks-rpc/src/cache.rs b/crates/flashblocks-rpc/src/cache.rs index c98a9a58..b780b802 100644 --- a/crates/flashblocks-rpc/src/cache.rs +++ b/crates/flashblocks-rpc/src/cache.rs @@ -1,10 +1,12 @@ +use alloy_consensus::BlockHeader; use alloy_consensus::Transaction as _; -use alloy_consensus::TxReceipt as _; +use alloy_consensus::TxReceipt; use alloy_consensus::transaction::SignerRecoverable; use alloy_consensus::transaction::TransactionMeta; use alloy_primitives::{Address, Sealable, TxHash, U256}; use alloy_rpc_types::Withdrawals; use alloy_rpc_types::{BlockTransactions, Header, TransactionInfo}; +use arc_swap::ArcSwap; use op_alloy_consensus::OpTxEnvelope; use op_alloy_network::Optimism; use op_alloy_rpc_types::OpTransactionReceipt; @@ -24,11 +26,7 @@ use rollup_boost::{ }; use serde::{Deserialize, Serialize}; use std::borrow::Cow; -use std::{ - collections::HashMap, - str::FromStr, - sync::{Arc, Mutex}, -}; +use std::{collections::HashMap, str::FromStr, sync::Arc}; #[derive(Debug, Deserialize, Serialize, Clone, Default)] pub struct Metadata { @@ -37,40 +35,46 @@ pub struct Metadata { pub block_number: u64, } -#[derive(Clone, Debug)] +#[derive(Clone)] pub struct FlashblocksCache { - inner: Arc>, + inner: Arc>, + // TODO: add arc_swap::Cache to speed it up even more } impl FlashblocksCache { pub fn new(chain_spec: Arc) -> Self { Self { - inner: Arc::new(Mutex::new(FlashblocksCacheInner::new(chain_spec))), + inner: Arc::new(ArcSwap::from_pointee(FlashblocksCacheInner::new( + chain_spec, + ))), } } pub fn get_block(&self, full: bool) -> Option> { - self.inner.lock().unwrap().get_block(full) + ArcSwap::load(&self.inner).get_block(full) } pub fn get_transaction_count(&self, address: Address) -> Option { - self.inner.lock().unwrap().get_nonce(address) + ArcSwap::load(&self.inner).get_nonce(address) } pub fn get_balance(&self, address: Address) -> Option { - self.inner.lock().unwrap().get_balance(address) + ArcSwap::load(&self.inner).get_balance(address) } pub fn get_receipt(&self, tx_hash: &TxHash) -> Option> { - self.inner.lock().unwrap().get_receipt(tx_hash) + ArcSwap::load(&self.inner).get_receipt(tx_hash) } pub fn process_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { - self.inner.lock().unwrap().process_payload(payload) + let mut new_state = FlashblocksCacheInner::clone(&self.inner.load_full()); + new_state.process_payload(payload)?; + self.inner.store(Arc::new(new_state)); + Ok(()) } } -#[derive(Debug, Clone)] +#[derive(Clone)] struct FlashblocksCacheInner { chain_spec: Arc, builder: FlashblockBuilder, @@ -200,32 +204,39 @@ impl FlashblocksCacheInner { // The first transaction in an Op block is the L1 info transaction. let mut l1_block_info = extract_l1_info(&block.body).expect("failed to extract l1 info"); + let block_number = block.number(); + let base_fee = block.base_fee_per_gas(); + let block_hash = block.hash_slow(); + let excess_blob_gas = block.excess_blob_gas(); + let timestamp = block.timestamp(); + let mut gas_used = 0; + let mut next_log_index = 0; // build the receipts - for (idx, tx) in block.body.transactions.iter().cloned().enumerate() { + for (indx, tx) in block.body.transactions.iter().enumerate() { let receipt = all_receipts - .get(idx) + .get(indx) .expect("Receipt should exist for transaction"); - - let meta = TransactionMeta::default(); - let mut next_log_index = 0; - let mut gas_used = 0; - if meta.index > 0 { - for receipt in all_receipts.iter().take(meta.index as usize) { - gas_used = receipt.cumulative_gas_used(); - next_log_index += receipt.logs().len(); - } - } - let tx = tx.try_into_recovered_unchecked()?; - + let meta = TransactionMeta { + tx_hash: tx.tx_hash(), + index: indx as u64, + block_hash, + block_number, + base_fee, + excess_blob_gas, + timestamp, + }; let input: ConvertReceiptInput<'_, OpPrimitives> = ConvertReceiptInput { - tx: tx.as_recovered_ref(), + receipt: Cow::Borrowed(receipt), + tx: tx.try_to_recovered_ref()?, gas_used: receipt.cumulative_gas_used() - gas_used, - receipt: Cow::Owned(receipt.clone()), next_log_index, meta, }; + gas_used = receipt.cumulative_gas_used(); + next_log_index += receipt.logs().len(); + let rpc_receipt = OpReceiptBuilder::new(&self.chain_spec.clone(), input, &mut l1_block_info) .expect("failed to build receipt") diff --git a/crates/flashblocks-rpc/src/flashblocks.rs b/crates/flashblocks-rpc/src/flashblocks.rs index d90427f5..fe3e3c42 100644 --- a/crates/flashblocks-rpc/src/flashblocks.rs +++ b/crates/flashblocks-rpc/src/flashblocks.rs @@ -1,38 +1,99 @@ use crate::{FlashblocksApi, cache::FlashblocksCache}; use alloy_primitives::{Address, TxHash, U256}; -use flashblocks_p2p::protocol::handler::FlashblocksHandle; -use futures_util::StreamExt as _; +use futures_util::StreamExt; use jsonrpsee::core::async_trait; use op_alloy_network::Optimism; use reth_optimism_chainspec::OpChainSpec; use reth_rpc_eth_api::{RpcBlock, RpcReceipt}; use rollup_boost::FlashblocksPayloadV1; -use std::sync::Arc; -use tracing::error; +use std::{io::Read, sync::Arc}; +use tokio::sync::mpsc; +use tokio_tungstenite::{connect_async, tungstenite::Message}; +use tracing::{debug, error, info}; +use url::Url; -#[derive(Debug, Clone)] +#[derive(Clone)] pub struct FlashblocksOverlay { - flashblocks_handle: FlashblocksHandle, + url: Url, cache: FlashblocksCache, } impl FlashblocksOverlay { - pub fn new(flashblocks_handle: FlashblocksHandle, chain_spec: Arc) -> Self { + pub fn new(url: Url, chain_spec: Arc) -> Self { Self { - flashblocks_handle, + url, cache: FlashblocksCache::new(chain_spec), } } - pub fn start(self) -> eyre::Result<()> { - let cache_cloned = self.cache.clone(); + pub fn start(&mut self) -> eyre::Result<()> { + let url = self.url.clone(); + let (sender, mut receiver) = mpsc::channel(100); + tokio::spawn(async move { - let mut stream = self.flashblocks_handle.flashblock_stream(); + let mut backoff = std::time::Duration::from_secs(1); + const MAX_BACKOFF: std::time::Duration = std::time::Duration::from_secs(10); + loop { - // TODO: handle this error - let payload = stream.next().await.unwrap(); - if let Err(e) = cache_cloned.process_payload(payload) { - error!("failed to process payload: {}", e); + match connect_async(url.as_str()).await { + Ok((ws_stream, _)) => { + info!("WebSocket connection established"); + let (_write, mut read) = ws_stream.split(); + + while let Some(msg) = read.next().await { + debug!("Received message: {:?}", msg); + + match msg { + Ok(Message::Binary(bytes)) => match try_decode_message(&bytes) { + Ok(payload) => { + info!("Received payload: {:?}", payload); + + let _ = sender + .send(InternalMessage::NewPayload(payload)) + .await + .map_err(|e| { + error!("failed to send payload to channel: {}", e); + }); + } + Err(e) => { + error!("failed to parse fb message: {}", e); + } + }, + Ok(Message::Close(e)) => { + error!("WebSocket connection closed: {:?}", e); + break; + } + Err(e) => { + error!("WebSocket connection error: {}", e); + break; + } + _ => {} + } + } + } + Err(e) => { + error!( + "WebSocket connection error, retrying in {:?}: {}", + backoff, e + ); + tokio::time::sleep(backoff).await; + // Double the backoff time, but cap at MAX_BACKOFF + backoff = std::cmp::min(backoff * 2, MAX_BACKOFF); + continue; + } + } + } + }); + + let cache_cloned = self.cache.clone(); + tokio::spawn(async move { + while let Some(message) = receiver.recv().await { + match message { + InternalMessage::NewPayload(payload) => { + if let Err(e) = cache_cloned.process_payload(payload) { + error!("failed to process payload: {}", e); + } + } } } }); @@ -45,6 +106,38 @@ impl FlashblocksOverlay { } } +enum InternalMessage { + NewPayload(FlashblocksPayloadV1), +} + +fn try_decode_message(bytes: &[u8]) -> eyre::Result { + let text = try_parse_message(bytes)?; + + let payload: FlashblocksPayloadV1 = match serde_json::from_str(&text) { + Ok(m) => m, + Err(e) => { + return Err(eyre::eyre!("failed to parse message: {}", e)); + } + }; + + Ok(payload) +} + +fn try_parse_message(bytes: &[u8]) -> eyre::Result { + if let Ok(text) = String::from_utf8(bytes.to_vec()) + && text.trim_start().starts_with("{") + { + return Ok(text); + } + + let mut decompressor = brotli::Decompressor::new(bytes, 4096); + let mut decompressed = Vec::new(); + decompressor.read_to_end(&mut decompressed)?; + + let text = String::from_utf8(decompressed)?; + Ok(text) +} + #[async_trait] impl FlashblocksApi for FlashblocksOverlay { async fn block_by_number(&self, full: bool) -> Option> { diff --git a/crates/flashblocks-rpc/src/lib.rs b/crates/flashblocks-rpc/src/lib.rs index 3bb78141..5887b2a7 100644 --- a/crates/flashblocks-rpc/src/lib.rs +++ b/crates/flashblocks-rpc/src/lib.rs @@ -8,4 +8,4 @@ mod metrics; pub use metrics::*; mod cache; -pub use cache::*; +mod tests; diff --git a/crates/flashblocks-rpc/src/rpc.rs b/crates/flashblocks-rpc/src/rpc.rs index b526aab1..93149d43 100644 --- a/crates/flashblocks-rpc/src/rpc.rs +++ b/crates/flashblocks-rpc/src/rpc.rs @@ -1,8 +1,9 @@ use alloy_eips::{BlockId, BlockNumberOrTag}; use alloy_primitives::{Address, TxHash, U256}; -use jsonrpsee::core::RpcResult; -use jsonrpsee::core::async_trait; -use jsonrpsee::proc_macros::rpc; +use jsonrpsee::{ + core::{RpcResult, async_trait}, + proc_macros::rpc, +}; use op_alloy_network::Optimism; use reth_optimism_primitives::OpTransactionSigned; use reth_provider::TransactionsProvider; @@ -112,10 +113,10 @@ where debug!("get_balance: {:?}, {:?}", address, block_number); let block_id = block_number.unwrap_or_default(); - if block_id.is_pending() { - if let Some(balance) = self.flashblocks_api.get_balance(address).await { - return Ok(balance); - } + if block_id.is_pending() + && let Some(balance) = self.flashblocks_api.get_balance(address).await + { + return Ok(balance); } EthState::balance(&self.eth_api, address, block_number) .await diff --git a/crates/flashblocks-node/tests/assets/genesis.json b/crates/flashblocks-rpc/src/tests/assets/genesis.json similarity index 100% rename from crates/flashblocks-node/tests/assets/genesis.json rename to crates/flashblocks-rpc/src/tests/assets/genesis.json diff --git a/crates/flashblocks-rpc/src/tests/mod.rs b/crates/flashblocks-rpc/src/tests/mod.rs new file mode 100644 index 00000000..cc4e99ed --- /dev/null +++ b/crates/flashblocks-rpc/src/tests/mod.rs @@ -0,0 +1,314 @@ +#[cfg(test)] +mod tests { + use crate::{EthApiOverrideServer, FlashblocksApiExt, FlashblocksOverlay, cache::Metadata}; + use alloy_consensus::Receipt; + use alloy_genesis::Genesis; + use alloy_primitives::{Address, B256, Bytes, TxHash, U256, address, b256}; + use alloy_provider::{Provider, RootProvider}; + use alloy_rpc_client::RpcClient; + use alloy_rpc_types_engine::PayloadId; + use reth_node_builder::{Node, NodeBuilder, NodeConfig, NodeHandle}; + use reth_node_core::{ + args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}, + exit::NodeExitFuture, + }; + use reth_optimism_chainspec::OpChainSpecBuilder; + use reth_optimism_node::{OpNode, args::RollupArgs}; + use reth_optimism_primitives::OpReceipt; + use reth_provider::providers::BlockchainProvider; + use reth_tasks::TaskManager; + use rollup_boost::{ + ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, + }; + use std::{any::Any, collections::HashMap, net::SocketAddr, str::FromStr, sync::Arc}; + use tokio::sync::{mpsc, oneshot}; + use url::Url; + + pub struct NodeContext { + sender: mpsc::Sender<(FlashblocksPayloadV1, oneshot::Sender<()>)>, + http_api_addr: SocketAddr, + _node_exit_future: NodeExitFuture, + _node: Box, + _task_manager: TaskManager, + } + + impl NodeContext { + pub async fn send_payload(&self, payload: FlashblocksPayloadV1) -> eyre::Result<()> { + let (tx, rx) = oneshot::channel(); + self.sender.send((payload, tx)).await?; + rx.await?; + Ok(()) + } + + pub async fn provider(&self) -> eyre::Result { + let url = format!("http://{}", self.http_api_addr); + let client = RpcClient::builder().http(url.parse()?); + + Ok(RootProvider::new(client)) + } + + pub async fn send_test_payloads(&self) -> eyre::Result<()> { + let base_payload = create_first_payload(); + self.send_payload(base_payload).await?; + + let second_payload = create_second_payload(); + self.send_payload(second_payload).await?; + + Ok(()) + } + } + + async fn setup_node() -> eyre::Result { + let tasks = TaskManager::current(); + let exec = tasks.executor(); + + let genesis: Genesis = serde_json::from_str(include_str!("assets/genesis.json")).unwrap(); + let chain_spec = Arc::new( + OpChainSpecBuilder::base_mainnet() + .genesis(genesis) + .ecotone_activated() + .build(), + ); + + let network_config = NetworkArgs { + discovery: DiscoveryArgs { + disable_discovery: true, + ..DiscoveryArgs::default() + }, + ..NetworkArgs::default() + }; + + // Use with_unused_ports() to let Reth allocate random ports and avoid port collisions + let node_config = NodeConfig::new(chain_spec.clone()) + .with_network(network_config.clone()) + .with_rpc(RpcServerArgs::default().with_unused_ports().with_http()) + .with_unused_ports(); + + let node = OpNode::new(RollupArgs::default()); + + // Start websocket server to simulate the builder and send payloads back to the node + let (sender, mut receiver) = + mpsc::channel::<(FlashblocksPayloadV1, oneshot::Sender<()>)>(100); + + let NodeHandle { + node, + node_exit_future, + } = NodeBuilder::new(node_config.clone()) + .testing_node(exec.clone()) + .with_types_and_provider::>() + .with_components(node.components_builder()) + .with_add_ons(node.add_ons()) + .extend_rpc_modules(move |ctx| { + // We are not going to use the websocket connection to send payloads so we use + // a dummy url. + let flashblocks_overlay = + FlashblocksOverlay::new(Url::parse("ws://localhost:8546")?, chain_spec); + + let eth_api = ctx.registry.eth_api().clone(); + let api_ext = FlashblocksApiExt::new(eth_api.clone(), flashblocks_overlay.clone()); + + ctx.modules.replace_configured(api_ext.into_rpc())?; + + tokio::spawn(async move { + while let Some((payload, tx)) = receiver.recv().await { + flashblocks_overlay.process_payload(payload).unwrap(); + tx.send(()).unwrap(); + } + }); + + Ok(()) + }) + .launch() + .await?; + + let http_api_addr = node + .rpc_server_handle() + .http_local_addr() + .ok_or_else(|| eyre::eyre!("Failed to get http api address"))?; + + Ok(NodeContext { + sender, + http_api_addr, + _node_exit_future: node_exit_future, + _node: Box::new(node), + _task_manager: tasks, + }) + } + + fn create_first_payload() -> FlashblocksPayloadV1 { + FlashblocksPayloadV1 { + payload_id: PayloadId::new([0; 8]), + index: 0, + base: Some(ExecutionPayloadBaseV1 { + parent_beacon_block_root: B256::default(), + parent_hash: B256::default(), + fee_recipient: Address::ZERO, + prev_randao: B256::default(), + block_number: 1, + gas_limit: 0, + timestamp: 0, + extra_data: Bytes::new(), + base_fee_per_gas: U256::ZERO, + }), + diff: ExecutionPayloadFlashblockDeltaV1::default(), + metadata: serde_json::to_value(Metadata { + block_number: 1, + receipts: HashMap::default(), + new_account_balances: HashMap::default(), + }) + .unwrap(), + } + } + + const TEST_ADDRESS: Address = address!("0x1234567890123456789012345678901234567890"); + const PENDING_BALANCE: u64 = 4600; + + const TX1_HASH: TxHash = + b256!("0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548"); + const TX2_HASH: TxHash = + b256!("0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8"); + + fn create_second_payload() -> FlashblocksPayloadV1 { + // Create second payload (index 1) with transactions + // tx1 hash: 0x2be2e6f8b01b03b87ae9f0ebca8bbd420f174bef0fbcc18c7802c5378b78f548 (deposit transaction) + // tx2 hash: 0xa6155b295085d3b87a3c86e342fe11c3b22f9952d0d85d9d34d223b7d6a17cd8 + let tx1 = Bytes::from_str("0x7ef8f8a042a8ae5ec231af3d0f90f68543ec8bca1da4f7edd712d5b51b490688355a6db794deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000044d000a118b00000000000000040000000067cb7cb0000000000077dbd4000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014edd27304108914dd6503b19b9eeb9956982ef197febbeeed8a9eac3dbaaabdf000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3").unwrap(); + let tx2 = Bytes::from_str("0xf8cd82016d8316e5708302c01c94f39635f2adf40608255779ff742afe13de31f57780b8646e530e9700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000156ddc81eed2a36d68302948ba0a608703e79b22164f74523d188a11f81c25a65dd59535bab1cd1d8b30d115f3ea07f4cfbbad77a139c9209d3bded89091867ff6b548dd714109c61d1f8e7a84d14").unwrap(); + + // Send another test flashblock payload + let payload = FlashblocksPayloadV1 { + payload_id: PayloadId::new([0; 8]), + index: 1, + base: None, + diff: ExecutionPayloadFlashblockDeltaV1 { + state_root: B256::default(), + receipts_root: B256::default(), + gas_used: 0, + block_hash: B256::default(), + transactions: vec![tx1, tx2], + withdrawals: Vec::new(), + logs_bloom: Default::default(), + withdrawals_root: Default::default(), + }, + metadata: serde_json::to_value(Metadata { + block_number: 1, + receipts: { + let mut receipts = HashMap::default(); + receipts.insert( + TX1_HASH.to_string(), // transaction hash as string + OpReceipt::Legacy(Receipt { + status: true.into(), + cumulative_gas_used: 21000, + logs: vec![], + }), + ); + receipts.insert( + TX2_HASH.to_string(), // transaction hash as string + OpReceipt::Legacy(Receipt { + status: true.into(), + cumulative_gas_used: 45000, + logs: vec![], + }), + ); + receipts + }, + new_account_balances: { + let mut map = HashMap::default(); + map.insert( + TEST_ADDRESS.to_string(), + format!("0x{:x}", U256::from(PENDING_BALANCE)), + ); + map + }, + }) + .unwrap(), + }; + + payload + } + + #[tokio::test] + async fn test_get_block_by_number_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node().await?; + let provider = node.provider().await?; + + let latest_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Latest) + .await? + .expect("latest block expected"); + assert_eq!(latest_block.number(), 0); + + // Querying pending block when it does not exists yet + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await?; + assert_eq!(pending_block.is_none(), true); + + let base_payload = create_first_payload(); + node.send_payload(base_payload).await?; + + // Query pending block after sending the base payload with an empty delta + let pending_block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(pending_block.number(), 1); + assert_eq!(pending_block.transactions.hashes().len(), 0); + + let second_payload = create_second_payload(); + node.send_payload(second_payload).await?; + + // Query pending block after sending the second payload with two transactions + let block = provider + .get_block_by_number(alloy_eips::BlockNumberOrTag::Pending) + .await? + .expect("pending block expected"); + + assert_eq!(block.number(), 1); + assert_eq!(block.transactions.hashes().len(), 2); + + Ok(()) + } + + #[tokio::test] + async fn test_get_balance_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node().await?; + let provider = node.provider().await?; + + node.send_test_payloads().await?; + + let balance = provider.get_balance(TEST_ADDRESS).await?; + assert_eq!(balance, U256::ZERO); + + let pending_balance = provider.get_balance(TEST_ADDRESS).pending().await?; + assert_eq!(pending_balance, U256::from(PENDING_BALANCE)); + + Ok(()) + } + + #[tokio::test] + async fn test_get_transaction_receipt_pending() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + let node = setup_node().await?; + let provider = node.provider().await?; + + let receipt = provider.get_transaction_receipt(TX1_HASH).await?; + assert_eq!(receipt.is_none(), true); + + node.send_test_payloads().await?; + + let receipt = provider + .get_transaction_receipt(TX1_HASH) + .await? + .expect("receipt expected"); + assert_eq!(receipt.gas_used, 21000); + + // TODO: Add a new payload and validate that the receipts from the previous payload + // are not returned. + + Ok(()) + } +} From e690dec117a054b3ec369c3440c42a69378f831e Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Sep 2025 20:31:05 -0700 Subject: [PATCH 098/114] chore: add websocket-proxy back --- Cargo.lock | 220 +- Cargo.toml | 6 +- crates/websocket-proxy/.dockerignore | 5 + crates/websocket-proxy/.env.example | 3 + crates/websocket-proxy/Cargo.lock | 2829 ++++++++++++++++++++++ crates/websocket-proxy/Cargo.toml | 43 + crates/websocket-proxy/src/auth.rs | 176 ++ crates/websocket-proxy/src/lib.rs | 15 + crates/websocket-proxy/src/rate_limit.rs | 820 +++++++ crates/websocket-proxy/src/server.rs | 226 ++ 10 files changed, 4334 insertions(+), 9 deletions(-) create mode 100644 crates/websocket-proxy/.dockerignore create mode 100644 crates/websocket-proxy/.env.example create mode 100644 crates/websocket-proxy/Cargo.lock create mode 100644 crates/websocket-proxy/Cargo.toml create mode 100644 crates/websocket-proxy/src/auth.rs create mode 100644 crates/websocket-proxy/src/lib.rs create mode 100644 crates/websocket-proxy/src/rate_limit.rs create mode 100644 crates/websocket-proxy/src/server.rs diff --git a/Cargo.lock b/Cargo.lock index 8f3c8de8..4dc68200 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1459,14 +1459,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.4.5", "bytes", "futures-util", "http", "http-body", "http-body-util", "itoa", - "matchit", + "matchit 0.7.3", "memchr", "mime", "percent-encoding", @@ -1479,6 +1479,43 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +dependencies = [ + "axum-core 0.5.2", + "base64 0.22.1", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit 0.8.4", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "axum-core" version = "0.4.5" @@ -1499,12 +1536,43 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "az" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.16", + "instant", + "rand 0.8.5", +] + [[package]] name = "backon" version = "1.5.2" @@ -3311,6 +3379,36 @@ dependencies = [ "url", ] +[[package]] +name = "flashblocks-websocket-proxy" +version = "0.1.0" +dependencies = [ + "axum 0.8.4", + "backoff", + "brotli", + "clap", + "dotenvy", + "eyre", + "futures", + "hostname", + "http", + "metrics", + "metrics-derive", + "metrics-exporter-prometheus 0.17.2", + "redis", + "reqwest", + "serde_json", + "testcontainers", + "testcontainers-modules", + "thiserror 2.0.16", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tracing", + "tracing-subscriber 0.3.20", + "uuid", +] + [[package]] name = "flate2" version = "1.1.2" @@ -3826,6 +3924,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "hostname" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +dependencies = [ + "cfg-if", + "libc", + "windows-link 0.1.3", +] + [[package]] name = "http" version = "1.3.1" @@ -4292,6 +4401,15 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + [[package]] name = "interprocess" version = "2.2.3" @@ -5085,6 +5203,12 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.7.5" @@ -5136,13 +5260,34 @@ dependencies = [ "indexmap 2.11.3", "ipnet", "metrics", - "metrics-util", + "metrics-util 0.19.1", "quanta", "thiserror 1.0.69", "tokio", "tracing", ] +[[package]] +name = "metrics-exporter-prometheus" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b166dea96003ee2531cf14833efedced545751d800f03535801d833313f8c15" +dependencies = [ + "base64 0.22.1", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap 2.11.3", + "ipnet", + "metrics", + "metrics-util 0.20.0", + "quanta", + "thiserror 2.0.16", + "tokio", + "tracing", +] + [[package]] name = "metrics-process" version = "2.4.0" @@ -5179,6 +5324,22 @@ dependencies = [ "sketches-ddsketch", ] +[[package]] +name = "metrics-util" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe8db7a05415d0f919ffb905afa37784f71901c9a773188876984b4f769ab986" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.15.5", + "metrics", + "quanta", + "rand 0.9.2", + "rand_xoshiro", + "sketches-ddsketch", +] + [[package]] name = "mime" version = "0.3.17" @@ -6588,6 +6749,23 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" +[[package]] +name = "redis" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "438a4e5f8e9aa246d6f3666d6978441bf1b37d5f417b50c4dd220be09f5fcc17" +dependencies = [ + "arc-swap", + "combine", + "itoa", + "num-bigint", + "percent-encoding", + "ryu", + "sha1_smol", + "socket2 0.5.10", + "url", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -8317,9 +8495,9 @@ dependencies = [ "http", "jsonrpsee-server 0.26.0", "metrics", - "metrics-exporter-prometheus", + "metrics-exporter-prometheus 0.16.2", "metrics-process", - "metrics-util", + "metrics-util 0.19.1", "procfs", "reth-metrics", "reth-tasks", @@ -9997,8 +10175,8 @@ dependencies = [ "jsonrpsee 0.25.1", "metrics", "metrics-derive", - "metrics-exporter-prometheus", - "metrics-util", + "metrics-exporter-prometheus 0.16.2", + "metrics-util 0.19.1", "moka", "op-alloy-consensus", "op-alloy-rpc-types-engine", @@ -10506,6 +10684,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + [[package]] name = "serde_repr" version = "0.1.20" @@ -10591,6 +10780,12 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.9.9" @@ -11066,6 +11261,15 @@ dependencies = [ "url", ] +[[package]] +name = "testcontainers-modules" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d43ed4e8f58424c3a2c6c56dbea6643c3c23e8666a34df13c54f0a184e6c707" +dependencies = [ + "testcontainers", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -11381,7 +11585,7 @@ checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", - "axum", + "axum 0.7.9", "base64 0.22.1", "bytes", "h2", diff --git a/Cargo.toml b/Cargo.toml index 7fcef31c..e0ff14be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,11 @@ [workspace] resolver = "3" -members = ["crates/rollup-boost", "crates/flashblocks-rpc"] +members = [ + "crates/rollup-boost", + "crates/websocket-proxy", + "crates/flashblocks-rpc", +] [workspace.dependencies] rollup-boost = { path = "crates/rollup-boost" } diff --git a/crates/websocket-proxy/.dockerignore b/crates/websocket-proxy/.dockerignore new file mode 100644 index 00000000..7bf30c2f --- /dev/null +++ b/crates/websocket-proxy/.dockerignore @@ -0,0 +1,5 @@ +target/ +.git/ +.github/ +.gitignore +README.md \ No newline at end of file diff --git a/crates/websocket-proxy/.env.example b/crates/websocket-proxy/.env.example new file mode 100644 index 00000000..b6f660ec --- /dev/null +++ b/crates/websocket-proxy/.env.example @@ -0,0 +1,3 @@ +UPSTREAM_WS=ws://upstreamurl.com/rs +MAXIMUM_CONCURRENT_CONNECTIONS=2 +LOG_LEVEL=debug diff --git a/crates/websocket-proxy/Cargo.lock b/crates/websocket-proxy/Cargo.lock new file mode 100644 index 00000000..78e1ba82 --- /dev/null +++ b/crates/websocket-proxy/Cargo.lock @@ -0,0 +1,2829 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "aws-lc-rs" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa9b6986f250236c27e5a204062434a773a13243d2ffc2955f37bdba4c5c6a1" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "axum" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" +dependencies = [ + "axum-core", + "base64", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.16", + "instant", + "rand 0.8.5", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", + "which", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "flashblocks-websocket-proxy" +version = "0.1.0" +dependencies = [ + "axum", + "backoff", + "clap", + "dotenvy", + "futures", + "hostname", + "http", + "metrics", + "metrics-derive", + "metrics-exporter-prometheus", + "redis", + "redis-test", + "reqwest", + "ring", + "serde_json", + "thiserror", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "h2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "hostname" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +dependencies = [ + "cfg-if", + "libc", + "windows-link", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.2", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "metrics" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dea7ac8057892855ec285c440160265225438c3c45072613c25a4b26e98ef5" +dependencies = [ + "ahash", + "portable-atomic", +] + +[[package]] +name = "metrics-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3dbdd96ed57d565ec744cba02862d707acf373c5772d152abae6ec5c4e24f6c" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df88858cd28baaaf2cfc894e37789ed4184be0e1351157aec7bf3c2266c793fd" +dependencies = [ + "base64", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "indexmap", + "ipnet", + "metrics", + "metrics-util", + "quanta", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-util" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8496cc523d1f94c1385dd8f0f0c2c480b2b8aeccb5b7e4485ad6365523ae376" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown", + "metrics", + "quanta", + "rand 0.9.1", + "rand_xoshiro", + "sketches-ddsketch", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quanta" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "raw-cpuid" +version = "11.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redis" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "438a4e5f8e9aa246d6f3666d6978441bf1b37d5f417b50c4dd220be09f5fcc17" +dependencies = [ + "arc-swap", + "combine", + "itoa", + "num-bigint", + "percent-encoding", + "ryu", + "sha1_smol", + "socket2", + "url", +] + +[[package]] +name = "redis-test" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "967d3ffa2d2ead5a95b2e8561d7453c4719c9fe9dbba521673e058e513cb1c24" +dependencies = [ + "rand 0.9.1", + "redis", + "socket2", + "tempfile", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +dependencies = [ + "aws-lc-rs", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" + +[[package]] +name = "rustls-webpki" +version = "0.103.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "sketches-ddsketch" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix 1.0.5", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "native-tls", + "rand 0.9.1", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/crates/websocket-proxy/Cargo.toml b/crates/websocket-proxy/Cargo.toml new file mode 100644 index 00000000..14785f79 --- /dev/null +++ b/crates/websocket-proxy/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "flashblocks-websocket-proxy" +version = "0.1.0" +edition = "2021" +rust-version = "1.85" +license = "MIT" + +[dependencies] +tracing.workspace = true +tracing-subscriber.workspace = true +clap.workspace = true +futures.workspace = true +thiserror.workspace = true +serde_json.workspace = true +metrics.workspace = true +metrics-derive.workspace = true +tokio.workspace = true +tokio-tungstenite.workspace = true +eyre.workspace = true + +metrics-exporter-prometheus = { version = "0.17.0", features = [ + "http-listener", +] } +http = "1.2.0" +axum = { version = "0.8.1", features = ["ws"] } +dotenvy = "0.15.7" +backoff = "0.4.0" +reqwest = { version = "0.12.15", default-features = false, features = [ + "native-tls", +] } + +hostname = "0.4.0" +redis = "0.30.0" +uuid = { version = "1.16.0", features = ["v4"] } +tokio-util = "0.7.12" +brotli = "8.0.1" + +[lib] +name = "websocket_proxy" + +[dev-dependencies] +testcontainers.workspace = true +testcontainers-modules.workspace = true diff --git a/crates/websocket-proxy/src/auth.rs b/crates/websocket-proxy/src/auth.rs new file mode 100644 index 00000000..74d3172c --- /dev/null +++ b/crates/websocket-proxy/src/auth.rs @@ -0,0 +1,176 @@ +use crate::auth::AuthenticationParseError::{ + DuplicateAPIKeyArgument, DuplicateApplicationArgument, MissingAPIKeyArgument, + MissingApplicationArgument, NoData, TooManyComponents, +}; +use std::collections::{HashMap, HashSet}; + +#[derive(Clone, Debug)] +pub struct Authentication { + key_to_application: HashMap, +} + +#[derive(Debug, PartialEq)] +pub enum AuthenticationParseError { + NoData(), + MissingApplicationArgument(String), + MissingAPIKeyArgument(String), + TooManyComponents(String), + DuplicateApplicationArgument(String), + DuplicateAPIKeyArgument(String), +} + +impl std::fmt::Display for AuthenticationParseError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + NoData() => write!(f, "No API Keys Provided"), + MissingApplicationArgument(arg) => write!(f, "Missing application argument: [{arg}]"), + MissingAPIKeyArgument(app) => write!(f, "Missing API Key argument: [{app}]"), + TooManyComponents(app) => write!(f, "Too many components: [{app}]"), + DuplicateApplicationArgument(app) => { + write!(f, "Duplicate application argument: [{app}]") + } + DuplicateAPIKeyArgument(app) => write!(f, "Duplicate API key: [{app}]"), + } + } +} + +impl std::error::Error for AuthenticationParseError {} + +impl TryFrom> for Authentication { + type Error = AuthenticationParseError; + + fn try_from(args: Vec) -> Result { + let mut applications = HashSet::new(); + let mut key_to_application: HashMap = HashMap::new(); + + if args.is_empty() { + return Err(NoData()); + } + + for arg in args { + let mut parts = arg.split(":"); + let app = parts + .next() + .ok_or(MissingApplicationArgument(arg.clone()))?; + if app.is_empty() { + return Err(MissingApplicationArgument(arg.clone())); + } + + let key = parts.next().ok_or(MissingAPIKeyArgument(app.to_string()))?; + if key.is_empty() { + return Err(MissingAPIKeyArgument(app.to_string())); + } + + if parts.count() > 0 { + return Err(TooManyComponents(app.to_string())); + } + + if applications.contains(app) { + return Err(DuplicateApplicationArgument(app.to_string())); + } + + if key_to_application.contains_key(key) { + return Err(DuplicateAPIKeyArgument(app.to_string())); + } + + applications.insert(app.to_string()); + key_to_application.insert(key.to_string(), app.to_string()); + } + + Ok(Self { key_to_application }) + } +} + +impl Authentication { + pub fn none() -> Self { + Self { + key_to_application: HashMap::new(), + } + } + + #[allow(dead_code)] + pub fn new(api_keys: HashMap) -> Self { + Self { + key_to_application: api_keys, + } + } + + pub fn get_application_for_key(&self, api_key: &String) -> Option<&String> { + self.key_to_application.get(api_key) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parsing() { + let auth = Authentication::try_from(vec![ + "app1:key1".to_string(), + "app2:key2".to_string(), + "app3:key3".to_string(), + ]) + .unwrap(); + + assert_eq!(auth.key_to_application.len(), 3); + assert_eq!(auth.key_to_application["key1"], "app1"); + assert_eq!(auth.key_to_application["key2"], "app2"); + assert_eq!(auth.key_to_application["key3"], "app3"); + + let auth = Authentication::try_from(vec![ + "app1:key1".to_string(), + "".to_string(), + "app3:key3".to_string(), + ]); + assert!(auth.is_err()); + assert_eq!(auth.unwrap_err(), MissingApplicationArgument("".into())); + + let auth = Authentication::try_from(vec![ + "app1:key1".to_string(), + "app2".to_string(), + "app3:key3".to_string(), + ]); + assert!(auth.is_err()); + assert_eq!(auth.unwrap_err(), MissingAPIKeyArgument("app2".into())); + + let auth = Authentication::try_from(vec![ + "app1:key1".to_string(), + ":".to_string(), + "app3:key3".to_string(), + ]); + assert!(auth.is_err()); + assert_eq!(auth.unwrap_err(), MissingApplicationArgument(":".into())); + + let auth = Authentication::try_from(vec![ + "app1:key1".to_string(), + "app2:".to_string(), + "app3:key3".to_string(), + ]); + assert!(auth.is_err()); + assert_eq!(auth.unwrap_err(), MissingAPIKeyArgument("app2".into())); + + let auth = Authentication::try_from(vec![ + "app1:key1".to_string(), + "app2:key2:unexpected2".to_string(), + "app3:key3".to_string(), + ]); + assert!(auth.is_err()); + assert_eq!(auth.unwrap_err(), TooManyComponents("app2".into())); + + let auth = Authentication::try_from(vec![ + "app1:key1".to_string(), + "app1:key3".to_string(), + "app2:key2".to_string(), + ]); + assert!(auth.is_err()); + assert_eq!( + auth.unwrap_err(), + DuplicateApplicationArgument("app1".into()) + ); + + let auth = Authentication::try_from(vec!["app1:key1".to_string(), "app2:key1".to_string()]); + assert!(auth.is_err()); + assert_eq!(auth.unwrap_err(), DuplicateAPIKeyArgument("app2".into())); + } +} diff --git a/crates/websocket-proxy/src/lib.rs b/crates/websocket-proxy/src/lib.rs new file mode 100644 index 00000000..ec369b49 --- /dev/null +++ b/crates/websocket-proxy/src/lib.rs @@ -0,0 +1,15 @@ +pub mod auth; +pub mod client; +pub mod metrics; +pub mod rate_limit; +pub mod registry; +pub mod server; +pub mod subscriber; + +pub use auth::*; +pub use client::*; +pub use metrics::*; +pub use rate_limit::*; +pub use registry::*; +pub use server::*; +pub use subscriber::*; diff --git a/crates/websocket-proxy/src/rate_limit.rs b/crates/websocket-proxy/src/rate_limit.rs new file mode 100644 index 00000000..34148def --- /dev/null +++ b/crates/websocket-proxy/src/rate_limit.rs @@ -0,0 +1,820 @@ +use std::collections::HashMap; +use std::net::IpAddr; +use std::sync::{Arc, Mutex}; +use tracing::{debug, error, warn}; + +use thiserror::Error; +use tokio::sync::{OwnedSemaphorePermit, Semaphore}; + +use redis::{Client, Commands, RedisError}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::{Duration, SystemTime}; +use uuid::Uuid; + +#[derive(Error, Debug)] +pub enum RateLimitError { + #[error("Rate Limit Reached: {reason}")] + Limit { reason: String }, +} + +#[clippy::has_significant_drop] +pub struct Ticket { + addr: IpAddr, + _permit: OwnedSemaphorePermit, + rate_limiter: Arc, +} + +impl Drop for Ticket { + fn drop(&mut self) { + self.rate_limiter.release(self.addr) + } +} + +pub trait RateLimit: Send + Sync { + fn try_acquire(self: Arc, addr: IpAddr) -> Result; + + fn release(&self, ticket: IpAddr); +} + +struct Inner { + active_connections: HashMap, + semaphore: Arc, +} + +pub struct InMemoryRateLimit { + per_ip_limit: usize, + inner: Mutex, +} + +impl InMemoryRateLimit { + pub fn new(instance_limit: usize, per_ip_limit: usize) -> Self { + Self { + per_ip_limit, + inner: Mutex::new(Inner { + active_connections: HashMap::new(), + semaphore: Arc::new(Semaphore::new(instance_limit)), + }), + } + } +} + +impl RateLimit for InMemoryRateLimit { + fn try_acquire(self: Arc, addr: IpAddr) -> Result { + let mut inner = self.inner.lock().unwrap(); + + let permit = + inner + .semaphore + .clone() + .try_acquire_owned() + .map_err(|_| RateLimitError::Limit { + reason: "Global limit".to_owned(), + })?; + + let current_count = match inner.active_connections.get(&addr) { + Some(count) => *count, + None => 0, + }; + + if current_count + 1 > self.per_ip_limit { + debug!( + message = "Rate limit exceeded, trying to acquire", + client = addr.to_string() + ); + return Err(RateLimitError::Limit { + reason: String::from("IP limit exceeded"), + }); + } + + let new_count = current_count + 1; + + inner.active_connections.insert(addr, new_count); + + Ok(Ticket { + addr, + _permit: permit, + rate_limiter: self.clone(), + }) + } + + fn release(&self, addr: IpAddr) { + let mut inner = self.inner.lock().unwrap(); + + let current_count = match inner.active_connections.get(&addr) { + Some(count) => *count, + None => 0, + }; + + let new_count = if current_count == 0 { + warn!( + message = "ip counting is not accurate -- unexpected underflow", + client = addr.to_string() + ); + 0 + } else { + current_count - 1 + }; + + if new_count == 0 { + inner.active_connections.remove(&addr); + } else { + inner.active_connections.insert(addr, new_count); + } + } +} + +pub struct RedisRateLimit { + redis_client: Client, + instance_limit: usize, + per_ip_limit: usize, + semaphore: Arc, + key_prefix: String, + instance_id: String, + heartbeat_interval: Duration, + heartbeat_ttl: Duration, + background_tasks_started: AtomicBool, +} + +impl RedisRateLimit { + pub fn new( + redis_url: &str, + instance_limit: usize, + per_ip_limit: usize, + key_prefix: &str, + ) -> Result { + let client = Client::open(redis_url)?; + let instance_id = Uuid::new_v4().to_string(); + + let heartbeat_interval = Duration::from_secs(10); + let heartbeat_ttl = Duration::from_secs(30); + + let rate_limiter = Self { + redis_client: client, + instance_limit, + per_ip_limit, + semaphore: Arc::new(Semaphore::new(instance_limit)), + key_prefix: key_prefix.to_string(), + instance_id, + heartbeat_interval, + heartbeat_ttl, + background_tasks_started: AtomicBool::new(false), + }; + + if let Err(e) = rate_limiter.register_instance() { + error!( + message = "Failed to register instance in Redis", + error = e.to_string() + ); + } + + Ok(rate_limiter) + } + + pub fn start_background_tasks(self: Arc) { + if self.background_tasks_started.swap(true, Ordering::SeqCst) { + return; + } + + debug!( + message = "Starting background heartbeat and cleanup tasks", + instance_id = self.instance_id + ); + + let self_clone = self.clone(); + tokio::spawn(async move { + loop { + if let Err(e) = self_clone.update_heartbeat() { + error!( + message = "Failed to update heartbeat in background task", + error = e.to_string() + ); + } + + if let Err(e) = self_clone.cleanup_stale_instances() { + error!( + message = "Failed to cleanup stale instances in background task", + error = e.to_string() + ); + } + + tokio::time::sleep(self_clone.heartbeat_interval / 2).await; + } + }); + } + + fn register_instance(&self) -> Result<(), RedisError> { + self.update_heartbeat()?; + debug!( + message = "Registered instance in Redis", + instance_id = self.instance_id + ); + + Ok(()) + } + + fn update_heartbeat(&self) -> Result<(), RedisError> { + let now = SystemTime::now(); + let mut conn = self.redis_client.get_connection()?; + + let ttl = self.heartbeat_ttl.as_secs(); + conn.set_ex::<_, _, ()>( + self.instance_heartbeat_key(), + now.duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(), + ttl, + )?; + + debug!( + message = "Updated instance heartbeat", + instance_id = self.instance_id + ); + + Ok(()) + } + + fn cleanup_stale_instances(&self) -> Result<(), RedisError> { + let mut conn = self.redis_client.get_connection()?; + + let instance_heartbeat_pattern = format!("{}:instance:*:heartbeat", self.key_prefix); + let instance_heartbeats: Vec = conn.keys(instance_heartbeat_pattern)?; + + let active_instance_ids: Vec = instance_heartbeats + .iter() + .filter_map(|key| key.split(':').nth(2).map(String::from)) + .collect(); + + debug!( + message = "Active instances with heartbeats", + instance_count = active_instance_ids.len(), + current_instance = self.instance_id + ); + + let ip_instance_pattern = format!("{}:ip:*:instance:*:connections", self.key_prefix); + let ip_instance_keys: Vec = conn.keys(ip_instance_pattern)?; + + let mut instance_ids_with_connections = std::collections::HashSet::new(); + for key in &ip_instance_keys { + if let Some(instance_id) = key.split(':').nth(4) { + instance_ids_with_connections.insert(instance_id.to_string()); + } + } + + debug!( + message = "Checking for stale instances", + instances_with_connections = instance_ids_with_connections.len(), + current_instance = self.instance_id + ); + + for instance_id in instance_ids_with_connections { + if instance_id == self.instance_id { + debug!( + message = "Skipping current instance", + instance_id = instance_id + ); + continue; + } + + if !active_instance_ids.contains(&instance_id) { + debug!( + message = "Found stale instance", + instance_id = instance_id, + reason = "Heartbeat key not found" + ); + self.cleanup_instance(&mut conn, &instance_id)?; + } + } + + debug!(message = "Completed stale instance cleanup"); + + Ok(()) + } + + fn cleanup_instance( + &self, + conn: &mut redis::Connection, + instance_id: &str, + ) -> Result<(), RedisError> { + let ip_instance_pattern = format!( + "{}:ip:*:instance:{}:connections", + self.key_prefix, instance_id + ); + let ip_instance_keys: Vec = conn.keys(ip_instance_pattern)?; + + debug!( + message = "Cleaning up instance", + instance_id = instance_id, + ip_key_count = ip_instance_keys.len() + ); + + for key in ip_instance_keys { + conn.del::<_, ()>(&key)?; + debug!(message = "Deleted IP instance key", key = key); + } + + Ok(()) + } + + fn ip_instance_key(&self, addr: &IpAddr) -> String { + format!( + "{}:ip:{}:instance:{}:connections", + self.key_prefix, addr, self.instance_id + ) + } + + fn instance_heartbeat_key(&self) -> String { + format!( + "{}:instance:{}:heartbeat", + self.key_prefix, self.instance_id + ) + } +} + +impl RateLimit for RedisRateLimit { + fn try_acquire(self: Arc, addr: IpAddr) -> Result { + self.clone().start_background_tasks(); + + let permit = match self.semaphore.clone().try_acquire_owned() { + Ok(permit) => permit, + Err(_) => { + return Err(RateLimitError::Limit { + reason: "Maximum connection limit reached for this server instance".to_string(), + }); + } + }; + + let mut conn = match self.redis_client.get_connection() { + Ok(conn) => conn, + Err(e) => { + error!( + message = "Failed to connect to Redis", + error = e.to_string() + ); + return Err(RateLimitError::Limit { + reason: "Redis connection failed".to_string(), + }); + } + }; + + let ip_keys_pattern = format!("{}:ip:{}:instance:*:connections", self.key_prefix, addr); + let ip_keys: Vec = match conn.keys(ip_keys_pattern) { + Ok(keys) => keys, + Err(e) => { + error!( + message = "Failed to get IP instance keys from Redis", + error = e.to_string() + ); + return Err(RateLimitError::Limit { + reason: "Redis operation failed".to_string(), + }); + } + }; + + let mut total_ip_connections: usize = 0; + for key in &ip_keys { + let count: usize = conn.get(key).unwrap_or(0); + total_ip_connections += count; + } + + if total_ip_connections >= self.per_ip_limit { + return Err(RateLimitError::Limit { + reason: format!("Per-IP connection limit reached for {addr}"), + }); + } + + let ip_instance_connections: usize = match conn.incr(self.ip_instance_key(&addr), 1) { + Ok(count) => count, + Err(e) => { + error!( + message = "Failed to increment per-instance IP counter in Redis", + error = e.to_string() + ); + return Err(RateLimitError::Limit { + reason: "Redis operation failed".to_string(), + }); + } + }; + + let total_instance_connections = self.instance_limit - self.semaphore.available_permits(); + + debug!( + message = "Connection established", + ip = addr.to_string(), + ip_instance_connections = ip_instance_connections, + total_ip_connections = total_ip_connections + 1, + total_instance_connections = total_instance_connections, + instance_id = self.instance_id + ); + + Ok(Ticket { + addr, + _permit: permit, + rate_limiter: self, + }) + } + + fn release(&self, addr: IpAddr) { + match self.redis_client.get_connection() { + Ok(mut conn) => { + let ip_instance_connections: Result = + conn.decr(self.ip_instance_key(&addr), 1); + + if let Err(ref e) = ip_instance_connections { + error!( + message = "Failed to decrement per-instance IP counter in Redis", + error = e.to_string() + ); + } + + debug!( + message = "Connection released", + ip = addr.to_string(), + ip_instance_connections = ip_instance_connections.unwrap_or(0), + instance_id = self.instance_id + ); + } + Err(e) => { + error!( + message = "Failed to connect to Redis for release", + error = e.to_string() + ); + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::str::FromStr; + use std::time::Duration; + use testcontainers::runners::AsyncRunner; + use testcontainers_modules::redis::Redis; + + const GLOBAL_LIMIT: usize = 3; + const PER_IP_LIMIT: usize = 2; + + #[tokio::test] + async fn test_tickets_are_released() { + let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); + + let rate_limiter = Arc::new(InMemoryRateLimit::new(GLOBAL_LIMIT, PER_IP_LIMIT)); + + assert_eq!( + rate_limiter + .inner + .lock() + .unwrap() + .semaphore + .available_permits(), + GLOBAL_LIMIT + ); + assert_eq!( + rate_limiter.inner.lock().unwrap().active_connections.len(), + 0 + ); + + let c1 = rate_limiter.clone().try_acquire(user_1).unwrap(); + + assert_eq!( + rate_limiter + .inner + .lock() + .unwrap() + .semaphore + .available_permits(), + GLOBAL_LIMIT - 1 + ); + assert_eq!( + rate_limiter.inner.lock().unwrap().active_connections.len(), + 1 + ); + assert_eq!( + rate_limiter.inner.lock().unwrap().active_connections[&user_1], + 1 + ); + + drop(c1); + + assert_eq!( + rate_limiter + .inner + .lock() + .unwrap() + .semaphore + .available_permits(), + GLOBAL_LIMIT + ); + assert_eq!( + rate_limiter.inner.lock().unwrap().active_connections.len(), + 0 + ); + } + + #[tokio::test] + async fn test_global_rate_limits() { + let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); + let user_2 = IpAddr::from_str("128.0.0.1").unwrap(); + + let rate_limiter = Arc::new(InMemoryRateLimit::new(GLOBAL_LIMIT, PER_IP_LIMIT)); + + let _c1 = rate_limiter.clone().try_acquire(user_1).unwrap(); + + let _c2 = rate_limiter.clone().try_acquire(user_2).unwrap(); + + let _c3 = rate_limiter.clone().try_acquire(user_1).unwrap(); + + assert_eq!( + rate_limiter + .inner + .lock() + .unwrap() + .semaphore + .available_permits(), + 0 + ); + + let c4 = rate_limiter.clone().try_acquire(user_2); + assert!(c4.is_err()); + assert_eq!( + c4.err().unwrap().to_string(), + "Rate Limit Reached: Global limit" + ); + + drop(_c3); + + let c4 = rate_limiter.clone().try_acquire(user_2); + assert!(c4.is_ok()); + } + + #[tokio::test] + async fn test_per_ip_limits() { + let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); + let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); + + let rate_limiter = Arc::new(InMemoryRateLimit::new(GLOBAL_LIMIT, PER_IP_LIMIT)); + + let _c1 = rate_limiter.clone().try_acquire(user_1).unwrap(); + let _c2 = rate_limiter.clone().try_acquire(user_1).unwrap(); + + assert_eq!( + rate_limiter.inner.lock().unwrap().active_connections[&user_1], + 2 + ); + + let c3 = rate_limiter.clone().try_acquire(user_1); + assert!(c3.is_err()); + assert_eq!( + c3.err().unwrap().to_string(), + "Rate Limit Reached: IP limit exceeded" + ); + + let c4 = rate_limiter.clone().try_acquire(user_2); + assert!(c4.is_ok()); + } + + #[tokio::test] + async fn test_global_limits_with_multiple_ips() { + let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); + let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); + let user_3 = IpAddr::from_str("127.0.0.3").unwrap(); + + let rate_limiter = Arc::new(InMemoryRateLimit::new(4, 3)); + + let ticket_1_1 = rate_limiter.clone().try_acquire(user_1).unwrap(); + let ticket_1_2 = rate_limiter.clone().try_acquire(user_1).unwrap(); + + let ticket_2_1 = rate_limiter.clone().try_acquire(user_2).unwrap(); + let ticket_2_2 = rate_limiter.clone().try_acquire(user_2).unwrap(); + + assert_eq!( + rate_limiter + .inner + .lock() + .unwrap() + .semaphore + .available_permits(), + 0 + ); + + // Try user_3 - should fail due to global limit + let result = rate_limiter.clone().try_acquire(user_3); + assert!(result.is_err()); + assert_eq!( + result.err().unwrap().to_string(), + "Rate Limit Reached: Global limit" + ); + + drop(ticket_1_1); + + let ticket_3_1 = rate_limiter.clone().try_acquire(user_3).unwrap(); + + drop(ticket_1_2); + drop(ticket_2_1); + drop(ticket_2_2); + drop(ticket_3_1); + + assert_eq!( + rate_limiter + .inner + .lock() + .unwrap() + .semaphore + .available_permits(), + 4 + ); + assert_eq!( + rate_limiter.inner.lock().unwrap().active_connections.len(), + 0 + ); + } + + #[tokio::test] + async fn test_per_ip_limits_remain_enforced() { + let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); + let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); + + let rate_limiter = Arc::new(InMemoryRateLimit::new(5, 2)); + + let ticket_1_1 = rate_limiter.clone().try_acquire(user_1).unwrap(); + let ticket_1_2 = rate_limiter.clone().try_acquire(user_1).unwrap(); + + let result = rate_limiter.clone().try_acquire(user_1); + assert!(result.is_err()); + assert_eq!( + result.err().unwrap().to_string(), + "Rate Limit Reached: IP limit exceeded" + ); + + let ticket_2_1 = rate_limiter.clone().try_acquire(user_2).unwrap(); + drop(ticket_1_1); + + let ticket_1_3 = rate_limiter.clone().try_acquire(user_1).unwrap(); + + let result = rate_limiter.clone().try_acquire(user_1); + assert!(result.is_err()); + assert_eq!( + result.err().unwrap().to_string(), + "Rate Limit Reached: IP limit exceeded" + ); + + drop(ticket_1_2); + drop(ticket_1_3); + drop(ticket_2_1); + + assert_eq!( + rate_limiter + .inner + .lock() + .unwrap() + .semaphore + .available_permits(), + 5 + ); + assert_eq!( + rate_limiter.inner.lock().unwrap().active_connections.len(), + 0 + ); + } + + #[tokio::test] + async fn test_instance_tracking_and_cleanup() { + let container = Redis::default().start().await.unwrap(); + let host_port = container.get_host_port_ipv4(6379).await.unwrap(); + let client_addr = format!("redis://127.0.0.1:{}", host_port); + + tokio::time::sleep(Duration::from_millis(100)).await; + + let user_1 = IpAddr::from_str("127.0.0.1").unwrap(); + let user_2 = IpAddr::from_str("127.0.0.2").unwrap(); + + let redis_client = Client::open(client_addr.as_str()).unwrap(); + + { + let rate_limiter1 = Arc::new(RedisRateLimit { + redis_client: Client::open(client_addr.as_str()).unwrap(), + instance_limit: 10, + per_ip_limit: 5, + semaphore: Arc::new(Semaphore::new(10)), + key_prefix: "test".to_string(), + instance_id: "instance1".to_string(), + heartbeat_interval: Duration::from_millis(200), + heartbeat_ttl: Duration::from_secs(1), + background_tasks_started: AtomicBool::new(true), + }); + + rate_limiter1.register_instance().unwrap(); + let _ticket1 = rate_limiter1.clone().try_acquire(user_1).unwrap(); + let _ticket2 = rate_limiter1.clone().try_acquire(user_2).unwrap(); + // no drop on release (exit of block) + std::mem::forget(_ticket1); + std::mem::forget(_ticket2); + + { + let mut conn = redis_client.get_connection().unwrap(); + + let exists: bool = redis::cmd("EXISTS") + .arg("test:instance:instance1:heartbeat".to_string()) + .query(&mut conn) + .unwrap(); + assert!(exists, "Instance1 heartbeat should exist initially"); + + let ip1_instance1_count: usize = redis::cmd("GET") + .arg("test:ip:127.0.0.1:instance:instance1:connections") + .query(&mut conn) + .unwrap(); + let ip2_instance1_count: usize = redis::cmd("GET") + .arg("test:ip:127.0.0.2:instance:instance1:connections") + .query(&mut conn) + .unwrap(); + + assert_eq!(ip1_instance1_count, 1, "IP1 count should be 1 initially"); + assert_eq!(ip2_instance1_count, 1, "IP2 count should be 1 initially"); + } + }; + + tokio::time::sleep(Duration::from_secs(1)).await; + + { + let mut conn = redis_client.get_connection().unwrap(); + + let exists: bool = redis::cmd("EXISTS") + .arg("test:instance:instance1:heartbeat".to_string()) + .query(&mut conn) + .unwrap(); + assert!( + !exists, + "Instance1 heartbeat should be gone after TTL expiration" + ); + + let ip1_instance1_count: usize = redis::cmd("GET") + .arg("test:ip:127.0.0.1:instance:instance1:connections") + .query(&mut conn) + .unwrap(); + let ip2_instance1_count: usize = redis::cmd("GET") + .arg("test:ip:127.0.0.2:instance:instance1:connections") + .query(&mut conn) + .unwrap(); + + assert_eq!( + ip1_instance1_count, 1, + "IP1 instance1 count should still be 1 after instance1 crash" + ); + assert_eq!( + ip2_instance1_count, 1, + "IP2 instance1 count should still be 1 after crash" + ); + } + + let rate_limiter2 = Arc::new(RedisRateLimit { + redis_client: Client::open(client_addr.as_str()).unwrap(), + instance_limit: 10, + per_ip_limit: 5, + semaphore: Arc::new(Semaphore::new(10)), + key_prefix: "test".to_string(), + instance_id: "instance2".to_string(), + heartbeat_interval: Duration::from_millis(200), + heartbeat_ttl: Duration::from_secs(2), + background_tasks_started: AtomicBool::new(false), + }); + + rate_limiter2.register_instance().unwrap(); + rate_limiter2.cleanup_stale_instances().unwrap(); + + tokio::time::sleep(Duration::from_secs(1)).await; + + { + let mut conn = redis_client.get_connection().unwrap(); + + let ip1_instance1_exists: bool = redis::cmd("EXISTS") + .arg("test:ip:127.0.0.1:instance:instance1:connections") + .query(&mut conn) + .unwrap(); + let ip2_instance1_exists: bool = redis::cmd("EXISTS") + .arg("test:ip:127.0.0.2:instance:instance1:connections") + .query(&mut conn) + .unwrap(); + + assert!( + !ip1_instance1_exists, + "IP1 instance1 counter should be gone after cleanup" + ); + assert!( + !ip2_instance1_exists, + "IP2 instance1 counter should be gone after cleanup" + ); + } + + let _ticket3 = rate_limiter2.clone().try_acquire(user_1).unwrap(); + + { + let mut conn = redis_client.get_connection().unwrap(); + let ip1_instance2_count: usize = redis::cmd("GET") + .arg("test:ip:127.0.0.1:instance:instance2:connections") + .query(&mut conn) + .unwrap(); + + assert_eq!(ip1_instance2_count, 1, "IP1 instance2 count should be 1"); + } + } +} diff --git a/crates/websocket-proxy/src/server.rs b/crates/websocket-proxy/src/server.rs new file mode 100644 index 00000000..fadf6237 --- /dev/null +++ b/crates/websocket-proxy/src/server.rs @@ -0,0 +1,226 @@ +use crate::auth::Authentication; +use crate::client::ClientConnection; +use crate::metrics::Metrics; +use crate::rate_limit::{RateLimit, RateLimitError}; +use crate::registry::Registry; +use axum::body::Body; +use axum::extract::{ConnectInfo, Path, State, WebSocketUpgrade}; +use axum::http::StatusCode; +use axum::response::{IntoResponse, Response}; +use axum::routing::{any, get}; +use axum::{Error, Router}; +use http::{HeaderMap, HeaderValue}; +use serde_json::json; +use std::net::{IpAddr, SocketAddr}; +use std::sync::Arc; +use tokio_util::sync::CancellationToken; +use tracing::{info, warn}; + +#[derive(Clone)] +struct ServerState { + registry: Registry, + rate_limiter: Arc, + metrics: Arc, + auth: Authentication, + ip_addr_http_header: String, +} + +#[derive(Clone)] +pub struct Server { + listen_addr: SocketAddr, + registry: Registry, + rate_limiter: Arc, + metrics: Arc, + ip_addr_http_header: String, + authentication: Option, +} + +impl Server { + pub fn new( + listen_addr: SocketAddr, + registry: Registry, + metrics: Arc, + rate_limiter: Arc, + authentication: Option, + ip_addr_http_header: String, + ) -> Self { + Self { + listen_addr, + registry, + rate_limiter, + metrics, + authentication, + ip_addr_http_header, + } + } + + pub async fn listen(&self, cancellation_token: CancellationToken) { + let mut router: Router = Router::new().route("/healthz", get(healthz_handler)); + + if self.authentication.is_some() { + info!("Authentication is enabled"); + router = router.route("/ws/{api_key}", any(authenticated_websocket_handler)); + } else { + info!("Public endpoint is enabled"); + router = router.route("/ws", any(unauthenticated_websocket_handler)); + } + + let router = router.with_state(ServerState { + registry: self.registry.clone(), + rate_limiter: self.rate_limiter.clone(), + metrics: self.metrics.clone(), + auth: self + .authentication + .clone() + .unwrap_or_else(Authentication::none), + ip_addr_http_header: self.ip_addr_http_header.clone(), + }); + + let listener = tokio::net::TcpListener::bind(self.listen_addr) + .await + .unwrap(); + + info!( + message = "starting server", + address = listener.local_addr().unwrap().to_string() + ); + + axum::serve( + listener, + router.into_make_service_with_connect_info::(), + ) + .with_graceful_shutdown(cancellation_token.cancelled_owned()) + .await + .unwrap() + } +} + +async fn healthz_handler() -> impl IntoResponse { + StatusCode::OK +} + +async fn authenticated_websocket_handler( + State(state): State, + ws: WebSocketUpgrade, + ConnectInfo(addr): ConnectInfo, + headers: HeaderMap, + Path(api_key): Path, +) -> impl IntoResponse { + let application = state.auth.get_application_for_key(&api_key); + + match application { + None => { + state.metrics.unauthorized_requests.increment(1); + + Response::builder() + .status(StatusCode::UNAUTHORIZED) + .body(Body::from( + json!({"message": "Invalid API key"}).to_string(), + )) + .unwrap() + } + Some(app) => { + state.metrics.proxy_connections_by_app(app); + websocket_handler(state, ws, addr, headers) + } + } +} + +async fn unauthenticated_websocket_handler( + State(state): State, + ws: WebSocketUpgrade, + ConnectInfo(addr): ConnectInfo, + headers: HeaderMap, +) -> impl IntoResponse { + websocket_handler(state, ws, addr, headers) +} + +fn websocket_handler( + state: ServerState, + ws: WebSocketUpgrade, + addr: SocketAddr, + headers: HeaderMap, +) -> Response { + let connect_addr = addr.ip(); + + let client_addr = match headers.get(state.ip_addr_http_header) { + None => connect_addr, + Some(value) => extract_addr(value, connect_addr), + }; + + let ticket = match state.rate_limiter.try_acquire(client_addr) { + Ok(ticket) => ticket, + Err(RateLimitError::Limit { reason }) => { + state.metrics.rate_limited_requests.increment(1); + + return Response::builder() + .status(StatusCode::TOO_MANY_REQUESTS) + .body(Body::from(json!({"message": reason}).to_string())) + .unwrap(); + } + }; + + ws.on_failed_upgrade(move |e: Error| { + info!( + message = "failed to upgrade connection", + error = e.to_string(), + client = addr.to_string() + ) + }) + .on_upgrade(async move |socket| { + let client = ClientConnection::new(client_addr, ticket, socket); + state.registry.subscribe(client).await; + }) +} + +fn extract_addr(header: &HeaderValue, fallback: IpAddr) -> IpAddr { + if header.is_empty() { + return fallback; + } + + match header.to_str() { + Ok(header_value) => { + let raw_value = header_value + .split(',') + .map(|ip| ip.trim().to_string()) + .next_back(); + + if let Some(raw_value) = raw_value { + return raw_value.parse::().unwrap_or(fallback); + } + + fallback + } + Err(e) => { + warn!( + message = "could not get header value", + error = e.to_string() + ); + fallback + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::Ipv4Addr; + + #[tokio::test] + async fn test_header_addr() { + let fb = Ipv4Addr::new(127, 0, 0, 1); + + let test = |header: &str, expected: Ipv4Addr| { + let hv = HeaderValue::from_str(header).unwrap(); + let result = extract_addr(&hv, IpAddr::V4(fb)); + assert_eq!(result, expected); + }; + + test("129.1.1.1", Ipv4Addr::new(129, 1, 1, 1)); + test("129.1.1.1,130.1.1.1", Ipv4Addr::new(130, 1, 1, 1)); + test("129.1.1.1 , 130.1.1.1 ", Ipv4Addr::new(130, 1, 1, 1)); + test("nonsense", fb); + test("400.0.0.1", fb); + test("120.0.0.1.0", fb); + } +} From 6355b884551817e765c727ea485da0e866f7639c Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Sep 2025 20:37:13 -0700 Subject: [PATCH 099/114] ws vs p2p args --- crates/rollup-boost/src/flashblocks/args.rs | 44 +++++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index 8c513073..1a56490f 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -3,12 +3,48 @@ use ed25519_dalek::{SigningKey, VerifyingKey}; use hex::FromHex; +#[derive(Parser, Clone, Debug)] +#[group(requires = "flashblocks_ws")] +pub struct FlashblocksWsArgs { + /// Enable Flashblocks client + #[arg( + long, + id = "flashblocks_ws", + conflicts = "flashblocks_p2p", + env, + default_value = "false" + )] + pub flashblocks_ws: bool, + + /// Flashblocks Builder WebSocket URL + #[arg(long, env, default_value = "ws://127.0.0.1:1111")] + pub flashblocks_builder_url: Url, + + /// Flashblocks WebSocket host for outbound connections + #[arg(long, env, default_value = "127.0.0.1")] + pub flashblocks_host: String, + + /// Flashblocks WebSocket port for outbound connections + #[arg(long, env, default_value = "1112")] + pub flashblocks_port: u16, + + /// Time used for timeout if builder disconnected + #[arg(long, env, default_value = "5000")] + pub flashblock_builder_ws_reconnect_ms: u64, +} + #[derive(Args, Clone, Debug)] -#[group(requires = "flashblocks")] -pub struct FlashblocksArgs { +#[group(requires = "flashblocks_p2p")] +pub struct FlashblocksP2PArgs { /// Enable Flashblocks client - #[arg(long, env, required = false)] - pub flashblocks: bool, + #[arg( + long, + id = "flashblocks_p2p", + conflicts = "flashblocks_ws", + env, + required = false + )] + pub flashblocks_p2p: bool, #[arg( long, From 6be9b9d026937e16e94c0c8d440ae374bd5bc500 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Sep 2025 21:01:22 -0700 Subject: [PATCH 100/114] chore: refactoring --- Cargo.lock | 1 + Cargo.toml | 1 + crates/rollup-boost/Cargo.toml | 2 +- crates/rollup-boost/src/cli.rs | 140 ++++---- crates/rollup-boost/src/client/rpc.rs | 16 +- crates/rollup-boost/src/flashblocks/args.rs | 7 +- .../rollup-boost/src/flashblocks/inbound.rs | 299 ++++++++++++++++++ .../rollup-boost/src/flashblocks/launcher.rs | 31 ++ crates/rollup-boost/src/flashblocks/mod.rs | 8 +- .../rollup-boost/src/flashblocks/service.rs | 18 +- crates/rollup-boost/src/tests/common/mod.rs | 1 - 11 files changed, 444 insertions(+), 80 deletions(-) create mode 100644 crates/rollup-boost/src/flashblocks/inbound.rs create mode 100644 crates/rollup-boost/src/flashblocks/launcher.rs diff --git a/Cargo.lock b/Cargo.lock index 4dc68200..c93ccc54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10189,6 +10189,7 @@ dependencies = [ "rand 0.9.2", "reqwest", "reth-optimism-payload-builder", + "reth-rpc-layer", "rustls", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index e0ff14be..77f471d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ arbitrary = { version = "=1.4.2", features = ["derive"] } # Reth deps reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth", tag = "v1.7.0" } # Alloy libraries alloy-rpc-types-engine = "1.0.30" diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 844bbb3e..084cd774 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -20,7 +20,6 @@ sha2.workspace = true arbitrary.workspace = true reth-optimism-payload-builder.workspace = true -# reth-rpc-layer.workspace = true op-alloy-rpc-types-engine.workspace = true alloy-rpc-types-engine.workspace = true alloy-rpc-types-eth.workspace = true @@ -75,6 +74,7 @@ hex = "0.4" bytes = "1.2" [dev-dependencies] +reth-rpc-layer.workspace = true tempfile = "3.20.0" rand = "0.9.0" time = { version = "0.3.36", features = ["macros", "formatting", "parsing"] } diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index 158b2aa8..3d593c62 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -3,13 +3,18 @@ use clap::Parser; use eyre::bail; use jsonrpsee::{RpcModule, server::Server}; use parking_lot::Mutex; -use std::{net::SocketAddr, path::PathBuf, sync::Arc}; +use std::{ + net::{IpAddr, SocketAddr}, + path::PathBuf, + str::FromStr, + sync::Arc, +}; use tokio::signal::unix::{SignalKind, signal as unix_signal}; use tracing::{Level, info}; use crate::{ - BlockSelectionPolicy, FlashblocksArgs, FlashblocksKeys, ProxyLayer, RollupBoostServer, - RpcClient, + BlockSelectionPolicy, Flashblocks, FlashblocksP2PArgs, FlashblocksP2PKeys, FlashblocksWsArgs, + ProxyLayer, RollupBoostServer, RpcClient, client::rpc::{BuilderArgs, L2ClientArgs}, debug_api::ExecutionMode, get_version, init_metrics, @@ -99,7 +104,10 @@ pub struct RollupBoostArgs { pub ignore_unhealthy_builders: bool, #[clap(flatten)] - pub flashblocks: Option, + pub flashblocks_p2p: Option, + + #[clap(flatten)] + pub flashblocks_ws: Option, } impl RollupBoostArgs { @@ -135,7 +143,7 @@ impl RollupBoostArgs { bail!("Missing Builder JWT secret"); }; - let flashblocks_keys = self.flashblocks.as_ref().map(|fb| FlashblocksKeys { + let flashblocks_keys = self.flashblocks_p2p.as_ref().map(|fb| FlashblocksP2PKeys { authorization_sk: fb.flashblocks_authorizer_sk.clone(), builder_pk: fb.flashblocks_builder_vk.clone(), }); @@ -151,59 +159,72 @@ impl RollupBoostArgs { let (probe_layer, probes) = ProbeLayer::new(); let execution_mode = Arc::new(Mutex::new(self.execution_mode)); -<<<<<<< HEAD - let (rpc_module, health_handle): (RpcModule<()>, _) = { -======= - let (rpc_module, health_handle): (RpcModule<()>, _) = if self.flashblocks.flashblocks { - let flashblocks_args = self.flashblocks; - let inbound_url = flashblocks_args.flashblocks_builder_url; - let outbound_addr = SocketAddr::new( - IpAddr::from_str(&flashblocks_args.flashblocks_host)?, - flashblocks_args.flashblocks_port, - ); - - let builder_client = Arc::new(Flashblocks::run( - builder_client.clone(), - inbound_url, - outbound_addr, - flashblocks_args.flashblock_builder_ws_reconnect_ms, - )?); - - let rollup_boost = RollupBoostServer::new( - l2_client, - builder_client, - execution_mode.clone(), - self.block_selection_policy, - probes.clone(), - self.external_state_root, - self.ignore_unhealthy_builders, - ); - - let health_handle = rollup_boost - .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); - - // Spawn the debug server - rollup_boost.start_debug_server(debug_addr.as_str()).await?; - (rollup_boost.try_into()?, health_handle) - } else { ->>>>>>> main - let rollup_boost = RollupBoostServer::new( - l2_client, - Arc::new(builder_client), - execution_mode.clone(), - self.block_selection_policy, - probes.clone(), - self.external_state_root, - self.ignore_unhealthy_builders, - ); - - let health_handle = rollup_boost - .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); - - // Spawn the debug server - rollup_boost.start_debug_server(debug_addr.as_str()).await?; - (rollup_boost.try_into()?, health_handle) - }; + let (rpc_module, health_handle): (RpcModule<()>, _) = + if let Some(flashblocks_ws) = self.flashblocks_ws { + let inbound_url = flashblocks_ws.flashblocks_builder_url; + let outbound_addr = SocketAddr::new( + IpAddr::from_str(&flashblocks_ws.flashblocks_host)?, + flashblocks_ws.flashblocks_port, + ); + + let builder_client = Arc::new(Flashblocks::run( + builder_client.clone(), + inbound_url, + outbound_addr, + flashblocks_ws.flashblock_builder_ws_reconnect_ms, + )?); + + let rollup_boost = RollupBoostServer::new( + l2_client, + builder_client, + execution_mode.clone(), + self.block_selection_policy, + probes.clone(), + self.external_state_root, + self.ignore_unhealthy_builders, + ); + + let health_handle = rollup_boost + .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); + + // Spawn the debug server + rollup_boost.start_debug_server(debug_addr.as_str()).await?; + (rollup_boost.try_into()?, health_handle) + } else if let Some(flashblocks_p2p) = self.flashblocks_p2p { + let rollup_boost = RollupBoostServer::new( + l2_client, + Arc::new(builder_client), + execution_mode.clone(), + self.block_selection_policy, + probes.clone(), + self.external_state_root, + self.ignore_unhealthy_builders, + ); + + let health_handle = rollup_boost + .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); + + // Spawn the debug server + rollup_boost.start_debug_server(debug_addr.as_str()).await?; + (rollup_boost.try_into()?, health_handle) + } else { + let rollup_boost = RollupBoostServer::new( + l2_client, + Arc::new(builder_client), + execution_mode.clone(), + self.block_selection_policy, + probes.clone(), + self.external_state_root, + self.ignore_unhealthy_builders, + ); + + let health_handle = rollup_boost + .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); + + // Spawn the debug server + rollup_boost.start_debug_server(debug_addr.as_str()).await?; + (rollup_boost.try_into()?, health_handle) + }; // Build and start the server info!("Starting server on :{}", self.rpc_port); @@ -290,7 +311,8 @@ pub mod tests { assert!(!args.metrics); assert_eq!(args.rpc_host, "127.0.0.1"); assert_eq!(args.rpc_port, 8081); - assert!(args.flashblocks.is_none()); + assert!(args.flashblocks_ws.is_none()); + assert!(args.flashblocks_p2p.is_none()); Ok(()) } diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index d71d0ed8..995e3e4b 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -100,7 +100,7 @@ impl From for ErrorObjectOwned { } #[derive(Clone)] -pub struct FlashblocksKeys { +pub struct FlashblocksP2PKeys { /// Flashblocks Authorization Secret pub authorization_sk: SigningKey, /// Flashblocks builder vk @@ -121,8 +121,8 @@ pub struct RpcClient { payload_source: PayloadSource, /// Flashblocks keys /// - /// `None` if flashblocks are disabled - flashblocks_keys: Option, + /// `None` if p2p flashblocks are disabled + flashblocks_p2p_keys: Option, } impl RpcClient { @@ -132,7 +132,7 @@ impl RpcClient { auth_rpc_jwt_secret: JwtSecret, timeout: u64, payload_source: PayloadSource, - flashblocks_keys: Option, + flashblocks_p2p_keys: Option, ) -> Result { let version = format!("{CARGO_PKG_VERSION}-{VERGEN_GIT_SHA}"); let mut headers = HeaderMap::new(); @@ -149,7 +149,7 @@ impl RpcClient { auth_client, auth_rpc, payload_source, - flashblocks_keys, + flashblocks_p2p_keys, }) } @@ -171,7 +171,7 @@ impl RpcClient { payload_attributes: Option, ) -> ClientResult { info!("Sending fork_choice_updated_v3 to {}", self.payload_source); - let res = match (&payload_attributes, &self.flashblocks_keys) { + let res = match (&payload_attributes, &self.flashblocks_p2p_keys) { (Some(attrs), Some(flashblocks)) => { let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attrs, 3); let authorization = Authorization::new( @@ -482,7 +482,9 @@ pub mod tests { let mut cmd = Command::cargo_bin("rollup-boost").unwrap(); cmd.arg("--invalid-arg"); - cmd.assert().failure(); + cmd.assert().failure().stderr(predicate::str::contains( + "error: unexpected argument '--invalid-arg' found", + )); } #[tokio::test] diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index 1a56490f..088f1b82 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -1,16 +1,17 @@ use clap::Args; use ed25519_dalek::{SigningKey, VerifyingKey}; +use url::Url; use hex::FromHex; -#[derive(Parser, Clone, Debug)] +#[derive(Args, Clone, Debug)] #[group(requires = "flashblocks_ws")] pub struct FlashblocksWsArgs { /// Enable Flashblocks client #[arg( long, id = "flashblocks_ws", - conflicts = "flashblocks_p2p", + conflicts_with = "flashblocks_p2p", env, default_value = "false" )] @@ -40,7 +41,7 @@ pub struct FlashblocksP2PArgs { #[arg( long, id = "flashblocks_p2p", - conflicts = "flashblocks_ws", + conflicts_with = "flashblocks_ws", env, required = false )] diff --git a/crates/rollup-boost/src/flashblocks/inbound.rs b/crates/rollup-boost/src/flashblocks/inbound.rs new file mode 100644 index 00000000..a5f6e053 --- /dev/null +++ b/crates/rollup-boost/src/flashblocks/inbound.rs @@ -0,0 +1,299 @@ +use std::time::Duration; + +use super::{metrics::FlashblocksWsInboundMetrics, primitives::FlashblocksPayloadV1}; +use futures::{SinkExt, StreamExt}; +use tokio::{sync::mpsc, time::interval}; +use tokio_tungstenite::{connect_async, tungstenite::Message}; +use tokio_util::sync::CancellationToken; +use tracing::{error, info}; +use url::Url; + +#[derive(Debug, thiserror::Error)] +enum FlashblocksReceiverError { + #[error("WebSocket connection failed: {0}")] + Connection(#[from] tokio_tungstenite::tungstenite::Error), + + #[error("Ping failed")] + PingFailed, + + #[error("Read timeout")] + ReadTimeout, + + #[error("Connection error: {0}")] + ConnectionError(String), + + #[error("Connection closed")] + ConnectionClosed, + + #[error("Task panicked: {0}")] + TaskPanic(String), + + #[error("Failed to send message to sender: {0}")] + SendError(#[from] Box>), +} + +pub struct FlashblocksReceiverService { + url: Url, + sender: mpsc::Sender, + reconnect_ms: u64, + metrics: FlashblocksWsInboundMetrics, +} + +impl FlashblocksReceiverService { + pub fn new(url: Url, sender: mpsc::Sender, reconnect_ms: u64) -> Self { + Self { + url, + sender, + reconnect_ms, + metrics: Default::default(), + } + } + + pub async fn run(self) { + loop { + if let Err(e) = self.connect_and_handle().await { + error!("Flashblocks receiver connection error, retrying in 5 seconds: {e}"); + self.metrics.reconnect_attempts.increment(1); + self.metrics.connection_status.set(0); + tokio::time::sleep(std::time::Duration::from_millis(self.reconnect_ms)).await; + } else { + break; + } + } + } + + async fn connect_and_handle(&self) -> Result<(), FlashblocksReceiverError> { + let (ws_stream, _) = connect_async(self.url.as_str()).await?; + let (mut write, mut read) = ws_stream.split(); + + info!("Connected to Flashblocks receiver at {}", self.url); + self.metrics.connection_status.set(1); + + let cancel_token = CancellationToken::new(); + let cancel_for_ping = cancel_token.clone(); + + let ping_task = tokio::spawn(async move { + let mut ping_interval = interval(Duration::from_millis(500)); + + loop { + tokio::select! { + _ = ping_interval.tick() => { + if write.send(Message::Ping(Default::default())).await.is_err() { + return Err(FlashblocksReceiverError::PingFailed); + } + } + _ = cancel_for_ping.cancelled() => { + tracing::debug!("Ping task cancelled"); + return Ok(()); + } + } + } + }); + + let sender = self.sender.clone(); + let metrics = self.metrics.clone(); + + let read_timeout = Duration::from_millis(1500); + let message_handle = tokio::spawn(async move { + loop { + let result = tokio::time::timeout(read_timeout, read.next()) + .await + .map_err(|_| FlashblocksReceiverError::ReadTimeout)?; + + match result { + Some(Ok(msg)) => match msg { + Message::Text(text) => { + metrics.messages_received.increment(1); + if let Ok(flashblocks_msg) = + serde_json::from_str::(&text) + { + sender.send(flashblocks_msg).await.map_err(|e| { + FlashblocksReceiverError::SendError(Box::new(e)) + })?; + } + } + Message::Close(_) => { + return Err(FlashblocksReceiverError::ConnectionClosed); + } + _ => {} + }, + Some(Err(e)) => { + return Err(FlashblocksReceiverError::ConnectionError(e.to_string())); + } + None => { + return Err(FlashblocksReceiverError::ReadTimeout); + } + }; + } + }); + + let result = tokio::select! { + result = message_handle => { + result.map_err(|e| FlashblocksReceiverError::TaskPanic(e.to_string()))? + }, + result = ping_task => { + result.map_err(|e| FlashblocksReceiverError::TaskPanic(e.to_string()))? + }, + }; + + cancel_token.cancel(); + result + } +} + +#[cfg(test)] +mod tests { + use futures::SinkExt; + use tokio::sync::watch; + use tokio_tungstenite::{accept_async, tungstenite::Utf8Bytes}; + + use super::*; + use std::net::{SocketAddr, TcpListener}; + + async fn start( + addr: SocketAddr, + ) -> eyre::Result<( + watch::Sender, + mpsc::Sender, + mpsc::Receiver<()>, + url::Url, + )> { + let (term_tx, mut term_rx) = watch::channel(false); + let (send_tx, mut send_rx) = mpsc::channel::(100); + let (send_ping_tx, send_ping_rx) = mpsc::channel::<()>(100); + + let listener = TcpListener::bind(addr)?; + let url = Url::parse(&format!("ws://{addr}"))?; + + listener + .set_nonblocking(true) + .expect("Failed to set TcpListener socket to non-blocking"); + + let listener = tokio::net::TcpListener::from_std(listener) + .expect("Failed to convert TcpListener to tokio TcpListener"); + + tokio::spawn(async move { + loop { + tokio::select! { + _ = term_rx.changed() => { + if *term_rx.borrow() { + return; + } + } + + result = listener.accept() => { + match result { + Ok((connection, _addr)) => { + match accept_async(connection).await { + Ok(ws_stream) => { + let (mut write, mut read) = ws_stream.split(); + + loop { + tokio::select! { + Some(msg) = send_rx.recv() => { + let serialized = serde_json::to_string(&msg).unwrap(); + let utf8_bytes = Utf8Bytes::from(serialized); + + write.send(Message::Text(utf8_bytes)).await.unwrap(); + }, + msg = read.next() => { + match msg { + // we need to read for the library to handle pong messages + Some(Ok(Message::Ping(_))) => { + send_ping_tx.send(()).await.unwrap(); + }, + _ => {} + } + } + _ = term_rx.changed() => { + if *term_rx.borrow() { + return; + } + } + } + } + } + Err(e) => { + eprintln!("Failed to accept WebSocket connection: {}", e); + } + } + } + Err(e) => { + // Optionally break or continue based on error type + if e.kind() == std::io::ErrorKind::Interrupted { + break; + } + } + } + } + } + } + }); + + Ok((term_tx, send_tx, send_ping_rx, url)) + } + + #[tokio::test] + async fn test_flashblocks_receiver_service() -> eyre::Result<()> { + let addr = "127.0.0.1:8080".parse::().unwrap(); + let (term, send_msg, _, url) = start(addr).await?; + + let (tx, mut rx) = mpsc::channel(100); + + let service = FlashblocksReceiverService::new(url, tx, 100); + let _ = tokio::spawn(async move { + service.run().await; + }); + + // Send a message to the websocket server + send_msg + .send(FlashblocksPayloadV1::default()) + .await + .expect("Failed to send message"); + + let msg = rx.recv().await.expect("Failed to receive message"); + assert_eq!(msg, FlashblocksPayloadV1::default()); + + // Drop the websocket server and start another one with the same address + // The FlashblocksReceiverService should reconnect to the new server + term.send(true).unwrap(); + + // sleep for 1 second to ensure the server is dropped + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + + // start a new server with the same address + let (term, send_msg, _, _url) = start(addr).await?; + send_msg + .send(FlashblocksPayloadV1::default()) + .await + .expect("Failed to send message"); + + let msg = rx.recv().await.expect("Failed to receive message"); + assert_eq!(msg, FlashblocksPayloadV1::default()); + term.send(true).unwrap(); + + Ok(()) + } + + #[tokio::test] + async fn test_flashblocks_receiver_service_ping_pong() -> eyre::Result<()> { + // test that if the builder is not sending any messages back, the service will send + // ping messages to test the connection periodically + + let addr = "127.0.0.1:8081".parse::().unwrap(); + let (_term, _send_msg, mut ping_rx, url) = start(addr).await?; + + let (tx, _rx) = mpsc::channel(100); + let service = FlashblocksReceiverService::new(url, tx, 100); + let _ = tokio::spawn(async move { + service.run().await; + }); + + // even if we do not send any messages, we should receive pings to keep the connection alive + for _ in 0..10 { + ping_rx.recv().await.expect("Failed to receive ping"); + } + + Ok(()) + } +} diff --git a/crates/rollup-boost/src/flashblocks/launcher.rs b/crates/rollup-boost/src/flashblocks/launcher.rs new file mode 100644 index 00000000..fd8f0fb9 --- /dev/null +++ b/crates/rollup-boost/src/flashblocks/launcher.rs @@ -0,0 +1,31 @@ +use crate::flashblocks::inbound::FlashblocksReceiverService; +use crate::{FlashblocksService, RpcClient}; +use core::net::SocketAddr; +use tokio::sync::mpsc; +use url::Url; + +pub struct Flashblocks {} + +impl Flashblocks { + pub fn run( + builder_url: RpcClient, + flashblocks_url: Url, + outbound_addr: SocketAddr, + reconnect_ms: u64, + ) -> eyre::Result { + let (tx, rx) = mpsc::channel(100); + + let receiver = FlashblocksReceiverService::new(flashblocks_url, tx, reconnect_ms); + tokio::spawn(async move { + let _ = receiver.run().await; + }); + + let service = FlashblocksService::new(builder_url, outbound_addr)?; + let mut service_handle = service.clone(); + tokio::spawn(async move { + service_handle.run(rx).await; + }); + + Ok(service) + } +} diff --git a/crates/rollup-boost/src/flashblocks/mod.rs b/crates/rollup-boost/src/flashblocks/mod.rs index b78ba788..9a64d4da 100644 --- a/crates/rollup-boost/src/flashblocks/mod.rs +++ b/crates/rollup-boost/src/flashblocks/mod.rs @@ -1,14 +1,20 @@ +mod launcher; + +pub use launcher::*; + mod primitives; mod service; pub use primitives::*; pub use service::*; +mod inbound; +mod outbound; + mod args; pub use args::*; mod error; -pub use error::*; mod p2p; pub use p2p::*; diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index aa7dde7a..4d693c95 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -1,17 +1,23 @@ +use super::outbound::WebSocketPublisher; use super::primitives::{ ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, }; -use crate::{FlashblocksError, OpExecutionPayloadEnvelope, PayloadVersion}; +use crate::flashblocks::metrics::FlashblocksServiceMetrics; +use crate::{ + ClientResult, EngineApiExt, NewPayload, OpExecutionPayloadEnvelope, PayloadVersion, RpcClient, +}; use alloy_primitives::U256; use alloy_rpc_types_engine::{ BlobsBundleV1, ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3, }; +use alloy_rpc_types_engine::{ForkchoiceState, ForkchoiceUpdated, PayloadId, PayloadStatus}; +use alloy_rpc_types_eth::{Block, BlockNumberOrTag}; +use core::net::SocketAddr; +use jsonrpsee::core::async_trait; use op_alloy_rpc_types_engine::{ OpExecutionPayloadEnvelopeV3, OpExecutionPayloadEnvelopeV4, OpExecutionPayloadV4, + OpPayloadAttributes, }; -<<<<<<< HEAD - -======= use reth_optimism_payload_builder::payload_id_optimism; use serde::{Deserialize, Serialize}; use std::io; @@ -50,7 +56,6 @@ enum FlashblocksEngineMessage { FlashblocksPayloadV1(FlashblocksPayloadV1), } ->>>>>>> main #[derive(Clone, Debug, Default)] pub struct FlashblockBuilder { base: Option, @@ -167,8 +172,6 @@ impl FlashblockBuilder { } } } -<<<<<<< HEAD -======= #[derive(Clone)] pub struct FlashblocksService { @@ -524,4 +527,3 @@ mod tests { Ok(()) } } ->>>>>>> main diff --git a/crates/rollup-boost/src/tests/common/mod.rs b/crates/rollup-boost/src/tests/common/mod.rs index 02e0f00c..791d004b 100644 --- a/crates/rollup-boost/src/tests/common/mod.rs +++ b/crates/rollup-boost/src/tests/common/mod.rs @@ -380,7 +380,6 @@ impl RollupBoostTestHarnessBuilder { println!("proxy authrpc: {}", builder_url); // Start Rollup-boost instance - let mut rollup_boost = RollupBoostConfig::default(); rollup_boost.args.l2_client.l2_url = l2.auth_rpc().await?; rollup_boost.args.builder.builder_url = builder_url.try_into().unwrap(); From 46fd26d9d44576ff98cacd17ad0c7ba506a6ccfa Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Sep 2025 21:17:54 -0700 Subject: [PATCH 101/114] chore: more refactoring --- crates/rollup-boost/src/cli.rs | 31 +++++-------------- crates/rollup-boost/src/flashblocks/mod.rs | 2 ++ crates/rollup-boost/src/flashblocks/p2p.rs | 2 +- .../rollup-boost/src/flashblocks/service.rs | 18 ++--------- 4 files changed, 13 insertions(+), 40 deletions(-) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index 3d593c62..d4f3acc9 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -184,23 +184,6 @@ impl RollupBoostArgs { self.ignore_unhealthy_builders, ); - let health_handle = rollup_boost - .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); - - // Spawn the debug server - rollup_boost.start_debug_server(debug_addr.as_str()).await?; - (rollup_boost.try_into()?, health_handle) - } else if let Some(flashblocks_p2p) = self.flashblocks_p2p { - let rollup_boost = RollupBoostServer::new( - l2_client, - Arc::new(builder_client), - execution_mode.clone(), - self.block_selection_policy, - probes.clone(), - self.external_state_root, - self.ignore_unhealthy_builders, - ); - let health_handle = rollup_boost .spawn_health_check(self.health_check_interval, self.max_unsafe_interval); @@ -347,7 +330,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-ws", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", @@ -355,9 +338,9 @@ pub mod tests { ])?; let flashblocks = args - .flashblocks + .flashblocks_ws .expect("flashblocks should be Some when flag is passed"); - assert!(flashblocks.flashblocks); + assert!(flashblocks.flashblocks_ws); Ok(()) } @@ -370,7 +353,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-ws", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", @@ -417,7 +400,7 @@ pub mod tests { "6666", "--execution-mode", "disabled", - "--flashblocks", + "--flashblocks-ws", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", @@ -464,7 +447,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-ws", "--flashblocks-authorizer-sk", "invalid_hex", "--flashblocks-builder-vk", @@ -482,7 +465,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-ws", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", diff --git a/crates/rollup-boost/src/flashblocks/mod.rs b/crates/rollup-boost/src/flashblocks/mod.rs index 9a64d4da..7a459662 100644 --- a/crates/rollup-boost/src/flashblocks/mod.rs +++ b/crates/rollup-boost/src/flashblocks/mod.rs @@ -14,6 +14,8 @@ mod outbound; mod args; pub use args::*; +mod metrics; + mod error; mod p2p; diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index b3683eaf..0f8846e1 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -7,7 +7,7 @@ use bytes::{Buf as _, BufMut as _, BytesMut}; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; -use crate::{FlashblocksError, FlashblocksPayloadV1}; +use crate::FlashblocksPayloadV1; /// An authorization token that grants a builder permission to publish flashblocks for a specific payload. /// diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index 4d693c95..b44bc724 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -2,6 +2,7 @@ use super::outbound::WebSocketPublisher; use super::primitives::{ ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1, FlashblocksPayloadV1, }; +use crate::flashblocks::error::FlashblocksError; use crate::flashblocks::metrics::FlashblocksServiceMetrics; use crate::{ ClientResult, EngineApiExt, NewPayload, OpExecutionPayloadEnvelope, PayloadVersion, RpcClient, @@ -23,25 +24,10 @@ use serde::{Deserialize, Serialize}; use std::io; use std::sync::Arc; use std::sync::atomic::{AtomicU64, Ordering}; -use thiserror::Error; use tokio::sync::RwLock; use tokio::sync::mpsc; use tracing::{debug, error, info}; -#[derive(Debug, Error, PartialEq)] -pub enum FlashblocksError { - #[error("Missing base payload for initial flashblock")] - MissingBasePayload, - #[error("Unexpected base payload for non-initial flashblock")] - UnexpectedBasePayload, - #[error("Missing delta for flashblock")] - MissingDelta, - #[error("Invalid index for flashblock")] - InvalidIndex, - #[error("Missing payload")] - MissingPayload, -} - #[derive(Debug, Deserialize, Serialize)] struct FlashbotsMessage { method: String, @@ -420,6 +406,7 @@ mod tests { jwt_secret, 2000, PayloadSource::Builder, + None, )?; let service = @@ -449,6 +436,7 @@ mod tests { jwt_secret, 2000, PayloadSource::Builder, + None, )?; let service = From afeed2d650a15c3afee85930f7fc1dacb09e5d71 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Wed, 5 Nov 2025 10:14:20 -0800 Subject: [PATCH 102/114] ws --- crates/rollup-boost/src/cli.rs | 8 ++++---- crates/rollup-boost/src/flashblocks/p2p.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index d4f3acc9..1e4774ac 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -361,9 +361,9 @@ pub mod tests { ])?; let flashblocks = args - .flashblocks + .flashblocks_ws .expect("flashblocks should be Some when flag is passed"); - assert!(flashblocks.flashblocks); + assert!(flashblocks.flashblocks_ws); Ok(()) } @@ -420,9 +420,9 @@ pub mod tests { assert_eq!(args.debug_server_port, 6666); let flashblocks = args - .flashblocks + .flashblocks_ws .expect("flashblocks should be Some when flag is passed"); - assert!(flashblocks.flashblocks); + assert!(flashblocks.flashblocks_ws); Ok(()) } diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index 0f8846e1..02f77ba2 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -7,7 +7,7 @@ use bytes::{Buf as _, BufMut as _, BytesMut}; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; -use crate::FlashblocksPayloadV1; +use crate::{FlashblocksPayloadV1, flashblocks::error::FlashblocksError}; /// An authorization token that grants a builder permission to publish flashblocks for a specific payload. /// From 26a342ecf0d7622d6ca67415ed7e43d073e77658 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 14:02:37 -0800 Subject: [PATCH 103/114] chore: remove unused types --- crates/rollup-boost/src/flashblocks/p2p.rs | 573 +-------------------- 1 file changed, 1 insertion(+), 572 deletions(-) diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/p2p.rs index a2e65d6e..4bc35453 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/p2p.rs @@ -1,13 +1,10 @@ -use std::marker::PhantomData; - use alloy_primitives::{B64, Bytes}; use alloy_rlp::{Decodable, Encodable, Header}; use alloy_rpc_types_engine::PayloadId; -use bytes::{Buf as _, BufMut as _, BytesMut}; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; -use crate::{FlashblocksPayloadV1, flashblocks::error::FlashblocksError}; +use crate::flashblocks::error::FlashblocksError; /// An authorization token that grants a builder permission to publish flashblocks for a specific payload. /// @@ -27,62 +24,6 @@ pub struct Authorization { pub authorizer_sig: Signature, } -/// A message requesting to start publishing flashblock payloads -#[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub struct StartPublish; -/// A message requesting to stop publishing flashblock payloads. -/// -/// This is a simple marker message with no fields that indicates the sender -/// wants to stop publishing flashblock payloads. -#[derive(Copy, Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub struct StopPublish; - -/// A message that can be sent over the Flashblocks P2P network. -/// -/// This enum represents the top-level message types that can be transmitted -/// over the P2P network. Currently all messages are wrapped in authorization to ensure -/// only authorized builders can create new messages. -#[repr(u8)] -#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub enum FlashblocksP2PMsg { - /// An authorized message containing a signed and authorized payload - Authorized(Authorized) = 0x00, -} - -/// The different types of authorized messages that can be sent over the Flashblocks P2P network. -/// -/// This enum represents the actual payload types that can be wrapped in authorization. -/// Each variant corresponds to a specific type of operation or data transmission. -#[allow(clippy::large_enum_variant)] -#[repr(u8)] -#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Eq)] -pub enum AuthorizedMsg { - /// A flashblock payload containing a list of transactions and associated metadata - FlashblocksPayloadV1(FlashblocksPayloadV1) = 0x00, - /// A declaration to start publishing flashblock payloads from a specific block number - StartPublish(StartPublish) = 0x01, - /// A declaration to stop publishing flashblock payloads - StopPublish(StopPublish) = 0x02, -} - -impl From for AuthorizedMsg { - fn from(payload: FlashblocksPayloadV1) -> Self { - Self::FlashblocksPayloadV1(payload) - } -} - -impl From for AuthorizedMsg { - fn from(req: StartPublish) -> Self { - Self::StartPublish(req) - } -} - -impl From for AuthorizedMsg { - fn from(res: StopPublish) -> Self { - Self::StopPublish(res) - } -} - impl Authorization { /// Creates a new authorization token for a builder to publish messages for a specific payload. /// @@ -224,378 +165,10 @@ impl Decodable for Authorization { } } -/// A type-safe wrapper around an authorized message for the Flashblocks P2P network. -/// -/// This struct provides type safety by encoding the specific message type `T` -/// at the type level while wrapping the underlying `Authorized` message. It uses a -/// phantom type marker to maintain type information without runtime overhead. -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct AuthorizedPayload { - /// The underlying authorized message containing the actual payload and signatures - pub authorized: Authorized, - /// Phantom type marker to maintain type safety for the specific message type - pub _marker: PhantomData, -} - -impl AuthorizedPayload -where - T: Into, -{ - /// Creates a new type-safe authorized payload. - /// - /// This constructor creates an authorized message by wrapping the provided message - /// with authorization and signing it with the actor's signing key. - /// - /// # Arguments - /// - /// * `actor_sk` - The signing key of the actor (builder) creating the message - /// * `authorization` - The authorization token granting permission to send this message - /// * `msg` - The message payload to be authorized and signed - /// - /// # Returns - /// - /// A new `AuthorizedPayload` instance with type safety for the message type - pub fn new(actor_sk: &SigningKey, authorization: Authorization, msg: T) -> Self { - let msg = msg.into(); - let authorized = Authorized::new(actor_sk, authorization, msg); - - Self { - authorized, - _marker: PhantomData, - } - } -} - -/// A signed and authorized message that can be sent over the Flashblocks P2P network. -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct Authorized { - /// The msg that is being authorized and signed over. - pub msg: AuthorizedMsg, - /// The authorization that grants permission to send this message. - pub authorization: Authorization, - /// The signature of the actor, made over the hash of the message and authorization. - pub actor_sig: Signature, -} - -impl Authorized { - /// Creates a new authorized message by combining a message with authorization and signing it. - /// - /// This function takes a message and authorization token, encodes them together, creates - /// a hash of the combined data, and signs it with the actor's signing key. - /// - /// # Arguments - /// - /// * `actor_sk` - The signing key of the actor (builder) creating the message - /// * `authorization` - The authorization token granting permission to send this message - /// * `msg` - The message to be authorized and signed - /// - /// # Returns - /// - /// A new `Authorized` instance containing the message, authorization, and signature - pub fn new(actor_sk: &SigningKey, authorization: Authorization, msg: AuthorizedMsg) -> Self { - let mut encoded = Vec::new(); - msg.encode(&mut encoded); - authorization.encode(&mut encoded); - - let hash = blake3::hash(&encoded); - let actor_sig = actor_sk.sign(hash.as_bytes()); - - Self { - msg, - authorization, - actor_sig, - } - } - - /// Verifies both the authorization and actor signatures. - /// - /// This function performs a two-step verification process: - /// 1. Verifies that the authorization signature is valid for the given authorizer - /// 2. Verifies that the actor signature is valid for the message and authorization - /// - /// # Arguments - /// - /// * `authorizer_sk` - The public key of the authorizer to verify against - /// - /// # Returns - /// - /// * `Ok(())` if both signatures are valid - /// * `Err(FlashblocksP2PError::InvalidAuthorizerSig)` if the authorization signature is invalid - /// * `Err(FlashblocksP2PError::InvalidBuilderSig)` if the actor signature is invalid - pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksError> { - self.authorization.verify(authorizer_sk)?; - - let mut encoded = Vec::new(); - self.msg.encode(&mut encoded); - self.authorization.encode(&mut encoded); - - let hash = blake3::hash(&encoded); - self.authorization - .builder_vk - .verify(hash.as_bytes(), &self.actor_sig) - .map_err(|_| FlashblocksError::InvalidBuilderSig) - } - - /// Converts this `Authorized` message into a type-safe `AuthorizedPayload` without verification. - /// - /// This is an unchecked conversion that bypasses type checking. The caller must ensure - /// that the contained message is actually of type `T`. - /// - /// # Type Parameters - /// - /// * `T` - The expected type of the contained message - /// - /// # Returns - /// - /// An `AuthorizedPayload` wrapper around this authorized message - pub fn into_unchecked(self) -> AuthorizedPayload { - AuthorizedPayload:: { - authorized: self, - _marker: PhantomData, - } - } -} - -impl AuthorizedPayload -where - AuthorizedMsg: AsRef, -{ - /// Returns a reference to the underlying message of type `T`. - /// - /// This method provides type-safe access to the contained message by leveraging - /// the `AsRef` trait implementation to extract the specific message type. - /// - /// # Returns - /// - /// A reference to the message of type `T` - pub fn msg(&self) -> &T { - self.authorized.msg.as_ref() - } -} - -impl Encodable for Authorized { - fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { - // encode once so we know the length beforehand - let sig_bytes = Bytes::copy_from_slice(&self.actor_sig.to_bytes()); - let payload_len = self.msg.length() + self.authorization.length() + sig_bytes.length(); - - Header { - list: true, - payload_length: payload_len, - } - .encode(out); - - // 1. payload - self.msg.encode(out); - // 2. authorization - self.authorization.encode(out); - // 3. builder signature - sig_bytes.encode(out); - } - - fn length(&self) -> usize { - let sig_bytes = Bytes::copy_from_slice(&self.actor_sig.to_bytes()); - let payload_len = self.msg.length() + self.authorization.length() + sig_bytes.length(); - - Header { - list: true, - payload_length: payload_len, - } - .length() - + payload_len - } -} - -impl Decodable for Authorized { - fn decode(buf: &mut &[u8]) -> Result { - let header = Header::decode(buf)?; - if !header.list { - return Err(alloy_rlp::Error::UnexpectedString); - } - - let mut body = &buf[..header.payload_length as usize]; - - // 1. payload - let payload = AuthorizedMsg::decode(&mut body)?; - // 2. authorization - let authorization = Authorization::decode(&mut body)?; - // 3. builder signature - let sig_bytes = Bytes::decode(&mut body)?; - let builder_sig = Signature::try_from(sig_bytes.as_ref()) - .map_err(|_| alloy_rlp::Error::Custom("bad signature"))?; - - // advance caller’s cursor - *buf = &buf[header.payload_length as usize..]; - - Ok(Self { - msg: payload, - authorization, - actor_sig: builder_sig, - }) - } -} - -impl FlashblocksP2PMsg { - pub fn encode(&self) -> BytesMut { - let mut buf = BytesMut::new(); - match self { - FlashblocksP2PMsg::Authorized(payload) => { - buf.put_u8(0x00); - payload.encode(&mut buf); - } - } - buf - } - - pub fn decode(buf: &mut &[u8]) -> Result { - if buf.is_empty() { - return Err(FlashblocksError::InputTooShort); - } - let id = buf[0]; - buf.advance(1); - match id { - 0x00 => { - let payload = Authorized::decode(buf)?; - Ok(FlashblocksP2PMsg::Authorized(payload)) - } - _ => Err(FlashblocksError::UnknownMessageType), - } - } -} - -impl AsRef for AuthorizedMsg { - fn as_ref(&self) -> &FlashblocksPayloadV1 { - match self { - Self::FlashblocksPayloadV1(p) => p, - _ => panic!("not a FlashblocksPayloadV1 message"), - } - } -} - -impl AsRef for AuthorizedMsg { - fn as_ref(&self) -> &StartPublish { - match self { - Self::StartPublish(req) => req, - _ => panic!("not a StartPublish message"), - } - } -} - -impl AsRef for AuthorizedMsg { - fn as_ref(&self) -> &StopPublish { - match self { - Self::StopPublish(res) => res, - _ => panic!("not a StopPublish message"), - } - } -} - -impl Encodable for StartPublish { - fn encode(&self, _out: &mut dyn alloy_rlp::BufMut) {} - - fn length(&self) -> usize { - 0 - } -} - -impl Decodable for StartPublish { - fn decode(_buf: &mut &[u8]) -> Result { - Ok(StartPublish) - } -} - -impl Encodable for StopPublish { - fn encode(&self, _out: &mut dyn alloy_rlp::BufMut) {} - - fn length(&self) -> usize { - 0 - } -} - -impl Decodable for StopPublish { - fn decode(_buf: &mut &[u8]) -> Result { - Ok(StopPublish) - } -} - -impl Encodable for AuthorizedMsg { - fn encode(&self, out: &mut dyn alloy_rlp::BufMut) { - match self { - Self::FlashblocksPayloadV1(payload) => { - Header { - list: true, - payload_length: 1 + payload.length(), - } - .encode(out); - 0u32.encode(out); - payload.encode(out); - } - Self::StartPublish(start) => { - Header { - list: true, - payload_length: 1 + start.length(), - } - .encode(out); - 1u32.encode(out); - start.encode(out); - } - Self::StopPublish(stop) => { - Header { - list: true, - payload_length: 1 + stop.length(), - } - .encode(out); - 2u32.encode(out); - stop.encode(out); - } - }; - } - - fn length(&self) -> usize { - let body_len = match self { - Self::FlashblocksPayloadV1(payload) => 1 + payload.length(), - Self::StartPublish(start) => 1 + start.length(), - Self::StopPublish(stop) => 1 + stop.length(), - }; - - Header { - list: true, - payload_length: body_len, - } - .length() - + body_len - } -} - -impl Decodable for AuthorizedMsg { - fn decode(buf: &mut &[u8]) -> Result { - let hdr = Header::decode(buf)?; - if !hdr.list { - return Err(alloy_rlp::Error::Custom( - "AuthorizedMsg must be an RLP list", - )); - } - - let tag = u8::decode(buf)?; - let value = match tag { - 0 => Self::FlashblocksPayloadV1(FlashblocksPayloadV1::decode(buf)?), - 1 => Self::StartPublish(StartPublish::decode(buf)?), - 2 => Self::StopPublish(StopPublish::decode(buf)?), - _ => return Err(alloy_rlp::Error::Custom("unknown tag")), - }; - - Ok(value) - } -} - #[cfg(test)] mod tests { use super::*; - use crate::{ExecutionPayloadBaseV1, ExecutionPayloadFlashblockDeltaV1}; - use alloy_primitives::{Address, B256, Bloom, U256}; use alloy_rlp::{Decodable, Encodable, encode}; - use alloy_rpc_types_eth::Withdrawal; - use bytes::{BufMut, BytesMut}; fn key_pair(seed: u8) -> (SigningKey, VerifyingKey) { let bytes = [seed; 32]; @@ -604,59 +177,6 @@ mod tests { (sk, vk) } - fn sample_authorization() -> (Authorization, VerifyingKey) { - let (authorizer_sk, authorizer_vk) = key_pair(1); - let (_, builder_vk) = key_pair(2); - - ( - Authorization::new( - PayloadId::default(), - 1_700_000_001, - &authorizer_sk, - builder_vk, - ), - authorizer_vk, - ) - } - - fn sample_diff() -> ExecutionPayloadFlashblockDeltaV1 { - ExecutionPayloadFlashblockDeltaV1 { - state_root: B256::from([0x11; 32]), - receipts_root: B256::from([0x22; 32]), - logs_bloom: Bloom::default(), - gas_used: 21_000, - block_hash: B256::from([0x33; 32]), - transactions: vec![Bytes::from_static(b"\xDE\xAD\xBE\xEF")], - withdrawals: vec![Withdrawal::default()], - withdrawals_root: B256::from([0x44; 32]), - blob_gas_used: None, - } - } - - fn sample_base() -> ExecutionPayloadBaseV1 { - ExecutionPayloadBaseV1 { - parent_beacon_block_root: B256::from([0x55; 32]), - parent_hash: B256::from([0x66; 32]), - fee_recipient: Address::default(), - prev_randao: B256::from([0x77; 32]), - block_number: 1_234, - gas_limit: 30_000_000, - timestamp: 1_700_000_999, - extra_data: Bytes::from_static(b"hi"), - base_fee_per_gas: U256::from(1_000_000_000u64), - } - } - - fn sample_flashblocks_payload() -> FlashblocksPayloadV1 { - FlashblocksPayloadV1 { - payload_id: PayloadId::default(), - index: 42, - diff: sample_diff(), - metadata: serde_json::json!({ "ok": true }), - base: Some(sample_base()), - } - } - #[test] fn authorization_rlp_roundtrip_and_verify() { let (authorizer_sk, authorizer_vk) = key_pair(1); @@ -694,95 +214,4 @@ mod tests { assert!(auth.verify(authorizer_vk).is_err()); } - - #[test] - fn authorized_rlp_roundtrip_and_verify() { - let (builder_sk, _builder_vk) = key_pair(2); - let (authorization, authorizer_vk) = sample_authorization(); - - let payload = sample_flashblocks_payload(); - let msg = AuthorizedMsg::FlashblocksPayloadV1(payload); - - let authorized = Authorized::new(&builder_sk, authorization.clone(), msg); - - // Encode → decode - let encoded = encode(&authorized); - assert_eq!(encoded.len(), authorized.length()); - - let mut slice = encoded.as_ref(); - let decoded = Authorized::decode(&mut slice).expect("decoding succeeds"); - assert!(slice.is_empty()); - assert_eq!(decoded, authorized); - - decoded - .verify(authorizer_vk) - .expect("composite verification succeeds"); - } - - #[test] - fn authorized_builder_signature_tamper_is_detected() { - let (builder_sk, _) = key_pair(2); - let (authorization, authorizer_vk) = sample_authorization(); - let payload = sample_flashblocks_payload(); - let msg = AuthorizedMsg::FlashblocksPayloadV1(payload); - - let mut authorized = Authorized::new(&builder_sk, authorization, msg); - - let mut sig_bytes = authorized.actor_sig.to_bytes(); - sig_bytes[0] ^= 1; - authorized.actor_sig = Signature::try_from(sig_bytes.as_ref()).unwrap(); - - assert!(authorized.verify(authorizer_vk).is_err()); - } - - #[test] - fn authorized_msg_variants_rlp_roundtrip() { - let variants = [ - AuthorizedMsg::FlashblocksPayloadV1(sample_flashblocks_payload()), - AuthorizedMsg::StartPublish(StartPublish), - AuthorizedMsg::StopPublish(StopPublish), - ]; - - for msg in variants { - let encoded = encode(&msg); - assert_eq!(encoded.len(), msg.length()); - - let mut slice = encoded.as_ref(); - let decoded = AuthorizedMsg::decode(&mut slice).expect("decodes"); - assert!(slice.is_empty()); - assert_eq!(decoded, msg); - } - } - - #[test] - fn p2p_msg_roundtrip() { - let (builder_sk, _) = key_pair(2); - let (authorization, _authorizer_vk) = sample_authorization(); - let payload = sample_flashblocks_payload(); - let msg = AuthorizedMsg::FlashblocksPayloadV1(payload); - - let authorized = Authorized::new(&builder_sk, authorization, msg); - let p2p = FlashblocksP2PMsg::Authorized(authorized.clone()); - - let encoded = p2p.encode(); - - let mut view: &[u8] = &encoded; - let decoded = FlashblocksP2PMsg::decode(&mut view).expect("decoding succeeds"); - assert!(view.is_empty(), "all bytes consumed"); - - match decoded { - FlashblocksP2PMsg::Authorized(inner) => assert_eq!(inner, authorized), - } - } - - #[test] - fn p2p_msg_unknown_type_errors() { - let mut buf = BytesMut::new(); - buf.put_u8(0xFF); // unknown discriminator - - let mut slice: &[u8] = &buf; - let err = - FlashblocksP2PMsg::decode(&mut slice).expect_err("should fail on unknown message type"); - assert_eq!(err, FlashblocksError::UnknownMessageType); - } } From f929970dd7ee42ed4c379f629a0639ab6527fbde Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 14:08:51 -0800 Subject: [PATCH 104/114] chore: cleanup FlashblocksError --- .../flashblocks/{p2p.rs => authorization.rs} | 2 +- crates/rollup-boost/src/flashblocks/error.rs | 25 ------------------- crates/rollup-boost/src/flashblocks/mod.rs | 6 ++--- .../rollup-boost/src/flashblocks/service.rs | 2 ++ 4 files changed, 5 insertions(+), 30 deletions(-) rename crates/rollup-boost/src/flashblocks/{p2p.rs => authorization.rs} (99%) delete mode 100644 crates/rollup-boost/src/flashblocks/error.rs diff --git a/crates/rollup-boost/src/flashblocks/p2p.rs b/crates/rollup-boost/src/flashblocks/authorization.rs similarity index 99% rename from crates/rollup-boost/src/flashblocks/p2p.rs rename to crates/rollup-boost/src/flashblocks/authorization.rs index 4bc35453..359d45f4 100644 --- a/crates/rollup-boost/src/flashblocks/p2p.rs +++ b/crates/rollup-boost/src/flashblocks/authorization.rs @@ -4,7 +4,7 @@ use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; -use crate::flashblocks::error::FlashblocksError; +use crate::FlashblocksError; /// An authorization token that grants a builder permission to publish flashblocks for a specific payload. /// diff --git a/crates/rollup-boost/src/flashblocks/error.rs b/crates/rollup-boost/src/flashblocks/error.rs deleted file mode 100644 index 079394fa..00000000 --- a/crates/rollup-boost/src/flashblocks/error.rs +++ /dev/null @@ -1,25 +0,0 @@ -use thiserror::Error; - -#[derive(Debug, Error, PartialEq)] -pub enum FlashblocksError { - #[error("invalid authorizer signature")] - InvalidAuthorizerSig, - #[error("invalid builder signature")] - InvalidBuilderSig, - #[error("input too short")] - InputTooShort, - #[error("unknown message type")] - UnknownMessageType, - #[error("invalid builder signature")] - Rlp(#[from] alloy_rlp::Error), - #[error("Missing base payload for initial flashblock")] - MissingBasePayload, - #[error("Unexpected base payload for non-initial flashblock")] - UnexpectedBasePayload, - #[error("Missing delta for flashblock")] - MissingDelta, - #[error("Invalid index for flashblock")] - InvalidIndex, - #[error("Missing payload")] - MissingPayload, -} diff --git a/crates/rollup-boost/src/flashblocks/mod.rs b/crates/rollup-boost/src/flashblocks/mod.rs index a180d536..d6e46ba0 100644 --- a/crates/rollup-boost/src/flashblocks/mod.rs +++ b/crates/rollup-boost/src/flashblocks/mod.rs @@ -13,7 +13,5 @@ pub use args::*; mod metrics; -mod error; - -mod p2p; -pub use p2p::*; +mod authorization; +pub use authorization::*; diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index 1fada2d1..b0bb70fb 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -37,6 +37,8 @@ pub enum FlashblocksError { InvalidIndex, #[error("Missing payload")] MissingPayload, + #[error("invalid authorizer signature")] + InvalidAuthorizerSig, } // Simplify actor messages to just handle shutdown From 39b4d244ed34575bebe0fe88941ae3aa79c7b31a Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 15:17:49 -0800 Subject: [PATCH 105/114] chore: fixup tests --- crates/rollup-boost/src/cli.rs | 24 ++++++++--------- crates/rollup-boost/src/client/rpc.rs | 27 ++++++++----------- crates/rollup-boost/src/flashblocks/args.rs | 2 +- crates/rollup-boost/src/server.rs | 29 ++++++++++++++------- 4 files changed, 43 insertions(+), 39 deletions(-) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index 5a05a9ee..b665e38e 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -254,7 +254,7 @@ pub mod tests { assert!( args.is_err(), - "flashblocks args should be invalid without --flashblocks flag" + "flashblocks args should be invalid without --flashblocks-p2p flag" ); Ok(()) @@ -268,7 +268,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-p2p", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", @@ -277,9 +277,9 @@ pub mod tests { let flashblocks = args .lib - .flashblocks_ws + .flashblocks_p2p .expect("flashblocks should be Some when flag is passed"); - assert!(flashblocks.flashblocks_ws); + assert!(flashblocks.flashblocks_p2p); Ok(()) } @@ -292,7 +292,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-p2p", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", @@ -301,9 +301,9 @@ pub mod tests { let flashblocks = args .lib - .flashblocks_ws + .flashblocks_p2p .expect("flashblocks should be Some when flag is passed"); - assert!(flashblocks.flashblocks_ws); + assert!(flashblocks.flashblocks_p2p); Ok(()) } @@ -340,7 +340,7 @@ pub mod tests { "6666", "--execution-mode", "disabled", - "--flashblocks", + "--flashblocks-p2p", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", @@ -361,9 +361,9 @@ pub mod tests { let flashblocks = args .lib - .flashblocks_ws + .flashblocks_p2p .expect("flashblocks should be Some when flag is passed"); - assert!(flashblocks.flashblocks_ws); + assert!(flashblocks.flashblocks_p2p); Ok(()) } @@ -388,7 +388,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-p2p", "--flashblocks-authorizer-sk", "invalid_hex", "--flashblocks-builder-vk", @@ -406,7 +406,7 @@ pub mod tests { SECRET, "--l2-jwt-token", SECRET, - "--flashblocks", + "--flashblocks-p2p", "--flashblocks-authorizer-sk", FLASHBLOCKS_SK, "--flashblocks-builder-vk", diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index 70630c27..0d99fa16 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -108,7 +108,7 @@ pub struct FlashblocksP2PKeys { /// Flashblocks Authorization Secret pub authorization_sk: SigningKey, /// Flashblocks builder vk - pub builder_pk: VerifyingKey, + pub builder_vk: VerifyingKey, } /// Client interface for interacting with execution layer node's Engine API. @@ -165,6 +165,8 @@ impl RpcClient { target = self.payload_source.to_string(), head_block_hash = %fork_choice_state.head_block_hash, url = %self.auth_rpc, + payload_attributes = payload_attributes.is_some(), + flashblocks_authorization, code, payload_id ) @@ -177,12 +179,13 @@ impl RpcClient { info!("Sending fork_choice_updated_v3 to {}", self.payload_source); let res = match (&payload_attributes, &self.flashblocks_p2p_keys) { (Some(attrs), Some(flashblocks)) => { + tracing::Span::current().record("flashblocks_authorization", true); let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attrs, 3); let authorization = Authorization::new( payload_id, attrs.payload_attributes.timestamp, &flashblocks.authorization_sk, - flashblocks.builder_pk.clone(), + flashblocks.builder_vk.clone(), ); self.auth_client .flashblocks_fork_choice_updated_v3( @@ -441,13 +444,17 @@ impl ClientArgs { } } - pub fn new_rpc_client(&self, payload_source: PayloadSource) -> eyre::Result { + pub fn new_rpc_client( + &self, + payload_source: PayloadSource, + flashblocks_p2p_keys: Option, + ) -> eyre::Result { RpcClient::new( self.url.clone(), self.get_auth_jwt()?, self.timeout, payload_source, - None, // TODO + flashblocks_p2p_keys, ) .map_err(eyre::Report::from) } @@ -509,7 +516,6 @@ define_client_args!((BuilderArgs, builder), (L2ClientArgs, l2)); #[cfg(test)] pub mod tests { - use assert_cmd::Command; use http::Uri; use jsonrpsee::core::client::ClientT; use parking_lot::Mutex; @@ -518,7 +524,6 @@ pub mod tests { use jsonrpsee::core::client::Error as ClientError; use jsonrpsee::server::{ServerBuilder, ServerHandle}; use jsonrpsee::{RpcModule, rpc_params}; - use predicates::prelude::*; use rollup_boost_types::payload::PayloadSource; use std::collections::HashSet; use std::net::SocketAddr; @@ -543,16 +548,6 @@ pub mod tests { } } - #[test] - fn test_invalid_args() { - let mut cmd = Command::cargo_bin("rollup-boost").unwrap(); - cmd.arg("--invalid-arg"); - - cmd.assert().failure().stderr(predicate::str::contains( - "error: unexpected argument '--invalid-arg' found", - )); - } - #[tokio::test] async fn valid_jwt() { let port = get_available_port(); diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index b8618cd6..c04fad64 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -100,7 +100,7 @@ pub struct FlashblocksP2PArgs { #[arg( long, id = "flashblocks_p2p", - conflicts_with = "flashblocks", + conflicts_with = "flashblocks_ws", env, required = false )] diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index a1b6ca05..d3476f88 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -1,7 +1,7 @@ use crate::debug_api::ExecutionMode; use crate::{ - Authorization, BlockSelectionPolicy, ClientArgs, EngineApiExt, Flashblocks, FlashblocksService, - RollupBoostLibArgs, update_execution_mode_gauge, + Authorization, BlockSelectionPolicy, ClientArgs, EngineApiExt, Flashblocks, FlashblocksP2PKeys, + FlashblocksService, RollupBoostLibArgs, update_execution_mode_gauge, }; use crate::{ client::rpc::RpcClient, @@ -82,8 +82,8 @@ impl RollupBoostServer { let l2_client_args: ClientArgs = rollup_boost_args.l2_client.into(); let builder_client_args: ClientArgs = rollup_boost_args.builder.into(); - let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2)?; - let builder_client = builder_client_args.new_rpc_client(PayloadSource::Builder)?; + let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2, None)?; + let builder_client = builder_client_args.new_rpc_client(PayloadSource::Builder, None)?; let inbound_url = flashblocks_args.flashblocks_builder_url; let outbound_addr = SocketAddr::new( @@ -115,16 +115,23 @@ impl RollupBoostServer { rollup_boost_args: RollupBoostLibArgs, probes: Arc, ) -> eyre::Result { - if rollup_boost_args.flashblocks_ws.is_none() { + if rollup_boost_args.flashblocks_ws.is_some() { eyre::bail!( - "RpcClient requires flashblocks to be disabled, first check rollup_boost_args.flashblocks.flashblocks == false before calling this constructor" + "RpcClient requires flashblocks-ws to be disabled, first check rollup_boost_args.flashblocks.flashblocks == false before calling this constructor" ); }; let l2_client_args: ClientArgs = rollup_boost_args.l2_client.into(); let builder_client_args: ClientArgs = rollup_boost_args.builder.into(); + let flashblocks_p2p_keys = rollup_boost_args + .flashblocks_p2p + .map(|x| FlashblocksP2PKeys { + authorization_sk: x.flashblocks_authorizer_sk.clone(), + builder_vk: x.flashblocks_builder_vk.clone(), + }); - let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2)?; - let builder_client = builder_client_args.new_rpc_client(PayloadSource::Builder)?; + let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2, None)?; + let builder_client = + builder_client_args.new_rpc_client(PayloadSource::Builder, flashblocks_p2p_keys)?; Ok(RollupBoostServer::new( l2_client, @@ -883,7 +890,9 @@ pub mod tests { jwt_path: None, timeout: 2000, }; - let l2_rpc_client = l2_client_args.new_rpc_client(PayloadSource::L2).unwrap(); + let l2_rpc_client = l2_client_args + .new_rpc_client(PayloadSource::L2, None) + .unwrap(); let l2_http_client = l2_client_args.new_http_client(PayloadSource::L2).unwrap(); // Build builder clients @@ -895,7 +904,7 @@ pub mod tests { }; let builder_rpc_client = Arc::new( builder_client_args - .new_rpc_client(PayloadSource::Builder) + .new_rpc_client(PayloadSource::Builder, None) .unwrap(), ); let builder_http_client = builder_client_args From 40cf2e1c1222dea790bb34258ff81f9178b79470 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 15:33:32 -0800 Subject: [PATCH 106/114] chore: move Authorization to rollup-boost-types --- Cargo.lock | 3 +++ crates/rollup-boost-types/Cargo.toml | 3 +++ .../src}/authorization.rs | 13 +++++++++---- crates/rollup-boost-types/src/lib.rs | 5 +++++ crates/rollup-boost/src/client/rpc.rs | 3 ++- crates/rollup-boost/src/flashblocks/args.rs | 4 ++-- crates/rollup-boost/src/flashblocks/mod.rs | 3 --- crates/rollup-boost/src/lib.rs | 4 ---- crates/rollup-boost/src/server.rs | 7 ++++--- 9 files changed, 28 insertions(+), 17 deletions(-) rename crates/{rollup-boost/src/flashblocks => rollup-boost-types/src}/authorization.rs (96%) diff --git a/Cargo.lock b/Cargo.lock index 4a3152b0..c1249464 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11366,11 +11366,14 @@ dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", "alloy-serde", + "blake3", + "ed25519-dalek", "futures", "moka", "op-alloy-rpc-types-engine 0.23.1", "serde", "serde_json", + "thiserror 2.0.17", "tracing", ] diff --git a/crates/rollup-boost-types/Cargo.toml b/crates/rollup-boost-types/Cargo.toml index 0f45532f..3c3d2f57 100644 --- a/crates/rollup-boost-types/Cargo.toml +++ b/crates/rollup-boost-types/Cargo.toml @@ -16,3 +16,6 @@ op-alloy-rpc-types-engine = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } tracing = { workspace = true } +thiserror = { workspace = true } +ed25519-dalek = { version = "2", features = ["serde"] } +blake3 = "1" # fast hashing for payload IDs diff --git a/crates/rollup-boost/src/flashblocks/authorization.rs b/crates/rollup-boost-types/src/authorization.rs similarity index 96% rename from crates/rollup-boost/src/flashblocks/authorization.rs rename to crates/rollup-boost-types/src/authorization.rs index 359d45f4..02f4193b 100644 --- a/crates/rollup-boost/src/flashblocks/authorization.rs +++ b/crates/rollup-boost-types/src/authorization.rs @@ -3,8 +3,7 @@ use alloy_rlp::{Decodable, Encodable, Header}; use alloy_rpc_types_engine::PayloadId; use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; use serde::{Deserialize, Serialize}; - -use crate::FlashblocksError; +use thiserror::Error; /// An authorization token that grants a builder permission to publish flashblocks for a specific payload. /// @@ -24,6 +23,12 @@ pub struct Authorization { pub authorizer_sig: Signature, } +#[derive(Debug, Error, PartialEq)] +pub enum AuthorizationError { + #[error("invalid authorizer signature")] + InvalidAuthorizerSig, +} + impl Authorization { /// Creates a new authorization token for a builder to publish messages for a specific payload. /// @@ -73,14 +78,14 @@ impl Authorization { /// /// * `Ok(())` if the signature is valid /// * `Err(FlashblocksP2PError::InvalidAuthorizerSig)` if the signature is invalid - pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), FlashblocksError> { + pub fn verify(&self, authorizer_sk: VerifyingKey) -> Result<(), AuthorizationError> { let mut msg = self.payload_id.0.to_vec(); msg.extend_from_slice(&self.timestamp.to_le_bytes()); msg.extend_from_slice(self.builder_vk.as_bytes()); let hash = blake3::hash(&msg); authorizer_sk .verify(hash.as_bytes(), &self.authorizer_sig) - .map_err(|_| FlashblocksError::InvalidAuthorizerSig) + .map_err(|_| AuthorizationError::InvalidAuthorizerSig) } } diff --git a/crates/rollup-boost-types/src/lib.rs b/crates/rollup-boost-types/src/lib.rs index 3e2fe256..d6fb6daf 100644 --- a/crates/rollup-boost-types/src/lib.rs +++ b/crates/rollup-boost-types/src/lib.rs @@ -1,2 +1,7 @@ +pub mod authorization; pub mod flashblocks; pub mod payload; + +pub mod ed25519_dalek { + pub use ed25519_dalek::*; +} diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index 0d99fa16..7f73a0eb 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -2,7 +2,7 @@ use crate::client::auth::AuthLayer; use crate::client::http::HttpClient as RollupBoostHttpClient; use crate::server::EngineApiClient; use crate::version::{CARGO_PKG_VERSION, VERGEN_GIT_SHA}; -use crate::{Authorization, EngineApiExt, FlashblocksEngineApiClient}; +use crate::{EngineApiExt, FlashblocksEngineApiClient}; use alloy_primitives::{B256, Bytes}; use alloy_rpc_types_engine::{ ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, JwtError, JwtSecret, PayloadId, @@ -25,6 +25,7 @@ use op_alloy_rpc_types_engine::{ use opentelemetry::trace::SpanKind; use paste::paste; use reth_optimism_payload_builder::payload_id_optimism; +use rollup_boost_types::authorization::Authorization; use rollup_boost_types::payload::{ NewPayload, OpExecutionPayloadEnvelope, PayloadSource, PayloadVersion, }; diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index c04fad64..74ea6ebf 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -112,7 +112,7 @@ pub struct FlashblocksP2PArgs { value_parser = parse_sk, required = false, )] - pub flashblocks_authorizer_sk: SigningKey, + pub authorizer_sk: SigningKey, #[arg( long, @@ -120,7 +120,7 @@ pub struct FlashblocksP2PArgs { value_parser = parse_vk, required = false, )] - pub flashblocks_builder_vk: VerifyingKey, + pub builder_vk: VerifyingKey, } pub fn parse_sk(s: &str) -> eyre::Result { diff --git a/crates/rollup-boost/src/flashblocks/mod.rs b/crates/rollup-boost/src/flashblocks/mod.rs index d6e46ba0..1499a26d 100644 --- a/crates/rollup-boost/src/flashblocks/mod.rs +++ b/crates/rollup-boost/src/flashblocks/mod.rs @@ -12,6 +12,3 @@ mod args; pub use args::*; mod metrics; - -mod authorization; -pub use authorization::*; diff --git a/crates/rollup-boost/src/lib.rs b/crates/rollup-boost/src/lib.rs index 3a17a007..81f6d427 100644 --- a/crates/rollup-boost/src/lib.rs +++ b/crates/rollup-boost/src/lib.rs @@ -42,10 +42,6 @@ pub use engine_api::*; mod version; pub use version::*; -pub mod ed25519_dalek { - pub use ed25519_dalek::*; -} - // re-export rollup-boost-types flashblocks types // this can be removed once dependent crates migrate to using rollup-boost-types directly pub use rollup_boost_types::flashblocks::*; diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index d3476f88..973ffcdc 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -1,6 +1,6 @@ use crate::debug_api::ExecutionMode; use crate::{ - Authorization, BlockSelectionPolicy, ClientArgs, EngineApiExt, Flashblocks, FlashblocksP2PKeys, + BlockSelectionPolicy, ClientArgs, EngineApiExt, Flashblocks, FlashblocksP2PKeys, FlashblocksService, RollupBoostLibArgs, update_execution_mode_gauge, }; use crate::{ @@ -32,6 +32,7 @@ use op_alloy_rpc_types_engine::{ }; use opentelemetry::trace::SpanKind; use parking_lot::Mutex; +use rollup_boost_types::authorization::Authorization; use rollup_boost_types::payload::{ NewPayload, NewPayloadV3, NewPayloadV4, OpExecutionPayloadEnvelope, PayloadSource, PayloadTraceContext, PayloadVersion, @@ -125,8 +126,8 @@ impl RollupBoostServer { let flashblocks_p2p_keys = rollup_boost_args .flashblocks_p2p .map(|x| FlashblocksP2PKeys { - authorization_sk: x.flashblocks_authorizer_sk.clone(), - builder_vk: x.flashblocks_builder_vk.clone(), + authorization_sk: x.authorizer_sk.clone(), + builder_vk: x.builder_vk.clone(), }); let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2, None)?; From 02ac0d53d38e814a96052f38c07ed753c7c05e4d Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 15:53:19 -0800 Subject: [PATCH 107/114] chore: cleanup --- Cargo.lock | 434 ++++++++++---------- Cargo.toml | 4 +- crates/rollup-boost/src/flashblocks/args.rs | 4 +- 3 files changed, 221 insertions(+), 221 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1249464..8e2993f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7098,7 +7098,7 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7106,15 +7106,15 @@ dependencies = [ "futures-core", "futures-util", "metrics", - "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-revm 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-tasks 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-revm 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-tasks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "tokio", "tracing", ] @@ -7153,7 +7153,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7162,14 +7162,14 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm-database", "tokio", "tokio-stream", @@ -7199,7 +7199,7 @@ dependencies = [ [[package]] name = "reth-chainspec" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7210,9 +7210,9 @@ dependencies = [ "alloy-trie", "auto_impl", "derive_more", - "reth-ethereum-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-network-peers 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-ethereum-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-network-peers 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde_json", ] @@ -7355,7 +7355,7 @@ dependencies = [ [[package]] name = "reth-codecs" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7365,8 +7365,8 @@ dependencies = [ "bytes", "modular-bitfield", "op-alloy-consensus 0.23.1", - "reth-codecs-derive 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-zstd-compressors 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-codecs-derive 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-zstd-compressors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde", ] @@ -7383,7 +7383,7 @@ dependencies = [ [[package]] name = "reth-codecs-derive" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "proc-macro2", "quote", @@ -7421,13 +7421,13 @@ dependencies = [ [[package]] name = "reth-consensus" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "thiserror 2.0.17", ] @@ -7446,13 +7446,13 @@ dependencies = [ [[package]] name = "reth-consensus-common" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", ] [[package]] @@ -7583,11 +7583,11 @@ dependencies = [ [[package]] name = "reth-db-models" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-eips", "alloy-primitives", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", ] [[package]] @@ -7839,22 +7839,22 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", - "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-evm 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-evm 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde", "thiserror 2.0.17", ] @@ -8031,11 +8031,11 @@ dependencies = [ [[package]] name = "reth-errors" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ - "reth-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "thiserror 2.0.17", ] @@ -8091,7 +8091,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8101,10 +8101,10 @@ dependencies = [ "alloy-rlp", "bytes", "derive_more", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-codecs-derive 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-codecs-derive 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde", "thiserror 2.0.17", ] @@ -8146,16 +8146,16 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", - "reth-engine-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-engine-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde", "sha2", "thiserror 2.0.17", @@ -8177,7 +8177,7 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8239,7 +8239,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8247,8 +8247,8 @@ dependencies = [ "alloy-rlp", "alloy-rpc-types-eth", "alloy-serde", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-zstd-compressors 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-zstd-compressors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde", "serde_with", ] @@ -8289,7 +8289,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8298,12 +8298,12 @@ dependencies = [ "auto_impl", "derive_more", "futures-util", - "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm 33.1.0", ] @@ -8343,13 +8343,13 @@ dependencies = [ [[package]] name = "reth-execution-errors" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-evm 0.25.2", "alloy-primitives", "alloy-rlp", "nybbles", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "thiserror 2.0.17", ] @@ -8374,16 +8374,16 @@ dependencies = [ [[package]] name = "reth-execution-types" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-evm 0.25.2", "alloy-primitives", "derive_more", - "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm 33.1.0", "serde", "serde_with", @@ -8454,7 +8454,7 @@ dependencies = [ [[package]] name = "reth-fs-util" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "serde", "serde_json", @@ -8549,7 +8549,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "metrics", "metrics-derive", @@ -8698,7 +8698,7 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9034,7 +9034,7 @@ dependencies = [ [[package]] name = "reth-optimism-chainspec" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-chains", "alloy-consensus", @@ -9045,12 +9045,12 @@ dependencies = [ "derive_more", "op-alloy-consensus 0.23.1", "op-alloy-rpc-types 0.23.1", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-network-peers 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-network-peers 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde_json", ] @@ -9132,23 +9132,23 @@ dependencies = [ [[package]] name = "reth-optimism-consensus" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-trie", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-consensus-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-consensus-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm 33.1.0", "thiserror 2.0.17", "tracing", @@ -9185,7 +9185,7 @@ dependencies = [ [[package]] name = "reth-optimism-evm" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9195,16 +9195,16 @@ dependencies = [ "op-alloy-consensus 0.23.1", "op-alloy-rpc-types-engine 0.23.1", "op-revm 14.1.0", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-evm 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-evm 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-consensus 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm 33.1.0", "thiserror 2.0.17", ] @@ -9262,12 +9262,12 @@ dependencies = [ [[package]] name = "reth-optimism-forks" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-op-hardforks", "alloy-primitives", "once_cell", - "reth-ethereum-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-ethereum-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", ] [[package]] @@ -9359,7 +9359,7 @@ dependencies = [ [[package]] name = "reth-optimism-payload-builder" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9372,23 +9372,23 @@ dependencies = [ "either", "op-alloy-consensus 0.23.1", "op-alloy-rpc-types-engine 0.23.1", - "reth-basic-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-evm 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-evm 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-txpool 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-util 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-validator 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-revm 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-transaction-pool 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-basic-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-evm 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-evm 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-txpool 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-util 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-validator 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-revm 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-transaction-pool 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm 33.1.0", "serde", "sha2", @@ -9419,14 +9419,14 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rlp", "op-alloy-consensus 0.23.1", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", ] [[package]] @@ -9539,7 +9539,7 @@ dependencies = [ [[package]] name = "reth-optimism-txpool" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9557,15 +9557,15 @@ dependencies = [ "op-alloy-rpc-types 0.23.1", "op-revm 14.1.0", "parking_lot", - "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-evm 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-transaction-pool 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-evm 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-forks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-optimism-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-transaction-pool 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde", "thiserror 2.0.17", "tokio", @@ -9596,19 +9596,19 @@ dependencies = [ [[package]] name = "reth-payload-builder" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-primitives", "alloy-rpc-types", "futures-util", "metrics", - "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-engine-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-engine-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-builder-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "tokio", "tokio-stream", "tracing", @@ -9629,10 +9629,10 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "pin-project", - "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-payload-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "tokio", "tokio-stream", "tracing", @@ -9661,7 +9661,7 @@ dependencies = [ [[package]] name = "reth-payload-primitives" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9670,12 +9670,12 @@ dependencies = [ "auto_impl", "either", "op-alloy-rpc-types-engine 0.23.1", - "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "serde", "thiserror 2.0.17", "tokio", @@ -9694,11 +9694,11 @@ dependencies = [ [[package]] name = "reth-payload-util" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-primitives", - "reth-transaction-pool 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-transaction-pool 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", ] [[package]] @@ -9714,11 +9714,11 @@ dependencies = [ [[package]] name = "reth-payload-validator" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", ] [[package]] @@ -9771,7 +9771,7 @@ dependencies = [ [[package]] name = "reth-primitives-traits" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9785,7 +9785,7 @@ dependencies = [ "derive_more", "once_cell", "op-alloy-consensus 0.23.1", - "reth-codecs 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-codecs 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm-bytecode", "revm-primitives", "revm-state", @@ -9884,7 +9884,7 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-primitives", "derive_more", @@ -9908,13 +9908,13 @@ dependencies = [ [[package]] name = "reth-revm" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-primitives", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm 33.1.0", ] @@ -10229,7 +10229,7 @@ dependencies = [ [[package]] name = "reth-rpc-layer" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-rpc-types-engine", "http", @@ -10348,10 +10348,10 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-primitives", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", ] [[package]] @@ -10389,7 +10389,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-primitives", "derive_more", @@ -10423,22 +10423,22 @@ dependencies = [ [[package]] name = "reth-storage-api" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-db-models 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-prune-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-stages-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-db-models 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-prune-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-stages-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm-database", ] @@ -10461,15 +10461,15 @@ dependencies = [ [[package]] name = "reth-storage-errors" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "derive_more", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-prune-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-static-file-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-prune-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-static-file-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm-database-interface", "thiserror 2.0.17", ] @@ -10495,13 +10495,13 @@ dependencies = [ [[package]] name = "reth-tasks" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "auto_impl", "dyn-clone", "futures-util", "metrics", - "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "thiserror 2.0.17", "tokio", "tracing", @@ -10612,7 +10612,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10625,16 +10625,16 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-eth-wire-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-fs-util 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-tasks 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-chain-state 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-chainspec 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-eth-wire-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-ethereum-primitives 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-execution-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-fs-util 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-metrics 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-api 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-tasks 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm-interpreter 31.1.0", "revm-primitives", "rustc-hash 2.1.1", @@ -10676,7 +10676,7 @@ dependencies = [ [[package]] name = "reth-trie" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10685,12 +10685,12 @@ dependencies = [ "alloy-trie", "auto_impl", "itertools 0.14.0", - "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-stages-types 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-sparse 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-stages-types 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-storage-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-sparse 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm-database", "tracing", ] @@ -10725,7 +10725,7 @@ dependencies = [ [[package]] name = "reth-trie-common" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10739,7 +10739,7 @@ dependencies = [ "itertools 0.14.0", "nybbles", "rayon", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "revm-database", "serde", "serde_with", @@ -10805,15 +10805,15 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-trie", "auto_impl", - "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-execution-errors 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-primitives-traits 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-trie-common 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "smallvec", "tracing", ] @@ -10847,7 +10847,7 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" version = "1.9.3" -source = "git+https://github.com/paradigmxyz/reth#4231f4b68879d673ebab41b8a7e434537e6c6f0c" +source = "git+https://github.com/paradigmxyz/reth?rev=4231f4b#4231f4b68879d673ebab41b8a7e434537e6c6f0c" dependencies = [ "zstd", ] @@ -11331,8 +11331,8 @@ dependencies = [ "predicates", "rand 0.9.2", "reqwest", - "reth-optimism-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth)", - "reth-rpc-layer 1.9.3 (git+https://github.com/paradigmxyz/reth)", + "reth-optimism-payload-builder 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", + "reth-rpc-layer 1.9.3 (git+https://github.com/paradigmxyz/reth?rev=4231f4b)", "rollup-boost-types", "rustls", "serde", diff --git a/Cargo.toml b/Cargo.toml index 72f28a41..f444b640 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,8 +30,8 @@ tracing-subscriber = { version = "0.3.20", features = ["env-filter", "json"] } url = "2.2.0" # Reth deps, use 4231f4b to get latest op-alloy -reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", ref = "4231f4b" } -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth", ref = "4231f4b" } +reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "4231f4b" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth", rev = "4231f4b" } # Alloy libraries alloy-rpc-types-engine = "1.0.41" diff --git a/crates/rollup-boost/src/flashblocks/args.rs b/crates/rollup-boost/src/flashblocks/args.rs index 74ea6ebf..8b535599 100644 --- a/crates/rollup-boost/src/flashblocks/args.rs +++ b/crates/rollup-boost/src/flashblocks/args.rs @@ -107,7 +107,7 @@ pub struct FlashblocksP2PArgs { pub flashblocks_p2p: bool, #[arg( - long, + long = "flashblocks-authorizer-sk", env = "FLASHBLOCKS_AUTHORIZER_SK", value_parser = parse_sk, required = false, @@ -115,7 +115,7 @@ pub struct FlashblocksP2PArgs { pub authorizer_sk: SigningKey, #[arg( - long, + long = "flashblocks-builder-vk", env = "FLASHBLOCKS_BUILDER_VK", value_parser = parse_vk, required = false, From b565106ded1d42ab7de7bc0395128700ac65d3d9 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 16:01:16 -0800 Subject: [PATCH 108/114] chore: satisfy clippy --- crates/rollup-boost-types/src/authorization.rs | 6 +++--- crates/rollup-boost-types/src/flashblocks.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/rollup-boost-types/src/authorization.rs b/crates/rollup-boost-types/src/authorization.rs index 02f4193b..e69fc7bf 100644 --- a/crates/rollup-boost-types/src/authorization.rs +++ b/crates/rollup-boost-types/src/authorization.rs @@ -140,10 +140,10 @@ impl Decodable for Authorization { if !header.list { return Err(alloy_rlp::Error::UnexpectedString); } - let mut body = &buf[..header.payload_length as usize]; + let mut body = &buf[..header.payload_length]; // 1. payload_id - let payload_id = alloy_rpc_types_engine::PayloadId(B64::decode(&mut body)?.into()); + let payload_id = alloy_rpc_types_engine::PayloadId(B64::decode(&mut body)?); // 2. timestamp let timestamp = u64::decode(&mut body)?; @@ -159,7 +159,7 @@ impl Decodable for Authorization { .map_err(|_| alloy_rlp::Error::Custom("bad signature"))?; // advance caller’s slice cursor - *buf = &buf[header.payload_length as usize..]; + *buf = &buf[header.payload_length..]; Ok(Self { payload_id, diff --git a/crates/rollup-boost-types/src/flashblocks.rs b/crates/rollup-boost-types/src/flashblocks.rs index 43da1c34..7f642314 100644 --- a/crates/rollup-boost-types/src/flashblocks.rs +++ b/crates/rollup-boost-types/src/flashblocks.rs @@ -167,7 +167,7 @@ impl Decodable for FlashblocksPayloadV1 { } // Limit the decoding window to the list payload only. - let mut body = &buf[..header.payload_length as usize]; + let mut body = &buf[..header.payload_length]; let payload_id = B64::decode(&mut body)?.into(); let index = u64::decode(&mut body)?; @@ -186,7 +186,7 @@ impl Decodable for FlashblocksPayloadV1 { }; // advance the original buffer cursor - *buf = &buf[header.payload_length as usize..]; + *buf = &buf[header.payload_length..]; Ok(Self { payload_id, From 2eb0895fbbaf056eaba34b1401cf70926b40f6a2 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 16:17:25 -0800 Subject: [PATCH 109/114] chore: prefer workspace defined deps --- Cargo.toml | 3 +++ crates/rollup-boost/Cargo.toml | 7 +++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f444b640..750572bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,9 @@ tokio = { version = "1", features = ["full"] } tracing = "0.1.4" tracing-subscriber = { version = "0.3.20", features = ["env-filter", "json"] } url = "2.2.0" +ed25519-dalek = { version = "2", features = ["serde"] } +blake3 = "1" +hex = "0.4" # Reth deps, use 4231f4b to get latest op-alloy reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "4231f4b" } diff --git a/crates/rollup-boost/Cargo.toml b/crates/rollup-boost/Cargo.toml index 838f202b..be2dfd5c 100644 --- a/crates/rollup-boost/Cargo.toml +++ b/crates/rollup-boost/Cargo.toml @@ -19,6 +19,9 @@ eyre.workspace = true url.workspace = true sha2.workspace = true moka = { workspace = true, features = ["future"] } +ed25519-dalek.workspace = true +blake3.workspace = true +hex.workspace = true # Reth deps reth-optimism-payload-builder.workspace = true @@ -68,10 +71,6 @@ uuid = { version = "1.17.0", features = ["v4", "v7"] } bytes = "1.10.1" lru = "0.16" -ed25519-dalek = { version = "2", features = ["serde"] } -blake3 = "1" # fast hashing for payload IDs -hex = "0.4" - [dev-dependencies] tempfile = "3.23.0" serial_test = "3" From 55060fcd522f081f4bd23d2cd683a8365507d360 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 16:22:16 -0800 Subject: [PATCH 110/114] Update crates/rollup-boost/src/server.rs Co-authored-by: 0xOsiris --- crates/rollup-boost/src/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index 973ffcdc..bd3cf0a1 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -479,7 +479,7 @@ where #[rpc(client)] pub trait FlashblocksEngineApi { - /// When flashblocks is enabled + /// When flashblocks p2p is enabled /// we add an additional parameter `authorization` to the FCU #[method(name = "flashblocks_forkchoiceUpdatedV3")] async fn flashblocks_fork_choice_updated_v3( From 0117c0d674cde6b42dc65c8cfb4e4157f46da0c3 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 16:25:28 -0800 Subject: [PATCH 111/114] chore: prefer workspace deps --- crates/rollup-boost-types/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/rollup-boost-types/Cargo.toml b/crates/rollup-boost-types/Cargo.toml index 3c3d2f57..05906b14 100644 --- a/crates/rollup-boost-types/Cargo.toml +++ b/crates/rollup-boost-types/Cargo.toml @@ -17,5 +17,5 @@ serde = { workspace = true } serde_json = { workspace = true } tracing = { workspace = true } thiserror = { workspace = true } -ed25519-dalek = { version = "2", features = ["serde"] } -blake3 = "1" # fast hashing for payload IDs +ed25519-dalek = { workspace = true } +blake3 = { workspace = true } From 79bcd1782829a23e76bc823f56f1c92ce6f132a6 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Tue, 16 Dec 2025 16:29:21 -0800 Subject: [PATCH 112/114] chore: fix comment --- crates/rollup-boost/src/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index bd3cf0a1..04a3261b 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -118,7 +118,7 @@ impl RollupBoostServer { ) -> eyre::Result { if rollup_boost_args.flashblocks_ws.is_some() { eyre::bail!( - "RpcClient requires flashblocks-ws to be disabled, first check rollup_boost_args.flashblocks.flashblocks == false before calling this constructor" + "RpcClient requires flashblocks-ws to be disabled, first check rollup_boost_args.flashblocks_ws.is_none() before calling this constructor" ); }; let l2_client_args: ClientArgs = rollup_boost_args.l2_client.into(); From ba36d45d87ff2dc42fd47934efdb29326916ab46 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 18 Dec 2025 16:07:46 -0800 Subject: [PATCH 113/114] feat: Cleanup RcpClient generics + don't send flashblocks authorization in dry run --- crates/rollup-boost/src/cli.rs | 28 +-- crates/rollup-boost/src/client/rpc.rs | 172 ++++++++++++++---- crates/rollup-boost/src/engine_api.rs | 2 +- .../rollup-boost/src/flashblocks/service.rs | 2 - crates/rollup-boost/src/health.rs | 14 -- crates/rollup-boost/src/server.rs | 118 +++++------- 6 files changed, 184 insertions(+), 152 deletions(-) diff --git a/crates/rollup-boost/src/cli.rs b/crates/rollup-boost/src/cli.rs index b665e38e..82a0d857 100644 --- a/crates/rollup-boost/src/cli.rs +++ b/crates/rollup-boost/src/cli.rs @@ -12,7 +12,6 @@ use crate::{ get_version, init_metrics, probe::ProbeLayer, }; -use crate::{FlashblocksService, RpcClient}; use rollup_boost_types::payload::PayloadSource; #[derive(Clone, Debug, clap::Args)] @@ -123,27 +122,12 @@ impl RollupBoostServiceArgs { let (probe_layer, probes) = ProbeLayer::new(); - let (health_handle, rpc_module) = if self.lib.flashblocks_ws.is_some() { - let rollup_boost = RollupBoostServer::::new_from_args( - self.lib.clone(), - probes.clone(), - )?; - let health_handle = rollup_boost - .spawn_health_check(self.lib.health_check_interval, self.lib.max_unsafe_interval); - let debug_server = DebugServer::new(rollup_boost.execution_mode.clone()); - debug_server.run(&debug_addr).await?; - let rpc_module: RpcModule<()> = rollup_boost.try_into()?; - (health_handle, rpc_module) - } else { - let rollup_boost = - RollupBoostServer::::new_from_args(self.lib.clone(), probes.clone())?; - let health_handle = rollup_boost - .spawn_health_check(self.lib.health_check_interval, self.lib.max_unsafe_interval); - let debug_server = DebugServer::new(rollup_boost.execution_mode.clone()); - debug_server.run(&debug_addr).await?; - let rpc_module: RpcModule<()> = rollup_boost.try_into()?; - (health_handle, rpc_module) - }; + let rollup_boost = RollupBoostServer::new_from_args(self.lib.clone(), probes.clone())?; + let health_handle = rollup_boost + .spawn_health_check(self.lib.health_check_interval, self.lib.max_unsafe_interval); + let debug_server = DebugServer::new(rollup_boost.execution_mode.clone()); + debug_server.run(&debug_addr).await?; + let rpc_module: RpcModule<()> = rollup_boost.try_into()?; // Build and start the server info!("Starting server on :{}", self.rpc_port); diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index 7f73a0eb..671c0a6b 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -2,7 +2,7 @@ use crate::client::auth::AuthLayer; use crate::client::http::HttpClient as RollupBoostHttpClient; use crate::server::EngineApiClient; use crate::version::{CARGO_PKG_VERSION, VERGEN_GIT_SHA}; -use crate::{EngineApiExt, FlashblocksEngineApiClient}; +use crate::{EngineApiExt, ExecutionMode, FlashblocksEngineApiClient as _}; use alloy_primitives::{B256, Bytes}; use alloy_rpc_types_engine::{ ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, JwtError, JwtSecret, PayloadId, @@ -23,6 +23,7 @@ use op_alloy_rpc_types_engine::{ OpPayloadAttributes, }; use opentelemetry::trace::SpanKind; +use parking_lot::Mutex; use paste::paste; use reth_optimism_payload_builder::payload_id_optimism; use rollup_boost_types::authorization::Authorization; @@ -30,6 +31,7 @@ use rollup_boost_types::payload::{ NewPayload, OpExecutionPayloadEnvelope, PayloadSource, PayloadVersion, }; use std::path::PathBuf; +use std::sync::Arc; use std::time::Duration; use thiserror::Error; use tracing::{info, instrument}; @@ -124,10 +126,23 @@ pub struct RpcClient { auth_rpc: Uri, /// The source of the payload payload_source: PayloadSource, +} + +/// Client interface for interacting with execution layer node's Engine API. +/// +/// fork_choice_updated_v3 with attributes is converted into +/// a flashblocks_fork_choice_updated_v3 and an Authorization token is generated +/// +/// - **Engine API** calls are faciliated via the `auth_client` (requires JWT authentication). +/// +#[derive(Clone, Debug)] +pub struct FlasblocksP2PRpcClient { + /// Inner RPC client + pub inner: RpcClient, /// Flashblocks keys - /// - /// `None` if p2p flashblocks are disabled - flashblocks_p2p_keys: Option, + pub flashblocks_p2p_keys: FlashblocksP2PKeys, + /// Execution mode of rollup boost + pub execution_mode: Arc>, } impl RpcClient { @@ -137,7 +152,6 @@ impl RpcClient { auth_rpc_jwt_secret: JwtSecret, timeout: u64, payload_source: PayloadSource, - flashblocks_p2p_keys: Option, ) -> Result { let version = format!("{CARGO_PKG_VERSION}-{VERGEN_GIT_SHA}"); let mut headers = HeaderMap::new(); @@ -154,7 +168,6 @@ impl RpcClient { auth_client, auth_rpc, payload_source, - flashblocks_p2p_keys, }) } @@ -167,7 +180,6 @@ impl RpcClient { head_block_hash = %fork_choice_state.head_block_hash, url = %self.auth_rpc, payload_attributes = payload_attributes.is_some(), - flashblocks_authorization, code, payload_id ) @@ -178,31 +190,12 @@ impl RpcClient { payload_attributes: Option, ) -> ClientResult { info!("Sending fork_choice_updated_v3 to {}", self.payload_source); - let res = match (&payload_attributes, &self.flashblocks_p2p_keys) { - (Some(attrs), Some(flashblocks)) => { - tracing::Span::current().record("flashblocks_authorization", true); - let payload_id = payload_id_optimism(&fork_choice_state.head_block_hash, attrs, 3); - let authorization = Authorization::new( - payload_id, - attrs.payload_attributes.timestamp, - &flashblocks.authorization_sk, - flashblocks.builder_vk.clone(), - ); - self.auth_client - .flashblocks_fork_choice_updated_v3( - fork_choice_state, - payload_attributes.clone(), - Some(authorization), - ) - .await - .set_code()? - } - _ => self - .auth_client - .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) - .await - .set_code()?, - }; + + let res = self + .auth_client + .fork_choice_updated_v3(fork_choice_state, payload_attributes.clone()) + .await + .set_code()?; if let Some(payload_id) = res.payload_id { tracing::Span::current().record("payload_id", payload_id.to_string()); @@ -419,6 +412,112 @@ impl EngineApiExt for RpcClient { } } +impl FlasblocksP2PRpcClient { + #[instrument( + skip_all, + err, + fields( + otel.kind = ?SpanKind::Client, + target = self.inner.payload_source.to_string(), + head_block_hash = %fork_choice_state.head_block_hash, + url = %self.inner.auth_rpc, + code, + payload_id + ) + )] + pub async fn flashblocks_fork_choice_updated_v3( + &self, + fork_choice_state: ForkchoiceState, + payload_attributes: OpPayloadAttributes, + ) -> ClientResult { + info!( + "Sending flashblocks_fork_choice_updated_v3 to {}", + self.inner.payload_source + ); + + let payload_id = + payload_id_optimism(&fork_choice_state.head_block_hash, &payload_attributes, 3); + let authorization = Authorization::new( + payload_id, + payload_attributes.payload_attributes.timestamp, + &self.flashblocks_p2p_keys.authorization_sk, + self.flashblocks_p2p_keys.builder_vk.clone(), + ); + + let res = self + .inner + .auth_client + .flashblocks_fork_choice_updated_v3( + fork_choice_state, + Some(payload_attributes), + Some(authorization), + ) + .await + .set_code()?; + + if let Some(payload_id) = res.payload_id { + tracing::Span::current().record("payload_id", payload_id.to_string()); + } + + if res.is_invalid() { + return Err(RpcClientError::InvalidPayload( + res.payload_status.status.to_string(), + )) + .set_code(); + } + info!( + "Successfully sent flashblocks_fork_choice_updated_v3 to {}", + self.inner.payload_source + ); + + Ok(res) + } +} + +#[async_trait] +impl EngineApiExt for FlasblocksP2PRpcClient { + async fn fork_choice_updated_v3( + &self, + fork_choice_state: ForkchoiceState, + payload_attributes: Option, + ) -> ClientResult { + match (payload_attributes, *self.execution_mode.lock()) { + // If we have payload attributes and execution mode is enabled, generate authorization + // We don't want to the builder to publish flashblocks if rollup boost is not going to + // honour the block. + (Some(attrs), ExecutionMode::Enabled) => Ok(self + .flashblocks_fork_choice_updated_v3(fork_choice_state, attrs) + .await + .set_code()?), + (attrs, _) => Ok(self + .inner + .fork_choice_updated_v3(fork_choice_state, attrs) + .await + .set_code()?), + } + } + + async fn new_payload(&self, new_payload: NewPayload) -> ClientResult { + self.inner.new_payload(new_payload).await + } + + async fn get_payload( + &self, + payload_id: PayloadId, + version: PayloadVersion, + ) -> ClientResult { + self.inner.get_payload(payload_id, version).await + } + + async fn get_block_by_number( + &self, + number: BlockNumberOrTag, + full: bool, + ) -> ClientResult { + self.inner.get_block_by_number(number, full).await + } +} + #[derive(Debug, Clone)] pub struct ClientArgs { /// Auth server address @@ -445,17 +544,12 @@ impl ClientArgs { } } - pub fn new_rpc_client( - &self, - payload_source: PayloadSource, - flashblocks_p2p_keys: Option, - ) -> eyre::Result { + pub fn new_rpc_client(&self, payload_source: PayloadSource) -> eyre::Result { RpcClient::new( self.url.clone(), self.get_auth_jwt()?, self.timeout, payload_source, - flashblocks_p2p_keys, ) .map_err(eyre::Report::from) } @@ -554,7 +648,7 @@ pub mod tests { let port = get_available_port(); let secret = JwtSecret::from_hex(SECRET).unwrap(); let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, port)).unwrap(); - let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2, None).unwrap(); + let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); let response = send_request(client.auth_client, port).await; assert!(response.is_ok()); assert_eq!(response.unwrap(), "You are the dark lord"); diff --git a/crates/rollup-boost/src/engine_api.rs b/crates/rollup-boost/src/engine_api.rs index 4b05552e..5023cea7 100644 --- a/crates/rollup-boost/src/engine_api.rs +++ b/crates/rollup-boost/src/engine_api.rs @@ -7,7 +7,7 @@ use crate::ClientResult; use rollup_boost_types::payload::{NewPayload, OpExecutionPayloadEnvelope, PayloadVersion}; #[async_trait] -pub trait EngineApiExt: Send + Sync + 'static { +pub trait EngineApiExt: std::fmt::Debug + Send + Sync + 'static { async fn fork_choice_updated_v3( &self, fork_choice_state: ForkchoiceState, diff --git a/crates/rollup-boost/src/flashblocks/service.rs b/crates/rollup-boost/src/flashblocks/service.rs index b0bb70fb..b4505b0d 100644 --- a/crates/rollup-boost/src/flashblocks/service.rs +++ b/crates/rollup-boost/src/flashblocks/service.rs @@ -409,7 +409,6 @@ mod tests { jwt_secret, 2000, PayloadSource::Builder, - None, )?; let service = @@ -439,7 +438,6 @@ mod tests { jwt_secret, 2000, PayloadSource::Builder, - None, )?; let service = diff --git a/crates/rollup-boost/src/health.rs b/crates/rollup-boost/src/health.rs index c963bfaa..d8403a29 100644 --- a/crates/rollup-boost/src/health.rs +++ b/crates/rollup-boost/src/health.rs @@ -307,7 +307,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::L2, - None, )?); let builder = MockHttpServer::serve(handler, now).await.unwrap(); @@ -316,7 +315,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, - None, )?); let health_handle = HealthHandle { @@ -350,7 +348,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::L2, - None, )?); // Builder unhealthy @@ -360,7 +357,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, - None, )?); let health_handle = HealthHandle { @@ -394,7 +390,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::L2, - None, )?); // Builder healthy @@ -404,7 +399,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, - None, )?); let health_handle = HealthHandle { @@ -438,7 +432,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::L2, - None, )?); let builder = MockHttpServer::serve(handler, now - 10).await.unwrap(); @@ -447,7 +440,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, - None, )?); let health_handle = HealthHandle { @@ -481,7 +473,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::L2, - None, )?); let builder = MockHttpServer::serve(handler, now - 10).await.unwrap(); @@ -490,7 +481,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, - None, )?); let health_handle = HealthHandle { @@ -523,7 +513,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::L2, - None, )?); // Builder unhealthy @@ -532,7 +521,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, - None, )?); let health_handle = HealthHandle { @@ -565,7 +553,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::L2, - None, )?); // Builder healthy @@ -575,7 +562,6 @@ mod tests { JwtSecret::random(), 100, PayloadSource::Builder, - None, )?); let health_handle = HealthHandle { diff --git a/crates/rollup-boost/src/server.rs b/crates/rollup-boost/src/server.rs index 04a3261b..a75fbb0e 100644 --- a/crates/rollup-boost/src/server.rs +++ b/crates/rollup-boost/src/server.rs @@ -1,7 +1,7 @@ use crate::debug_api::ExecutionMode; use crate::{ - BlockSelectionPolicy, ClientArgs, EngineApiExt, Flashblocks, FlashblocksP2PKeys, - FlashblocksService, RollupBoostLibArgs, update_execution_mode_gauge, + BlockSelectionPolicy, ClientArgs, EngineApiExt, FlasblocksP2PRpcClient, Flashblocks, + FlashblocksP2PKeys, RollupBoostLibArgs, update_execution_mode_gauge, }; use crate::{ client::rpc::RpcClient, @@ -58,9 +58,9 @@ pub struct BuilderPayloadResult { pub type BuilderResult = Result>; #[derive(Clone, Debug)] -pub struct RollupBoostServer { +pub struct RollupBoostServer { pub l2_client: Arc, - pub builder_client: Arc, + pub builder_client: Arc, pub payload_trace_context: Arc, pub execution_mode: Arc>, block_selection_policy: Option, @@ -70,39 +70,49 @@ pub struct RollupBoostServer { payload_to_fcu_request: DashMap)>, } -impl RollupBoostServer { +impl RollupBoostServer { pub fn new_from_args( rollup_boost_args: RollupBoostLibArgs, probes: Arc, ) -> eyre::Result { - let Some(flashblocks_args) = rollup_boost_args.flashblocks_ws else { - eyre::bail!( - "FlashblocksService requires flashblocks to be enabled, first check rollup_boost_args.flashblocks.flashblocks == true before calling this constructor" - ); - }; let l2_client_args: ClientArgs = rollup_boost_args.l2_client.into(); let builder_client_args: ClientArgs = rollup_boost_args.builder.into(); - let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2, None)?; - let builder_client = builder_client_args.new_rpc_client(PayloadSource::Builder, None)?; + let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2)?; + let builder_client = builder_client_args.new_rpc_client(PayloadSource::Builder)?; + let execution_mode = Arc::new(Mutex::new(rollup_boost_args.execution_mode.clone())); - let inbound_url = flashblocks_args.flashblocks_builder_url; - let outbound_addr = SocketAddr::new( - IpAddr::from_str(&flashblocks_args.flashblocks_host)?, - flashblocks_args.flashblocks_port, - ); + let builder_client: Arc = + if let Some(flashblocks_ws) = rollup_boost_args.flashblocks_ws { + let inbound_url = flashblocks_ws.flashblocks_builder_url; + let outbound_addr = SocketAddr::new( + IpAddr::from_str(&flashblocks_ws.flashblocks_host)?, + flashblocks_ws.flashblocks_port, + ); - let builder_client = Arc::new(Flashblocks::run( - builder_client.clone(), - inbound_url, - outbound_addr, - flashblocks_args.flashblocks_ws_config, - )?); + Arc::new(Flashblocks::run( + builder_client.clone(), + inbound_url, + outbound_addr, + flashblocks_ws.flashblocks_ws_config, + )?) + } else if let Some(flashblocks_p2p) = rollup_boost_args.flashblocks_p2p.clone() { + Arc::new(FlasblocksP2PRpcClient { + inner: builder_client, + flashblocks_p2p_keys: FlashblocksP2PKeys { + authorization_sk: flashblocks_p2p.authorizer_sk.clone(), + builder_vk: flashblocks_p2p.builder_vk.clone(), + }, + execution_mode: execution_mode.clone(), + }) + } else { + Arc::new(builder_client) + }; Ok(RollupBoostServer::new( l2_client, builder_client, - rollup_boost_args.execution_mode, + execution_mode, rollup_boost_args.block_selection_policy, probes.clone(), rollup_boost_args.external_state_root, @@ -111,58 +121,23 @@ impl RollupBoostServer { } } -impl RollupBoostServer { - pub fn new_from_args( - rollup_boost_args: RollupBoostLibArgs, - probes: Arc, - ) -> eyre::Result { - if rollup_boost_args.flashblocks_ws.is_some() { - eyre::bail!( - "RpcClient requires flashblocks-ws to be disabled, first check rollup_boost_args.flashblocks_ws.is_none() before calling this constructor" - ); - }; - let l2_client_args: ClientArgs = rollup_boost_args.l2_client.into(); - let builder_client_args: ClientArgs = rollup_boost_args.builder.into(); - let flashblocks_p2p_keys = rollup_boost_args - .flashblocks_p2p - .map(|x| FlashblocksP2PKeys { - authorization_sk: x.authorizer_sk.clone(), - builder_vk: x.builder_vk.clone(), - }); - - let l2_client = l2_client_args.new_rpc_client(PayloadSource::L2, None)?; - let builder_client = - builder_client_args.new_rpc_client(PayloadSource::Builder, flashblocks_p2p_keys)?; - - Ok(RollupBoostServer::new( - l2_client, - Arc::new(builder_client), - rollup_boost_args.execution_mode, - rollup_boost_args.block_selection_policy, - probes.clone(), - rollup_boost_args.external_state_root, - rollup_boost_args.ignore_unhealthy_builders, - )) - } -} - -impl RollupBoostServer { +impl RollupBoostServer { pub fn new( l2_client: RpcClient, - builder_client: Arc, - initial_execution_mode: ExecutionMode, + builder_client: Arc, + execution_mode: Arc>, block_selection_policy: Option, probes: Arc, external_state_root: bool, ignore_unhealthy_builders: bool, ) -> Self { - update_execution_mode_gauge(initial_execution_mode); + update_execution_mode_gauge(*execution_mode.lock()); Self { l2_client: Arc::new(l2_client), builder_client, block_selection_policy, payload_trace_context: Arc::new(PayloadTraceContext::new()), - execution_mode: Arc::new(Mutex::new(initial_execution_mode)), + execution_mode, probes, external_state_root, ignore_unhealthy_builders, @@ -459,10 +434,7 @@ impl RollupBoostServer { } } -impl TryInto> for RollupBoostServer -where - T: EngineApiExt, -{ +impl TryInto> for RollupBoostServer { type Error = RegisterMethodError; fn try_into(self) -> Result, Self::Error> { @@ -533,7 +505,7 @@ pub trait EngineApi { } #[async_trait] -impl EngineApiServer for RollupBoostServer { +impl EngineApiServer for RollupBoostServer { #[instrument( skip_all, err, @@ -891,9 +863,7 @@ pub mod tests { jwt_path: None, timeout: 2000, }; - let l2_rpc_client = l2_client_args - .new_rpc_client(PayloadSource::L2, None) - .unwrap(); + let l2_rpc_client = l2_client_args.new_rpc_client(PayloadSource::L2).unwrap(); let l2_http_client = l2_client_args.new_http_client(PayloadSource::L2).unwrap(); // Build builder clients @@ -905,7 +875,7 @@ pub mod tests { }; let builder_rpc_client = Arc::new( builder_client_args - .new_rpc_client(PayloadSource::Builder, None) + .new_rpc_client(PayloadSource::Builder) .unwrap(), ); let builder_http_client = builder_client_args @@ -920,7 +890,7 @@ pub mod tests { let rollup_boost = RollupBoostServer::new( l2_rpc_client, builder_rpc_client, - ExecutionMode::Enabled, + Arc::new(Mutex::new(ExecutionMode::Enabled)), None, probes.clone(), external_state_root, From fc0f983eaed9924d121fea37addaee4de050da42 Mon Sep 17 00:00:00 2001 From: Eric Woolsey Date: Thu, 18 Dec 2025 16:31:34 -0800 Subject: [PATCH 114/114] fix: extract lock --- crates/rollup-boost/src/client/rpc.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/rollup-boost/src/client/rpc.rs b/crates/rollup-boost/src/client/rpc.rs index 671c0a6b..d35fe3bc 100644 --- a/crates/rollup-boost/src/client/rpc.rs +++ b/crates/rollup-boost/src/client/rpc.rs @@ -481,7 +481,8 @@ impl EngineApiExt for FlasblocksP2PRpcClient { fork_choice_state: ForkchoiceState, payload_attributes: Option, ) -> ClientResult { - match (payload_attributes, *self.execution_mode.lock()) { + let execution_mode = *self.execution_mode.lock(); + match (payload_attributes, execution_mode) { // If we have payload attributes and execution mode is enabled, generate authorization // We don't want to the builder to publish flashblocks if rollup boost is not going to // honour the block.