diff --git a/Cargo.lock b/Cargo.lock index 6f487492..9586be98 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.25.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -70,7 +70,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.4", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -78,9 +78,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -114,9 +114,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.17" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6068f356948cd84b5ad9ac30c50478e433847f14a50714d2b68f15d052724049" +checksum = "ef8ff73a143281cb77c32006b04af9c047a6b8fe5860e85a88ad325328965355" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -129,9 +129,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3abecb92ba478a285fbf5689100dbafe4003ded4a09bf4b5ef62cca87cd4f79e" +checksum = "b9b151e38e42f1586a01369ec52a6934702731d07e8509a7307331b09f6c46dc" dependencies = [ "alloy-eips", "alloy-primitives", @@ -151,14 +151,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-consensus-any" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e864d4f11d1fb8d3ac2fd8f3a15f1ee46d55ec6d116b342ed1b2cb737f25894" +checksum = "6e2d5e8668ef6215efdb7dcca6f22277b4e483a5650e05f5de22b2350971f4b8" dependencies = [ "alloy-consensus", "alloy-eips", @@ -198,7 +198,7 @@ dependencies = [ "crc", "rand 0.8.5", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -227,14 +227,14 @@ dependencies = [ "rand 0.8.5", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-eips" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d9a64522a0db6ebcc4ff9c904e329e77dd737c2c25d30f1bdc32ca6c6ce334" +checksum = "e5434834adaf64fa20a6fb90877bc1d33214c41b055cc49f82189c98614368cc" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -252,14 +252,14 @@ dependencies = [ "serde", "serde_with", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-evm" -version = "0.21.3" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f1bfade4de9f464719b5aca30cf5bb02b9fda7036f0cf43addc3a0e66a0340c" +checksum = "06a5f67ee74999aa4fe576a83be1996bdf74a30fce3d248bf2007d6fc7dae8aa" dependencies = [ "alloy-consensus", "alloy-eips", @@ -274,14 +274,14 @@ dependencies = [ "op-alloy-rpc-types-engine", "op-revm", "revm", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-genesis" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675b163946b343ed2ddde4416114ad61fabc8b2a50d08423f38aa0ac2319e800" +checksum = "919a8471cfbed7bcd8cf1197a57dda583ce0e10c6385f6ff4e8b41304b223392" dependencies = [ "alloy-eips", "alloy-primitives", @@ -319,24 +319,24 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87b774478fcc616993e97659697f3e3c7988fdad598e46ee0ed11209cd0d8ee" +checksum = "d7c69f6c9c68a1287c9d5ff903d0010726934de0dac10989be37b75a29190d55" dependencies = [ "alloy-primitives", "alloy-sol-types", "http 1.3.1", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", ] [[package]] name = "alloy-network" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d6ed73d440bae8f27771b7cd507fa8f10f19ddf0b8f67e7622a52e0dbf798e" +checksum = "8eaf2ae05219e73e0979cb2cf55612aafbab191d130f203079805eaf881cca58" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -355,14 +355,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-network-primitives" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219dccd2cf753a43bd9b0fbb7771a16927ffdb56e43e3a15755bef1a74d614aa" +checksum = "e58f4f345cef483eab7374f2b6056973c7419ffe8ad35e994b7a7f5d8e0c7ba4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -384,9 +384,9 @@ dependencies = [ "const-hex", "derive_more", "foldhash 0.2.0", - "getrandom 0.3.4", + "getrandom 0.3.3", "hashbrown 0.16.0", - "indexmap 2.12.0", + "indexmap 2.11.1", "itoa", "k256", "keccak-asm", @@ -403,9 +403,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0ef8cbc2b68e2512acf04b2d296c05c98a661bc460462add6414528f4ff3d9b" +checksum = "de2597751539b1cc8fe4204e5325f9a9ed83fcacfb212018dfcfa7877e76de21" dependencies = [ "alloy-chains", "alloy-consensus", @@ -431,12 +431,12 @@ dependencies = [ "futures", "futures-utils-wasm", "lru 0.13.0", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "pin-project", "reqwest", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", "url", @@ -445,9 +445,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be028fb1c6c173f5765d0baa3580a11d69826ea89fe00ee5c9d7eddb2c3509cd" +checksum = "06e45a68423e732900a0c824b8e22237db461b79d2e472dd68b7547c16104427" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -455,7 +455,7 @@ dependencies = [ "auto_impl", "bimap", "futures", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "serde", "serde_json", "tokio", @@ -484,14 +484,14 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "alloy-rpc-client" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0f67d1e655ed93efca217213340d21cce982333cc44a1d918af9150952ef66" +checksum = "edf8eb8be597cfa8c312934d2566ec4516f066d69164f9212d7a148979fdcfd8" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -515,9 +515,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe106e50522980bc9e7cc9016f445531edf1a53e0fdba904c833b98c6fdff3f0" +checksum = "339af7336571dd39ae3a15bde08ae6a647e62f75350bd415832640268af92c06" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -528,9 +528,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b67bf1ed8cac6fde7dd017ca0a1c33be846e613a265956089f983af1354f13" +checksum = "19b33cdc0483d236cdfff763dae799ccef9646e94fb549a74f7adac6a7f7bb86" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -540,9 +540,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cf94d581b3aa13ebacb90ea52e0179985b7c20d8a522319e7d40768d56667a" +checksum = "83d98fb386a462e143f5efa64350860af39950c49e7c0cbdba419c16793116ef" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -552,9 +552,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "425e14ee32eb8b7edd6a2247fe0ed640785e6eba75af27db27f1e6220c15ef0d" +checksum = "fbde0801a32d21c5f111f037bee7e22874836fba7add34ed4a6919932dd7cf23" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -563,9 +563,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440655ffd9ff8724fa76a07c7dbe18cb4353617215c23e3921163516b6c07ff8" +checksum = "55c8d51ebb7c5fa8be8ea739a3933c5bfea08777d2d662b30b2109ac5ca71e6b" dependencies = [ "alloy-eips", "alloy-primitives", @@ -576,16 +576,16 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", "tree_hash", "tree_hash_derive", ] [[package]] name = "alloy-rpc-types-debug" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f69c12784cdf1059936249a6e705ec03bf8cea1a12181ed5cea9ca2be9cca684" +checksum = "388cf910e66bd4f309a81ef746dcf8f9bca2226e3577890a8d56c5839225cf46" dependencies = [ "alloy-primitives", "derive_more", @@ -595,9 +595,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabc17f0eac3f747eeddebc768c8e30763d6f6c53188f5335a935dedc57ddfbd" +checksum = "605ec375d91073851f566a3082548af69a28dca831b27a8be7c1b4c49f5c6ca2" dependencies = [ "alloy-consensus", "alloy-eips", @@ -616,9 +616,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0185f68a0f8391ab996d335a887087d7ccdbc97952efab3516f6307d456ba2cd" +checksum = "361cd87ead4ba7659bda8127902eda92d17fa7ceb18aba1676f7be10f7222487" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -633,14 +633,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-rpc-types-mev" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c89422163337ff64d9aaa13f3e4df53d60d789004044cd64ebc7dc4d5765a64" +checksum = "1397926d8d06a2531578bafc3e0ec78f97a02f0e6d1631c67d80d22af6a3af02" dependencies = [ "alloy-consensus", "alloy-eips", @@ -653,23 +653,23 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d31a6766c8f91d18d07a36b57f55efd981752df619d30b395a92332a8b28ea05" +checksum = "de4e95fb0572b97b17751d0fdf5cdc42b0050f9dd9459eddd1bf2e2fbfed0a33" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c208cbe2ea28368c3f61bd1e27b14238b7b03796e90370de3c0d8722e0f9830" +checksum = "cddde1bbd4feeb0d363ae7882af1e2e7955ef77c17f933f31402aad9343b57c5" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -679,9 +679,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "596cfa360922ba9af901cc7370c68640e4f72adb6df0ab064de32f21fec498d7" +checksum = "64600fc6c312b7e0ba76f73a381059af044f4f21f43e07f51f1fa76c868fe302" dependencies = [ "alloy-primitives", "arbitrary", @@ -691,9 +691,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f06333680d04370c8ed3a6b0eccff384e422c3d8e6b19e61fedc3a9f0ab7743" +checksum = "5772858492b26f780468ae693405f895d6a27dea6e3eab2c36b6217de47c2647" dependencies = [ "alloy-primitives", "async-trait", @@ -701,14 +701,14 @@ dependencies = [ "either", "elliptic-curve", "k256", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "alloy-signer-aws" -version = "1.0.42" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a59f1e68c38d447b5ebf8b53d91f7373e59be1de438e77bdb030ea6b2da529b" +checksum = "a46118173eb381b2911202a83dc4f39267027b0fe7d3533449f5e4ebc0eadcab" dependencies = [ "alloy-consensus", "alloy-network", @@ -719,15 +719,15 @@ dependencies = [ "aws-sdk-kms", "k256", "spki", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", ] [[package]] name = "alloy-signer-local" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590dcaeb290cdce23155e68af4791d093afc3754b1a331198a25d2d44c5456e8" +checksum = "f4195b803d0a992d8dbaab2ca1986fc86533d4bc80967c0cce7668b26ad99ef9" dependencies = [ "alloy-consensus", "alloy-network", @@ -738,7 +738,7 @@ dependencies = [ "coins-bip39", "k256", "rand 0.8.5", - "thiserror 2.0.17", + "thiserror 2.0.16", "zeroize", ] @@ -753,7 +753,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -765,11 +765,11 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.12.0", + "indexmap 2.11.1", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "syn-solidity", "tiny-keccak", ] @@ -786,7 +786,7 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "syn-solidity", ] @@ -814,20 +814,21 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55bbdcee53e4e3857b5ddbc2986ebe9c2ab5f352ec285cb0da04c1e8f2ca9c18" +checksum = "025a940182bddaeb594c26fe3728525ae262d0806fe6a4befdf5d7bc13d54bce" dependencies = [ "alloy-json-rpc", + "alloy-primitives", "auto_impl", "base64 0.22.1", "derive_more", "futures", "futures-utils-wasm", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tower", "tracing", @@ -837,9 +838,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793967215109b4a334047c810ed6db5e873ad3ea07f65cc02202bd4b810d9615" +checksum = "e3b5064d1e1e1aabc918b5954e7fb8154c39e77ec6903a581b973198b26628fa" dependencies = [ "alloy-json-rpc", "alloy-rpc-types-engine", @@ -858,9 +859,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e182e5ae0c4858bb87df23ebfe31018d7e51fe1a264b8a8a2b26932cb04861" +checksum = "d47962f3f1d9276646485458dc842b4e35675f42111c9d814ae4711c664c8300" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -878,9 +879,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e9dc891c80d6216003d4b04f0a7463015d0873d36e4ac2ec0bcc9196aa4ea7" +checksum = "9476a36a34e2fb51b6746d009c53d309a186a825aa95435407f0e07149f4ad2d" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -916,14 +917,15 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.42" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab54221eccefa254ce9f65b079c097b1796e48c21c7ce358230f8988d75392fb" +checksum = "f8e52276fdb553d3c11563afad2898f4085165e4093604afe3d78b69afbf408f" dependencies = [ + "alloy-primitives", "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -943,9 +945,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.21" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -958,9 +960,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" @@ -993,9 +995,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "approx" @@ -1017,7 +1019,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -1159,7 +1161,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -1197,7 +1199,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -1286,7 +1288,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -1342,9 +1344,9 @@ checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" [[package]] name = "async-compression" -version = "0.4.32" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" +checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" dependencies = [ "compression-codecs", "compression-core", @@ -1372,7 +1374,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -1383,7 +1385,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -1430,7 +1432,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -1441,9 +1443,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.10" +version = "1.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1856b1b48b65f71a4dd940b1c0931f9a7b646d4a924b9828ffefc1454714668a" +checksum = "8bc1b40fb26027769f16960d2f4a6bc20c4bb755d403e552c8c1a73af433c246" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1471,9 +1473,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.8" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" +checksum = "d025db5d9f52cbc413b167136afb3d8aeea708c0d8884783cf6253be5e22f6f2" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1506,9 +1508,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.13" +version = "1.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2402da1a5e16868ba98725e5d73f26b8116eaa892e56f2cd0bf5eec7985f70" +checksum = "c034a1bc1d70e16e7f4e4caf7e9f7693e4c9c24cd91cf17c2a0b21abaebc7c8b" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1530,9 +1532,9 @@ dependencies = [ [[package]] name = "aws-sdk-kms" -version = "1.92.0" +version = "1.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b4c5b673a7c76c831a707461eb9fdc880c54f47fa61ffe322fd8cfc59b3e4a" +checksum = "15e7ef7189e532a6d7654befd668b535d31f261c61342397da47ccfa3fb0505a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1552,9 +1554,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.88.0" +version = "1.83.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05b276777560aa9a196dbba2e3aada4d8006d3d7eeb3ba7fe0c317227d933c4" +checksum = "643cd43af212d2a1c4dedff6f044d7e1961e5d9e7cfe773d70f31d9842413886" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1574,9 +1576,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.90.0" +version = "1.84.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9be14d6d9cd761fac3fd234a0f47f7ed6c0df62d83c0eeb7012750e4732879b" +checksum = "20ec4a95bd48e0db7a424356a161f8d87bd6a4f0af37204775f0da03d9e39fc3" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1596,9 +1598,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.90.0" +version = "1.85.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98a862d704c817d865c8740b62d8bbeb5adcb30965e93b471df8a5bcefa20a80" +checksum = "410309ad0df4606bc721aff0d89c3407682845453247213a0ccc5ff8801ee107" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1619,9 +1621,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.6" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" +checksum = "084c34162187d39e3740cb635acd73c4e3a551a36146ad6fe8883c929c9f876c" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -1641,9 +1643,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.6" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" +checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" dependencies = [ "futures-util", "pin-project-lite", @@ -1652,16 +1654,15 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.5" +version = "0.62.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" +checksum = "7c4dacf2d38996cf729f55e7a762b30918229917eca115de45dfa8dfb97796c9" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "bytes-utils", "futures-core", - "futures-util", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -1673,9 +1674,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +checksum = "147e8eea63a40315d704b97bf9bc9b8c1402ae94f89d5ad6f7550d963309da1b" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1693,37 +1694,37 @@ dependencies = [ "pin-project-lite", "rustls 0.21.12", "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.2", "tower", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.61.7" +version = "0.61.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" +checksum = "eaa31b350998e703e9826b2104dd6f63be0508666e1aba88137af060e8944047" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.8" +version = "0.60.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" +checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" dependencies = [ "aws-smithy-types", "urlencoding", @@ -1731,9 +1732,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.4" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" +checksum = "d3946acbe1ead1301ba6862e712c7903ca9bb230bdf1fbd1b5ac54158ef2ab1f" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1755,9 +1756,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" +checksum = "07f5e0fc8a6b3f2303f331b94504bbf754d85488f402d6f1dd7a6080f99afe56" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -1772,9 +1773,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.4" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" +checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" dependencies = [ "base64-simd", "bytes", @@ -1798,18 +1799,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.12" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" +checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.10" +version = "1.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" +checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1870,9 +1871,9 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" [[package]] name = "backon" -version = "1.6.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" dependencies = [ "fastrand", "tokio", @@ -1880,9 +1881,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.76" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -1890,7 +1891,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link 0.2.1", + "windows-targets 0.52.6", ] [[package]] @@ -1905,16 +1906,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base256emoji" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" -dependencies = [ - "const-str", - "match-lookup", -] - [[package]] name = "base64" version = "0.21.7" @@ -1951,9 +1942,9 @@ checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bigdecimal" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560f42649de9fa436b73517378a147ec21f6c997a546581df4b4b31677828934" +checksum = "1a22f228ab7a1b23027ccc6c350b72868017af7ea8356fbdf19f8d991c690013" dependencies = [ "autocfg", "libm", @@ -1984,7 +1975,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools 0.12.1", @@ -1997,17 +1988,35 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.108", + "syn 2.0.106", "which", ] +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.9.4", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.106", +] + [[package]] name = "bindgen" version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools 0.13.0", @@ -2016,7 +2025,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -2025,16 +2034,18 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools 0.13.0", + "log", + "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -2076,11 +2087,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ - "serde_core", + "serde", ] [[package]] @@ -2125,9 +2136,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.16" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" dependencies = [ "cc", "glob", @@ -2141,11 +2152,11 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "boa_interner", "boa_macros", "boa_string", - "indexmap 2.12.0", + "indexmap 2.11.1", "num-bigint", "rustc-hash 2.1.1", ] @@ -2157,7 +2168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" dependencies = [ "arrayvec", - "bitflags 2.10.0", + "bitflags 2.9.4", "boa_ast", "boa_gc", "boa_interner", @@ -2171,7 +2182,7 @@ dependencies = [ "fast-float2", "hashbrown 0.15.5", "icu_normalizer 1.5.0", - "indexmap 2.12.0", + "indexmap 2.11.1", "intrusive-collections", "itertools 0.13.0", "num-bigint", @@ -2191,7 +2202,7 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror 2.0.17", + "thiserror 2.0.16", "time", ] @@ -2217,7 +2228,7 @@ dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.15.5", - "indexmap 2.12.0", + "indexmap 2.11.1", "once_cell", "phf", "rustc-hash 2.1.1", @@ -2232,7 +2243,7 @@ checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "synstructure", ] @@ -2242,7 +2253,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "boa_ast", "boa_interner", "boa_macros", @@ -2294,7 +2305,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -2379,22 +2390,22 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -2440,11 +2451,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.1" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" dependencies = [ - "serde_core", + "serde", ] [[package]] @@ -2464,7 +2475,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver 1.0.27", + "semver 1.0.26", "serde", "serde_json", ] @@ -2477,10 +2488,10 @@ checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" dependencies = [ "camino", "cargo-platform", - "semver 1.0.27", + "semver 1.0.26", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -2532,9 +2543,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -2553,7 +2564,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.1", + "windows-link 0.2.0", ] [[package]] @@ -2606,9 +2617,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.51" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -2616,9 +2627,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -2628,21 +2639,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "cmake" @@ -2655,11 +2666,12 @@ dependencies = [ [[package]] name = "codspeed" -version = "4.0.5" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe68fdd3fe25bc26de0230718d74eb150f09f70be3141c61ea7f9b00812054aa" +checksum = "b520a5f5816577235477565f6fac8e986f490cddfb20e9ecec9eeaed6b97e479" dependencies = [ "anyhow", + "bindgen 0.72.1", "cc", "colored", "glob", @@ -2673,9 +2685,9 @@ dependencies = [ [[package]] name = "codspeed-criterion-compat" -version = "4.0.5" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a06533c3c2c7b43b2efcca2dc0f228097b4c582c95f59cc187bbeb926b42cfb" +checksum = "44f068691ba0ff77f43f22565671f5203d836ebf9d5787d583c0763e7167eeac" dependencies = [ "clap", "codspeed", @@ -2688,9 +2700,9 @@ dependencies = [ [[package]] name = "codspeed-criterion-compat-walltime" -version = "4.0.5" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4102bd4dcfb09fae5cf5ca86c6c5ad0bd0cabe834cd84b5e7b7dd969fb9093e8" +checksum = "d1be3cac3cb256492c091dc6cf7b7f165689247dbf6f1d162b0730d30e7550c2" dependencies = [ "anes", "cast", @@ -2821,9 +2833,9 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.2.1" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" +checksum = "3f8e18d0dca9578507f13f9803add0df13362b02c501c1c17734f0dbb52eaf0b" dependencies = [ "crossterm 0.29.0", "unicode-segmentation", @@ -2846,9 +2858,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.31" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" dependencies = [ "brotli", "compression-core", @@ -2937,14 +2949,15 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.17.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +checksum = "dccd746bf9b1038c0507b7cec21eb2b11222db96a2902c96e8c185d6d20fb9c4" dependencies = [ "cfg-if", "cpufeatures", + "hex", "proptest", - "serde_core", + "serde", ] [[package]] @@ -2953,17 +2966,11 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const-str" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" - [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] @@ -3121,10 +3128,10 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "crossterm_winapi", "mio", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rustix 0.38.44", "signal-hook", "signal-hook-mio", @@ -3137,10 +3144,10 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "crossterm_winapi", "document-features", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rustix 1.1.2", "winapi", ] @@ -3216,7 +3223,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3250,7 +3257,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3265,7 +3272,7 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3276,7 +3283,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3287,7 +3294,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3300,7 +3307,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.12", + "parking_lot_core 0.9.11", ] [[package]] @@ -3314,7 +3321,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.12", + "parking_lot_core 0.9.11", ] [[package]] @@ -3340,7 +3347,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3373,12 +3380,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", - "serde_core", + "serde", ] [[package]] @@ -3400,7 +3407,7 @@ checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3411,7 +3418,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3432,7 +3439,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3442,7 +3449,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3463,7 +3470,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "unicode-xid", ] @@ -3522,7 +3529,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -3559,7 +3566,7 @@ dependencies = [ "lru 0.12.5", "more-asserts", "multiaddr", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rand 0.8.5", "smallvec", "socket2 0.5.10", @@ -3577,7 +3584,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3588,9 +3595,9 @@ checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" [[package]] name = "document-features" -version = "0.2.12" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" dependencies = [ "litrs", ] @@ -3662,7 +3669,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3746,27 +3753,27 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "enum-ordinalize" -version = "4.3.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.2" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3777,7 +3784,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3793,7 +3800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -3842,9 +3849,9 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.9.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dcddb2554d19cde19b099fadddde576929d7a4d0c1cd3512d1fd95cf174375c" +checksum = "9ca8ba45b63c389c6e115b095ca16381534fdcc03cf58176a3f8554db2dbe19b" dependencies = [ "alloy-primitives", "ethereum_serde_utils", @@ -3857,14 +3864,14 @@ dependencies = [ [[package]] name = "ethereum_ssz_derive" -version = "0.9.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a657b6b3b7e153637dc6bdc6566ad9279d9ee11a15b12cfb24a2e04360637e9f" +checksum = "0dd55d08012b4e0dfcc92b8d6081234df65f2986ad34cc76eeed69c5e2ce7506" dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -3974,9 +3981,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -4106,7 +4113,7 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.5", + "parking_lot 0.12.4", ] [[package]] @@ -4123,7 +4130,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -4172,11 +4179,25 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" +[[package]] +name = "generator" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.61.3", +] + [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "serde", "typenum", @@ -4193,21 +4214,21 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.4" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasip2", + "wasi 0.14.5+wasi-0.2.4", "wasm-bindgen", ] @@ -4223,9 +4244,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.32.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" @@ -4233,7 +4254,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "libc", "libgit2-sys", "log", @@ -4325,7 +4346,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.12.0", + "indexmap 2.11.1", "slab", "tokio", "tokio-util", @@ -4344,7 +4365,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.12.0", + "indexmap 2.11.1", "slab", "tokio", "tokio-util", @@ -4353,13 +4374,12 @@ dependencies = [ [[package]] name = "half" -version = "2.7.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", - "zerocopy", ] [[package]] @@ -4409,8 +4429,6 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ - "allocator-api2", - "equivalent", "foldhash 0.2.0", "serde", ] @@ -4469,6 +4487,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex-conservative" @@ -4498,7 +4519,7 @@ dependencies = [ "rand 0.9.2", "ring", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tinyvec", "tokio", "tracing", @@ -4517,12 +4538,12 @@ dependencies = [ "ipconfig", "moka", "once_cell", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rand 0.9.2", "resolv-conf", "serde", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -4547,11 +4568,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.12" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -4636,9 +4657,9 @@ checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" [[package]] name = "humantime" -version = "2.3.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "humantime-serde" @@ -4724,12 +4745,12 @@ dependencies = [ "hyper-util", "log", "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.2", "tower-service", - "webpki-roots 1.0.4", + "webpki-roots 1.0.2", ] [[package]] @@ -4763,9 +4784,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -4779,7 +4800,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.0", "system-configuration", "tokio", "tower-service", @@ -4789,9 +4810,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -4799,7 +4820,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core 0.61.2", ] [[package]] @@ -4825,28 +4846,28 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", "potential_utf", - "yoke 0.8.1", + "yoke 0.8.0", "zerofrom", - "zerovec 0.11.5", + "zerovec 0.11.4", ] [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", - "litemap 0.8.1", - "tinystr 0.8.2", - "writeable 0.6.2", - "zerovec 0.11.5", + "litemap 0.8.0", + "tinystr 0.8.1", + "writeable 0.6.1", + "zerovec 0.11.4", ] [[package]] @@ -4902,16 +4923,17 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ - "icu_collections 2.1.1", - "icu_normalizer_data 2.1.1", - "icu_properties 2.1.1", - "icu_provider 2.1.1", + "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.5", + "zerovec 0.11.4", ] [[package]] @@ -4922,9 +4944,9 @@ checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" @@ -4943,16 +4965,18 @@ dependencies = [ [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ - "icu_collections 2.1.1", + "displaydoc", + "icu_collections 2.0.0", "icu_locale_core", - "icu_properties_data 2.1.1", - "icu_provider 2.1.1", + "icu_properties_data 2.0.1", + "icu_provider 2.0.0", + "potential_utf", "zerotrie", - "zerovec 0.11.5", + "zerovec 0.11.4", ] [[package]] @@ -4963,9 +4987,9 @@ checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" @@ -4986,17 +5010,19 @@ dependencies = [ [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", "icu_locale_core", - "writeable 0.6.2", - "yoke 0.8.1", + "stable_deref_trait", + "tinystr 0.8.1", + "writeable 0.6.1", + "yoke 0.8.0", "zerofrom", "zerotrie", - "zerovec 0.11.5", + "zerovec 0.11.4", ] [[package]] @@ -5007,7 +5033,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -5033,8 +5059,8 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "icu_normalizer 2.1.1", - "icu_properties 2.1.1", + "icu_normalizer 2.0.0", + "icu_properties 2.0.1", ] [[package]] @@ -5064,7 +5090,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -5105,15 +5131,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.15.5", "serde", - "serde_core", ] [[package]] @@ -5131,22 +5156,19 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.7" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" [[package]] name = "inherent" -version = "1.0.13" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" +checksum = "6c38228f24186d9cc68c729accb4d413be9eaed6ad07ff79e0270d9e56f3de13" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -5155,7 +5177,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "inotify-sys", "libc", ] @@ -5189,7 +5211,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -5228,6 +5250,17 @@ dependencies = [ "memoffset", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -5258,20 +5291,20 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.17" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "is_terminal_polyfill" -version = "1.70.2" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -5343,15 +5376,15 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", @@ -5392,9 +5425,9 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.2", "tokio-util", "tracing", "url", @@ -5414,13 +5447,13 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "jsonrpsee-types", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "pin-project", "rand 0.9.2", "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tower", @@ -5445,7 +5478,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tower", "url", @@ -5461,7 +5494,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -5483,7 +5516,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -5500,7 +5533,7 @@ dependencies = [ "http 1.3.1", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -5615,9 +5648,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libgit2-sys" @@ -5633,12 +5666,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-link 0.2.1", + "windows-targets 0.53.3", ] [[package]] @@ -5661,31 +5694,31 @@ dependencies = [ "multihash", "quick-protobuf", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", "zeroize", ] [[package]] name = "libproc" -version = "0.14.11" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a54ad7278b8bc5301d5ffd2a94251c004feb971feba96c971ea4063645990757" +checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" dependencies = [ - "bindgen 0.72.1", + "bindgen 0.70.1", "errno", "libc", ] [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "libc", - "redox_syscall 0.5.18", + "redox_syscall 0.5.17", ] [[package]] @@ -5793,22 +5826,23 @@ checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "1.0.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" [[package]] name = "lock_api" -version = "0.4.14" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ + "autocfg", "scopeguard", "serde", ] @@ -5819,6 +5853,19 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[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.20", +] + [[package]] name = "lru" version = "0.12.5" @@ -5870,9 +5917,9 @@ checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" [[package]] name = "mach2" -version = "0.5.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" dependencies = [ "libc", ] @@ -5885,18 +5932,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", -] - -[[package]] -name = "match-lookup" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "syn 2.0.106", ] [[package]] @@ -5926,15 +5962,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.9" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" dependencies = [ "libc", ] @@ -5967,7 +6003,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -5977,7 +6013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd7399781913e5393588a8d8c6a2867bf85fb38eaf2502fdce465aad2dc6f034" dependencies = [ "base64 0.22.1", - "indexmap 2.12.0", + "indexmap 2.11.1", "metrics", "metrics-util", "quanta", @@ -5986,18 +6022,18 @@ dependencies = [ [[package]] name = "metrics-process" -version = "2.4.2" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f615e08e049bd14a44c4425415782efb9bcd479fc1e19ddeb971509074c060d0" +checksum = "4a82c8add4382f29a122fa64fff1891453ed0f6b2867d971e7d60cb8dfa322ff" dependencies = [ "libc", "libproc", "mach2", "metrics", "once_cell", - "procfs 0.18.0", + "procfs", "rlimit", - "windows 0.62.2", + "windows 0.58.0", ] [[package]] @@ -6060,19 +6096,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", - "simd-adler32", ] [[package]] name = "mio" -version = "1.1.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", - "wasi", - "windows-sys 0.61.2", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -6098,19 +6133,20 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.11" +version = "0.12.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" dependencies = [ "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "equivalent", - "parking_lot 0.12.5", + "loom", + "parking_lot 0.12.4", "portable-atomic", "rustc_version 0.4.1", "smallvec", "tagptr", + "thiserror 1.0.69", "uuid", ] @@ -6141,12 +6177,11 @@ dependencies = [ [[package]] name = "multibase" -version = "0.9.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" dependencies = [ "base-x", - "base256emoji", "data-encoding", "data-encoding-macro", ] @@ -6184,7 +6219,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -6206,7 +6241,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "fsevent-sys", "inotify", "kqueue", @@ -6235,11 +6270,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.50.3" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -6269,10 +6304,11 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c79c15c05d4bf82b6f5ef163104cc81a760d8e874d38ac50ab67c8877b647b" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" dependencies = [ + "byteorder", "lazy_static", "libm", "num-integer", @@ -6351,9 +6387,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", "rustversion", @@ -6361,14 +6397,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -6388,9 +6424,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "nybbles" -version = "0.4.6" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4b5ecbd0beec843101bffe848217f770e8b8da81d8355b7d6e226f2199b3dc" +checksum = "f0418987d1aaed324d95b4beffc93635e19be965ed5d63ec07a35980fe3b71a4" dependencies = [ "alloy-rlp", "arbitrary", @@ -6403,9 +6439,9 @@ dependencies = [ [[package]] name = "object" -version = "0.37.3" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -6422,9 +6458,9 @@ dependencies = [ [[package]] name = "once_cell_polyfill" -version = "1.70.2" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "oorandom" @@ -6447,7 +6483,7 @@ dependencies = [ "derive_more", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -6468,7 +6504,7 @@ dependencies = [ "op-alloy-consensus", "serde", "snap", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -6489,11 +6525,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.74" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -6510,7 +6546,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -6521,9 +6557,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.110" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -6567,7 +6603,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -6578,9 +6614,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "owo-colors" -version = "4.2.3" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" [[package]] name = "p256" @@ -6631,7 +6667,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -6653,12 +6689,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.5" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.12", + "parking_lot_core 0.9.11", ] [[package]] @@ -6677,15 +6713,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.12" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall 0.5.17", "smallvec", - "windows-link 0.2.1", + "windows-targets 0.52.6", ] [[package]] @@ -6706,12 +6742,12 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.6" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ "base64 0.22.1", - "serde_core", + "serde", ] [[package]] @@ -6731,11 +6767,12 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.3" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", + "thiserror 2.0.16", "ucd-trie", ] @@ -6789,7 +6826,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -6818,7 +6855,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -6923,11 +6960,11 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ - "zerovec 0.11.5", + "zerovec 0.11.4", ] [[package]] @@ -6962,7 +6999,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -6987,11 +7024,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.23.7", + "toml_edit", ] [[package]] @@ -7013,14 +7050,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -7033,7 +7070,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "version_check", "yansi", ] @@ -7044,55 +7081,35 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "chrono", "flate2", "hex", - "procfs-core 0.17.0", + "procfs-core", "rustix 0.38.44", ] -[[package]] -name = "procfs" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" -dependencies = [ - "bitflags 2.10.0", - "procfs-core 0.18.0", - "rustix 1.1.2", -] - [[package]] name = "procfs-core" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "chrono", "hex", ] -[[package]] -name = "procfs-core" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" -dependencies = [ - "bitflags 2.10.0", - "hex", -] - [[package]] name = "proptest" -version = "1.9.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.9.4", + "lazy_static", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -7121,7 +7138,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -7132,7 +7149,7 @@ checksum = "095a99f75c69734802359b682be8daaf8980296731f6470434ea2c652af1dd30" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -7155,7 +7172,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -7193,7 +7210,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "memchr", "unicase", ] @@ -7208,7 +7225,7 @@ dependencies = [ "libc", "once_cell", "raw-cpuid", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "web-sys", "winapi", ] @@ -7241,8 +7258,8 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls 0.23.31", - "socket2 0.6.1", - "thiserror 2.0.17", + "socket2 0.6.0", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -7255,7 +7272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.3.3", "lru-slab", "rand 0.9.2", "ring", @@ -7263,7 +7280,7 @@ dependencies = [ "rustls 0.23.31", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -7278,16 +7295,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.0", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -7362,7 +7379,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.3.3", "serde", ] @@ -7390,7 +7407,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "cassowary", "compact_str", "crossterm 0.28.1", @@ -7411,7 +7428,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", ] [[package]] @@ -7451,11 +7468,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", ] [[package]] @@ -7477,34 +7494,34 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -7514,9 +7531,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -7525,23 +7542,23 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "regress" -version = "0.10.5" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2057b2325e68a893284d1538021ab90279adac1139957ca2a74426c6f118fb48" +checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" dependencies = [ - "hashbrown 0.16.0", + "hashbrown 0.15.5", "memchr", ] @@ -7556,9 +7573,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", @@ -7582,7 +7599,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls-native-certs 0.8.1", "rustls-pki-types", "serde", "serde_json", @@ -7590,7 +7607,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.2", "tokio-util", "tower", "tower-http", @@ -7600,7 +7617,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.4", + "webpki-roots 1.0.2", ] [[package]] @@ -7642,14 +7659,14 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "reth-basic-payload-builder" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7673,7 +7690,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7682,7 +7699,7 @@ dependencies = [ "alloy-signer-local", "derive_more", "metrics", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "pin-project", "rand 0.9.2", "reth-chainspec", @@ -7704,7 +7721,7 @@ dependencies = [ [[package]] name = "reth-chainspec" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7724,7 +7741,7 @@ dependencies = [ [[package]] name = "reth-cli" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-genesis", "clap", @@ -7738,7 +7755,7 @@ dependencies = [ [[package]] name = "reth-cli-commands" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7813,7 +7830,7 @@ dependencies = [ [[package]] name = "reth-cli-runner" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "reth-tasks", "tokio", @@ -7823,7 +7840,7 @@ dependencies = [ [[package]] name = "reth-cli-util" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7834,13 +7851,13 @@ dependencies = [ "reth-fs-util", "secp256k1 0.30.0", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-codecs" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7860,17 +7877,17 @@ dependencies = [ [[package]] name = "reth-codecs-derive" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "reth-config" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "eyre", "humantime-serde", @@ -7885,20 +7902,20 @@ dependencies = [ [[package]] name = "reth-consensus" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", "reth-execution-types", "reth-primitives-traits", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-consensus-common" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7910,7 +7927,7 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7936,14 +7953,14 @@ dependencies = [ [[package]] name = "reth-db" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "derive_more", "eyre", "metrics", "page_size", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-db-api", "reth-fs-util", "reth-libmdbx", @@ -7956,13 +7973,13 @@ dependencies = [ "strum 0.27.2", "sysinfo", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-db-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7991,7 +8008,7 @@ dependencies = [ [[package]] name = "reth-db-common" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -8014,14 +8031,14 @@ dependencies = [ "reth-trie-db", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-db-models" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8036,7 +8053,7 @@ dependencies = [ [[package]] name = "reth-discv4" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8044,7 +8061,7 @@ dependencies = [ "enr", "generic-array", "itertools 0.14.0", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rand 0.8.5", "reth-ethereum-forks", "reth-net-banlist", @@ -8053,7 +8070,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -8062,7 +8079,7 @@ dependencies = [ [[package]] name = "reth-discv5" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8078,7 +8095,7 @@ dependencies = [ "reth-metrics", "reth-network-peers", "secp256k1 0.30.0", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -8086,14 +8103,14 @@ dependencies = [ [[package]] name = "reth-dns-discovery" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "data-encoding", "enr", "hickory-resolver", "linked_hash_set", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-ethereum-forks", "reth-network-peers", "reth-tokio-util", @@ -8101,7 +8118,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -8110,7 +8127,7 @@ dependencies = [ [[package]] name = "reth-downloaders" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8135,7 +8152,7 @@ dependencies = [ "reth-tasks", "reth-testing-utils", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8145,7 +8162,7 @@ dependencies = [ [[package]] name = "reth-e2e-test-utils" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8203,7 +8220,7 @@ dependencies = [ [[package]] name = "reth-ecies" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "aes", "alloy-primitives", @@ -8223,7 +8240,7 @@ dependencies = [ "secp256k1 0.30.0", "sha2 0.10.9", "sha3", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8234,7 +8251,7 @@ dependencies = [ [[package]] name = "reth-engine-local" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8257,7 +8274,7 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8275,14 +8292,14 @@ dependencies = [ "reth-primitives-traits", "reth-trie-common", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", ] [[package]] name = "reth-engine-service" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "futures", "pin-project", @@ -8304,7 +8321,7 @@ dependencies = [ [[package]] name = "reth-engine-tree" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8317,7 +8334,7 @@ dependencies = [ "futures", "metrics", "mini-moka", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rayon", "reth-chain-state", "reth-chainspec", @@ -8351,7 +8368,7 @@ dependencies = [ "revm-primitives", "schnellru", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -8359,7 +8376,7 @@ dependencies = [ [[package]] name = "reth-engine-util" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -8387,7 +8404,7 @@ dependencies = [ [[package]] name = "reth-era" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8397,13 +8414,13 @@ dependencies = [ "ethereum_ssz_derive", "reth-ethereum-primitives", "snap", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-era-downloader" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "bytes", @@ -8418,7 +8435,7 @@ dependencies = [ [[package]] name = "reth-era-utils" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8440,18 +8457,18 @@ dependencies = [ [[package]] name = "reth-errors" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "reth-consensus", "reth-execution-errors", "reth-storage-errors", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-eth-wire" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-chains", "alloy-primitives", @@ -8469,7 +8486,7 @@ dependencies = [ "reth-primitives-traits", "serde", "snap", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8479,7 +8496,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8494,13 +8511,13 @@ dependencies = [ "reth-ethereum-primitives", "reth-primitives-traits", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-ethereum-consensus" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8516,7 +8533,7 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8528,13 +8545,13 @@ dependencies = [ "reth-primitives-traits", "serde", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-ethereum-forks" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8548,7 +8565,7 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8577,7 +8594,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8597,7 +8614,7 @@ dependencies = [ [[package]] name = "reth-etl" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "rayon", "reth-db-api", @@ -8607,7 +8624,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8631,7 +8648,7 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8651,20 +8668,20 @@ dependencies = [ [[package]] name = "reth-execution-errors" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-evm", "alloy-primitives", "alloy-rlp", "nybbles", "reth-storage-errors", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-execution-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8682,7 +8699,7 @@ dependencies = [ [[package]] name = "reth-exex" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8691,7 +8708,7 @@ dependencies = [ "futures", "itertools 0.14.0", "metrics", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-chain-state", "reth-chainspec", "reth-config", @@ -8711,7 +8728,7 @@ dependencies = [ "reth-tasks", "reth-tracing", "rmp-serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-util", "tracing", @@ -8720,7 +8737,7 @@ dependencies = [ [[package]] name = "reth-exex-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8734,17 +8751,17 @@ dependencies = [ [[package]] name = "reth-fs-util" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-invalid-block-hooks" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8771,7 +8788,7 @@ dependencies = [ [[package]] name = "reth-ipc" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "bytes", "futures", @@ -8780,7 +8797,7 @@ dependencies = [ "jsonrpsee", "pin-project", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8791,23 +8808,23 @@ dependencies = [ [[package]] name = "reth-libmdbx" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "byteorder", "dashmap 6.1.0", "derive_more", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-mdbx-sys", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-mdbx-sys" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "bindgen 0.71.1", "cc", @@ -8816,7 +8833,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "futures", "metrics", @@ -8828,7 +8845,7 @@ dependencies = [ [[package]] name = "reth-net-banlist" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", ] @@ -8836,13 +8853,13 @@ dependencies = [ [[package]] name = "reth-net-nat" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "futures-util", "if-addrs", "reqwest", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -8850,7 +8867,7 @@ dependencies = [ [[package]] name = "reth-network" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8865,7 +8882,7 @@ dependencies = [ "futures", "itertools 0.14.0", "metrics", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "pin-project", "rand 0.8.5", "reth-chainspec", @@ -8895,7 +8912,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8905,7 +8922,7 @@ dependencies = [ [[package]] name = "reth-network-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8923,7 +8940,7 @@ dependencies = [ "reth-primitives-traits", "reth-tokio-util", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", ] @@ -8931,7 +8948,7 @@ dependencies = [ [[package]] name = "reth-network-p2p" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8939,7 +8956,7 @@ dependencies = [ "auto_impl", "derive_more", "futures", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-consensus", "reth-eth-wire-types", "reth-ethereum-primitives", @@ -8954,14 +8971,14 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-rlp", "enr", "secp256k1 0.30.0", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "url", ] @@ -8969,7 +8986,7 @@ dependencies = [ [[package]] name = "reth-network-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8983,7 +9000,7 @@ dependencies = [ [[package]] name = "reth-nippy-jar" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "anyhow", "bincode", @@ -8992,7 +9009,7 @@ dependencies = [ "memmap2", "reth-fs-util", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", "zstd", ] @@ -9000,7 +9017,7 @@ dependencies = [ [[package]] name = "reth-node-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -9024,7 +9041,7 @@ dependencies = [ [[package]] name = "reth-node-builder" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9092,7 +9109,7 @@ dependencies = [ [[package]] name = "reth-node-core" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9133,7 +9150,7 @@ dependencies = [ "serde", "shellexpand", "strum 0.27.2", - "thiserror 2.0.17", + "thiserror 2.0.16", "toml", "tracing", "url", @@ -9144,7 +9161,7 @@ dependencies = [ [[package]] name = "reth-node-ethereum" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-network", @@ -9182,7 +9199,7 @@ dependencies = [ [[package]] name = "reth-node-ethstats" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9195,7 +9212,7 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-tungstenite", @@ -9206,7 +9223,7 @@ dependencies = [ [[package]] name = "reth-node-events" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9230,7 +9247,7 @@ dependencies = [ [[package]] name = "reth-node-metrics" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "eyre", "http 1.3.1", @@ -9239,7 +9256,7 @@ dependencies = [ "metrics-exporter-prometheus", "metrics-process", "metrics-util", - "procfs 0.17.0", + "procfs", "reth-metrics", "reth-tasks", "tokio", @@ -9250,7 +9267,7 @@ dependencies = [ [[package]] name = "reth-node-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "reth-chainspec", "reth-db-api", @@ -9262,7 +9279,7 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9281,7 +9298,7 @@ dependencies = [ [[package]] name = "reth-payload-builder" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9302,7 +9319,7 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "pin-project", "reth-payload-primitives", @@ -9314,7 +9331,7 @@ dependencies = [ [[package]] name = "reth-payload-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9328,14 +9345,14 @@ dependencies = [ "reth-primitives-traits", "scroll-alloy-rpc-types-engine", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", ] [[package]] name = "reth-payload-util" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9345,7 +9362,7 @@ dependencies = [ [[package]] name = "reth-payload-validator" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9355,7 +9372,7 @@ dependencies = [ [[package]] name = "reth-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "c-kzg", @@ -9369,7 +9386,7 @@ dependencies = [ [[package]] name = "reth-primitives-traits" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9397,13 +9414,13 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-provider" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9414,7 +9431,7 @@ dependencies = [ "itertools 0.14.0", "metrics", "notify", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rayon", "reth-chain-state", "reth-chainspec", @@ -9448,7 +9465,7 @@ dependencies = [ [[package]] name = "reth-prune" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9468,7 +9485,7 @@ dependencies = [ "reth-static-file-types", "reth-tokio-util", "rustc-hash 2.1.1", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9476,7 +9493,7 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "arbitrary", @@ -9484,13 +9501,13 @@ dependencies = [ "modular-bitfield", "reth-codecs", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-revm" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9503,7 +9520,7 @@ dependencies = [ [[package]] name = "reth-rpc" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9537,7 +9554,7 @@ dependencies = [ "jsonrpsee", "jsonrpsee-types", "jsonwebtoken", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "pin-project", "reth-chain-state", "reth-chainspec", @@ -9572,7 +9589,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tower", @@ -9583,7 +9600,7 @@ dependencies = [ [[package]] name = "reth-rpc-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-genesis", @@ -9611,7 +9628,7 @@ dependencies = [ [[package]] name = "reth-rpc-builder" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-network", "alloy-provider", @@ -9639,7 +9656,7 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-util", "tower", @@ -9650,7 +9667,7 @@ dependencies = [ [[package]] name = "reth-rpc-convert" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-json-rpc", @@ -9671,13 +9688,13 @@ dependencies = [ "scroll-alloy-consensus", "scroll-alloy-evm", "scroll-alloy-rpc-types", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-rpc-engine-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9686,7 +9703,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "metrics", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-chainspec", "reth-engine-primitives", "reth-metrics", @@ -9699,7 +9716,7 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9707,7 +9724,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9726,7 +9743,7 @@ dependencies = [ "futures", "jsonrpsee", "jsonrpsee-types", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-chain-state", "reth-chainspec", "reth-errors", @@ -9752,7 +9769,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9790,7 +9807,7 @@ dependencies = [ "revm-inspectors", "schnellru", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -9799,7 +9816,7 @@ dependencies = [ [[package]] name = "reth-rpc-layer" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-rpc-types-engine", "http 1.3.1", @@ -9813,7 +9830,7 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9829,7 +9846,7 @@ dependencies = [ [[package]] name = "reth-scroll-chainspec" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-chains", "alloy-consensus", @@ -9854,7 +9871,7 @@ dependencies = [ [[package]] name = "reth-scroll-cli" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "clap", "eyre", @@ -9878,7 +9895,7 @@ dependencies = [ [[package]] name = "reth-scroll-consensus" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9891,14 +9908,14 @@ dependencies = [ "reth-scroll-primitives", "scroll-alloy-consensus", "scroll-alloy-hardforks", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-scroll-engine-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9923,7 +9940,7 @@ dependencies = [ [[package]] name = "reth-scroll-evm" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9946,14 +9963,14 @@ dependencies = [ "scroll-alloy-consensus", "scroll-alloy-evm", "scroll-alloy-hardforks", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-scroll-forks" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-chains", "alloy-primitives", @@ -9967,7 +9984,7 @@ dependencies = [ [[package]] name = "reth-scroll-node" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -10019,7 +10036,7 @@ dependencies = [ [[package]] name = "reth-scroll-payload" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10043,14 +10060,14 @@ dependencies = [ "reth-transaction-pool", "revm", "scroll-alloy-hardforks", - "thiserror 2.0.17", + "thiserror 2.0.16", "tracing", ] [[package]] name = "reth-scroll-primitives" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10070,7 +10087,7 @@ dependencies = [ [[package]] name = "reth-scroll-rpc" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10103,7 +10120,7 @@ dependencies = [ "scroll-alloy-hardforks", "scroll-alloy-network", "scroll-alloy-rpc-types", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10111,14 +10128,14 @@ dependencies = [ [[package]] name = "reth-scroll-txpool" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "c-kzg", "derive_more", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-chainspec", "reth-primitives-traits", "reth-revm", @@ -10136,7 +10153,7 @@ dependencies = [ [[package]] name = "reth-stages" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10176,7 +10193,7 @@ dependencies = [ "reth-trie", "reth-trie-db", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10184,7 +10201,7 @@ dependencies = [ [[package]] name = "reth-stages-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -10203,7 +10220,7 @@ dependencies = [ "reth-static-file", "reth-static-file-types", "reth-tokio-util", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10211,7 +10228,7 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "arbitrary", @@ -10225,10 +10242,10 @@ dependencies = [ [[package]] name = "reth-static-file" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rayon", "reth-codecs", "reth-db-api", @@ -10245,7 +10262,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "clap", @@ -10257,7 +10274,7 @@ dependencies = [ [[package]] name = "reth-storage-api" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10280,7 +10297,7 @@ dependencies = [ [[package]] name = "reth-storage-errors" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-eips", "alloy-primitives", @@ -10290,13 +10307,13 @@ dependencies = [ "reth-prune-types", "reth-static-file-types", "revm-database-interface", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "reth-tasks" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "auto_impl", "dyn-clone", @@ -10305,7 +10322,7 @@ dependencies = [ "pin-project", "rayon", "reth-metrics", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", "tracing-futures", @@ -10314,7 +10331,7 @@ dependencies = [ [[package]] name = "reth-testing-utils" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10330,7 +10347,7 @@ dependencies = [ [[package]] name = "reth-tokio-util" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "tokio", "tokio-stream", @@ -10340,7 +10357,7 @@ dependencies = [ [[package]] name = "reth-tracing" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "clap", "eyre", @@ -10355,7 +10372,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10363,10 +10380,10 @@ dependencies = [ "alloy-rlp", "aquamarine", "auto_impl", - "bitflags 2.10.0", + "bitflags 2.9.4", "futures-util", "metrics", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "paste", "pin-project", "rand 0.9.2", @@ -10387,7 +10404,7 @@ dependencies = [ "serde", "serde_json", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -10396,7 +10413,7 @@ dependencies = [ [[package]] name = "reth-trie" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -10421,7 +10438,7 @@ dependencies = [ [[package]] name = "reth-trie-common" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -10446,7 +10463,7 @@ dependencies = [ [[package]] name = "reth-trie-db" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "reth-db-api", @@ -10459,7 +10476,7 @@ dependencies = [ [[package]] name = "reth-trie-parallel" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10477,7 +10494,7 @@ dependencies = [ "reth-trie-common", "reth-trie-db", "reth-trie-sparse", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10485,7 +10502,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10504,7 +10521,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse-parallel" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -10522,7 +10539,7 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "zstd", ] @@ -10673,7 +10690,7 @@ dependencies = [ "revm", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -10726,7 +10743,7 @@ dependencies = [ [[package]] name = "revm-scroll" version = "0.1.0" -source = "git+https://github.com/scroll-tech/scroll-revm#d6b77e226ce20646d0ddf3dfe3b1fb3ec8a58cc3" +source = "git+https://github.com/scroll-tech/scroll-revm#f5ae93d909f185461af8d0263b2549081e9781c8" dependencies = [ "auto_impl", "enumn", @@ -10742,7 +10759,7 @@ name = "revm-state" version = "7.0.5" source = "git+https://github.com/scroll-tech/revm#51f65cca104d85ea41125e88d58ece665d1f43c1" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "revm-bytecode", "revm-primitives", "serde", @@ -10921,6 +10938,7 @@ dependencies = [ "reth-rpc-api", "reth-rpc-eth-api", "reth-rpc-eth-types", + "reth-rpc-layer", "reth-rpc-server-types", "reth-scroll-chainspec", "reth-scroll-cli", @@ -10977,7 +10995,7 @@ dependencies = [ "futures", "metrics", "metrics-derive", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "rand 0.9.2", "reqwest", "reth-chainspec", @@ -11011,7 +11029,7 @@ dependencies = [ "serde", "serde_json", "strum 0.27.2", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -11062,7 +11080,7 @@ dependencies = [ "scroll-alloy-rpc-types-engine", "scroll-db", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -11101,7 +11119,7 @@ dependencies = [ "scroll-db", "scroll-engine", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -11119,7 +11137,7 @@ dependencies = [ "reth-scroll-primitives", "reth-tracing", "rollup-node-primitives", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -11151,7 +11169,7 @@ dependencies = [ "rollup-node-providers", "scroll-alloy-consensus", "scroll-l1", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -11231,9 +11249,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rust_decimal" -version = "1.39.0" +version = "1.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" +checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" dependencies = [ "arrayvec", "borsh", @@ -11287,7 +11305,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.27", + "semver 1.0.26", ] [[package]] @@ -11296,7 +11314,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.4.15", @@ -11309,11 +11327,11 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -11358,14 +11376,14 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.1", + "security-framework 3.4.0", ] [[package]] @@ -11379,9 +11397,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", "zeroize", @@ -11399,10 +11417,10 @@ dependencies = [ "log", "once_cell", "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls-native-certs 0.8.1", "rustls-platform-verifier-android", "rustls-webpki 0.103.4", - "security-framework 3.5.1", + "security-framework 3.4.0", "security-framework-sys", "webpki-root-certs 0.26.11", "windows-sys 0.59.0", @@ -11444,9 +11462,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" dependencies = [ "fnv", "quick-error", @@ -11481,7 +11499,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -11498,9 +11516,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.5" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1317c3bf3e7df961da95b0a56a172a02abead31276215a0497241a7624b487ce" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" dependencies = [ "dyn-clone", "ref-cast", @@ -11519,6 +11537,12 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -11528,7 +11552,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scroll-alloy-consensus" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11547,7 +11571,7 @@ dependencies = [ [[package]] name = "scroll-alloy-evm" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11565,7 +11589,7 @@ dependencies = [ [[package]] name = "scroll-alloy-hardforks" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-hardforks", "auto_impl", @@ -11575,7 +11599,7 @@ dependencies = [ [[package]] name = "scroll-alloy-network" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-network", @@ -11590,7 +11614,7 @@ dependencies = [ [[package]] name = "scroll-alloy-provider" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-provider", @@ -11599,6 +11623,7 @@ dependencies = [ "alloy-transport", "alloy-transport-http", "async-trait", + "auto_impl", "derive_more", "eyre", "http-body-util", @@ -11608,14 +11633,14 @@ dependencies = [ "reth-scroll-engine-primitives", "scroll-alloy-network", "scroll-alloy-rpc-types-engine", - "thiserror 2.0.17", + "thiserror 2.0.16", "tower", ] [[package]] name = "scroll-alloy-rpc-types" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-consensus", "alloy-eips", @@ -11632,7 +11657,7 @@ dependencies = [ [[package]] name = "scroll-alloy-rpc-types-engine" version = "1.8.2" -source = "git+https://github.com/scroll-tech/reth.git#a0ffcb548edd85e6ce7c51e5579500aaee213350" +source = "git+https://github.com/scroll-tech/reth.git#0e4001e46de6de73f1ebd479a228f9159f8f3721" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -11654,7 +11679,7 @@ dependencies = [ "scroll-alloy-consensus", "scroll-l1", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "zstd", ] @@ -11679,7 +11704,7 @@ dependencies = [ "serde_json", "strum 0.27.2", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -11705,7 +11730,7 @@ dependencies = [ "scroll-codec", "scroll-db", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -11741,7 +11766,7 @@ dependencies = [ "scroll-alloy-provider", "scroll-alloy-rpc-types-engine", "serde", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -11756,7 +11781,7 @@ dependencies = [ "bitvec", "derive_more", "scroll-alloy-consensus", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -11784,7 +11809,7 @@ version = "0.0.1" dependencies = [ "alloy-primitives", "futures", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "reth-chainspec", "reth-eth-wire-types", "reth-network", @@ -11800,7 +11825,7 @@ dependencies = [ "rollup-node-primitives", "scroll-alloy-hardforks", "scroll-wire", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -11843,20 +11868,19 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "sea-orm" -version = "1.1.17" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "699b1ec145a6530c8f862eed7529d8a6068392e628d81cc70182934001e9c2a3" +checksum = "458d38dfa73e8ab64260f9fd96d61e1ca96a312d06e94b71615a417ef29efcac" dependencies = [ "async-stream", "async-trait", "bigdecimal", "chrono", - "derive_more", "futures-util", "log", "ouroboros", @@ -11869,7 +11893,7 @@ dependencies = [ "serde_json", "sqlx", "strum 0.26.3", - "thiserror 2.0.17", + "thiserror 2.0.16", "time", "tracing", "url", @@ -11878,9 +11902,9 @@ dependencies = [ [[package]] name = "sea-orm-cli" -version = "1.1.17" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cd31ebb07814d4c7b73796708bfab6c13d22f8db072cdb5115f967f4d5d2c" +checksum = "529b598e847338b7ff863a2abc8c693f515edd075f3f8e92f1b4aca2665f98dd" dependencies = [ "chrono", "clap", @@ -11889,7 +11913,6 @@ dependencies = [ "regex", "sea-schema", "sqlx", - "tokio", "tracing", "tracing-subscriber 0.3.20", "url", @@ -11897,23 +11920,23 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "1.1.17" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c964f4b7f34f53decf381bc88f03187b9355e07f356ce65544626e781a9585" +checksum = "af976292446b09dd51d7b1784d6195dec76844e9e9e980b5fb12634ef417d6ea" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", "sea-bae", - "syn 2.0.108", + "syn 2.0.106", "unicode-ident", ] [[package]] name = "sea-orm-migration" -version = "1.1.17" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977e3f71486b04371026d1ecd899f49cf437f832cd11d463f8948ee02e47ed9e" +checksum = "294321e37421a108ed040c349c543023f221e36f93c85411efc61e4a2266b811" dependencies = [ "async-trait", "clap", @@ -11968,8 +11991,8 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.108", - "thiserror 2.0.17", + "syn 2.0.106", + "thiserror 2.0.16", ] [[package]] @@ -11994,7 +12017,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -12065,7 +12088,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -12074,11 +12097,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.5.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -12106,12 +12129,11 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", - "serde_core", ] [[package]] @@ -12162,21 +12184,20 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.11.1", "itoa", "memchr", "ryu", "serde", - "serde_core", ] [[package]] @@ -12202,18 +12223,19 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.15.1" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.0", + "indexmap 2.11.1", "schemars 0.9.0", - "schemars 1.0.5", - "serde_core", + "schemars 1.0.4", + "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -12221,14 +12243,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.15.1" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ - "darling 0.21.3", + "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -12332,9 +12354,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", "mio", @@ -12360,12 +12382,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - [[package]] name = "simdutf8" version = "0.1.5" @@ -12380,7 +12396,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.17", + "thiserror 2.0.16", "time", ] @@ -12445,12 +12461,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -12527,7 +12543,7 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink 0.10.0", - "indexmap 2.12.0", + "indexmap 2.11.1", "log", "memchr", "native-tls", @@ -12538,7 +12554,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.16", "time", "tokio", "tokio-stream", @@ -12557,7 +12573,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -12580,7 +12596,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.108", + "syn 2.0.106", "tokio", "url", ] @@ -12594,7 +12610,7 @@ dependencies = [ "atoi", "base64 0.22.1", "bigdecimal", - "bitflags 2.10.0", + "bitflags 2.9.4", "byteorder", "bytes", "chrono", @@ -12625,7 +12641,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 2.0.16", "time", "tracing", "uuid", @@ -12641,7 +12657,7 @@ dependencies = [ "atoi", "base64 0.22.1", "bigdecimal", - "bitflags 2.10.0", + "bitflags 2.9.4", "byteorder", "chrono", "crc", @@ -12668,7 +12684,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 2.0.16", "time", "tracing", "uuid", @@ -12695,7 +12711,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.17", + "thiserror 2.0.16", "time", "tracing", "url", @@ -12704,9 +12720,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static_assertions" @@ -12769,7 +12785,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -12781,7 +12797,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -12803,9 +12819,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -12821,7 +12837,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -12841,7 +12857,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -12863,7 +12879,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.4", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -12903,15 +12919,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.3.3", "once_cell", "rustix 1.1.2", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -12953,11 +12969,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.16", ] [[package]] @@ -12968,18 +12984,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -13002,12 +13018,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "itoa", "js-sys", "libc", "num-conv", @@ -13055,12 +13070,12 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", - "zerovec 0.11.5", + "zerovec 0.11.4", ] [[package]] @@ -13090,31 +13105,34 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ + "backtrace", "bytes", + "io-uring", "libc", "mio", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "slab", + "socket2 0.6.0", "tokio-macros", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -13139,9 +13157,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls 0.23.31", "tokio", @@ -13168,19 +13186,19 @@ dependencies = [ "futures-util", "log", "rustls 0.23.31", - "rustls-native-certs 0.8.2", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.2", "tungstenite", "webpki-roots 0.26.11", ] [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -13199,8 +13217,8 @@ checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", + "toml_datetime", + "toml_edit", ] [[package]] @@ -13212,50 +13230,20 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_datetime" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" -dependencies = [ - "serde_core", -] - [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.12.0", + "indexmap 2.11.1", "serde", "serde_spanned", - "toml_datetime 0.6.11", + "toml_datetime", "toml_write", "winnow", ] -[[package]] -name = "toml_edit" -version = "0.23.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" -dependencies = [ - "indexmap 2.12.0", - "toml_datetime 0.7.3", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" -dependencies = [ - "winnow", -] - [[package]] name = "toml_write" version = "0.1.2" @@ -13281,7 +13269,7 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "socket2 0.6.1", + "socket2 0.6.0", "sync_wrapper", "tokio", "tokio-stream", @@ -13311,7 +13299,7 @@ dependencies = [ "futures-core", "futures-util", "hdrhistogram", - "indexmap 2.12.0", + "indexmap 2.11.1", "pin-project-lite", "slab", "sync_wrapper", @@ -13330,7 +13318,7 @@ checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "async-compression", "base64 0.22.1", - "bitflags 2.10.0", + "bitflags 2.9.4", "bytes", "futures-core", "futures-util", @@ -13397,7 +13385,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -13441,6 +13429,17 @@ dependencies = [ "tracing-subscriber 0.3.20", ] +[[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" @@ -13485,9 +13484,11 @@ dependencies = [ "serde", "serde_json", "sharded-slab", + "smallvec", "thread_local", "tracing", "tracing-core", + "tracing-log", "tracing-serde", ] @@ -13513,7 +13514,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -13528,9 +13529,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.15" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" [[package]] name = "try-lock" @@ -13553,15 +13554,15 @@ dependencies = [ "rustls 0.23.31", "rustls-pki-types", "sha1", - "thiserror 2.0.17", + "thiserror 2.0.16", "utf-8", ] [[package]] name = "typenum" -version = "1.19.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" @@ -13613,24 +13614,24 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" -version = "0.1.25" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-segmentation" @@ -13737,7 +13738,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.3.3", "js-sys", "serde", "wasm-bindgen", @@ -13810,7 +13811,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -13853,11 +13854,20 @@ 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.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.1+wasi-0.2.4" +version = "1.0.0+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" dependencies = [ "wit-bindgen", ] @@ -13870,9 +13880,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", @@ -13881,11 +13891,25 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" dependencies = [ "cfg-if", "js-sys", @@ -13896,9 +13920,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -13906,22 +13930,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ - "bumpalo", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", + "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ "unicode-ident", ] @@ -13962,7 +13986,7 @@ checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", - "parking_lot 0.12.5", + "parking_lot 0.12.4", "pin-utils", "slab", "wasm-bindgen", @@ -13970,9 +13994,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ "js-sys", "wasm-bindgen", @@ -13994,14 +14018,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.4", + "webpki-root-certs 1.0.2", ] [[package]] name = "webpki-root-certs" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" dependencies = [ "rustls-pki-types", ] @@ -14012,14 +14036,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.4", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -14048,9 +14072,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -14074,7 +14098,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -14095,23 +14119,34 @@ dependencies = [ [[package]] name = "windows" -version = "0.62.2" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +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.62.2", + "windows-core 0.61.2", "windows-future", + "windows-link 0.1.3", "windows-numerics", ] [[package]] name = "windows-collections" -version = "0.3.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core 0.62.2", + "windows-core 0.61.2", ] [[package]] @@ -14128,25 +14163,38 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.62.2" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", + "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 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] name = "windows-future" -version = "0.3.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", + "windows-core 0.61.2", + "windows-link 0.1.3", "windows-threading", ] @@ -14158,18 +14206,29 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "windows-implement" -version = "0.60.2" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -14180,18 +14239,29 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", +] + +[[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.106", ] [[package]] name = "windows-interface" -version = "0.59.3" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -14202,18 +14272,18 @@ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] name = "windows-numerics" -version = "0.3.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", + "windows-core 0.61.2", + "windows-link 0.1.3", ] [[package]] @@ -14238,38 +14308,39 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-link 0.1.3", + "windows-targets 0.52.6", ] [[package]] name = "windows-result" -version = "0.4.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link 0.2.1", + "windows-link 0.1.3", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-link 0.1.3", + "windows-result 0.2.0", + "windows-targets 0.52.6", ] [[package]] name = "windows-strings" -version = "0.5.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link 0.2.1", + "windows-link 0.1.3", ] [[package]] @@ -14314,16 +14385,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.5", + "windows-targets 0.53.3", ] [[package]] name = "windows-sys" -version = "0.61.2" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" dependencies = [ - "windows-link 0.2.1", + "windows-link 0.2.0", ] [[package]] @@ -14374,28 +14445,28 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.5" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows-link 0.1.3", + "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.2.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-link 0.2.1", + "windows-link 0.1.3", ] [[package]] @@ -14418,9 +14489,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" @@ -14442,9 +14513,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" @@ -14466,9 +14537,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" @@ -14478,9 +14549,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" @@ -14502,9 +14573,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" @@ -14526,9 +14597,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" @@ -14550,9 +14621,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" @@ -14574,9 +14645,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" @@ -14599,9 +14670,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" [[package]] name = "write16" @@ -14617,9 +14688,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "ws_stream_wasm" @@ -14634,7 +14705,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror 2.0.17", + "thiserror 2.0.16", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -14651,9 +14722,9 @@ dependencies = [ [[package]] name = "xattr" -version = "1.6.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", "rustix 1.1.2", @@ -14685,12 +14756,13 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ + "serde", "stable_deref_trait", - "yoke-derive 0.8.1", + "yoke-derive 0.8.0", "zerofrom", ] @@ -14702,19 +14774,19 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "synstructure", ] [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "synstructure", ] @@ -14735,7 +14807,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] @@ -14755,15 +14827,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -14776,17 +14848,17 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" dependencies = [ "displaydoc", - "yoke 0.8.1", + "yoke 0.8.0", "zerofrom", ] @@ -14803,13 +14875,13 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ - "yoke 0.8.1", + "yoke 0.8.0", "zerofrom", - "zerovec-derive 0.11.2", + "zerovec-derive 0.11.1", ] [[package]] @@ -14820,18 +14892,18 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.106", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e8f36425..fef581e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -169,6 +169,7 @@ reth-provider = { git = "https://github.com/scroll-tech/reth.git", default-featu reth-rpc-api = { git = "https://github.com/scroll-tech/reth.git", default-features = false } reth-rpc-eth-api = { git = "https://github.com/scroll-tech/reth.git", default-features = false } reth-rpc-eth-types = { git = "https://github.com/scroll-tech/reth.git", default-features = false } +reth-rpc-layer = { git = "https://github.com/scroll-tech/reth.git", default-features = false } reth-rpc-server-types = { git = "https://github.com/scroll-tech/reth.git", default-features = false } reth-storage-api = { git = "https://github.com/scroll-tech/reth.git", default-features = false } reth-tasks = { git = "https://github.com/scroll-tech/reth.git", default-features = false } diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 6f81447d..ddda6994 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -76,11 +76,16 @@ aws-config = "1.8.0" aws-sdk-kms = "1.76.0" # test-utils +alloy-eips = { workspace = true, optional = true } +alloy-rpc-types-eth = { workspace = true, optional = true } alloy-rpc-types-engine = { workspace = true, optional = true } reth-e2e-test-utils = { workspace = true, optional = true } reth-engine-local = { workspace = true, optional = true } reth-provider = { workspace = true, optional = true } +reth-rpc-layer = { workspace = true, optional = true } reth-rpc-server-types = { workspace = true, optional = true } +reth-storage-api = { workspace = true, optional = true } +reth-tokio-util = { workspace = true, optional = true } scroll-alloy-rpc-types-engine = { workspace = true, optional = true } scroll-alloy-rpc-types.workspace = true @@ -108,6 +113,7 @@ reth-e2e-test-utils.workspace = true reth-node-core.workspace = true reth-provider.workspace = true reth-primitives-traits.workspace = true +reth-rpc-layer.workspace = true reth-rpc-server-types.workspace = true reth-scroll-node = { workspace = true, features = ["test-utils"] } reth-storage-api.workspace = true @@ -140,10 +146,15 @@ test-utils = [ "rollup-node/test-utils", "reth-e2e-test-utils", "reth-rpc-server-types", + "reth-rpc-layer", + "reth-tokio-util", "scroll-alloy-rpc-types-engine", "alloy-rpc-types-engine", "reth-primitives-traits/test-utils", "reth-network-p2p/test-utils", "rollup-node-chain-orchestrator/test-utils", "scroll-network/test-utils", + "alloy-eips", + "reth-storage-api", + "alloy-rpc-types-eth", ] diff --git a/crates/node/src/test_utils/block_builder.rs b/crates/node/src/test_utils/block_builder.rs new file mode 100644 index 00000000..77d511a8 --- /dev/null +++ b/crates/node/src/test_utils/block_builder.rs @@ -0,0 +1,171 @@ +//! Block building helpers for test fixtures. + +use super::fixture::TestFixture; +use crate::test_utils::EventAssertions; + +use alloy_primitives::B256; +use reth_primitives_traits::transaction::TxHashRef; +use reth_scroll_primitives::ScrollBlock; +use scroll_alloy_consensus::ScrollTransaction; + +/// Builder for constructing and validating blocks in tests. +#[derive(Debug)] +pub struct BlockBuilder<'a> { + fixture: &'a mut TestFixture, + expected_tx_hashes: Vec, + expected_tx_count: Option, + expected_base_fee: Option, + expected_block_number: Option, + expect_l1_message: bool, + expected_l1_message_count: Option, +} + +impl<'a> BlockBuilder<'a> { + /// Create a new block builder. + pub(crate) fn new(fixture: &'a mut TestFixture) -> Self { + Self { + fixture, + expected_tx_hashes: Vec::new(), + expected_tx_count: None, + expected_block_number: None, + expected_base_fee: None, + expect_l1_message: false, + expected_l1_message_count: None, + } + } + + /// Expect a specific transaction to be included in the block. + pub fn expect_tx(mut self, tx_hash: B256) -> Self { + self.expected_tx_hashes.push(tx_hash); + self + } + + /// Expect a specific number of transactions in the block. + pub const fn expect_tx_count(mut self, count: usize) -> Self { + self.expected_tx_count = Some(count); + self + } + + /// Expect a specific block number. + pub const fn expect_block_number(mut self, number: u64) -> Self { + self.expected_block_number = Some(number); + self + } + + /// Expect at least one L1 message in the block. + pub const fn expect_l1_message(mut self) -> Self { + self.expect_l1_message = true; + self + } + + /// Expect a specific number of L1 messages in the block. + pub const fn expect_l1_message_count(mut self, count: usize) -> Self { + self.expected_l1_message_count = Some(count); + self + } + + /// Build the block and validate against expectations. + pub async fn await_block(self) -> eyre::Result { + let sequencer_node = &self.fixture.nodes[0]; + + // Get the sequencer from the rollup manager handle + let handle = &sequencer_node.rollup_manager_handle; + + // Trigger block building + handle.build_block(); + + // If extract the block number. + let expect = self.fixture.expect_event(); + let block = + if let Some(b) = self.expected_block_number { + expect.block_sequenced(b).await? + } else { + expect.extract(|e| { + if let rollup_node_chain_orchestrator::ChainOrchestratorEvent::BlockSequenced( + block, + ) = e + { + Some(block.clone()) + } else { + None + } + }).await? + }; + + // Finally validate the block. + self.validate_block(&block) + } + + /// Validate the block against expectations. + fn validate_block(self, block: &ScrollBlock) -> eyre::Result { + // Check transaction count + if let Some(expected_count) = self.expected_tx_count { + if block.body.transactions.len() != expected_count { + return Err(eyre::eyre!( + "Expected {} transactions, but block has {}", + expected_count, + block.body.transactions.len() + )); + } + } + + // Check block number + if let Some(expected_number) = self.expected_block_number { + if block.header.number != expected_number { + return Err(eyre::eyre!( + "Expected {} number, but block has {}", + expected_number, + block.header.number + )); + } + } + + // Check specific transaction hashes + for expected_hash in &self.expected_tx_hashes { + if !block.body.transactions.iter().any(|tx| tx.tx_hash() == expected_hash) { + return Err(eyre::eyre!( + "Expected transaction {:?} not found in block", + expected_hash + )); + } + } + + // Check base fee + if let Some(expected_base_fee) = self.expected_base_fee { + let actual_base_fee = block + .header + .base_fee_per_gas + .ok_or_else(|| eyre::eyre!("Block has no base fee"))?; + if actual_base_fee != expected_base_fee { + return Err(eyre::eyre!( + "Expected base fee {}, but block has {}", + expected_base_fee, + actual_base_fee + )); + } + } + + // Check L1 messages + if self.expect_l1_message { + let l1_message_count = + block.body.transactions.iter().filter(|tx| tx.queue_index().is_some()).count(); + if l1_message_count == 0 { + return Err(eyre::eyre!("Expected at least one L1 message, but block has none")); + } + } + + if let Some(expected_count) = self.expected_l1_message_count { + let l1_message_count = + block.body.transactions.iter().filter(|tx| tx.queue_index().is_some()).count(); + if l1_message_count != expected_count { + return Err(eyre::eyre!( + "Expected {} L1 messages, but block has {}", + expected_count, + l1_message_count + )); + } + } + + Ok(block.clone()) + } +} diff --git a/crates/node/src/test_utils/event_utils.rs b/crates/node/src/test_utils/event_utils.rs new file mode 100644 index 00000000..fb11afb1 --- /dev/null +++ b/crates/node/src/test_utils/event_utils.rs @@ -0,0 +1,442 @@ +//! Event handling and assertion utilities for test fixtures. + +use super::fixture::TestFixture; +use std::time::Duration; + +use futures::{FutureExt, StreamExt}; +use reth_scroll_primitives::ScrollBlock; +use rollup_node_chain_orchestrator::ChainOrchestratorEvent; +use rollup_node_primitives::ChainImport; +use tokio::time::timeout; + +/// Builder for waiting for specific events with optional assertions. +#[derive(Debug)] +pub struct EventWaiter<'a> { + fixture: &'a mut TestFixture, + node_index: usize, + timeout_duration: Duration, +} + +impl<'a> EventWaiter<'a> { + /// Create a new event waiter. + pub fn new(fixture: &'a mut TestFixture, node_index: usize) -> Self { + Self { fixture, node_index, timeout_duration: Duration::from_secs(30) } + } + + /// Set a custom timeout for waiting. + pub const fn timeout(mut self, duration: Duration) -> Self { + self.timeout_duration = duration; + self + } + + /// Wait for a block sequenced event. + pub async fn block_sequenced(self, target: u64) -> eyre::Result { + self.wait_for_event(|e| { + if let ChainOrchestratorEvent::BlockSequenced(block) = e { + (block.header.number == target).then(|| block.clone()) + } else { + None + } + }) + .await + } + + /// Wait for a chain consolidated event. + pub async fn chain_consolidated(self) -> eyre::Result<(u64, u64)> { + self.wait_for_event(|e| { + if let ChainOrchestratorEvent::ChainConsolidated { from, to } = e { + Some((*from, *to)) + } else { + None + } + }) + .await + } + + /// Wait for a chain extended event. + pub async fn chain_extended(self, target: u64) -> eyre::Result<()> { + self.wait_for_event(|e| { + matches!(e, ChainOrchestratorEvent::ChainExtended(ChainImport { chain, .. }) if chain.last().map(|b| b.header.number) >= Some(target)) + .then_some(()) + }) + .await + } + + /// Wait for a chain reorged event. + pub async fn chain_reorged(self) -> eyre::Result<()> { + self.wait_for_event(|e| matches!(e, ChainOrchestratorEvent::ChainReorged(_)).then_some(())) + .await + } + + /// Wait for an L1 synced event. + pub async fn l1_synced(self) -> eyre::Result<()> { + self.wait_for_event(|e| matches!(e, ChainOrchestratorEvent::L1Synced).then_some(())).await + } + + /// Wait for an optimistic sync event. + pub async fn optimistic_sync(self) -> eyre::Result<()> { + self.wait_for_event(|e| { + matches!(e, ChainOrchestratorEvent::OptimisticSync(_)).then_some(()) + }) + .await + } + + /// Wait for a new L1 block event. + pub async fn new_l1_block(self) -> eyre::Result { + self.wait_for_event(|e| { + if let ChainOrchestratorEvent::NewL1Block(block_number) = e { + Some(*block_number) + } else { + None + } + }) + .await + } + + /// Wait for an L1 message committed event. + pub async fn l1_message_committed(self) -> eyre::Result<()> { + self.wait_for_event(|e| { + matches!(e, ChainOrchestratorEvent::L1MessageCommitted(_)).then_some(()) + }) + .await + } + + /// Wait for an L1 reorg event. + pub async fn l1_reorg(self) -> eyre::Result<()> { + self.wait_for_event(|e| matches!(e, ChainOrchestratorEvent::L1Reorg { .. }).then_some(())) + .await + } + + /// Wait for a new block received event from the network. + pub async fn new_block_received(self) -> eyre::Result { + self.wait_for_event(|e| { + if let ChainOrchestratorEvent::NewBlockReceived(block_with_peer) = e { + Some(block_with_peer.block.clone()) + } else { + None + } + }) + .await + } + + /// Wait for any event where the predicate returns true. + pub async fn where_event( + self, + mut predicate: impl FnMut(&ChainOrchestratorEvent) -> bool, + ) -> eyre::Result { + self.wait_for_event(move |e| predicate(e).then(|| e.clone())).await + } + + /// Wait for any event and extract a value from it. + pub async fn extract( + self, + mut extractor: impl FnMut(&ChainOrchestratorEvent) -> Option, + ) -> eyre::Result { + self.wait_for_event(move |e| extractor(e)).await + } + + /// Wait for N events matching a predicate. + pub async fn where_event_n( + self, + count: usize, + mut predicate: impl FnMut(&ChainOrchestratorEvent) -> bool, + ) -> eyre::Result> { + let events = &mut self.fixture.nodes[self.node_index].chain_orchestrator_rx; + let mut matched_events = Vec::new(); + + let result = timeout(self.timeout_duration, async { + while let Some(event) = events.next().await { + if predicate(&event) { + matched_events.push(event.clone()); + if matched_events.len() >= count { + return Ok(matched_events.clone()); + } + } + } + Err(eyre::eyre!("Event stream ended before matching {} events", count)) + }) + .await; + + match result { + Ok(r) => r, + Err(_) => Err(eyre::eyre!( + "Timeout waiting for {} events (matched {} so far)", + count, + matched_events.len() + )), + } + } + + /// Internal helper to wait for a specific event. + async fn wait_for_event( + self, + mut extractor: impl FnMut(&ChainOrchestratorEvent) -> Option, + ) -> eyre::Result { + let events = &mut self.fixture.nodes[self.node_index].chain_orchestrator_rx; + + let result = timeout(self.timeout_duration, async { + while let Some(event) = events.next().await { + tracing::debug!(target: "event_waiter", ?event); + if let Some(value) = extractor(&event) { + return Ok(value); + } + } + Err(eyre::eyre!("Event stream ended without matching event")) + }) + .await; + + result.unwrap_or_else(|_| Err(eyre::eyre!("Timeout waiting for event"))) + } +} + +/// Builder for waiting for events on multiple nodes. +#[derive(Debug)] +pub struct MultiNodeEventWaiter<'a> { + fixture: &'a mut TestFixture, + node_indices: Vec, + timeout_duration: Duration, +} + +impl<'a> MultiNodeEventWaiter<'a> { + /// Create a new multi-node event waiter. + pub fn new(fixture: &'a mut TestFixture, node_indices: Vec) -> Self { + Self { fixture, node_indices, timeout_duration: Duration::from_secs(30) } + } + + /// Set a custom timeout for waiting. + pub const fn timeout(mut self, duration: Duration) -> Self { + self.timeout_duration = duration; + self + } + + /// Wait for block sequenced event on all specified nodes. + pub async fn block_sequenced(self) -> eyre::Result> { + self.wait_for_event_on_all(|e| { + if let ChainOrchestratorEvent::BlockSequenced(block) = e { + Some(block.clone()) + } else { + None + } + }) + .await + } + + /// Wait for chain consolidated event on all specified nodes. + pub async fn chain_consolidated(self) -> eyre::Result> { + self.wait_for_event_on_all(|e| { + if let ChainOrchestratorEvent::ChainConsolidated { from, to } = e { + Some((*from, *to)) + } else { + None + } + }) + .await + } + + /// Wait for chain extended event on all specified nodes. + pub async fn chain_extended(self, target: u64) -> eyre::Result<()> { + self.wait_for_event_on_all(|e| { + matches!(e, ChainOrchestratorEvent::ChainExtended(ChainImport{chain,..}) if chain.last().map(|b| b.header.number) >= Some(target)).then_some(()) + }) + .await?; + Ok(()) + } + + /// Wait for chain reorged event on all specified nodes. + pub async fn chain_reorged(self) -> eyre::Result<()> { + self.wait_for_event_on_all(|e| { + matches!(e, ChainOrchestratorEvent::ChainReorged(_)).then_some(()) + }) + .await?; + Ok(()) + } + + /// Wait for L1 synced event on all specified nodes. + pub async fn l1_synced(self) -> eyre::Result<()> { + self.wait_for_event_on_all(|e| matches!(e, ChainOrchestratorEvent::L1Synced).then_some(())) + .await?; + Ok(()) + } + + /// Wait for optimistic sync event on all specified nodes. + pub async fn optimistic_sync(self) -> eyre::Result<()> { + self.wait_for_event_on_all(|e| { + matches!(e, ChainOrchestratorEvent::OptimisticSync(_)).then_some(()) + }) + .await?; + Ok(()) + } + + /// Wait for new L1 block event on all specified nodes. + pub async fn new_l1_block(self) -> eyre::Result> { + self.wait_for_event_on_all(|e| { + if let ChainOrchestratorEvent::NewL1Block(block_number) = e { + Some(*block_number) + } else { + None + } + }) + .await + } + + /// Wait for L1 message committed event on all specified nodes. + pub async fn l1_message_committed(self) -> eyre::Result<()> { + self.wait_for_event_on_all(|e| { + matches!(e, ChainOrchestratorEvent::L1MessageCommitted(_)).then_some(()) + }) + .await?; + Ok(()) + } + + /// Wait for L1 reorg event to be received by all. + pub async fn l1_reorg(self) -> eyre::Result<()> { + self.wait_for_event_on_all(|e| { + matches!(e, ChainOrchestratorEvent::L1Reorg { .. }).then_some(()) + }) + .await?; + Ok(()) + } + + /// Wait for new block received event on all specified nodes. + pub async fn new_block_received(self) -> eyre::Result> { + self.wait_for_event_on_all(|e| { + if let ChainOrchestratorEvent::NewBlockReceived(block_with_peer) = e { + Some(block_with_peer.block.clone()) + } else { + None + } + }) + .await + } + + /// Wait for any event where the predicate returns true on all specified nodes. + pub async fn where_event( + self, + predicate: impl Fn(&ChainOrchestratorEvent) -> bool, + ) -> eyre::Result> { + self.wait_for_event_on_all(move |e| predicate(e).then(|| e.clone())).await + } + + /// Wait for any event and extract a value from it on all specified nodes. + pub async fn extract( + self, + extractor: impl Fn(&ChainOrchestratorEvent) -> Option, + ) -> eyre::Result> + where + T: Send + Clone + 'static, + { + self.wait_for_event_on_all(extractor).await + } + + /// Internal helper to wait for a specific event on all nodes. + async fn wait_for_event_on_all( + self, + extractor: impl Fn(&ChainOrchestratorEvent) -> Option, + ) -> eyre::Result> + where + T: Send + Clone + 'static, + { + let timeout_duration = self.timeout_duration; + let node_indices = self.node_indices; + let node_count = node_indices.len(); + + // Track which nodes have found their event + let mut results: Vec> = vec![None; node_count]; + let mut completed = 0; + + let result = timeout(timeout_duration, async { + loop { + // Poll each node's event stream + for (idx, &node_index) in node_indices.iter().enumerate() { + // Skip nodes that already found their event + if results[idx].is_some() { + continue; + } + + let events = &mut self.fixture.nodes[node_index].chain_orchestrator_rx; + + // Try to get the next event (non-blocking with try_next) + if let Some(event) = events.next().now_or_never() { + match event { + Some(event) => { + if let Some(value) = extractor(&event) { + results[idx] = Some(value); + completed += 1; + + if completed == node_count { + // All nodes have found their events + return Ok(results + .into_iter() + .map(|r| r.unwrap()) + .collect::>()); + } + } + } + None => { + return Err(eyre::eyre!( + "Event stream ended without matching event on node {}", + node_index + )); + } + } + } + } + + // Small delay to avoid busy waiting + tokio::time::sleep(tokio::time::Duration::from_millis(10)).await; + } + }) + .await; + + result.unwrap_or_else(|_| { + Err(eyre::eyre!( + "Timeout waiting for event on {} nodes (completed {}/{})", + node_count, + completed, + node_count + )) + }) + } +} + +/// Extension trait for `TestFixture` to add event waiting capabilities. +pub trait EventAssertions { + /// Wait for an event on the sequencer node. + fn expect_event(&mut self) -> EventWaiter<'_>; + + /// Wait for an event on a specific node. + fn expect_event_on(&mut self, node_index: usize) -> EventWaiter<'_>; + + /// Wait for an event on multiple nodes. + fn expect_event_on_nodes(&mut self, node_indices: Vec) -> MultiNodeEventWaiter<'_>; + + /// Wait for an event on all nodes. + fn expect_event_on_all_nodes(&mut self) -> MultiNodeEventWaiter<'_>; + + /// Wait for an event on all follower nodes (excluding sequencer at index 0). + fn expect_event_on_followers(&mut self) -> MultiNodeEventWaiter<'_>; +} + +impl EventAssertions for TestFixture { + fn expect_event(&mut self) -> EventWaiter<'_> { + EventWaiter::new(self, 0) + } + + fn expect_event_on(&mut self, node_index: usize) -> EventWaiter<'_> { + EventWaiter::new(self, node_index) + } + + fn expect_event_on_nodes(&mut self, node_indices: Vec) -> MultiNodeEventWaiter<'_> { + MultiNodeEventWaiter::new(self, node_indices) + } + + fn expect_event_on_all_nodes(&mut self) -> MultiNodeEventWaiter<'_> { + let node_indices = (0..self.nodes.len()).collect(); + MultiNodeEventWaiter::new(self, node_indices) + } + + fn expect_event_on_followers(&mut self) -> MultiNodeEventWaiter<'_> { + let node_indices = (1..self.nodes.len()).collect(); + MultiNodeEventWaiter::new(self, node_indices) + } +} diff --git a/crates/node/src/test_utils/fixture.rs b/crates/node/src/test_utils/fixture.rs new file mode 100644 index 00000000..1cb607ee --- /dev/null +++ b/crates/node/src/test_utils/fixture.rs @@ -0,0 +1,465 @@ +//! Core test fixture for setting up and managing test nodes. + +use super::{ + block_builder::BlockBuilder, l1_helpers::L1Helper, setup_engine, tx_helpers::TxHelper, +}; +use crate::{ + BlobProviderArgs, ChainOrchestratorArgs, ConsensusAlgorithm, ConsensusArgs, EngineDriverArgs, + L1ProviderArgs, RollupNodeDatabaseArgs, RollupNodeGasPriceOracleArgs, RollupNodeNetworkArgs, + RpcArgs, ScrollRollupNode, ScrollRollupNodeConfig, SequencerArgs, SignerArgs, +}; + +use alloy_eips::BlockNumberOrTag; +use alloy_primitives::Address; +use alloy_rpc_types_eth::Block; +use alloy_signer_local::PrivateKeySigner; +use reth_chainspec::EthChainSpec; +use reth_e2e_test_utils::{wallet::Wallet, NodeHelperType, TmpDB}; +use reth_eth_wire_types::BasicNetworkPrimitives; +use reth_network::NetworkHandle; +use reth_node_builder::NodeTypes; +use reth_node_types::NodeTypesWithDBAdapter; +use reth_provider::providers::BlockchainProvider; +use reth_scroll_chainspec::SCROLL_DEV; +use reth_scroll_primitives::ScrollPrimitives; +use reth_tasks::TaskManager; +use reth_tokio_util::EventStream; +use rollup_node_chain_orchestrator::{ChainOrchestratorEvent, ChainOrchestratorHandle}; +use rollup_node_primitives::BlockInfo; +use rollup_node_sequencer::L1MessageInclusionMode; +use rollup_node_watcher::L1Notification; +use scroll_alloy_consensus::ScrollPooledTransaction; +use scroll_alloy_provider::{ScrollAuthApiEngineClient, ScrollEngineApi}; +use scroll_alloy_rpc_types::Transaction; +use scroll_engine::{Engine, ForkchoiceState}; +use std::{ + fmt::{Debug, Formatter}, + path::PathBuf, + sync::Arc, +}; +use tokio::sync::{mpsc, Mutex}; + +/// Main test fixture providing a high-level interface for testing rollup nodes. +#[derive(Debug)] +pub struct TestFixture { + /// The list of nodes in the test setup. + pub nodes: Vec, + /// Shared wallet for generating transactions. + pub wallet: Arc>, + /// Chain spec used by the nodes. + pub chain_spec: Arc<::ChainSpec>, + /// The task manager. Held in order to avoid dropping the node. + _tasks: TaskManager, +} + +/// The network handle to the Scroll network. +pub type ScrollNetworkHandle = + NetworkHandle>; + +/// The blockchain test provider. +pub type TestBlockChainProvider = + BlockchainProvider>; + +/// The node type (sequencer or follower). +#[derive(Debug)] +pub enum NodeType { + /// A sequencer node. + Sequencer, + /// A follower node. + Follower, +} + +/// Handle to a single test node with its components. +pub struct NodeHandle { + /// The underlying node context. + pub node: NodeHelperType, + /// Engine instance for this node. + pub engine: Engine>, + /// L1 watcher notification channel. + pub l1_watcher_tx: Option>>, + /// Chain orchestrator listener. + pub chain_orchestrator_rx: EventStream, + /// Chain orchestrator handle. + pub rollup_manager_handle: ChainOrchestratorHandle, + /// Node index in the test setup. + pub index: usize, + /// The type of the node. + pub typ: NodeType, +} + +impl NodeHandle { + /// Returns true if this is a handle to the sequencer. + pub const fn is_sequencer(&self) -> bool { + matches!(self.typ, NodeType::Sequencer) + } + + /// Returns true if this is a handle to a follower. + pub const fn is_follower(&self) -> bool { + matches!(self.typ, NodeType::Follower) + } +} + +impl Debug for NodeHandle { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("NodeHandle") + .field("node", &"NodeHelper") + .field("engine", &"Box") + .field("l1_watcher_tx", &self.l1_watcher_tx) + .field("rollup_manager_handle", &self.rollup_manager_handle) + .field("index", &self.index) + .finish() + } +} + +impl TestFixture { + /// Create a new test fixture builder with custom configuration. + pub fn builder() -> TestFixtureBuilder { + TestFixtureBuilder::new() + } + + /// Get the sequencer node (assumes first node is sequencer). + pub fn sequencer(&mut self) -> &mut NodeHandle { + let handle = &mut self.nodes[0]; + assert!(handle.is_sequencer(), "expected sequencer, got follower"); + handle + } + + /// Get a follower node by index. + pub fn follower(&mut self, index: usize) -> &mut NodeHandle { + if index == 0 && self.nodes[0].is_sequencer() { + return &mut self.nodes[index + 1]; + } + &mut self.nodes[index] + } + + /// Get the wallet. + pub fn wallet(&self) -> Arc> { + self.wallet.clone() + } + + /// Start building a block using the sequencer. + pub fn build_block(&mut self) -> BlockBuilder<'_> { + BlockBuilder::new(self) + } + + /// Get L1 helper for managing L1 interactions. + pub fn l1(&mut self) -> L1Helper<'_> { + L1Helper::new(self) + } + + /// Get transaction helper for creating and injecting transactions. + pub fn tx(&mut self) -> TxHelper<'_> { + TxHelper::new(self) + } + + /// Inject a simple transfer transaction and return its hash. + pub async fn inject_transfer(&mut self) -> eyre::Result { + self.tx().transfer().inject().await + } + + /// Inject a raw transaction into a specific node's pool. + pub async fn inject_tx_on( + &mut self, + node_index: usize, + tx: impl Into, + ) -> eyre::Result<()> { + self.nodes[node_index].node.rpc.inject_tx(tx.into()).await?; + Ok(()) + } + + /// Get the current (latest) block from a specific node. + pub async fn get_block(&self, node_index: usize) -> eyre::Result> { + use reth_rpc_api::EthApiServer; + + self.nodes[node_index] + .node + .rpc + .inner + .eth_api() + .block_by_number(BlockNumberOrTag::Latest, false) + .await? + .ok_or_else(|| eyre::eyre!("Latest block not found")) + } + + /// Get the current (latest) block from the sequencer node. + pub async fn get_sequencer_block(&self) -> eyre::Result> { + self.get_block(0).await + } +} + +/// Builder for creating test fixtures with a fluent API. +#[derive(Debug)] +pub struct TestFixtureBuilder { + config: ScrollRollupNodeConfig, + num_nodes: usize, + chain_spec: Option::ChainSpec>>, + is_dev: bool, + no_local_transactions_propagation: bool, +} + +impl Default for TestFixtureBuilder { + fn default() -> Self { + Self::new() + } +} + +impl TestFixtureBuilder { + /// Create a new test fixture builder. + pub fn new() -> Self { + Self { + config: Self::default_config(), + num_nodes: 0, + chain_spec: None, + is_dev: false, + no_local_transactions_propagation: false, + } + } + + /// Returns the default rollup node config. + fn default_config() -> ScrollRollupNodeConfig { + ScrollRollupNodeConfig { + test: true, + network_args: RollupNodeNetworkArgs::default(), + database_args: RollupNodeDatabaseArgs::default(), + l1_provider_args: L1ProviderArgs::default(), + engine_driver_args: EngineDriverArgs { sync_at_startup: true }, + chain_orchestrator_args: ChainOrchestratorArgs { + optimistic_sync_trigger: 100, + chain_buffer_size: 100, + }, + sequencer_args: SequencerArgs { + payload_building_duration: 1000, + allow_empty_blocks: true, + ..Default::default() + }, + blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, + signer_args: SignerArgs::default(), + gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), + consensus_args: ConsensusArgs::noop(), + database: None, + rpc_args: RpcArgs { enabled: true }, + } + } + + /// Adds a sequencer node to the test with default settings. + pub fn sequencer(mut self) -> Self { + self.config.sequencer_args.sequencer_enabled = true; + self.config.sequencer_args.auto_start = false; + self.config.sequencer_args.block_time = 100; + self.config.sequencer_args.payload_building_duration = 40; + self.config.sequencer_args.l1_message_inclusion_mode = + L1MessageInclusionMode::BlockDepth(0); + self.config.sequencer_args.allow_empty_blocks = true; + self.config.database_args.rn_db_path = Some(PathBuf::from("sqlite::memory:")); + + self.num_nodes += 1; + self + } + + /// Adds `count`s follower nodes to the test. + pub const fn followers(mut self, count: usize) -> Self { + self.num_nodes += count; + self + } + + /// Toggle the test field. + pub const fn with_test(mut self, test: bool) -> Self { + self.config.test = test; + self + } + + /// Set the sequencer url for the node. + pub fn with_sequencer_url(mut self, url: String) -> Self { + self.config.network_args.sequencer_url = Some(url); + self + } + + /// Set the sequencer auto start for the node. + pub const fn with_sequencer_auto_start(mut self, auto_start: bool) -> Self { + self.config.sequencer_args.auto_start = auto_start; + self + } + + /// Set a custom chain spec. + pub fn with_chain_spec( + mut self, + spec: Arc<::ChainSpec>, + ) -> Self { + self.chain_spec = Some(spec); + self + } + + /// Enable dev mode. + pub const fn with_dev_mode(mut self, enabled: bool) -> Self { + self.is_dev = enabled; + self + } + + /// Disable local transaction propagation. + pub const fn no_local_tx_propagation(mut self) -> Self { + self.no_local_transactions_propagation = true; + self + } + + /// Set the block time for the sequencer. + pub const fn block_time(mut self, millis: u64) -> Self { + self.config.sequencer_args.block_time = millis; + self + } + + /// Set whether to allow empty blocks. + pub const fn allow_empty_blocks(mut self, allow: bool) -> Self { + self.config.sequencer_args.allow_empty_blocks = allow; + self + } + + /// Set L1 message inclusion mode with block depth. + pub const fn with_l1_message_delay(mut self, depth: u64) -> Self { + self.config.sequencer_args.l1_message_inclusion_mode = + L1MessageInclusionMode::BlockDepth(depth); + self + } + + /// Set L1 message inclusion mode to finalized with optional block depth. + pub const fn with_finalized_l1_messages(mut self, depth: u64) -> Self { + self.config.sequencer_args.l1_message_inclusion_mode = + L1MessageInclusionMode::FinalizedWithBlockDepth(depth); + self + } + + /// Use an in-memory `SQLite` database. + pub fn with_memory_db(mut self) -> Self { + self.config.database_args.rn_db_path = Some(PathBuf::from("sqlite::memory:")); + self + } + + /// Set a custom database path. + pub fn with_db_path(mut self, path: PathBuf) -> Self { + self.config.database_args.rn_db_path = Some(path); + self + } + + /// Use noop consensus (no validation). + pub const fn with_noop_consensus(mut self) -> Self { + self.config.consensus_args = ConsensusArgs::noop(); + self + } + + /// Use `SystemContract` consensus with the given authorized signer address. + pub const fn with_consensus_system_contract(mut self, authorized_signer: Address) -> Self { + self.config.consensus_args.algorithm = ConsensusAlgorithm::SystemContract; + self.config.consensus_args.authorized_signer = Some(authorized_signer); + self + } + + /// Set the private key signer for the node. + pub fn with_signer(mut self, signer: PrivateKeySigner) -> Self { + self.config.signer_args.private_key = Some(signer); + self + } + + /// Set the payload building duration in milliseconds. + pub const fn payload_building_duration(mut self, millis: u64) -> Self { + self.config.sequencer_args.payload_building_duration = millis; + self + } + + /// Set the fee recipient address. + pub const fn fee_recipient(mut self, address: Address) -> Self { + self.config.sequencer_args.fee_recipient = address; + self + } + + /// Enable auto-start for the sequencer. + pub const fn auto_start(mut self, enabled: bool) -> Self { + self.config.sequencer_args.auto_start = enabled; + self + } + + /// Set the maximum number of L1 messages per block. + pub const fn max_l1_messages(mut self, max: u64) -> Self { + self.config.sequencer_args.max_l1_messages = Some(max); + self + } + + /// Enable the Scroll wire protocol. + pub const fn with_scroll_wire(mut self, enabled: bool) -> Self { + self.config.network_args.enable_scroll_wire = enabled; + self + } + + /// Enable the ETH-Scroll wire bridge. + pub const fn with_eth_scroll_bridge(mut self, enabled: bool) -> Self { + self.config.network_args.enable_eth_scroll_wire_bridge = enabled; + self + } + + /// Set the optimistic sync trigger threshold. + pub const fn optimistic_sync_trigger(mut self, blocks: u64) -> Self { + self.config.chain_orchestrator_args.optimistic_sync_trigger = blocks; + self + } + + /// Get a mutable reference to the underlying config for advanced customization. + pub fn config_mut(&mut self) -> &mut ScrollRollupNodeConfig { + &mut self.config + } + + /// Build the test fixture. + pub async fn build(self) -> eyre::Result { + let config = self.config; + let chain_spec = self.chain_spec.unwrap_or_else(|| SCROLL_DEV.clone()); + + let (nodes, _tasks, wallet) = setup_engine( + config.clone(), + self.num_nodes, + chain_spec.clone(), + self.is_dev, + self.no_local_transactions_propagation, + ) + .await?; + + let mut node_handles = Vec::with_capacity(nodes.len()); + for (index, node) in nodes.into_iter().enumerate() { + let genesis_hash = node.inner.chain_spec().genesis_hash(); + + // Create engine for the node + let auth_client = node.inner.engine_http_client(); + let engine_client = Arc::new(ScrollAuthApiEngineClient::new(auth_client)) + as Arc; + let fcs = ForkchoiceState::new( + BlockInfo { hash: genesis_hash, number: 0 }, + Default::default(), + Default::default(), + ); + let engine = Engine::new(Arc::new(engine_client), fcs); + + // Get handles if available + let l1_watcher_tx = node.inner.add_ons_handle.l1_watcher_tx.clone(); + let rollup_manager_handle = node.inner.add_ons_handle.rollup_manager_handle.clone(); + let chain_orchestrator_rx = + node.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await?; + + node_handles.push(NodeHandle { + node, + engine, + chain_orchestrator_rx, + l1_watcher_tx, + rollup_manager_handle, + index, + typ: if config.sequencer_args.sequencer_enabled && index == 0 { + NodeType::Sequencer + } else { + NodeType::Follower + }, + }); + } + + Ok(TestFixture { + nodes: node_handles, + wallet: Arc::new(Mutex::new(wallet)), + chain_spec, + _tasks, + }) + } +} diff --git a/crates/node/src/test_utils/l1_helpers.rs b/crates/node/src/test_utils/l1_helpers.rs new file mode 100644 index 00000000..fc9737e3 --- /dev/null +++ b/crates/node/src/test_utils/l1_helpers.rs @@ -0,0 +1,204 @@ +//! L1 interaction helpers for test fixtures. + +use super::fixture::TestFixture; +use std::{fmt::Debug, str::FromStr, sync::Arc}; + +use alloy_primitives::{Address, Bytes, B256, U256}; +use rollup_node_primitives::{BatchCommitData, ConsensusUpdate}; +use rollup_node_watcher::L1Notification; +use scroll_alloy_consensus::TxL1Message; + +/// Helper for managing L1 interactions in tests. +#[derive(Debug)] +pub struct L1Helper<'a> { + fixture: &'a mut TestFixture, + target_node_index: Option, +} + +impl<'a> L1Helper<'a> { + /// Create a new L1 helper. + pub(crate) fn new(fixture: &'a mut TestFixture) -> Self { + Self { fixture, target_node_index: None } + } + + /// Target a specific node for L1 notifications (default is all nodes). + pub const fn for_node(mut self, index: usize) -> Self { + self.target_node_index = Some(index); + self + } + + /// Send a notification that L1 is synced. + pub async fn sync(self) -> eyre::Result<()> { + let notification = Arc::new(L1Notification::Synced); + self.send_to_nodes(notification).await + } + + /// Send a new L1 block notification. + pub async fn new_block(self, block_number: u64) -> eyre::Result<()> { + let notification = Arc::new(L1Notification::NewBlock(block_number)); + self.send_to_nodes(notification).await + } + + /// Send an L1 reorg notification. + pub async fn reorg_to(self, block_number: u64) -> eyre::Result<()> { + let notification = Arc::new(L1Notification::Reorg(block_number)); + self.send_to_nodes(notification).await + } + + /// Send an L1 consensus notification. + pub async fn signer_update(self, new_signer: Address) -> eyre::Result<()> { + let notification = + Arc::new(L1Notification::Consensus(ConsensusUpdate::AuthorizedSigner(new_signer))); + self.send_to_nodes(notification).await + } + + /// Send an L1 reorg notification. + pub async fn batch_commit(self, calldata_path: Option<&str>, index: u64) -> eyre::Result<()> { + let raw_calldata = calldata_path + .map(|path| { + Result::<_, eyre::Report>::Ok(Bytes::from_str(&std::fs::read_to_string(path)?)?) + }) + .transpose()? + .unwrap_or_default(); + let batch_data = BatchCommitData { + hash: B256::random(), + index, + block_number: 0, + block_timestamp: 0, + calldata: Arc::new(raw_calldata), + blob_versioned_hash: None, + finalized_block_number: None, + }; + + let notification = Arc::new(L1Notification::BatchCommit(batch_data)); + self.send_to_nodes(notification).await + } + + /// Create a new L1 message builder. + pub fn add_message(self) -> L1MessageBuilder<'a> { + L1MessageBuilder::new(self) + } + + /// Send notification to target nodes. + async fn send_to_nodes(&self, notification: Arc) -> eyre::Result<()> { + let nodes = if let Some(index) = self.target_node_index { + vec![&self.fixture.nodes[index]] + } else { + self.fixture.nodes.iter().collect() + }; + + for node in nodes { + if let Some(tx) = &node.l1_watcher_tx { + tx.send(notification.clone()).await?; + } + } + + Ok(()) + } +} + +/// Builder for creating L1 messages in tests. +#[derive(Debug)] +pub struct L1MessageBuilder<'a> { + l1_helper: L1Helper<'a>, + l1_block_number: u64, + queue_index: u64, + gas_limit: u64, + to: Address, + value: U256, + sender: Option
, + input: Bytes, +} + +impl<'a> L1MessageBuilder<'a> { + /// Create a new L1 message builder. + fn new(l1_helper: L1Helper<'a>) -> Self { + Self { + l1_helper, + l1_block_number: 0, + queue_index: 0, + gas_limit: 21000, + to: Address::random(), + value: U256::from(1), + sender: None, + input: Bytes::default(), + } + } + + /// Set the L1 block number for this message. + pub const fn at_block(mut self, block_number: u64) -> Self { + self.l1_block_number = block_number; + self + } + + /// Set the queue index for this message. + pub const fn queue_index(mut self, index: u64) -> Self { + self.queue_index = index; + self + } + + /// Set the gas limit for this message. + pub const fn gas_limit(mut self, limit: u64) -> Self { + self.gas_limit = limit; + self + } + + /// Set the recipient address. + pub const fn to(mut self, address: Address) -> Self { + self.to = address; + self + } + + /// Set the value to send. + pub fn value(mut self, value: impl TryInto) -> Self { + self.value = value.try_into().expect("should convert to U256"); + self + } + + /// Set the sender address. + pub const fn sender(mut self, address: Address) -> Self { + self.sender = Some(address); + self + } + + /// Set the input data. + pub fn input(mut self, data: Bytes) -> Self { + self.input = data; + self + } + + /// Send the L1 message to the database and notify nodes. + pub async fn send(self) -> eyre::Result { + let sender = self.sender.unwrap_or_else(|| Address::random()); + + let tx_l1_message = TxL1Message { + queue_index: self.queue_index, + gas_limit: self.gas_limit, + to: self.to, + value: self.value, + sender, + input: self.input, + }; + + // Send notification to nodes + let notification = Arc::new(L1Notification::L1Message { + message: tx_l1_message.clone(), + block_number: self.l1_block_number, + block_timestamp: self.l1_block_number * 10, + }); + + let nodes = if let Some(index) = self.l1_helper.target_node_index { + vec![&self.l1_helper.fixture.nodes[index]] + } else { + self.l1_helper.fixture.nodes.iter().collect() + }; + + for node in nodes { + if let Some(tx) = &node.l1_watcher_tx { + tx.send(notification.clone()).await?; + } + } + + Ok(tx_l1_message) + } +} diff --git a/crates/node/src/test_utils.rs b/crates/node/src/test_utils/mod.rs similarity index 70% rename from crates/node/src/test_utils.rs rename to crates/node/src/test_utils/mod.rs index dd668222..14fb1ea6 100644 --- a/crates/node/src/test_utils.rs +++ b/crates/node/src/test_utils/mod.rs @@ -1,10 +1,82 @@ -//! This crate contains utilities for running end-to-end tests for the scroll reth node. +//! Test utilities for the Scroll rollup node. +//! +//! This module provides a high-level test framework for creating and managing +//! test nodes, building blocks, managing L1 interactions, and asserting on events. +//! +//! # Quick Start +//! +//! ```rust,ignore +//! use rollup_node::test_utils::TestFixture; +//! +//! #[tokio::test] +//! async fn test_basic_block_production() -> eyre::Result<()> { +//! let mut fixture = TestFixture::sequencer().build().await?; +//! +//! // Inject a transaction +//! let tx_hash = fixture.inject_transfer().await?; +//! +//! // Build a block +//! let block = fixture.build_block() +//! .expect_tx(tx_hash) +//! .await_block() +//! .await?; +//! +//! // Get the current block +//! let current_block = fixture.get_sequencer_block().await?; +//! +//! Ok(()) +//! } +//! ``` +//! +//! # Event Assertions +//! +//! The framework provides powerful event assertion capabilities: +//! +//! ```rust,ignore +//! // Wait for events on a single node +//! fixture.expect_event_on(1).chain_extended().await?; +//! +//! // Wait for the same event on multiple nodes +//! fixture.expect_event_on_followers().new_block_received().await?; +//! +//! // Wait for events on all nodes (including sequencer) +//! fixture.expect_event_on_all_nodes().chain_extended().await?; +//! +//! // Custom event predicates - just check if event matches +//! fixture.expect_event() +//! .where_event(|e| matches!(e, ChainOrchestratorEvent::BlockSequenced(_))) +//! .await?; +//! +//! // Extract values from events +//! let block_numbers = fixture.expect_event_on_nodes(vec![1, 2]) +//! .extract(|e| { +//! if let ChainOrchestratorEvent::NewL1Block(num) = e { +//! Some(*num) +//! } else { +//! None +//! } +//! }) +//! .await?; +//! ``` -use crate::{ConsensusArgs, RollupNodeGasPriceOracleArgs}; +// Module declarations +pub mod block_builder; +pub mod event_utils; +pub mod fixture; +pub mod l1_helpers; +pub mod network_helpers; +pub mod tx_helpers; -use super::{ - BlobProviderArgs, ChainOrchestratorArgs, EngineDriverArgs, L1ProviderArgs, - RollupNodeDatabaseArgs, RpcArgs, ScrollRollupNode, ScrollRollupNodeConfig, SequencerArgs, +// Re-export main types for convenience +pub use event_utils::{EventAssertions, EventWaiter, MultiNodeEventWaiter}; +pub use fixture::{NodeHandle, TestFixture, TestFixtureBuilder}; +pub use network_helpers::{NetworkHelper, NetworkHelpers, ReputationChecker, ReputationChecks}; + +// Legacy utilities - keep existing functions for backward compatibility +use crate::{ + BlobProviderArgs, ChainOrchestratorArgs, ConsensusArgs, EngineDriverArgs, L1ProviderArgs, + RollupNodeDatabaseArgs, RollupNodeNetworkArgs, RpcArgs, ScrollRollupNode, + ScrollRollupNodeConfig, SequencerArgs, }; use alloy_primitives::Bytes; use reth_chainspec::EthChainSpec; @@ -14,8 +86,9 @@ use reth_e2e_test_utils::{ }; use reth_engine_local::LocalPayloadAttributesBuilder; use reth_node_builder::{ - rpc::RpcHandleProvider, EngineNodeLauncher, Node, NodeBuilder, NodeConfig, NodeHandle, - NodeTypes, NodeTypesWithDBAdapter, PayloadAttributesBuilder, PayloadTypes, TreeConfig, + rpc::RpcHandleProvider, EngineNodeLauncher, Node, NodeBuilder, NodeConfig, + NodeHandle as RethNodeHandle, NodeTypes, NodeTypesWithDBAdapter, PayloadAttributesBuilder, + PayloadTypes, TreeConfig, }; use reth_node_core::args::{DiscoveryArgs, NetworkArgs, RpcServerArgs, TxPoolArgs}; use reth_provider::providers::BlockchainProvider; @@ -27,6 +100,9 @@ use tokio::sync::Mutex; use tracing::{span, Level}; /// Creates the initial setup with `num_nodes` started and interconnected. +/// +/// This is the legacy setup function that's used by existing tests. +/// For new tests, consider using the `TestFixture` API instead. pub async fn setup_engine( mut scroll_node_config: ScrollRollupNodeConfig, num_nodes: usize, @@ -84,7 +160,7 @@ where let testing_node = NodeBuilder::new(node_config.clone()).testing_node(exec.clone()); let testing_config = testing_node.config().clone(); let node = ScrollRollupNode::new(scroll_node_config.clone(), testing_config).await; - let NodeHandle { node, node_exit_future: _ } = testing_node + let RethNodeHandle { node, node_exit_future: _ } = testing_node .with_types_and_provider::>() .with_components(node.components_builder()) .with_add_ons(node.add_ons()) @@ -143,7 +219,7 @@ pub async fn generate_tx(wallet: Arc>) -> Bytes { pub fn default_test_scroll_rollup_node_config() -> ScrollRollupNodeConfig { ScrollRollupNodeConfig { test: true, - network_args: crate::args::RollupNodeNetworkArgs::default(), + network_args: RollupNodeNetworkArgs::default(), database_args: RollupNodeDatabaseArgs::default(), l1_provider_args: L1ProviderArgs::default(), engine_driver_args: EngineDriverArgs { sync_at_startup: true }, @@ -158,7 +234,7 @@ pub fn default_test_scroll_rollup_node_config() -> ScrollRollupNodeConfig { }, blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), + gas_price_oracle_args: crate::RollupNodeGasPriceOracleArgs::default(), consensus_args: ConsensusArgs::noop(), database: None, rpc_args: RpcArgs { enabled: true }, @@ -176,7 +252,7 @@ pub fn default_test_scroll_rollup_node_config() -> ScrollRollupNodeConfig { pub fn default_sequencer_test_scroll_rollup_node_config() -> ScrollRollupNodeConfig { ScrollRollupNodeConfig { test: true, - network_args: crate::args::RollupNodeNetworkArgs::default(), + network_args: RollupNodeNetworkArgs::default(), database_args: RollupNodeDatabaseArgs { rn_db_path: Some(PathBuf::from("sqlite::memory:")), }, @@ -198,7 +274,7 @@ pub fn default_sequencer_test_scroll_rollup_node_config() -> ScrollRollupNodeCon }, blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), + gas_price_oracle_args: crate::RollupNodeGasPriceOracleArgs::default(), consensus_args: ConsensusArgs::noop(), database: None, rpc_args: RpcArgs { enabled: true }, diff --git a/crates/node/src/test_utils/network_helpers.rs b/crates/node/src/test_utils/network_helpers.rs new file mode 100644 index 00000000..468c4263 --- /dev/null +++ b/crates/node/src/test_utils/network_helpers.rs @@ -0,0 +1,285 @@ +//! Network-related test helpers for managing peers, reputation, and block propagation. +//! +//! This module provides utilities for testing network-level behaviors including: +//! - Checking and asserting on peer reputation +//! - Announcing blocks to the network +//! - Getting peer information +//! +//! # Examples +//! +//! ## Checking reputation +//! +//! ```rust,ignore +//! use rollup_node::test_utils::{TestFixture, ReputationChecks}; +//! +//! #[tokio::test] +//! async fn test_reputation() -> eyre::Result<()> { +//! let mut fixture = TestFixture::sequencer().with_nodes(2).build().await?; +//! +//! // Get node 0's peer ID +//! let node0_peer_id = fixture.network_on(0).peer_id().await?; +//! +//! // Check reputation from node 1's perspective +//! fixture.check_reputation_on(1) +//! .of_peer(node0_peer_id) +//! .equals(0) +//! .await?; +//! +//! // ... do something that should decrease reputation ... +//! +//! // Wait for reputation to drop below initial value +//! fixture.check_reputation_on(1) +//! .of_node(0).await? +//! .eventually_less_than(0) +//! .await?; +//! +//! Ok(()) +//! } +//! ``` +//! +//! ## Announcing blocks +//! +//! ```rust,ignore +//! use rollup_node::test_utils::{TestFixture, NetworkHelpers}; +//! use alloy_primitives::{Signature, U256}; +//! use reth_scroll_primitives::ScrollBlock; +//! +//! #[tokio::test] +//! async fn test_block_announce() -> eyre::Result<()> { +//! let mut fixture = TestFixture::sequencer().with_nodes(2).build().await?; +//! +//! // Create a block +//! let block = ScrollBlock::default(); +//! let signature = Signature::new(U256::from(1), U256::from(1), false); +//! +//! // Announce from node 0 +//! fixture.network_on(0).announce_block(block, signature).await?; +//! +//! Ok(()) +//! } +//! ``` + +use super::fixture::{ScrollNetworkHandle, TestFixture}; +use alloy_primitives::Signature; +use reth_network_api::{PeerId, PeerInfo, Peers}; +use reth_scroll_primitives::ScrollBlock; +use std::time::Duration; +use tokio::time; + +/// Helper for network-related test operations. +#[derive(Debug)] +pub struct NetworkHelper<'a> { + fixture: &'a TestFixture, + node_index: usize, +} + +impl<'a> NetworkHelper<'a> { + /// Create a new network helper for a specific node. + pub const fn new(fixture: &'a TestFixture, node_index: usize) -> Self { + Self { fixture, node_index } + } + + /// Get the network handle for this node. + pub async fn network_handle( + &self, + ) -> eyre::Result> { + self.fixture.nodes[self.node_index] + .rollup_manager_handle + .get_network_handle() + .await + .map_err(|e| eyre::eyre!("Failed to get network handle: {}", e)) + } + + /// Get this node's peer ID. + pub async fn peer_id(&self) -> eyre::Result { + let handle = self.network_handle().await?; + Ok(*handle.inner().peer_id()) + } + + /// Get the reputation of a peer from this node's perspective. + pub async fn reputation_of(&self, peer_id: PeerId) -> eyre::Result> { + let handle = self.network_handle().await?; + handle + .inner() + .reputation_by_id(peer_id) + .await + .map_err(|e| eyre::eyre!("Failed to get reputation: {}", e)) + } + + /// Get all connected peers. + pub async fn peers(&self) -> eyre::Result> { + let handle = self.network_handle().await?; + handle.inner().get_all_peers().await.map_err(|e| eyre::eyre!("Failed to get peers: {}", e)) + } + + /// Announce a block from this node to the network. + pub async fn announce_block( + &self, + block: ScrollBlock, + signature: Signature, + ) -> eyre::Result<()> { + let handle = self.network_handle().await?; + handle.announce_block(block, signature); + Ok(()) + } + + /// Get the number of connected peers. + pub async fn peer_count(&self) -> eyre::Result { + let peers = self.peers().await?; + Ok(peers.len()) + } +} + +/// Extension trait for `TestFixture` to add network helper capabilities. +pub trait NetworkHelpers { + /// Get a network helper for the sequencer node (node 0). + fn network(&self) -> NetworkHelper<'_>; + + /// Get a network helper for a specific node by index. + fn network_on(&self, node_index: usize) -> NetworkHelper<'_>; +} + +impl NetworkHelpers for TestFixture { + fn network(&self) -> NetworkHelper<'_> { + NetworkHelper::new(self, 0) + } + + fn network_on(&self, node_index: usize) -> NetworkHelper<'_> { + NetworkHelper::new(self, node_index) + } +} + +/// Builder for checking reputation with assertions. +#[derive(Debug)] +pub struct ReputationChecker<'a> { + fixture: &'a mut TestFixture, + observer_node: usize, + target_peer: Option, + timeout: Duration, + poll_interval: Duration, +} + +impl<'a> ReputationChecker<'a> { + /// Create a new reputation checker. + pub fn new(fixture: &'a mut TestFixture, observer_node: usize) -> Self { + Self { + fixture, + observer_node, + target_peer: None, + timeout: Duration::from_secs(5), + poll_interval: Duration::from_millis(100), + } + } + + /// Set the target peer by node index. + pub async fn of_node(mut self, node_index: usize) -> eyre::Result { + let peer_id = self.fixture.network_on(node_index).peer_id().await?; + self.target_peer = Some(peer_id); + Ok(self) + } + + /// Set a custom timeout for polling assertions (default: 5s). + pub const fn with_timeout(mut self, timeout: Duration) -> Self { + self.timeout = timeout; + self + } + + /// Set a custom poll interval for polling assertions (default: 100ms). + pub const fn with_poll_interval(mut self, interval: Duration) -> Self { + self.poll_interval = interval; + self + } + + /// Get the current reputation value. + pub async fn get(&self) -> eyre::Result> { + let peer_id = self.target_peer.ok_or_else(|| eyre::eyre!("No target peer set"))?; + self.fixture.network_on(self.observer_node).reputation_of(peer_id).await + } + + /// Assert that the reputation equals a specific value. + pub async fn equals(&mut self, expected: i32) -> eyre::Result<()> { + let reputation = self.get().await?; + let actual = reputation.ok_or_else(|| eyre::eyre!("Peer not found"))?; + if actual != expected { + return Err(eyre::eyre!("Expected reputation {}, got {}", expected, actual)); + } + Ok(()) + } + + /// Wait until the reputation becomes less than a threshold. + /// Polls repeatedly until the condition is met or timeout occurs. + pub async fn eventually_less_than(self, threshold: i32) -> eyre::Result<()> { + let peer_id = self.target_peer.ok_or_else(|| eyre::eyre!("No target peer set"))?; + let mut interval = time::interval(self.poll_interval); + let start = time::Instant::now(); + + loop { + let reputation = + self.fixture.network_on(self.observer_node).reputation_of(peer_id).await?; + if let Some(rep) = reputation { + if rep < threshold { + return Ok(()); + } + } + + if start.elapsed() > self.timeout { + let current = reputation.unwrap_or(0); + return Err(eyre::eyre!( + "Timeout waiting for reputation < {} (current: {})", + threshold, + current + )); + } + + interval.tick().await; + } + } + + /// Wait until the reputation becomes greater than a threshold. + /// Polls repeatedly until the condition is met or timeout occurs. + pub async fn eventually_greater_than(self, threshold: i32) -> eyre::Result<()> { + let peer_id = self.target_peer.ok_or_else(|| eyre::eyre!("No target peer set"))?; + let mut interval = time::interval(self.poll_interval); + let start = time::Instant::now(); + + loop { + let reputation = + self.fixture.network_on(self.observer_node).reputation_of(peer_id).await?; + if let Some(rep) = reputation { + if rep > threshold { + return Ok(()); + } + } + + if start.elapsed() > self.timeout { + let current = reputation.unwrap_or(0); + return Err(eyre::eyre!( + "Timeout waiting for reputation > {} (current: {})", + threshold, + current + )); + } + + interval.tick().await; + } + } +} + +/// Extension trait for checking reputation. +pub trait ReputationChecks { + /// Start checking reputation from the sequencer's perspective. + fn check_reputation(&mut self) -> ReputationChecker<'_>; + + /// Start checking reputation from a specific node's perspective. + fn check_reputation_on(&mut self, observer_node: usize) -> ReputationChecker<'_>; +} + +impl ReputationChecks for TestFixture { + fn check_reputation(&mut self) -> ReputationChecker<'_> { + ReputationChecker::new(self, 0) + } + + fn check_reputation_on(&mut self, observer_node: usize) -> ReputationChecker<'_> { + ReputationChecker::new(self, observer_node) + } +} diff --git a/crates/node/src/test_utils/tx_helpers.rs b/crates/node/src/test_utils/tx_helpers.rs new file mode 100644 index 00000000..ded7123b --- /dev/null +++ b/crates/node/src/test_utils/tx_helpers.rs @@ -0,0 +1,95 @@ +//! Transaction creation and injection helpers for test fixtures. + +use super::fixture::TestFixture; +use alloy_primitives::{Address, Bytes, B256, U256}; +use reth_e2e_test_utils::transaction::TransactionTestContext; + +/// Helper for creating and injecting transactions in tests. +#[derive(Debug)] +pub struct TxHelper<'a> { + fixture: &'a mut TestFixture, + target_node_index: usize, +} + +impl<'a> TxHelper<'a> { + /// Create a new transaction helper. + pub(crate) fn new(fixture: &'a mut TestFixture) -> Self { + Self { fixture, target_node_index: 0 } + } + + /// Target a specific node for transaction injection (default is sequencer). + pub const fn for_node(mut self, index: usize) -> Self { + self.target_node_index = index; + self + } + + /// Create a transfer transaction builder. + pub fn transfer(self) -> TransferTxBuilder<'a> { + TransferTxBuilder::new(self) + } +} + +/// Builder for creating transfer transactions. +#[derive(Debug)] +pub struct TransferTxBuilder<'a> { + tx_helper: TxHelper<'a>, + to: Option
, + value: U256, +} + +impl<'a> TransferTxBuilder<'a> { + /// Create a new transfer transaction builder. + fn new(tx_helper: TxHelper<'a>) -> Self { + Self { tx_helper, to: None, value: U256::from(1) } + } + + /// Set the recipient address. + pub const fn to(mut self, address: Address) -> Self { + self.to = Some(address); + self + } + + /// Set the value to transfer. + pub fn value(mut self, value: impl Into) -> Self { + self.value = value.into(); + self + } + + /// Build and inject the transaction, returning its hash. + pub async fn inject(self) -> eyre::Result { + let mut wallet = self.tx_helper.fixture.wallet.lock().await; + + // Generate the transaction + let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + wallet.chain_id, + wallet.inner.clone(), + wallet.inner_nonce, + ) + .await; + + wallet.inner_nonce += 1; + drop(wallet); + + // Inject into the target node + let node = &self.tx_helper.fixture.nodes[self.tx_helper.target_node_index]; + let tx_hash = node.node.rpc.inject_tx(raw_tx).await?; + + Ok(tx_hash) + } + + /// Build the transaction bytes without injecting. + pub async fn build(self) -> eyre::Result { + let mut wallet = self.tx_helper.fixture.wallet.lock().await; + + let raw_tx = TransactionTestContext::transfer_tx_nonce_bytes( + wallet.chain_id, + wallet.inner.clone(), + wallet.inner_nonce, + ) + .await; + + wallet.inner_nonce += 1; + + Ok(raw_tx) + } +} diff --git a/crates/node/tests/e2e.rs b/crates/node/tests/e2e.rs index 6f6e7f1b..0d43fabb 100644 --- a/crates/node/tests/e2e.rs +++ b/crates/node/tests/e2e.rs @@ -1,18 +1,13 @@ //! End-to-end tests for the rollup node. -use alloy_eips::{eip2718::Encodable2718, BlockNumberOrTag}; -use alloy_primitives::{address, b256, Address, Bytes, Signature, B256, U256}; -use alloy_rpc_types_eth::Block; +use alloy_eips::BlockNumberOrTag; +use alloy_primitives::{address, b256, Address, Bytes, Signature, U256}; use alloy_signer::Signer; use alloy_signer_local::PrivateKeySigner; -use eyre::Ok; use futures::{task::noop_waker_ref, FutureExt, StreamExt}; use reth_chainspec::EthChainSpec; -use reth_e2e_test_utils::{NodeHelperType, TmpDB}; -use reth_network::{NetworkConfigBuilder, NetworkEventListenerProvider, Peers, PeersInfo}; +use reth_network::{NetworkConfigBuilder, NetworkEventListenerProvider, PeersInfo}; use reth_network_api::block::EthWireProvider; -use reth_node_api::NodeTypesWithDBAdapter; -use reth_provider::providers::BlockchainProvider; use reth_rpc_api::EthApiServer; use reth_scroll_chainspec::{ScrollChainSpec, SCROLL_DEV, SCROLL_MAINNET, SCROLL_SEPOLIA}; use reth_scroll_node::ScrollNetworkPrimitives; @@ -24,19 +19,13 @@ use rollup_node::{ constants::SCROLL_GAS_LIMIT, test_utils::{ default_sequencer_test_scroll_rollup_node_config, default_test_scroll_rollup_node_config, - generate_tx, setup_engine, + generate_tx, setup_engine, EventAssertions, NetworkHelpers, ReputationChecks, TestFixture, }, - BlobProviderArgs, ChainOrchestratorArgs, ConsensusAlgorithm, ConsensusArgs, EngineDriverArgs, - L1ProviderArgs, RollupNodeContext, RollupNodeDatabaseArgs, RollupNodeExtApiClient, - RollupNodeGasPriceOracleArgs, RollupNodeNetworkArgs as ScrollNetworkArgs, RpcArgs, - ScrollRollupNode, ScrollRollupNodeConfig, SequencerArgs, + RollupNodeContext, RollupNodeExtApiClient, }; use rollup_node_chain_orchestrator::ChainOrchestratorEvent; -use rollup_node_primitives::{sig_encode_hash, BatchCommitData, BlockInfo, ConsensusUpdate}; -use rollup_node_sequencer::L1MessageInclusionMode; +use rollup_node_primitives::{sig_encode_hash, BatchCommitData, BlockInfo}; use rollup_node_watcher::L1Notification; -use scroll_alloy_consensus::TxL1Message; -use scroll_alloy_rpc_types::Transaction as ScrollAlloyTransaction; use scroll_db::{test_utils::setup_test_db, L1MessageKey}; use scroll_network::NewBlockWithPeer; use scroll_wire::{ScrollWireConfig, ScrollWireProtocolHandler}; @@ -55,264 +44,117 @@ use tracing::trace; async fn can_bridge_l1_messages() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // Create the chain spec for scroll mainnet with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); - let node_args = ScrollRollupNodeConfig { - test: true, - network_args: ScrollNetworkArgs::default(), - database_args: RollupNodeDatabaseArgs { - rn_db_path: Some(PathBuf::from("sqlite::memory:")), - }, - l1_provider_args: L1ProviderArgs::default(), - engine_driver_args: EngineDriverArgs::default(), - chain_orchestrator_args: ChainOrchestratorArgs::default(), - sequencer_args: SequencerArgs { - sequencer_enabled: true, - auto_start: false, - block_time: 0, - l1_message_inclusion_mode: L1MessageInclusionMode::BlockDepth(0), - allow_empty_blocks: true, - ..SequencerArgs::default() - }, - blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, - signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), - consensus_args: ConsensusArgs::noop(), - database: None, - rpc_args: RpcArgs::default(), - }; - let (mut nodes, _tasks, _wallet) = setup_engine(node_args, 1, chain_spec, false, false).await?; - let node = nodes.pop().unwrap(); - - let chain_orchestrator = node.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut events = chain_orchestrator.get_event_listener().await?; - let l1_watcher_tx = node.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); + // Create a sequencer test fixture + let mut fixture = TestFixture::builder() + .sequencer() + .with_l1_message_delay(0) + .allow_empty_blocks(true) + .build() + .await?; // Send a notification to set the L1 to synced - l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; - - let l1_message = TxL1Message { - queue_index: 0, - gas_limit: 21000, - sender: Address::random(), - to: Address::random(), - value: U256::from(1), - input: Default::default(), - }; - l1_watcher_tx - .send(Arc::new(L1Notification::L1Message { - message: l1_message.clone(), - block_number: 0, - block_timestamp: 1000, - })) + fixture.l1().sync().await?; + + // Create and send an L1 message + fixture + .l1() + .add_message() + .queue_index(0) + .gas_limit(21000) + .sender(Address::random()) + .to(Address::random()) + .value(1u32) + .at_block(0) + .send() .await?; - wait_n_events( - &mut events, - |e| { - if let ChainOrchestratorEvent::L1MessageCommitted(index) = e { - assert_eq!(index, 0); - true - } else { - false - } - }, - 1, - ) - .await; - - chain_orchestrator.build_block(); + // Wait for the L1 message to be committed + fixture.expect_event().l1_message_committed().await?; - wait_n_events( - &mut events, - |e| { - if let ChainOrchestratorEvent::BlockSequenced(block) = e { - assert_eq!(block.body.transactions.len(), 1); - assert_eq!( - block.body.transactions[0].as_l1_message().unwrap().inner(), - &l1_message - ); - true - } else { - false - } - }, - 1, - ) - .await; + // Build a block and expect it to contain the L1 message + fixture.build_block().expect_l1_message_count(1).await_block().await?; Ok(()) } #[tokio::test] -async fn can_sequence_and_gossip_blocks() { +async fn can_sequence_and_gossip_blocks() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // create 2 nodes - let chain_spec = (*SCROLL_DEV).clone(); - let rollup_manager_args = ScrollRollupNodeConfig { - test: true, - network_args: ScrollNetworkArgs { - enable_eth_scroll_wire_bridge: true, - enable_scroll_wire: true, - sequencer_url: None, - signer_address: None, - }, - database_args: RollupNodeDatabaseArgs { - rn_db_path: Some(PathBuf::from("sqlite::memory:")), - }, - l1_provider_args: L1ProviderArgs::default(), - engine_driver_args: EngineDriverArgs::default(), - chain_orchestrator_args: ChainOrchestratorArgs::default(), - sequencer_args: SequencerArgs { - sequencer_enabled: true, - auto_start: false, - block_time: 0, - l1_message_inclusion_mode: L1MessageInclusionMode::BlockDepth(0), - payload_building_duration: 1000, - allow_empty_blocks: true, - ..SequencerArgs::default() - }, - blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, - signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), - consensus_args: ConsensusArgs::noop(), - database: None, - rpc_args: RpcArgs::default(), - }; + // create 2 nodes with the new TestFixture API + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .block_time(0) + .allow_empty_blocks(true) + .with_eth_scroll_bridge(true) + .with_scroll_wire(true) + .payload_building_duration(1000) + .build() + .await?; - let (nodes, _tasks, wallet) = - setup_engine(rollup_manager_args, 2, chain_spec, false, false).await.unwrap(); - let wallet = Arc::new(Mutex::new(wallet)); + // Send L1 synced notification to the sequencer + fixture.l1().for_node(0).sync().await?; - // generate rollup node manager event streams for each node - let sequencer_rnm_handle = nodes[0].inner.add_ons_handle.rollup_manager_handle.clone(); - let mut sequencer_events = sequencer_rnm_handle.get_event_listener().await.unwrap(); - let sequencer_l1_watcher_tx = nodes[0].inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let mut follower_events = - nodes[1].inner.add_ons_handle.rollup_manager_handle.get_event_listener().await.unwrap(); + // Inject a transaction into the sequencer node + let tx_hash = fixture.inject_transfer().await?; - // Send a notification to set the L1 to synced - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); + // Build a block and wait for it to be sequenced + fixture.build_block().expect_tx(tx_hash).expect_tx_count(1).await_block().await?; - // inject a transaction into the pool of the first node - let tx = generate_tx(wallet).await; - nodes[0].rpc.inject_tx(tx).await.unwrap(); - sequencer_rnm_handle.build_block(); + // Assert that the follower node receives the block from the network + let received_block = fixture.expect_event_on(1).new_block_received().await?; + assert_eq!(received_block.body.transactions.len(), 1); - // wait for the sequencer to build a block - wait_n_events( - &mut sequencer_events, - |e| { - if let ChainOrchestratorEvent::BlockSequenced(block) = e { - assert_eq!(block.body.transactions.len(), 1); - true - } else { - false - } - }, - 1, - ) - .await; + // Assert that a chain extension is triggered on the follower node + fixture.expect_event_on(1).chain_extended(1).await?; - // assert that the follower node has received the block from the peer - wait_n_events( - &mut follower_events, - |e| { - if let ChainOrchestratorEvent::NewBlockReceived(block_with_peer) = e { - assert_eq!(block_with_peer.block.body.transactions.len(), 1); - true - } else { - false - } - }, - 1, - ) - .await; - - // assert that a chain extension is triggered on the follower node - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), - 1, - ) - .await; + Ok(()) } #[tokio::test] -async fn can_penalize_peer_for_invalid_block() { +async fn can_penalize_peer_for_invalid_block() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // create 2 nodes - let chain_spec = (*SCROLL_DEV).clone(); - let rollup_manager_args = ScrollRollupNodeConfig { - test: true, - network_args: ScrollNetworkArgs { - enable_eth_scroll_wire_bridge: true, - enable_scroll_wire: true, - sequencer_url: None, - signer_address: None, - }, - database_args: RollupNodeDatabaseArgs { - rn_db_path: Some(PathBuf::from("sqlite::memory:")), - }, - l1_provider_args: L1ProviderArgs::default(), - engine_driver_args: EngineDriverArgs::default(), - sequencer_args: SequencerArgs { - sequencer_enabled: true, - auto_start: false, - block_time: 0, - l1_message_inclusion_mode: L1MessageInclusionMode::BlockDepth(0), - payload_building_duration: 1000, - allow_empty_blocks: true, - ..SequencerArgs::default() - }, - blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, - signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), - consensus_args: ConsensusArgs::noop(), - chain_orchestrator_args: ChainOrchestratorArgs::default(), - database: None, - rpc_args: RpcArgs::default(), - }; - - let (nodes, _tasks, _) = - setup_engine(rollup_manager_args, 2, chain_spec, false, false).await.unwrap(); - - let node0_rmn_handle = nodes[0].inner.add_ons_handle.rollup_manager_handle.clone(); - let node0_network_handle = node0_rmn_handle.get_network_handle().await.unwrap(); - let node0_id = node0_network_handle.inner().peer_id(); - - let node1_rnm_handle = nodes[1].inner.add_ons_handle.rollup_manager_handle.clone(); - let node1_network_handle = node1_rnm_handle.get_network_handle().await.unwrap(); + // Create 2 nodes with the TestFixture API + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .block_time(0) + .allow_empty_blocks(true) + .with_eth_scroll_bridge(true) + .with_scroll_wire(true) + .payload_building_duration(1000) + .build() + .await?; - // get initial reputation of node0 from pov of node1 - let initial_reputation = - node1_network_handle.inner().reputation_by_id(*node0_id).await.unwrap().unwrap(); - assert_eq!(initial_reputation, 0); + // Check initial reputation of node 0 from node 1's perspective + fixture.check_reputation_on(1).of_node(0).await?.equals(0).await?; - // create invalid block + // Create invalid block let mut block = ScrollBlock::default(); block.header.number = 1; block.header.parent_hash = b256!("0x14844a4fc967096c628e90df3bb0c3e98941bdd31d1982c2f3e70ed17250d98b"); - // send invalid block from node0 to node1. We don't care about the signature here since we use a + // Send invalid block from node0 to node1. We don't care about the signature here since we use a // NoopConsensus in the test. - node0_network_handle.announce_block(block, Signature::new(U256::from(1), U256::from(1), false)); - - eventually( - Duration::from_secs(5), - Duration::from_millis(10), - "Peer0 reputation should be lower after sending invalid block", - || async { - // check that the node0 is penalized on node1 - let slashed_reputation = - node1_network_handle.inner().reputation_by_id(*node0_id).await.unwrap().unwrap(); - slashed_reputation < initial_reputation - }, - ) - .await; + fixture + .network_on(0) + .announce_block(block, Signature::new(U256::from(1), U256::from(1), false)) + .await?; + + // Wait for reputation to decrease + fixture + .check_reputation_on(1) + .of_node(0) + .await? + .with_timeout(Duration::from_secs(5)) + .with_poll_interval(Duration::from_millis(10)) + .eventually_less_than(0) + .await?; + + Ok(()) } /// Tests that peers are penalized for broadcasting blocks with invalid signatures. @@ -340,74 +182,39 @@ async fn can_penalize_peer_for_invalid_signature() -> eyre::Result<()> { let unauthorized_signer = PrivateKeySigner::random().with_chain_id(Some(chain_spec.chain().id())); - let mut test_config = default_sequencer_test_scroll_rollup_node_config(); - test_config.consensus_args.algorithm = ConsensusAlgorithm::SystemContract; - test_config.consensus_args.authorized_signer = Some(authorized_address); - test_config.signer_args.private_key = Some(authorized_signer.clone()); - - // Setup nodes - let (mut nodes, _tasks, _) = - setup_engine(test_config, 2, chain_spec.clone(), false, false).await.unwrap(); - - let node0 = nodes.remove(0); - let node1 = nodes.remove(0); - - // Get handles - let node0_rmn_handle = node0.inner.add_ons_handle.rollup_manager_handle.clone(); - let node0_network_handle = node0_rmn_handle.get_network_handle().await.unwrap(); - let node0_l1_watcher_tx = node0.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let node0_id = node0_network_handle.inner().peer_id(); - - let node1_rnm_handle = node1.inner.add_ons_handle.rollup_manager_handle.clone(); - let node1_network_handle = node1_rnm_handle.get_network_handle().await.unwrap(); - - // Get event streams - let mut node0_events = node0_rmn_handle.get_event_listener().await.unwrap(); - let mut node1_events = node1_rnm_handle.get_event_listener().await.unwrap(); + // Build fixture with SystemContract consensus + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .with_chain_spec(chain_spec) + .block_time(0) + .allow_empty_blocks(true) + .with_consensus_system_contract(authorized_address) + .with_signer(authorized_signer.clone()) + .payload_building_duration(1000) + .build() + .await?; // Set the L1 to synced on the sequencer node - node0_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); - node0_events.next().await; - node0_events.next().await; + fixture.l1().for_node(0).sync().await?; + fixture.expect_event_on(0).l1_synced().await?; // === Phase 1: Test valid block with correct signature === // Have the legitimate sequencer build and sign a block - node0_rmn_handle.build_block(); - - // Wait for the sequencer to build the block - let block0 = - if let Some(ChainOrchestratorEvent::BlockSequenced(block)) = node0_events.next().await { - assert_eq!(block.body.transactions.len(), 0, "Block should have no transactions"); - block - } else { - panic!("Failed to receive block from sequencer"); - }; + let block0 = fixture.build_block().expect_tx_count(0).await_block().await?; - // Node1 should receive and accept the valid block - if let Some(ChainOrchestratorEvent::NewBlockReceived(block_with_peer)) = - node1_events.next().await - { - assert_eq!(block0.hash_slow(), block_with_peer.block.hash_slow()); - - // Verify the signature is from the authorized signer - let hash = sig_encode_hash(&block_with_peer.block); - let recovered = block_with_peer.signature.recover_address_from_prehash(&hash).unwrap(); - assert_eq!(recovered, authorized_address, "Block should be signed by authorized signer"); - } else { - panic!("Failed to receive valid block at follower"); - } + // Wait for node1 to receive and validate the block with correct signature + let received_block = fixture.expect_event_on(1).new_block_received().await?; + assert_eq!(block0.hash_slow(), received_block.hash_slow()); // Wait for successful import - wait_n_events(&mut node1_events, |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), 1) - .await; + fixture.expect_event_on(1).chain_extended(block0.header.number).await?; // === Phase 2: Create and send valid block with unauthorized signer signature === - // Get initial reputation of node0 from node1's perspective - let initial_reputation = - node1_network_handle.inner().reputation_by_id(*node0_id).await.unwrap().unwrap(); - assert_eq!(initial_reputation, 0, "Initial reputation should be zero"); + // Check initial reputation + fixture.check_reputation_on(1).of_node(0).await?.equals(0).await?; // Create a new block manually (we'll reuse the valid block structure but with wrong signature) let mut block1 = block0.clone(); @@ -417,73 +224,69 @@ async fn can_penalize_peer_for_invalid_signature() -> eyre::Result<()> { // Sign the block with the unauthorized signer let block_hash = sig_encode_hash(&block1); - let unauthorized_signature = unauthorized_signer.sign_hash(&block_hash).await.unwrap(); + let unauthorized_signature = unauthorized_signer.sign_hash(&block_hash).await?; // Send the block with invalid signature from node0 to node1 - node0_network_handle.announce_block(block1.clone(), unauthorized_signature); + fixture.network_on(0).announce_block(block1.clone(), unauthorized_signature).await?; // Node1 should receive and process the invalid block - wait_for_event_predicate_5s(&mut node1_events, |e| { - if let ChainOrchestratorEvent::NewBlockReceived(block_with_peer) = e { - assert_eq!(block1.hash_slow(), block_with_peer.block.hash_slow()); - - // Verify the signature is from the unauthorized signer - let hash = sig_encode_hash(&block_with_peer.block); - let recovered = block_with_peer.signature.recover_address_from_prehash(&hash).unwrap(); - return recovered == unauthorized_signer.address(); - } - false - }) - .await?; - - eventually( - Duration::from_secs(5), - Duration::from_millis(100), - "Node0 reputation should be lower after sending block with invalid signature", - || async { - let current_reputation = - node1_network_handle.inner().reputation_by_id(*node0_id).await.unwrap().unwrap(); - current_reputation < initial_reputation - }, - ) - .await; + fixture + .expect_event_on(1) + .timeout(Duration::from_secs(5)) + .extract(|e| { + if let ChainOrchestratorEvent::NewBlockReceived(block_with_peer) = e { + if block1.hash_slow() == block_with_peer.block.hash_slow() { + // Verify the signature is from the unauthorized signer + let hash = sig_encode_hash(&block_with_peer.block); + if let Result::Ok(recovered) = + block_with_peer.signature.recover_address_from_prehash(&hash) + { + return Some(recovered == unauthorized_signer.address()); + } + } + } + None + }) + .await?; + + // Wait for reputation to decrease + fixture + .check_reputation_on(1) + .of_node(0) + .await? + .with_timeout(Duration::from_secs(5)) + .with_poll_interval(Duration::from_millis(100)) + .eventually_less_than(0) + .await?; // === Phase 3: Send valid block with invalid signature === - // Get current reputation of node0 from node1's perspective - let current_reputation = - node1_network_handle.inner().reputation_by_id(*node0_id).await.unwrap().unwrap(); + + // Get current reputation before sending malformed signature + let current_reputation = fixture.check_reputation_on(1).of_node(0).await?.get().await?.unwrap(); let invalid_signature = Signature::new(U256::from(1), U256::from(1), false); // Create a new block with the same structure as before but with an invalid signature. // We need to make sure the block is different so that it is not filtered. block1.header.timestamp += 1; - node0_network_handle.announce_block(block1.clone(), invalid_signature); - - eventually( - Duration::from_secs(5), - Duration::from_millis(100), - "Node0 reputation should be lower after sending block with invalid signature", - || async { - let all_peers = node1_network_handle.inner().get_all_peers().await.unwrap(); - if all_peers.is_empty() { - return true; // No peers to check, assume penalization and peer0 is blocked and - // disconnected - } + fixture.network_on(0).announce_block(block1.clone(), invalid_signature).await?; - let penalized_reputation = - node1_network_handle.inner().reputation_by_id(*node0_id).await.unwrap().unwrap(); - penalized_reputation < current_reputation - }, - ) - .await; + // Wait for the node's 0 reputation to eventually fall. + fixture + .check_reputation_on(1) + .of_node(0) + .await? + .with_timeout(Duration::from_secs(5)) + .with_poll_interval(Duration::from_millis(100)) + .eventually_less_than(current_reputation) + .await?; Ok(()) } #[allow(clippy::large_stack_frames)] #[tokio::test] -async fn can_forward_tx_to_sequencer() { +async fn can_forward_tx_to_sequencer() -> eyre::Result<()> { reth_tracing::init_test_tracing(); // create 2 nodes @@ -589,118 +392,52 @@ async fn can_forward_tx_to_sequencer() { 1, ) .await; + + Ok(()) } #[allow(clippy::large_stack_frames)] #[tokio::test] -async fn can_sequence_and_gossip_transactions() { +async fn can_sequence_and_gossip_transactions() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - // create 2 nodes - let mut sequencer_node_config = default_sequencer_test_scroll_rollup_node_config(); - sequencer_node_config.sequencer_args.block_time = 0; - let follower_node_config = default_test_scroll_rollup_node_config(); + // Create 2 nodes with the TestFixture API + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .block_time(0) + .allow_empty_blocks(true) + .build() + .await?; - // Create the chain spec for scroll mainnet with Euclid v2 activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); - let (mut sequencer_node, _tasks, _) = - setup_engine(sequencer_node_config, 1, chain_spec.clone(), false, false).await.unwrap(); + // Send L1 synced notification to sequencer + fixture.l1().for_node(0).sync().await?; + fixture.expect_event_on(0).l1_synced().await?; - let (mut follower_node, _tasks, wallet) = - setup_engine(follower_node_config, 1, chain_spec, false, false).await.unwrap(); + // Have the sequencer build an empty block + fixture.build_block().expect_tx_count(0).await_block().await?; - let wallet = Arc::new(Mutex::new(wallet)); + // Assert that the follower node has received the block + fixture.expect_event_on(1).chain_extended(1).await?; - // Connect the nodes together. - sequencer_node[0].network.add_peer(follower_node[0].network.record()).await; - follower_node[0].network.next_session_established().await; - sequencer_node[0].network.next_session_established().await; + // Inject a transaction into the follower node's pool + let tx = generate_tx(fixture.wallet.clone()).await; + fixture.inject_tx_on(1, tx).await?; - // generate rollup node manager event streams for each node - let sequencer_rnm_handle = sequencer_node[0].inner.add_ons_handle.rollup_manager_handle.clone(); - let mut sequencer_events = sequencer_rnm_handle.get_event_listener().await.unwrap(); - let sequencer_l1_watcher_tx = - sequencer_node[0].inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let mut follower_events = follower_node[0] - .inner - .add_ons_handle - .rollup_manager_handle - .get_event_listener() - .await - .unwrap(); + // Wait for transaction propagation + tokio::time::sleep(Duration::from_secs(10)).await; - // Send a notification to set the L1 to synced - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); - sequencer_events.next().await; - sequencer_events.next().await; + // Build block on sequencer - should include the transaction gossiped from follower + fixture.build_block().expect_tx_count(1).expect_block_number(2).await_block().await?; - // have the sequencer build an empty block and gossip it to follower - sequencer_rnm_handle.build_block(); + // Assert that the follower node has received the block with the transaction + let received_block = fixture.expect_event_on(1).new_block_received().await?; + assert_eq!(received_block.body.transactions.len(), 1); - // wait for the sequencer to build a block with no transactions - if let Some(ChainOrchestratorEvent::BlockSequenced(block)) = sequencer_events.next().await { - assert_eq!(block.body.transactions.len(), 0); - } else { - panic!("Failed to receive block from rollup node"); - } + // Assert that the block was successfully imported by the follower node + fixture.expect_event_on(1).chain_extended(2).await?; - // assert that the follower node has received the block from the peer - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), - 1, - ) - .await; - - // inject a transaction into the pool of the follower node - let tx = generate_tx(wallet).await; - follower_node[0].rpc.inject_tx(tx).await.unwrap(); - - tokio::time::sleep(tokio::time::Duration::from_secs(10)).await; - - // build block - sequencer_rnm_handle.build_block(); - - // wait for the sequencer to build a block with transactions - wait_n_events( - &mut sequencer_events, - |e| { - if let ChainOrchestratorEvent::BlockSequenced(block) = e { - assert_eq!(block.header.number, 2); - assert_eq!(block.body.transactions.len(), 1); - return true - } - false - }, - 1, - ) - .await; - - // assert that the follower node has received the block from the peer - if let Some(ChainOrchestratorEvent::NewBlockReceived(block_with_peer)) = - follower_events.next().await - { - assert_eq!(block_with_peer.block.body.transactions.len(), 1); - } else { - panic!("Failed to receive block from rollup node"); - } - - // assert that the block was successfully imported by the follower node - wait_n_events( - &mut follower_events, - |e| { - if let ChainOrchestratorEvent::ChainExtended(chain) = e { - assert_eq!(chain.chain.len(), 1); - let block = chain.chain.first().unwrap(); - assert_eq!(block.body.transactions.len(), 1); - true - } else { - false - } - }, - 1, - ) - .await; + Ok(()) } /// We test the bridge from the eth-wire protocol to the scroll-wire protocol. @@ -714,7 +451,7 @@ async fn can_sequence_and_gossip_transactions() { /// The test will send messages from Node 3 to Node 1, which will bridge the messages to Node /// Node 2 will then receive the messages and verify that they are correct. #[tokio::test] -async fn can_bridge_blocks() { +async fn can_bridge_blocks() -> eyre::Result<()> { reth_tracing::init_test_tracing(); // Create the chain spec for scroll dev with Feynman activated and a test genesis. @@ -723,8 +460,7 @@ async fn can_bridge_blocks() { // Setup the bridge node and a standard node. let (mut nodes, tasks, _) = setup_engine(default_test_scroll_rollup_node_config(), 1, chain_spec.clone(), false, false) - .await - .unwrap(); + .await?; let mut bridge_node = nodes.pop().unwrap(); let bridge_peer_id = bridge_node.network.record().id; let bridge_node_l1_watcher_tx = bridge_node.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); @@ -803,13 +539,14 @@ async fn can_bridge_blocks() { assert_eq!(peer_id, bridge_peer_id); assert_eq!(block.hash_slow(), block_1_hash); assert_eq!( - TryInto::::try_into(extra_data.as_ref().windows(65).last().unwrap()) - .unwrap(), + TryInto::::try_into(extra_data.as_ref().windows(65).last().unwrap())?, signature ) } else { panic!("Failed to receive block from scroll-wire network"); } + + Ok(()) } /// Test that when the rollup node manager is shutdown, it consolidates the most recent batch @@ -1212,90 +949,41 @@ async fn can_handle_batch_revert() -> eyre::Result<()> { reth_tracing::init_test_tracing(); let chain_spec = (*SCROLL_MAINNET).clone(); - // Launch a node - let (mut nodes, _tasks, _) = - setup_engine(default_test_scroll_rollup_node_config(), 1, chain_spec.clone(), false, false) - .await?; - let node = nodes.pop().unwrap(); - let handle = node.inner.add_ons_handle.rollup_manager_handle.clone(); - let l1_watcher_tx = node.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - - // Request an event stream from the rollup node manager and manually poll rnm to process the - // event stream request from the handle. - let mut rnm_events = handle.get_event_listener().await?; - - // Load test batches - let raw_calldata_0 = read_to_bytes("./tests/testdata/batch_0_calldata.bin")?; - let batch_0_data = BatchCommitData { - hash: b256!("5AAEB6101A47FC16866E80D77FFE090B6A7B3CF7D988BE981646AB6AEDFA2C42"), - index: 1, - block_number: 18318207, - block_timestamp: 1696935971, - calldata: Arc::new(raw_calldata_0), - blob_versioned_hash: None, - finalized_block_number: None, - }; - let raw_calldata_1 = read_to_bytes("./tests/testdata/batch_1_calldata.bin")?; - let batch_1_data = BatchCommitData { - hash: b256!("AA8181F04F8E305328A6117FA6BC13FA2093A3C4C990C5281DF95A1CB85CA18F"), - index: 2, - block_number: 18318215, - block_timestamp: 1696936000, - calldata: Arc::new(raw_calldata_1), - blob_versioned_hash: None, - finalized_block_number: None, - }; - let revert_batch_data = BatchCommitData { - hash: B256::random(), - index: 2, - block_number: 18318220, - block_timestamp: 1696936500, - calldata: Arc::new(Default::default()), - blob_versioned_hash: None, - finalized_block_number: None, - }; + // Create a follower node + let mut fixture = + TestFixture::builder().followers(1).with_chain_spec(chain_spec).build().await?; // Send the first batch. - l1_watcher_tx.send(Arc::new(L1Notification::BatchCommit(batch_0_data))).await?; + fixture.l1().for_node(0).batch_commit(Some("./tests/testdata/batch_0_calldata.bin"), 1).await?; // Read the first 4 blocks. - loop { - if let Some(ChainOrchestratorEvent::BlockConsolidated(consolidation_outcome)) = - rnm_events.next().await - { - if consolidation_outcome.block_info().block_info.number == 4 { - break - } - } - } + fixture + .expect_event() + .where_event_n(4, |e| matches!(e, ChainOrchestratorEvent::BlockConsolidated(_))) + .await?; // Send the second batch. - l1_watcher_tx.send(Arc::new(L1Notification::BatchCommit(batch_1_data))).await?; + fixture.l1().for_node(0).batch_commit(Some("./tests/testdata/batch_1_calldata.bin"), 2).await?; // Read the next 42 blocks. - loop { - if let Some(ChainOrchestratorEvent::BlockConsolidated(consolidation_outcome)) = - rnm_events.next().await - { - if consolidation_outcome.block_info().block_info.number == 46 { - break - } - } - } + fixture + .expect_event() + .where_event_n(42, |e| matches!(e, ChainOrchestratorEvent::BlockConsolidated(_))) + .await?; - let status = handle.status().await?; + let status = fixture.follower(0).rollup_manager_handle.status().await?; // Assert the forkchoice state is above 4 assert!(status.l2.fcs.head_block_info().number > 4); assert!(status.l2.fcs.safe_block_info().number > 4); // Send the third batch which should trigger the revert. - l1_watcher_tx.send(Arc::new(L1Notification::BatchCommit(revert_batch_data))).await?; + fixture.l1().for_node(0).batch_commit(None, 2).await?; // Wait for the third batch to be proceeded. tokio::time::sleep(Duration::from_millis(300)).await; - let status = handle.status().await?; + let status = fixture.follower(0).rollup_manager_handle.status().await?; // Assert the forkchoice state was reset to 4. assert_eq!(status.l2.fcs.head_block_info().number, 4); @@ -1309,144 +997,105 @@ async fn can_handle_batch_revert() -> eyre::Result<()> { async fn can_handle_l1_message_reorg() -> eyre::Result<()> { reth_tracing::init_test_tracing(); color_eyre::install()?; - let chain_spec = (*SCROLL_DEV).clone(); // Launch 2 nodes: node0=sequencer and node1=follower. - let config = default_sequencer_test_scroll_rollup_node_config(); - let (mut nodes, _tasks, _) = setup_engine(config, 2, chain_spec.clone(), false, false).await?; - let node0 = nodes.remove(0); - let node1 = nodes.remove(0); - - // Get handles - let node0_rnm_handle = node0.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node0_rnm_events = node0_rnm_handle.get_event_listener().await?; - let node0_l1_watcher_tx = node0.inner.add_ons_handle.l1_watcher_tx.as_ref().unwrap(); - - let node1_rnm_handle = node1.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node1_rnm_events = node1_rnm_handle.get_event_listener().await?; - let node1_l1_watcher_tx = node1.inner.add_ons_handle.l1_watcher_tx.as_ref().unwrap(); + let mut fixture = TestFixture::builder().sequencer().followers(1).block_time(0).build().await?; // Set L1 synced on both the sequencer and follower nodes. - node0_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; - node1_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; + fixture.l1().sync().await?; + fixture.expect_event_on_all_nodes().l1_synced().await?; // Let the sequencer build 10 blocks before performing the reorg process. let mut reorg_block = None; for i in 1..=10 { - node0_rnm_handle.build_block(); - let b = wait_for_block_sequenced_5s(&mut node0_rnm_events, i).await?; + let b = fixture.build_block().expect_block_number(i).await_block().await?; tracing::info!(target: "scroll::test", block_number = ?b.header.number, block_hash = ?b.header.hash_slow(), "Sequenced block"); reorg_block = Some(b); } // Assert that the follower node has received all 10 blocks from the sequencer node. - wait_for_block_imported_5s(&mut node1_rnm_events, 10).await?; - - // Send a L1 message and wait for it to be indexed. - let l1_message_notification = L1Notification::L1Message { - message: TxL1Message { - queue_index: 0, - gas_limit: 21000, - to: Default::default(), - value: Default::default(), - sender: address!("f39Fd6e51aad88F6F4ce6aB8827279cffFb92266"), - input: Default::default(), - }, - block_number: 10, - block_timestamp: 0, - }; + fixture + .expect_event_on(1) + .where_event_n(10, |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_))) + .await?; - // Send the L1 message to the sequencer node. - node0_l1_watcher_tx.send(Arc::new(l1_message_notification.clone())).await?; - node0_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(10))).await?; - wait_for_event_5s(&mut node0_rnm_events, ChainOrchestratorEvent::L1MessageCommitted(0)).await?; - wait_for_event_5s(&mut node0_rnm_events, ChainOrchestratorEvent::NewL1Block(10)).await?; + // Send the L1 message to the nodes. + fixture + .l1() + .add_message() + .at_block(10) + .sender(address!("f39Fd6e51aad88F6F4ce6aB8827279cffFb92266")) + .send() + .await?; + fixture.l1().new_block(10).await?; - // Send L1 the L1 message to follower node. - node1_l1_watcher_tx.send(Arc::new(l1_message_notification)).await?; - node1_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(10))).await?; - wait_for_event_5s(&mut node1_rnm_events, ChainOrchestratorEvent::L1MessageCommitted(0)).await?; - wait_for_event_5s(&mut node1_rnm_events, ChainOrchestratorEvent::NewL1Block(10)).await?; + // Expect the events to reach all nodes. + fixture.expect_event_on_all_nodes().l1_message_committed().await?; + fixture.expect_event_on_all_nodes().new_l1_block().await?; // Build block that contains the L1 message. - let mut block11_before_reorg = None; - node0_rnm_handle.build_block(); - wait_for_event_predicate_5s(&mut node0_rnm_events, |e| { - if let ChainOrchestratorEvent::BlockSequenced(block) = e { - if block.header.number == 11 && - block.body.transactions.len() == 1 && - block.body.transactions.iter().any(|tx| tx.is_l1_message()) - { - block11_before_reorg = Some(block.header.hash_slow()); - return true; - } - } - - false - }) - .await?; + let block11_before_reorg = fixture + .build_block() + .expect_block_number(11) + .expect_l1_message_count(1) + .await_block() + .await?; for i in 12..=15 { - node0_rnm_handle.build_block(); - wait_for_block_sequenced_5s(&mut node0_rnm_events, i).await?; + fixture.build_block().expect_block_number(i).await_block().await?; } // Assert that the follower node has received the latest block from the sequencer node. - wait_for_block_imported_5s(&mut node1_rnm_events, 15).await?; + fixture + .expect_event_on(1) + .where_event_n(5, |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_))) + .await?; // Assert both nodes are at block 15. - let node0_latest_block = latest_block(&node0).await?; - assert_eq!(node0_latest_block.header.number, 15); - assert_eq!( - node0_latest_block.header.hash_slow(), - latest_block(&node1).await?.header.hash_slow() - ); + let sequencer_latest_block = fixture.get_sequencer_block().await?; + let follower_latest_block = fixture.get_block(1).await?; + assert_eq!(sequencer_latest_block.header.number, 15); + assert_eq!(sequencer_latest_block.header.hash_slow(), follower_latest_block.header.hash_slow()); // Issue and wait for the reorg. - node0_l1_watcher_tx.send(Arc::new(L1Notification::Reorg(9))).await?; - - let reorg_block = reorg_block.as_ref().map(Into::::into); - wait_for_event_5s( - &mut node0_rnm_events, - ChainOrchestratorEvent::L1Reorg { - l1_block_number: 9, - queue_index: Some(0), - l2_head_block_info: reorg_block, - l2_safe_block_info: None, - }, - ) - .await?; - node1_l1_watcher_tx.send(Arc::new(L1Notification::Reorg(9))).await?; - wait_for_event_5s( - &mut node1_rnm_events, - ChainOrchestratorEvent::L1Reorg { - l1_block_number: 9, - queue_index: Some(0), - l2_head_block_info: reorg_block, - l2_safe_block_info: None, - }, - ) - .await?; + fixture.l1().reorg_to(9).await?; + fixture + .expect_event_on_all_nodes() + .where_event(|e| { + matches!( + e, + ChainOrchestratorEvent::L1Reorg { + l1_block_number: 9, + queue_index: Some(0), + l2_head_block_info: b, + l2_safe_block_info: None, + } + if *b == reorg_block.as_ref().map(|b| b.into()) + ) + }) + .await?; + + // Wait for block to handle the reorg + tokio::time::sleep(Duration::from_secs(1)).await; // Assert both nodes are at block 10. - assert_latest_block_on_rpc_by_number(&node0, 10).await; - assert_latest_block_on_rpc_by_number(&node1, 10).await; + assert_eq!(fixture.get_sequencer_block().await?.header.number, 10); + assert_eq!(fixture.get_block(1).await?.header.number, 10); // Since the L1 reorg reverted the L1 message included in block 11, the sequencer // should produce a new block at height 11. - node0_rnm_handle.build_block(); - wait_for_block_sequenced_5s(&mut node0_rnm_events, 11).await?; + fixture.build_block().expect_block_number(11).await_block().await?; // Assert that the follower node has received the new block from the sequencer node. - wait_for_block_imported_5s(&mut node1_rnm_events, 11).await?; + fixture.expect_event_on(1).chain_extended(11).await?; // Assert both nodes are at block 11. - assert_latest_block_on_rpc_by_number(&node0, 11).await; - let node0_latest_block = latest_block(&node0).await?; - assert_latest_block_on_rpc_by_hash(&node1, node0_latest_block.header.hash_slow()).await; + let sequencer_block11 = fixture.get_sequencer_block().await?; + assert_eq!(sequencer_block11.header.number, 11); + assert_eq!(fixture.get_block(1).await?.header.number, 11); // Assert that block 11 has a different hash after the reorg. - assert_ne!(block11_before_reorg.unwrap(), node0_latest_block.header.hash_slow()); + assert_ne!(block11_before_reorg.hash_slow(), sequencer_block11.header.hash_slow()); Ok(()) } @@ -1457,79 +1106,39 @@ async fn can_handle_l1_message_reorg() -> eyre::Result<()> { async fn requeues_transactions_after_l1_reorg() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let chain_spec = (*SCROLL_DEV).clone(); - let mut config = default_sequencer_test_scroll_rollup_node_config(); - config.sequencer_args.auto_start = false; - config.sequencer_args.block_time = 0; + let mut sequencer = + TestFixture::builder().sequencer().auto_start(false).block_time(0).build().await?; - let (mut nodes, _tasks, wallet) = - setup_engine(config, 1, chain_spec.clone(), false, false).await?; - let node = nodes.pop().expect("node exists"); - - let rnm_handle = node.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut events = rnm_handle.get_event_listener().await?; - let l1_watcher_tx = node.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - - l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; - let _ = events.next().await; - let _ = events.next().await; + // Set the l1 as being synced. + sequencer.l1().sync().await?; // Let the sequencer build 10 blocks. for i in 1..=10 { - rnm_handle.build_block(); - let b = wait_for_block_sequenced_5s(&mut events, i).await?; + let b = sequencer.build_block().expect_block_number(i).await_block().await?; tracing::info!(target: "scroll::test", block_number = ?b.header.number, block_hash = ?b.header.hash_slow(), "Sequenced block"); } // Send a L1 message and wait for it to be indexed. - let l1_message_notification = L1Notification::L1Message { - message: TxL1Message { - queue_index: 0, - gas_limit: 21000, - to: Default::default(), - value: Default::default(), - sender: Default::default(), - input: Default::default(), - }, - block_number: 2, - block_timestamp: 0, - }; + sequencer.l1().add_message().at_block(2).send().await?; + sequencer.expect_event().l1_message_committed().await?; + + // Send the L1 block which finalizes the L1 message. + sequencer.l1().new_block(2).await?; + sequencer.expect_event().new_l1_block().await?; // Build a L2 block with L1 message, so we can revert it later. - l1_watcher_tx.send(Arc::new(l1_message_notification.clone())).await?; - l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(2))).await?; - wait_for_event_5s(&mut events, ChainOrchestratorEvent::L1MessageCommitted(0)).await?; - wait_for_event_5s(&mut events, ChainOrchestratorEvent::NewL1Block(2)).await?; - rnm_handle.build_block(); - wait_for_block_sequenced_5s(&mut events, 11).await?; + sequencer.build_block().await_block().await?; // Inject a user transaction and force the sequencer to include it in the next block - let wallet = Arc::new(Mutex::new(wallet)); - let tx = generate_tx(wallet.clone()).await; - let injected_tx_bytes: Vec = tx.clone().into(); - node.rpc.inject_tx(tx).await?; - - rnm_handle.build_block(); - let block_with_tx = wait_for_block_sequenced_5s(&mut events, 12).await?; - assert!( - block_contains_raw_tx(&block_with_tx, &injected_tx_bytes), - "block 11 should contain the injected transaction before the reorg" - ); + let hash = sequencer.inject_transfer().await?; + sequencer.build_block().expect_tx(hash).expect_tx_count(1).await_block().await?; // Trigger an L1 reorg that reverts the block containing the transaction - l1_watcher_tx.send(Arc::new(L1Notification::Reorg(1))).await?; - wait_for_event_predicate_5s(&mut events, |event| { - matches!(event, ChainOrchestratorEvent::L1Reorg { l1_block_number: 1, .. }) - }) - .await?; + sequencer.l1().reorg_to(1).await?; + sequencer.expect_event().l1_reorg().await?; // Build the next block – the reverted transaction should have been requeued - rnm_handle.build_block(); - let reseq_block = wait_for_block_sequenced_5s(&mut events, 11).await?; - assert!( - block_contains_raw_tx(&reseq_block, &injected_tx_bytes), - "re-sequenced block should contain the reverted transaction" - ); + sequencer.build_block().expect_tx(hash).expect_tx_count(1).await_block().await?; Ok(()) } @@ -1541,58 +1150,48 @@ async fn requeues_transactions_after_l1_reorg() -> eyre::Result<()> { async fn requeues_transactions_after_update_fcs_head() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let chain_spec = (*SCROLL_DEV).clone(); - let mut config = default_sequencer_test_scroll_rollup_node_config(); - config.sequencer_args.auto_start = false; - config.sequencer_args.block_time = 0; + let mut sequencer = + TestFixture::builder().sequencer().auto_start(false).block_time(0).build().await?; - let (mut nodes, _tasks, wallet) = - setup_engine(config, 1, chain_spec.clone(), false, false).await?; - let node = nodes.pop().expect("node exists"); - - let handle = node.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut events = handle.get_event_listener().await?; - - // Set L1 synced to allow sequencing. - let l1_watcher_tx = node.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; - let _ = events.next().await; - let _ = events.next().await; + // Set the l1 as being synced. + sequencer.l1().sync().await?; // Build a few blocks and remember block #4 as the future reset target. let mut target_head: Option = None; for i in 1..=4 { - handle.build_block(); - let b = wait_for_block_sequenced_5s(&mut events, i).await?; + let b = sequencer.build_block().expect_block_number(i as u64).await_block().await?; if i == 4 { target_head = Some(BlockInfo { number: b.header.number, hash: b.header.hash_slow() }); } } // Inject a user transaction and include it in block 5. - let wallet = Arc::new(Mutex::new(wallet)); - let tx = generate_tx(wallet.clone()).await; - let injected_tx_bytes: Vec = tx.clone().into(); - node.rpc.inject_tx(tx).await?; - - handle.build_block(); - let block_with_tx = wait_for_block_sequenced_5s(&mut events, 5).await?; - assert!( - block_contains_raw_tx(&block_with_tx, &injected_tx_bytes), - "block 5 should contain the injected transaction before the FCS reset", - ); + let hash = sequencer.inject_transfer().await?; + sequencer + .build_block() + .expect_block_number(5) + .expect_tx(hash) + .expect_tx_count(1) + .await_block() + .await?; // Reset FCS head back to block 4; this should collect block 5's txs and requeue them. let head = target_head.expect("target head exists"); - handle.update_fcs_head(head).await.expect("update_fcs_head should succeed"); + sequencer + .sequencer() + .rollup_manager_handle + .update_fcs_head(head) + .await + .expect("update_fcs_head should succeed"); // Build the next block – the reverted transaction should have been requeued and included. - handle.build_block(); - let reseq_block = wait_for_block_sequenced_5s(&mut events, 5).await?; - assert!( - block_contains_raw_tx(&reseq_block, &injected_tx_bytes), - "re-sequenced block should contain the reverted transaction after FCS reset", - ); + sequencer + .build_block() + .expect_block_number(5) + .expect_tx(hash) + .expect_tx_count(1) + .await_block() + .await?; Ok(()) } @@ -1681,19 +1280,12 @@ async fn test_custom_genesis_block_production_and_propagation() -> eyre::Result< let custom_chain_spec = Arc::new(ScrollChainSpec::from_custom_genesis(custom_genesis)); // Launch 2 nodes: node0=sequencer and node1=follower. - let config = default_sequencer_test_scroll_rollup_node_config(); - let (mut nodes, _tasks, _) = - setup_engine(config, 2, custom_chain_spec.clone(), false, false).await?; - let node0 = nodes.remove(0); - let node1 = nodes.remove(0); - - // Get handles - let node0_rnm_handle = node0.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node0_rnm_events = node0_rnm_handle.get_event_listener().await?; - let node0_l1_watcher_tx = node0.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - - let node1_rnm_handle = node1.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node1_rnm_events = node1_rnm_handle.get_event_listener().await?; + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .with_chain_spec(custom_chain_spec.clone()) + .build() + .await?; // Verify the genesis hash is different from all predefined networks assert_ne!(custom_chain_spec.genesis_hash(), SCROLL_DEV.genesis_hash()); @@ -1703,33 +1295,40 @@ async fn test_custom_genesis_block_production_and_propagation() -> eyre::Result< // Verify both nodes start with the same genesis hash from the custom chain spec assert_eq!( custom_chain_spec.genesis_hash(), - node0.block_hash(0), + fixture.get_sequencer_block().await?.header.hash_slow(), "Node0 should have the custom genesis hash" ); assert_eq!( custom_chain_spec.genesis_hash(), - node1.block_hash(0), + fixture.get_block(1).await?.header.hash_slow(), "Node1 should have the custom genesis hash" ); // Set L1 synced on sequencer node - node0_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; + fixture.l1().for_node(0).sync().await?; + fixture.expect_event().l1_synced().await?; // Let the sequencer build 10 blocks. - for i in 1..=10 { - node0_rnm_handle.build_block(); - let b = wait_for_block_sequenced_5s(&mut node0_rnm_events, i).await?; + for _ in 1..=10 { + let b = fixture.build_block().await_block().await?; tracing::info!(target: "scroll::test", block_number = ?b.header.number, block_hash = ?b.header.hash_slow(), "Sequenced block"); } // Assert that the follower node has received all 10 blocks from the sequencer node. - wait_for_block_imported_5s(&mut node1_rnm_events, 10).await?; + fixture + .expect_event_on(1) + .where_event_n(10, |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_))) + .await?; // Assert both nodes have the same latest block hash. - assert_eq!(latest_block(&node0).await?.header.number, 10, "Node0 should be at block 10"); assert_eq!( - latest_block(&node0).await?.header.hash_slow(), - latest_block(&node1).await?.header.hash_slow(), + fixture.get_sequencer_block().await?.header.number, + 10, + "Node0 should be at block 10" + ); + assert_eq!( + fixture.get_sequencer_block().await?.header.hash_slow(), + fixture.get_block(1).await?.header.hash_slow(), "Both nodes should have the same latest block hash" ); @@ -1740,67 +1339,55 @@ async fn test_custom_genesis_block_production_and_propagation() -> eyre::Result< async fn can_rpc_enable_disable_sequencing() -> eyre::Result<()> { reth_tracing::init_test_tracing(); color_eyre::install()?; - let chain_spec = (*SCROLL_DEV).clone(); // Launch sequencer node with automatic sequencing enabled. - let mut config = default_sequencer_test_scroll_rollup_node_config(); - config.sequencer_args.block_time = 40; // Enable automatic block production - config.sequencer_args.auto_start = true; - - let (mut nodes, _tasks, _) = setup_engine(config, 2, chain_spec.clone(), false, false).await?; - let node0 = nodes.remove(0); - let node1 = nodes.remove(0); - - // Get handles - let node0_rnm_handle = node0.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node0_rnm_events = node0_rnm_handle.get_event_listener().await?; - let node0_l1_watcher_tx = node0.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - - let node1_rnm_handle = node1.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node1_rnm_events = node1_rnm_handle.get_event_listener().await?; + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .block_time(40) + .with_sequencer_auto_start(true) + .build() + .await?; // Set L1 synced - node0_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; - - // Create RPC client - let client0 = node0.rpc_client().expect("RPC client should be available"); + fixture.l1().sync().await?; // Test that sequencing is initially enabled (blocks produced automatically) tokio::time::sleep(Duration::from_millis(100)).await; - assert_ne!(latest_block(&node0).await?.header.number, 0, "Should produce blocks"); + assert_ne!(fixture.get_sequencer_block().await?.header.number, 0, "Should produce blocks"); // Disable automatic sequencing via RPC - let result = RollupNodeExtApiClient::disable_automatic_sequencing(&client0).await?; + let client = fixture.sequencer().node.rpc_client().expect("Should have rpc client"); + let result = RollupNodeExtApiClient::disable_automatic_sequencing(&client).await?; assert!(result, "Disable automatic sequencing should return true"); // Wait a bit and verify no more blocks are produced automatically. // +1 blocks is okay due to still being processed - let block_num_before_wait = latest_block(&node0).await?.header.number; + let block_num_before_wait = fixture.get_sequencer_block().await?.header.number; tokio::time::sleep(Duration::from_millis(300)).await; - let block_num_after_wait = latest_block(&node0).await?.header.number; + let block_num_after_wait = fixture.get_sequencer_block().await?.header.number; assert!( (block_num_before_wait..=block_num_before_wait + 1).contains(&block_num_after_wait), "No blocks should be produced automatically after disabling" ); // Make sure follower is at same block - wait_for_block_imported_5s(&mut node1_rnm_events, block_num_after_wait).await?; - assert_eq!(block_num_after_wait, latest_block(&node1).await?.header.number); + fixture.expect_event_on(1).chain_extended(block_num_after_wait).await?; + assert_eq!(block_num_after_wait, fixture.get_block(1).await?.header.number); // Verify manual block building still works - node0_rnm_handle.build_block(); - wait_for_block_sequenced_5s(&mut node0_rnm_events, block_num_after_wait + 1).await?; + fixture.build_block().expect_block_number(block_num_after_wait + 1).await_block().await?; // Wait for the follower to import the block - wait_for_block_imported_5s(&mut node1_rnm_events, block_num_after_wait + 1).await?; + fixture.expect_event_on(1).chain_extended(block_num_after_wait + 1).await?; // Enable sequencing again - let result = RollupNodeExtApiClient::enable_automatic_sequencing(&client0).await?; + let result = RollupNodeExtApiClient::enable_automatic_sequencing(&client).await?; assert!(result, "Enable automatic sequencing should return true"); // Make sure automatic sequencing resumes - wait_for_block_sequenced_5s(&mut node0_rnm_events, block_num_after_wait + 2).await?; - wait_for_block_imported_5s(&mut node1_rnm_events, block_num_after_wait + 2).await?; + fixture.expect_event().block_sequenced(block_num_after_wait + 2).await?; + fixture.expect_event_on(1).chain_extended(block_num_after_wait + 2).await?; Ok(()) } @@ -1832,111 +1419,92 @@ async fn can_rpc_enable_disable_sequencing() -> eyre::Result<()> { async fn can_reject_l2_block_with_unknown_l1_message() -> eyre::Result<()> { reth_tracing::init_test_tracing(); color_eyre::install()?; - let chain_spec = (*SCROLL_DEV).clone(); // Launch 2 nodes: node0=sequencer and node1=follower. - let config = default_sequencer_test_scroll_rollup_node_config(); - let (mut nodes, _tasks, _) = setup_engine(config, 2, chain_spec.clone(), false, false).await?; - let node0 = nodes.remove(0); - let node1 = nodes.remove(0); - - // Get handles - let node0_rnm_handle = node0.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node0_rnm_events = node0_rnm_handle.get_event_listener().await?; - let node0_l1_watcher_tx = node0.inner.add_ons_handle.l1_watcher_tx.as_ref().unwrap(); - - let node1_rnm_handle = node1.inner.add_ons_handle.rollup_manager_handle.clone(); - let mut node1_rnm_events = node1_rnm_handle.get_event_listener().await?; - let node1_l1_watcher_tx = node1.inner.add_ons_handle.l1_watcher_tx.as_ref().unwrap(); + let mut fixture = TestFixture::builder().sequencer().followers(1).build().await?; // Set L1 synced - node0_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; - node1_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await?; + fixture.l1().sync().await?; + fixture.expect_event_on_all_nodes().l1_synced().await?; // Let the sequencer build 10 blocks before performing the reorg process. for i in 1..=10 { - node0_rnm_handle.build_block(); - let b = wait_for_block_sequenced_5s(&mut node0_rnm_events, i).await?; + let b = fixture.build_block().expect_block_number(i).await_block().await?; tracing::info!(target: "scroll::test", block_number = ?b.header.number, block_hash = ?b.header.hash_slow(), "Sequenced block") } // Assert that the follower node has received all 10 blocks from the sequencer node. - wait_for_block_imported_5s(&mut node1_rnm_events, 10).await?; - - // Send a L1 message and wait for it to be indexed. - let l1_message_notification = L1Notification::L1Message { - message: TxL1Message { - queue_index: 0, - gas_limit: 21000, - to: Default::default(), - value: Default::default(), - sender: address!("f39Fd6e51aad88F6F4ce6aB8827279cffFb92266"), - input: Default::default(), - }, - block_number: 10, - block_timestamp: 0, - }; + fixture.expect_event_on(1).chain_extended(10).await?; // Send the L1 message to the sequencer node but not to follower node. - node0_l1_watcher_tx.send(Arc::new(l1_message_notification.clone())).await?; - node0_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(10))).await?; - wait_for_event_5s(&mut node0_rnm_events, ChainOrchestratorEvent::L1MessageCommitted(0)).await?; - wait_for_event_5s(&mut node0_rnm_events, ChainOrchestratorEvent::NewL1Block(10)).await?; + fixture + .l1() + .for_node(0) + .add_message() + .at_block(10) + .sender(address!("f39Fd6e51aad88F6F4ce6aB8827279cffFb92266")) + .value(0) + .to(Address::ZERO) + .send() + .await?; + fixture.expect_event().l1_message_committed().await?; - // Build block that contains the L1 message. - node0_rnm_handle.build_block(); - wait_for_event_predicate_5s(&mut node0_rnm_events, |e| { - if let ChainOrchestratorEvent::BlockSequenced(block) = e { - if block.header.number == 11 && - block.body.transactions.len() == 1 && - block.body.transactions.iter().any(|tx| tx.is_l1_message()) - { - return true; - } - } + fixture.l1().for_node(0).new_block(10).await?; + fixture.expect_event().new_l1_block().await?; - false - }) - .await?; + // Build block that contains the L1 message. + fixture.build_block().expect_block_number(11).expect_l1_message().await_block().await?; for i in 12..=15 { - node0_rnm_handle.build_block(); - wait_for_block_sequenced_5s(&mut node0_rnm_events, i).await?; + fixture.build_block().expect_block_number(i).await_block().await?; } - wait_for_event_5s( - &mut node1_rnm_events, - ChainOrchestratorEvent::L1MessageNotFoundInDatabase(L1MessageKey::TransactionHash(b256!( - "0x0a2f8e75392ab51a26a2af835042c614eb141cd934fe1bdd4934c10f2fe17e98" - ))), - ) - .await?; + fixture + .expect_event_on(1) + .where_event(|e| { + matches!( + e, + ChainOrchestratorEvent::L1MessageNotFoundInDatabase(L1MessageKey::TransactionHash( + hash + )) if hash == &b256!("0x0a2f8e75392ab51a26a2af835042c614eb141cd934fe1bdd4934c10f2fe17e98") + ) + }) + .await?; // follower node should not import block 15 // follower node doesn't know about the L1 message so stops processing the chain at block 10 - assert_eq!(latest_block(&node1).await?.header.number, 10); + assert_eq!(fixture.get_block(1).await?.header.number, 10); // Finally send L1 the L1 message to follower node. - node1_l1_watcher_tx.send(Arc::new(l1_message_notification)).await?; - node1_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(10))).await?; - wait_for_event_5s(&mut node1_rnm_events, ChainOrchestratorEvent::L1MessageCommitted(0)).await?; - wait_for_event_5s(&mut node1_rnm_events, ChainOrchestratorEvent::NewL1Block(10)).await?; + fixture + .l1() + .for_node(1) + .add_message() + .at_block(10) + .sender(address!("f39Fd6e51aad88F6F4ce6aB8827279cffFb92266")) + .value(0) + .to(Address::ZERO) + .send() + .await?; + fixture.expect_event_on(1).l1_message_committed().await?; + + fixture.l1().for_node(1).new_block(10).await?; + fixture.expect_event_on(1).new_l1_block().await?; // Produce another block and send to follower node. - node0_rnm_handle.build_block(); - wait_for_block_sequenced_5s(&mut node0_rnm_events, 16).await?; + fixture.build_block().expect_block_number(16).await_block().await?; // Assert that the follower node has received the latest block from the sequencer node and // processed the missing chain before. // This is possible now because it has received the L1 message. - wait_for_block_imported_5s(&mut node1_rnm_events, 16).await?; + fixture.expect_event_on(1).chain_extended(16).await?; // Assert both nodes are at block 16. - let node0_latest_block = latest_block(&node0).await?; + let node0_latest_block = fixture.get_sequencer_block().await?; assert_eq!(node0_latest_block.header.number, 16); assert_eq!( node0_latest_block.header.hash_slow(), - latest_block(&node1).await?.header.hash_slow() + fixture.get_block(1).await?.header.hash_slow() ); Ok(()) @@ -1947,30 +1515,20 @@ async fn can_gossip_over_eth_wire() -> eyre::Result<()> { reth_tracing::init_test_tracing(); // Create the chain spec for scroll dev with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); - - let mut config = default_sequencer_test_scroll_rollup_node_config(); - config.sequencer_args.block_time = 40; - config.sequencer_args.auto_start = true; - - // Setup the rollup node manager. - let (mut nodes, _tasks, _) = - setup_engine(config, 2, chain_spec.clone(), false, false).await.unwrap(); - let follower = nodes.pop().unwrap(); - let sequencer = nodes.pop().unwrap(); + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .with_sequencer_auto_start(true) + .block_time(40) + .build() + .await?; // Set the L1 synced on the sequencer node to start block production. - let mut sequencer_events = - sequencer.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await.unwrap(); - let sequencer_l1_notification_tx = - sequencer.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); + fixture.l1().for_node(0).sync().await?; + fixture.expect_event().l1_synced().await?; - // Set the L1 synced on the sequencer node to start block production. - sequencer_l1_notification_tx.send(Arc::new(L1Notification::Synced)).await?; - sequencer_events.next().await; - sequencer_events.next().await; - - let mut eth_wire_blocks = follower.inner.network.eth_wire_block_listener().await?; + let mut eth_wire_blocks = + fixture.follower(0).node.inner.network.eth_wire_block_listener().await?; if let Some(block) = eth_wire_blocks.next().await { println!("Received block from eth-wire network: {block:?}"); @@ -1995,58 +1553,41 @@ async fn signer_rotation() -> eyre::Result<()> { let signer_2 = PrivateKeySigner::random().with_chain_id(Some(chain_spec.chain().id())); let signer_2_address = signer_2.address(); - let mut sequencer_1_config = default_sequencer_test_scroll_rollup_node_config(); - - sequencer_1_config.test = false; - sequencer_1_config.consensus_args.algorithm = ConsensusAlgorithm::SystemContract; - sequencer_1_config.consensus_args.authorized_signer = Some(signer_1_address); - sequencer_1_config.signer_args.private_key = Some(signer_1); - sequencer_1_config.sequencer_args.block_time = 40; - sequencer_1_config.sequencer_args.auto_start = true; - sequencer_1_config.network_args.enable_eth_scroll_wire_bridge = false; - - let mut sequencer_2_config = default_sequencer_test_scroll_rollup_node_config(); - sequencer_2_config.test = false; - sequencer_2_config.consensus_args.algorithm = ConsensusAlgorithm::SystemContract; - sequencer_2_config.consensus_args.authorized_signer = Some(signer_1_address); - sequencer_2_config.signer_args.private_key = Some(signer_2); - sequencer_2_config.sequencer_args.block_time = 40; - sequencer_2_config.sequencer_args.auto_start = true; - sequencer_2_config.network_args.enable_eth_scroll_wire_bridge = false; - - // Setup two sequencer nodes. - let (mut nodes, _tasks, _) = - setup_engine(sequencer_1_config, 2, chain_spec.clone(), false, false).await.unwrap(); - let follower = nodes.pop().unwrap(); - let mut sequencer_1 = nodes.pop().unwrap(); - let (mut nodes, _tasks, _) = - setup_engine(sequencer_2_config, 1, chain_spec.clone(), false, false).await.unwrap(); - let mut sequencer_2 = nodes.pop().unwrap(); + let mut fixture1 = TestFixture::builder() + .sequencer() + .followers(1) + .with_test(false) + .with_consensus_system_contract(signer_1_address) + .with_signer(signer_1) + .with_sequencer_auto_start(true) + .with_eth_scroll_bridge(false) + .block_time(40) + .build() + .await?; - // Create an L1 - let follower_l1_notification_tx = follower.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let sequencer_1_l1_notification_tx = - sequencer_1.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let sequencer_2_l1_notification_tx = - sequencer_2.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); + let mut fixture2 = TestFixture::builder() + .sequencer() + .with_test(false) + .with_consensus_system_contract(signer_1_address) + .with_signer(signer_2) + .with_sequencer_auto_start(true) + .with_eth_scroll_bridge(false) + .block_time(40) + .build() + .await?; // Set the L1 synced on both nodes to start block production. - sequencer_1_l1_notification_tx.send(Arc::new(L1Notification::Synced)).await?; - sequencer_2_l1_notification_tx.send(Arc::new(L1Notification::Synced)).await?; - - // Create a follower event stream. - let mut follower_events = - follower.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await.unwrap(); - let mut sequencer_2_events = - sequencer_2.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await.unwrap(); + fixture1.l1().for_node(0).sync().await?; + fixture2.l1().for_node(0).sync().await?; // connect the two sequencers - sequencer_1.connect(&mut sequencer_2).await; + fixture1.sequencer().node.connect(&mut fixture2.sequencer().node).await; - for _ in 0..5 { - wait_n_events( - &mut follower_events, - |event| { + // wait for 5 blocks to be produced. + for i in 1..=5 { + fixture1 + .expect_event_on(1) + .where_event(|event| { if let ChainOrchestratorEvent::NewBlockReceived(block) = event { let signature = block.signature; let hash = sig_encode_hash(&block.block); @@ -2056,45 +1597,22 @@ async fn signer_rotation() -> eyre::Result<()> { } else { false } - }, - 1, - ) - .await; - wait_n_events( - &mut follower_events, - |event| matches!(event, ChainOrchestratorEvent::ChainExtended(_)), - 1, - ) - .await; + }) + .await?; + fixture1.expect_event_on(1).chain_extended(i).await?; } - wait_n_events( - &mut sequencer_2_events, - |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), - 5, - ) - .await; + fixture2.expect_event().chain_extended(5).await?; // now update the authorized signer to sequencer 2 - follower_l1_notification_tx - .send(Arc::new(L1Notification::Consensus(ConsensusUpdate::AuthorizedSigner( - signer_2_address, - )))) - .await?; - sequencer_1_l1_notification_tx - .send(Arc::new(L1Notification::Consensus(ConsensusUpdate::AuthorizedSigner( - signer_2_address, - )))) - .await?; - sequencer_2_l1_notification_tx - .send(Arc::new(L1Notification::Consensus(ConsensusUpdate::AuthorizedSigner( - signer_2_address, - )))) - .await?; + fixture1.l1().signer_update(signer_2_address).await?; + fixture2.l1().signer_update(signer_2_address).await?; - wait_n_events( - &mut follower_events, - |event| { + tokio::time::sleep(Duration::from_secs(1)).await; + + fixture1 + .expect_event_on(1) + .where_event_n(5, |event| { if let ChainOrchestratorEvent::NewBlockReceived(block) = event { let signature = block.signature; let hash = sig_encode_hash(&block.block); @@ -2104,10 +1622,8 @@ async fn signer_rotation() -> eyre::Result<()> { } else { false } - }, - 5, - ) - .await; + }) + .await?; Ok(()) } @@ -2118,136 +1634,6 @@ pub fn read_to_bytes>(path: P) -> eyre::Result Ok(Bytes::from_str(&std::fs::read_to_string(path)?)?) } -async fn latest_block( - node: &NodeHelperType< - ScrollRollupNode, - BlockchainProvider>, - >, -) -> eyre::Result> { - node.rpc - .inner - .eth_api() - .block_by_number(BlockNumberOrTag::Latest, false) - .await? - .ok_or_else(|| eyre::eyre!("Latest block not found")) -} - -async fn wait_for_block_sequenced( - events: &mut EventStream, - block_number: u64, - timeout: Duration, -) -> eyre::Result { - let mut block = None; - - wait_for_event_predicate( - events, - |e| { - if let ChainOrchestratorEvent::BlockSequenced(b) = e { - if b.header.number == block_number { - block = Some(b); - return true; - } - } - - false - }, - timeout, - ) - .await?; - - block.ok_or_else(|| eyre::eyre!("Block with number {block_number} was not sequenced")) -} - -async fn wait_for_block_sequenced_5s( - events: &mut EventStream, - block_number: u64, -) -> eyre::Result { - wait_for_block_sequenced(events, block_number, Duration::from_secs(5)).await -} - -async fn wait_for_chain_extended( - events: &mut EventStream, - block_number: u64, - timeout: Duration, -) -> eyre::Result { - let mut block = None; - - wait_for_event_predicate( - events, - |e| { - if let ChainOrchestratorEvent::ChainExtended(b) = e { - let b = &b.chain[0]; - if b.header.number == block_number { - block = Some(b.clone()); - return true; - } - } - - false - }, - timeout, - ) - .await?; - - block.ok_or_else(|| eyre::eyre!("Block with number {block_number} was not imported")) -} - -async fn wait_for_block_imported_5s( - events: &mut EventStream, - block_number: u64, -) -> eyre::Result { - wait_for_chain_extended(events, block_number, Duration::from_secs(5)).await -} - -async fn wait_for_event_predicate( - event_stream: &mut EventStream, - mut predicate: impl FnMut(ChainOrchestratorEvent) -> bool, - timeout: Duration, -) -> eyre::Result<()> { - let sleep = tokio::time::sleep(timeout); - tokio::pin!(sleep); - - loop { - tokio::select! { - maybe_event = event_stream.next() => { - match maybe_event { - Some(e) if predicate(e.clone()) => { - tracing::debug!(target: "scroll::test", event = ?e, "Received event"); - return Ok(()); - } - Some(e) => { - tracing::debug!(target: "scroll::test", event = ?e, "Ignoring event"); - }, // Ignore other events - None => return Err(eyre::eyre!("Event stream ended unexpectedly")), - } - } - _ = &mut sleep => return Err(eyre::eyre!("Timeout while waiting for event")), - } - } -} - -async fn wait_for_event_predicate_5s( - event_stream: &mut EventStream, - predicate: impl FnMut(ChainOrchestratorEvent) -> bool, -) -> eyre::Result<()> { - wait_for_event_predicate(event_stream, predicate, Duration::from_secs(5)).await -} - -async fn wait_for_event( - event_stream: &mut EventStream, - event: ChainOrchestratorEvent, - timeout: Duration, -) -> eyre::Result<()> { - wait_for_event_predicate(event_stream, |e| e == event, timeout).await -} - -async fn wait_for_event_5s( - event_stream: &mut EventStream, - event: ChainOrchestratorEvent, -) -> eyre::Result<()> { - wait_for_event(event_stream, event, Duration::from_secs(5)).await -} - /// Waits for n events to be emitted. async fn wait_n_events( events: &mut EventStream, @@ -2269,7 +1655,7 @@ async fn wait_n_events( pub async fn eventually(timeout: Duration, tick: Duration, message: &str, mut predicate: F) where F: FnMut() -> Fut, - Fut: std::future::Future, + Fut: Future, { let mut interval = time::interval(tick); let start = time::Instant::now(); @@ -2283,46 +1669,3 @@ where interval.tick().await; } } - -async fn assert_latest_block_on_rpc_by_number( - node: &NodeHelperType< - ScrollRollupNode, - BlockchainProvider>, - >, - block_number: u64, -) { - eventually( - Duration::from_secs(5), - Duration::from_millis(100), - "Waiting for latest block by number on node", - || async { - println!( - "Latest block number: {}, hash: {}", - latest_block(node).await.unwrap().header.number, - latest_block(node).await.unwrap().header.hash_slow() - ); - latest_block(node).await.unwrap().header.number == block_number - }, - ) - .await; -} - -async fn assert_latest_block_on_rpc_by_hash( - node: &NodeHelperType< - ScrollRollupNode, - BlockchainProvider>, - >, - block_hash: B256, -) { - eventually( - Duration::from_secs(5), - Duration::from_millis(100), - "Waiting for latest block by hash on node", - || async { latest_block(node).await.unwrap().header.hash_slow() == block_hash }, - ) - .await; -} - -fn block_contains_raw_tx(block: &ScrollBlock, raw_tx: &[u8]) -> bool { - block.body.transactions.iter().any(|tx| tx.encoded_2718().as_slice() == raw_tx) -} diff --git a/crates/node/tests/sync.rs b/crates/node/tests/sync.rs index 2d2686a2..afe737d1 100644 --- a/crates/node/tests/sync.rs +++ b/crates/node/tests/sync.rs @@ -1,16 +1,16 @@ //! Contains tests related to RN and EN sync. use alloy_primitives::{b256, Address, U256}; -use alloy_provider::{Provider, ProviderBuilder}; use futures::StreamExt; use reqwest::Url; use reth_provider::{BlockIdReader, BlockReader}; +use reth_rpc_eth_api::helpers::EthTransactions; use reth_scroll_chainspec::{SCROLL_DEV, SCROLL_SEPOLIA}; use reth_tokio_util::EventStream; use rollup_node::{ test_utils::{ - default_sequencer_test_scroll_rollup_node_config, default_test_scroll_rollup_node_config, - generate_tx, setup_engine, + default_test_scroll_rollup_node_config, generate_tx, setup_engine, EventAssertions, + TestFixture, }, BlobProviderArgs, ChainOrchestratorArgs, ConsensusArgs, EngineDriverArgs, L1ProviderArgs, RollupNodeDatabaseArgs, RollupNodeGasPriceOracleArgs, RollupNodeNetworkArgs, RpcArgs, @@ -103,58 +103,31 @@ async fn test_should_consolidate_to_block_15k() -> eyre::Result<()> { async fn test_node_produces_block_on_startup() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let mut sequencer_node_config = default_sequencer_test_scroll_rollup_node_config(); - sequencer_node_config.sequencer_args.auto_start = true; - sequencer_node_config.sequencer_args.allow_empty_blocks = false; + // Start a sequencer and follower node. + let mut fixture = TestFixture::builder() + .sequencer() + .followers(1) + .auto_start(true) + .allow_empty_blocks(false) + .build() + .await?; - let (mut nodes, _tasks, wallet) = - setup_engine(sequencer_node_config, 2, (*SCROLL_DEV).clone(), false, false).await?; - - let follower = nodes.pop().unwrap(); - let mut follower_events = - follower.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await?; - let follower_l1_watcher_tx = follower.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - - let sequencer = nodes.pop().unwrap(); - let mut sequencer_events = - sequencer.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await?; - let sequencer_l1_watcher_tx = sequencer.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - - // Send a notification to the sequencer and follower nodes that the L1 watcher is synced. - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); - follower_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); + fixture.l1().sync().await?; // wait for both nodes to be synced. - wait_n_events( - &mut sequencer_events, - |e| matches!(e, ChainOrchestratorEvent::ChainConsolidated { from: _, to: _ }), - 1, - ) - .await; - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::ChainConsolidated { from: _, to: _ }), - 1, - ) - .await; + fixture.expect_event_on_all_nodes().chain_consolidated().await?; // construct a transaction and send it to the follower node. - let wallet = Arc::new(tokio::sync::Mutex::new(wallet)); + let wallet = fixture.wallet(); + let follower_rpc = fixture.follower(0).node.rpc.inner.clone(); let handle = tokio::spawn(async move { loop { let tx = generate_tx(wallet.clone()).await; - follower.rpc.inject_tx(tx).await.unwrap(); + let _ = follower_rpc.eth_api().send_raw_transaction(tx).await; } }); - // Assert that the follower node receives the new block. - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), - 1, - ) - .await; - + fixture.expect_event_on_followers().chain_extended(1).await?; drop(handle); Ok(()) @@ -165,72 +138,49 @@ async fn test_node_produces_block_on_startup() -> eyre::Result<()> { #[tokio::test] async fn test_should_trigger_pipeline_sync_for_execution_node() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let node_config = default_test_scroll_rollup_node_config(); - let mut sequencer_node_config = default_sequencer_test_scroll_rollup_node_config(); - sequencer_node_config.sequencer_args.block_time = 40; - sequencer_node_config.sequencer_args.auto_start = true; - // Create the chain spec for scroll mainnet with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); - let (mut nodes, _tasks, _) = - setup_engine(sequencer_node_config.clone(), 1, chain_spec.clone(), false, false) - .await - .unwrap(); - let mut synced = nodes.pop().unwrap(); - let mut synced_events = synced.inner.rollup_manager_handle.get_event_listener().await?; - let synced_l1_watcher_tx = synced.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - - let (mut nodes, _tasks, _) = - setup_engine(node_config.clone(), 1, chain_spec, false, false).await.unwrap(); - let mut unsynced = nodes.pop().unwrap(); - let mut unsynced_events = unsynced.inner.rollup_manager_handle.get_event_listener().await?; + const OPTIMISTIC_SYNC_TRIGGER: u64 = 100; + let mut sequencer = TestFixture::builder() + .sequencer() + .block_time(40) + .auto_start(true) + .optimistic_sync_trigger(OPTIMISTIC_SYNC_TRIGGER) + .build() + .await?; + + let mut follower = TestFixture::builder() + .followers(1) + .optimistic_sync_trigger(OPTIMISTIC_SYNC_TRIGGER) + .build() + .await?; // Set the L1 to synced on the synced node to start block production. - synced_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); + sequencer.l1().sync().await?; // Wait for the chain to be advanced by the sequencer. - let optimistic_sync_trigger = node_config.chain_orchestrator_args.optimistic_sync_trigger + 1; - wait_n_events( - &mut synced_events, - |e| matches!(e, ChainOrchestratorEvent::BlockSequenced(_)), - optimistic_sync_trigger, - ) - .await; + sequencer.expect_event().block_sequenced(OPTIMISTIC_SYNC_TRIGGER + 1).await?; // Connect the nodes together. - synced.network.add_peer(unsynced.network.record()).await; - unsynced.network.next_session_established().await; - synced.network.next_session_established().await; + sequencer.sequencer().node.connect(&mut follower.follower(0).node).await; // Assert that the unsynced node triggers optimistic sync. - wait_n_events( - &mut unsynced_events, - |e| matches!(e, ChainOrchestratorEvent::OptimisticSync(_)), - 1, - ) - .await; + follower.expect_event().optimistic_sync().await?; // Verify the unsynced node syncs. - let provider = ProviderBuilder::new().connect_http(unsynced.rpc_url()); + let mut num = follower.get_block(0).await?.header.number; let mut retries = 0; - let mut num = provider.get_block_number().await.unwrap(); loop { - if retries > 10 || num > optimistic_sync_trigger { + if retries > 10 || num > OPTIMISTIC_SYNC_TRIGGER { break } - num = provider.get_block_number().await.unwrap(); + num = follower.get_block(0).await?.header.number; tokio::time::sleep(tokio::time::Duration::from_millis(200)).await; retries += 1; } // Assert that the unsynced node triggers a chain extension on the optimistic chain. - wait_n_events( - &mut unsynced_events, - |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), - 1, - ) - .await; + follower.expect_event().chain_extended(num).await?; Ok(()) } @@ -239,55 +189,22 @@ async fn test_should_trigger_pipeline_sync_for_execution_node() -> eyre::Result< #[tokio::test] async fn test_should_consolidate_after_optimistic_sync() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let node_config = default_test_scroll_rollup_node_config(); - let sequencer_node_config = ScrollRollupNodeConfig { - test: true, - network_args: RollupNodeNetworkArgs { - enable_eth_scroll_wire_bridge: true, - enable_scroll_wire: true, - sequencer_url: None, - signer_address: None, - }, - database_args: RollupNodeDatabaseArgs::default(), - l1_provider_args: L1ProviderArgs::default(), - engine_driver_args: EngineDriverArgs::default(), - chain_orchestrator_args: ChainOrchestratorArgs::default(), - sequencer_args: SequencerArgs { - sequencer_enabled: true, - auto_start: true, - block_time: 20, - l1_message_inclusion_mode: L1MessageInclusionMode::BlockDepth(0), - allow_empty_blocks: true, - ..SequencerArgs::default() - }, - blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, - signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), - consensus_args: ConsensusArgs::noop(), - database: None, - rpc_args: RpcArgs::default(), - }; - // Create the chain spec for scroll dev with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); - - // Create a sequencer node and an unsynced node. - let (mut nodes, _tasks, _) = - setup_engine(sequencer_node_config, 1, chain_spec.clone(), false, false).await.unwrap(); - let mut sequencer = nodes.pop().unwrap(); - let sequencer_l1_watcher_tx = sequencer.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let sequencer_handle = sequencer.inner.rollup_manager_handle.clone(); - let mut sequencer_events = sequencer_handle.get_event_listener().await?; + let mut sequencer = TestFixture::builder() + .sequencer() + .with_eth_scroll_bridge(true) + .with_scroll_wire(true) + .auto_start(true) + .block_time(20) + .with_l1_message_delay(0) + .allow_empty_blocks(true) + .build() + .await?; - let (mut nodes, _tasks, _) = - setup_engine(node_config.clone(), 1, chain_spec, false, false).await.unwrap(); - let mut follower = nodes.pop().unwrap(); - let follower_l1_watcher_tx = follower.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let mut follower_events = - follower.inner.add_ons_handle.rollup_manager_handle.get_event_listener().await?; + let mut follower = TestFixture::builder().followers(1).build().await?; // Send a notification to the sequencer node that the L1 watcher is synced. - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); + sequencer.l1().sync().await?; // Create a sequence of L1 messages to be added to the sequencer node. const L1_MESSAGES_COUNT: usize = 200; @@ -306,145 +223,94 @@ async fn test_should_consolidate_after_optimistic_sync() -> eyre::Result<()> { // Add the L1 messages to the sequencer node. for (i, l1_message) in l1_messages.iter().enumerate() { - sequencer_l1_watcher_tx - .send(Arc::new(L1Notification::L1Message { - message: l1_message.clone(), - block_number: i as u64, - block_timestamp: i as u64 * 10, - })) - .await - .unwrap(); - wait_n_events( - &mut sequencer_events, - |e| { - matches!( - e, - rollup_node_chain_orchestrator::ChainOrchestratorEvent::L1MessageCommitted(_) - ) - }, - 1, - ) - .await; - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(i as u64))).await.unwrap(); - wait_n_events( - &mut sequencer_events, - |e| matches!(e, ChainOrchestratorEvent::NewL1Block(_)), - 1, - ) - .await; - sequencer_handle.build_block(); - wait_n_events( - &mut sequencer_events, - |e: ChainOrchestratorEvent| matches!(e, ChainOrchestratorEvent::BlockSequenced(_)), - 1, - ) - .await; + sequencer + .l1() + .add_message() + .to(l1_message.to) + .queue_index(l1_message.queue_index) + .gas_limit(l1_message.gas_limit) + .sender(l1_message.sender) + .value(l1_message.value) + .input(l1_message.input.clone()) + .at_block(i as u64) + .send() + .await?; + sequencer.expect_event().l1_message_committed().await?; + + sequencer.l1().new_block(i as u64).await?; + sequencer.expect_event().new_l1_block().await?; + + sequencer.build_block().expect_block_number((i + 1) as u64).await_block().await?; } // Connect the nodes together. - sequencer.network.add_peer(follower.network.record()).await; - follower.network.next_session_established().await; - sequencer.network.next_session_established().await; + sequencer.sequencer().node.connect(&mut follower.follower(0).node).await; // trigger a new block on the sequencer node. - sequencer_handle.build_block(); + sequencer.build_block().await_block().await?; // Assert that the unsynced node triggers optimistic sync. - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::OptimisticSync(_)), - 1, - ) - .await; + follower.expect_event().optimistic_sync().await?; // Let the unsynced node process the optimistic sync. tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; // Send all L1 messages to the unsynced node. for (i, l1_message) in l1_messages.iter().enumerate() { - follower_l1_watcher_tx - .send(Arc::new(L1Notification::L1Message { - message: l1_message.clone(), - block_number: i as u64, - block_timestamp: i as u64 * 10, - })) - .await - .unwrap(); - wait_n_events( - &mut follower_events, - |e: ChainOrchestratorEvent| { - matches!( - e, - rollup_node_chain_orchestrator::ChainOrchestratorEvent::L1MessageCommitted(_) - ) - }, - 1, - ) - .await; + follower + .l1() + .add_message() + .to(l1_message.to) + .queue_index(l1_message.queue_index) + .gas_limit(l1_message.gas_limit) + .sender(l1_message.sender) + .value(l1_message.value) + .input(l1_message.input.clone()) + .at_block(i as u64) + .send() + .await?; + follower.expect_event().l1_message_committed().await?; } // Send a notification to the unsynced node that the L1 watcher is synced. - follower_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); + follower.l1().sync().await?; // Wait for the unsynced node to sync to the L1 watcher. - wait_n_events(&mut follower_events, |e| matches!(e, ChainOrchestratorEvent::L1Synced), 1).await; + follower.expect_event().l1_synced().await?; // Let the unsynced node process the L1 messages. tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; // build a new block on the sequencer node to trigger consolidation on the unsynced node. - sequencer_handle.build_block(); + sequencer.build_block().await_block().await?; // Assert that the unsynced node consolidates the chain. - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), - 1, - ) - .await; + follower.expect_event().chain_extended((L1_MESSAGES_COUNT + 2) as u64).await?; // Now push a L1 message to the sequencer node and build a new block. - sequencer_l1_watcher_tx - .send(Arc::new(L1Notification::L1Message { - message: TxL1Message { - queue_index: 200, - gas_limit: 21000, - sender: Address::random(), - to: Address::random(), - value: U256::from(1), - input: Default::default(), - }, - block_number: 200, - block_timestamp: 2010, - })) - .await - .unwrap(); - wait_n_events( - &mut sequencer_events, - |e: ChainOrchestratorEvent| matches!(e, ChainOrchestratorEvent::L1MessageCommitted(_)), - 1, - ) - .await; - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(201))).await.unwrap(); - wait_n_events(&mut sequencer_events, |e| matches!(e, ChainOrchestratorEvent::NewL1Block(_)), 1) - .await; - sequencer_handle.build_block(); - - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::NewBlockReceived(_)), - 1, - ) - .await; + sequencer + .l1() + .add_message() + .queue_index(200) + .sender(Address::random()) + .value(1) + .at_block(200) + .send() + .await?; + sequencer.expect_event().l1_message_committed().await?; + + sequencer.l1().new_block(201).await?; + sequencer.expect_event().new_l1_block().await?; + + sequencer.build_block().await_block().await?; + follower.expect_event().new_block_received().await?; // Assert that the follower node does not accept the new block as it does not have the L1 // message. - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::L1MessageNotFoundInDatabase(_)), - 1, - ) - .await; + follower + .expect_event() + .where_event(|e| matches!(e, ChainOrchestratorEvent::L1MessageNotFoundInDatabase(_))) + .await?; Ok(()) } @@ -453,149 +319,65 @@ async fn test_should_consolidate_after_optimistic_sync() -> eyre::Result<()> { #[tokio::test] async fn test_consolidation() -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let node_config = default_test_scroll_rollup_node_config(); - let sequencer_node_config = ScrollRollupNodeConfig { - test: true, - network_args: RollupNodeNetworkArgs { - enable_eth_scroll_wire_bridge: true, - enable_scroll_wire: true, - sequencer_url: None, - signer_address: None, - }, - database_args: RollupNodeDatabaseArgs { - rn_db_path: Some(PathBuf::from("sqlite::memory:")), - }, - l1_provider_args: L1ProviderArgs::default(), - engine_driver_args: EngineDriverArgs::default(), - chain_orchestrator_args: ChainOrchestratorArgs::default(), - sequencer_args: SequencerArgs { - sequencer_enabled: true, - auto_start: false, - block_time: 10, - l1_message_inclusion_mode: L1MessageInclusionMode::BlockDepth(0), - allow_empty_blocks: true, - ..SequencerArgs::default() - }, - blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, - signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), - consensus_args: ConsensusArgs::noop(), - database: None, - rpc_args: RpcArgs::default(), - }; - // Create the chain spec for scroll dev with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); + let mut sequencer = TestFixture::builder() + .sequencer() + .with_eth_scroll_bridge(true) + .with_scroll_wire(true) + .auto_start(false) + .block_time(10) + .with_l1_message_delay(0) + .allow_empty_blocks(true) + .build() + .await?; - // Create a sequencer node and an unsynced node. - let (mut nodes, _tasks, _) = - setup_engine(sequencer_node_config, 1, chain_spec.clone(), false, false).await.unwrap(); - let mut sequencer = nodes.pop().unwrap(); - let sequencer_l1_watcher_tx = sequencer.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let sequencer_handle = sequencer.inner.rollup_manager_handle.clone(); - let mut sequencer_events = sequencer_handle.get_event_listener().await?; - - let (mut nodes, _tasks, _) = - setup_engine(node_config.clone(), 1, chain_spec, false, false).await.unwrap(); - let mut follower = nodes.pop().unwrap(); - let follower_l1_watcher_tx = follower.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); - let mut follower_events = follower.inner.rollup_manager_handle.get_event_listener().await?; + let mut follower = TestFixture::builder().followers(1).build().await?; // Connect the nodes together. - sequencer.network.add_peer(follower.network.record()).await; - follower.network.next_session_established().await; - sequencer.network.next_session_established().await; + sequencer.sequencer().node.connect(&mut follower.follower(0).node).await; // Create a L1 message and send it to both nodes. - let l1_message = TxL1Message { - queue_index: 0, - gas_limit: 21000, - sender: Address::random(), - to: Address::random(), - value: U256::from(1), - input: Default::default(), - }; - sequencer_l1_watcher_tx - .send(Arc::new(L1Notification::L1Message { - message: l1_message.clone(), - block_number: 0, - block_timestamp: 0, - })) - .await - .unwrap(); - wait_n_events( - &mut sequencer_events, - |e| matches!(e, ChainOrchestratorEvent::L1MessageCommitted(_)), - 1, - ) - .await; - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(2))).await.unwrap(); - - follower_l1_watcher_tx - .send(Arc::new(L1Notification::L1Message { - message: l1_message, - block_number: 0, - block_timestamp: 0, - })) - .await - .unwrap(); - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::L1MessageCommitted(_)), - 1, - ) - .await; + let sender = Address::random(); + let to = Address::random(); + + sequencer.l1().add_message().sender(sender).to(to).value(1).queue_index(0).send().await?; + sequencer.expect_event().l1_message_committed().await?; + + follower.l1().add_message().sender(sender).to(to).value(1).send().await?; + follower.expect_event().l1_message_committed().await?; // Send a notification to both nodes that the L1 watcher is synced. - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); - follower_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); + sequencer.l1().sync().await?; + follower.l1().sync().await?; // Assert that the unsynced node consolidates the chain. - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::ChainConsolidated { from: 0, to: 0 }), - 1, - ) - .await; + follower.expect_event().chain_consolidated().await?; // Build a new block on the sequencer node. - sequencer_handle.build_block(); + sequencer.build_block().await_block().await?; // Now push a L1 message to the sequencer node and build a new block. - sequencer_l1_watcher_tx - .send(Arc::new(L1Notification::L1Message { - message: TxL1Message { - queue_index: 1, - gas_limit: 21000, - sender: Address::random(), - to: Address::random(), - value: U256::from(1), - input: Default::default(), - }, - block_number: 1, - block_timestamp: 10, - })) - .await - .unwrap(); - wait_n_events( - &mut sequencer_events, - |e| matches!(e, ChainOrchestratorEvent::L1MessageCommitted(_)), - 1, - ) - .await; - - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::NewBlock(5))).await.unwrap(); - wait_n_events(&mut sequencer_events, |e| matches!(e, ChainOrchestratorEvent::NewL1Block(_)), 1) - .await; - sequencer_handle.build_block(); + sequencer + .l1() + .add_message() + .sender(Address::random()) + .to(Address::random()) + .value(1) + .queue_index(1) + .at_block(1) + .send() + .await?; + sequencer.expect_event().l1_message_committed().await?; + + sequencer.l1().new_block(5).await?; + sequencer.expect_event().new_l1_block().await?; + sequencer.build_block().await_block().await?; // Assert that the follower node rejects the new block as it hasn't received the L1 message. - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::L1MessageNotFoundInDatabase(_)), - 1, - ) - .await; + follower + .expect_event() + .where_event(|e| matches!(e, ChainOrchestratorEvent::L1MessageNotFoundInDatabase(_))) + .await?; Ok(()) } @@ -665,97 +447,49 @@ async fn test_chain_orchestrator_fork_choice( initial_blocks: usize, reorg_block_number: Option, additional_blocks: usize, - expected_final_event_predicate: impl FnMut(ChainOrchestratorEvent) -> bool, + expected_final_event_predicate: impl FnMut(&ChainOrchestratorEvent) -> bool, ) -> eyre::Result<()> { reth_tracing::init_test_tracing(); - let node_config = default_test_scroll_rollup_node_config(); - let sequencer_node_config = ScrollRollupNodeConfig { - test: true, - network_args: RollupNodeNetworkArgs { - enable_eth_scroll_wire_bridge: false, - enable_scroll_wire: true, - ..Default::default() - }, - database_args: RollupNodeDatabaseArgs { - rn_db_path: Some(PathBuf::from("sqlite::memory:")), - }, - l1_provider_args: L1ProviderArgs::default(), - engine_driver_args: EngineDriverArgs::default(), - chain_orchestrator_args: ChainOrchestratorArgs::default(), - sequencer_args: SequencerArgs { - sequencer_enabled: true, - auto_start: false, - block_time: 10, - l1_message_inclusion_mode: L1MessageInclusionMode::BlockDepth(0), - allow_empty_blocks: true, - ..SequencerArgs::default() - }, - blob_provider_args: BlobProviderArgs { mock: true, ..Default::default() }, - signer_args: Default::default(), - gas_price_oracle_args: RollupNodeGasPriceOracleArgs::default(), - consensus_args: ConsensusArgs::noop(), - database: None, - rpc_args: RpcArgs::default(), - }; - // Create the chain spec for scroll dev with Feynman activated and a test genesis. - let chain_spec = (*SCROLL_DEV).clone(); - - // Create a sequencer node and an unsynced node. - let (mut nodes, _tasks, _) = - setup_engine(sequencer_node_config.clone(), 1, chain_spec.clone(), false, false) - .await - .unwrap(); - let mut sequencer = nodes.pop().unwrap(); - let sequencer_handle = sequencer.inner.rollup_manager_handle.clone(); - let mut sequencer_events = sequencer_handle.get_event_listener().await?; - let sequencer_l1_watcher_tx = sequencer.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); + let mut sequencer = TestFixture::builder() + .sequencer() + .with_scroll_wire(true) + .with_eth_scroll_bridge(false) + .auto_start(false) + .block_time(10) + .with_l1_message_delay(0) + .allow_empty_blocks(true) + .build() + .await?; - let (mut nodes, _tasks, _) = - setup_engine(node_config.clone(), 1, chain_spec.clone(), false, false).await.unwrap(); - let mut follower = nodes.pop().unwrap(); - let mut follower_events = follower.inner.rollup_manager_handle.get_event_listener().await?; - let follower_l1_watcher_tx = follower.inner.add_ons_handle.l1_watcher_tx.clone().unwrap(); + let mut follower = TestFixture::builder().followers(1).build().await?; // Connect the nodes together. - sequencer.connect(&mut follower).await; + sequencer.sequencer().node.connect(&mut follower.follower(0).node).await; // set both the sequencer and follower L1 watchers to synced - sequencer_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); - follower_l1_watcher_tx.send(Arc::new(L1Notification::Synced)).await.unwrap(); + sequencer.l1().sync().await?; + follower.l1().sync().await?; // Initially the sequencer should build 100 empty blocks in each and the follower // should follow them let mut reorg_block_info: Option = None; for i in 0..initial_blocks { - sequencer_handle.build_block(); - wait_n_events( - &mut sequencer_events, - |e| { - if let ChainOrchestratorEvent::BlockSequenced(block) = e { - if Some(i) == reorg_block_number { - reorg_block_info = Some((&block).into()); - } - true - } else { - false - } - }, - 1, - ) - .await; - wait_n_events( - &mut follower_events, - |e| matches!(e, ChainOrchestratorEvent::ChainExtended(_)), - 1, - ) - .await; + let num = (i + 1) as u64; + let block = sequencer.build_block().await_block().await?; + + if Some(i) == reorg_block_number { + reorg_block_info = Some((&block).into()); + } + + follower.expect_event().chain_extended(num).await?; } // Now reorg the sequencer and disable gossip so we can create fork - sequencer_handle.set_gossip(false).await.unwrap(); + let sequencer_handle = &sequencer.sequencer().rollup_manager_handle; + sequencer_handle.set_gossip(false).await?; if let Some(block_info) = reorg_block_info { - sequencer_handle.update_fcs_head(block_info).await.unwrap(); + sequencer_handle.update_fcs_head(block_info).await?; } // wait two seconds to ensure the timestamp of the new blocks is greater than the old ones @@ -763,21 +497,16 @@ async fn test_chain_orchestrator_fork_choice( // Have the sequencer build 20 new blocks, containing new L1 messages. for _ in 0..additional_blocks { - sequencer_handle.build_block(); - wait_n_events( - &mut sequencer_events, - |e| matches!(e, ChainOrchestratorEvent::BlockSequenced(_block)), - 1, - ) - .await; + sequencer.build_block().await_block().await?; } // now build a final block - sequencer_handle.set_gossip(true).await.unwrap(); - sequencer_handle.build_block(); + let sequencer_handle = &sequencer.sequencer().rollup_manager_handle; + sequencer_handle.set_gossip(true).await?; + sequencer.build_block().await_block().await?; // Wait for the follower node to accept the new chain - wait_n_events(&mut follower_events, expected_final_event_predicate, 1).await; + follower.expect_event().where_event(expected_final_event_predicate).await?; Ok(()) }