From 3a7c48d9d8edb665a10e92fd0f97470b117924fe Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Fri, 30 Jan 2026 12:45:21 +0100 Subject: [PATCH 1/3] feat: implement mendel HF --- Cargo.lock | 1058 ++++++++++++++-------------- Cargo.toml | 83 +-- src/chainspec/parser.rs | 11 +- src/consensus/eip4844/bep657.rs | 335 +++++++++ src/consensus/eip4844/mod.rs | 7 +- src/consensus/parlia/validation.rs | 60 +- src/consensus/parlia/vote_pool.rs | 88 ++- src/evm/precompiles/mod.rs | 76 +- src/hardforks/bsc.rs | 5 + src/hardforks/mod.rs | 28 + src/node/consensus.rs | 635 ++++++++++++++++- src/node/evm/assembler.rs | 43 +- src/node/evm/config.rs | 44 +- src/node/miner/bid_simulator.rs | 15 +- src/node/miner/payload.rs | 75 +- src/node/miner/util.rs | 13 +- src/node/mod.rs | 20 +- src/node/pool/mod.rs | 3 + 18 files changed, 1927 insertions(+), 672 deletions(-) create mode 100644 src/consensus/eip4844/bep657.rs diff --git a/Cargo.lock b/Cargo.lock index 3b01a468..d4a0a891 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -106,9 +106,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.27" +version = "0.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db5bcdd086f0b1b9610140a12c59b757397be90bd130d8d836fc8da0815a34" +checksum = "90f374d3c6d729268bbe2d0e0ff992bb97898b2df756691a62ee1d5f0506bc39" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3a590d13de3944675987394715f37537b50b856e3b23a0e66e97d963edbf38" +checksum = "86debde32d8dbb0ab29e7cc75ae1a98688ac7a4c9da54b3a9b14593b9b3c46d3" dependencies = [ "alloy-eips", "alloy-primitives", @@ -144,14 +144,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-consensus-any" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f28f769d5ea999f0d8a105e434f483456a15b4e1fcb08edbbbe1650a497ff6d" +checksum = "8d6cb2e7efd385b333f5a77b71baaa2605f7e22f1d583f2879543b54cbce777c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -164,9 +164,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "369f5707b958927176265e8a58627fc6195e5dfa5c55689396e68b241b3a72e6" +checksum = "14ff5ee5f27aa305bda825c735f686ad71bb65508158f059f513895abe69b8c3" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -191,7 +191,7 @@ dependencies = [ "crc", "rand 0.8.5", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -222,7 +222,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -233,19 +233,21 @@ checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" dependencies = [ "alloy-primitives", "alloy-rlp", + "arbitrary", "borsh", "serde", ] [[package]] name = "alloy-eips" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09535cbc646b0e0c6fcc12b7597eaed12cf86dff4c4fba9507a61e71b94f30eb" +checksum = "be47bf1b91674a5f394b9ed3c691d764fb58ba43937f1371550ff4bc8e59c295" dependencies = [ "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", + "alloy-eip7928", "alloy-primitives", "alloy-rlp", "alloy-serde", @@ -260,14 +262,14 @@ dependencies = [ "serde", "serde_with", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-evm" -version = "0.26.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96827207397445a919a8adc49289b53cc74e48e460411740bba31cec2fc307d" +checksum = "7b99ba7b74a87176f31ee1cd26768f7155b0eeff61ed925f59b13085ffe5f891" dependencies = [ "alloy-consensus", "alloy-eips", @@ -281,14 +283,14 @@ dependencies = [ "op-alloy", "op-revm", "revm", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-genesis" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1005520ccf89fa3d755e46c1d992a9e795466c2e7921be2145ef1f749c5727de" +checksum = "a59f6f520c323111650d319451de1edb1e32760029a468105b9d7b0f7c11bdf2" dependencies = [ "alloy-eips", "alloy-primitives", @@ -315,9 +317,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84e3cf01219c966f95a460c95f1d4c30e12f6c18150c21a30b768af2a2a29142" +checksum = "8708475665cc00e081c085886e68eada2f64cfa08fc668213a9231655093d4de" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -327,24 +329,24 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b626409c98ba43aaaa558361bca21440c88fd30df7542c7484b9c7a1489cdb" +checksum = "5a24c81a56d684f525cd1c012619815ad3a1dd13b0238f069356795d84647d3c" dependencies = [ "alloy-primitives", "alloy-sol-types", "http 1.4.0", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] [[package]] name = "alloy-network" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89924fdcfeee0e0fa42b1f10af42f92802b5d16be614a70897382565663bf7cf" +checksum = "786c5b3ad530eaf43cda450f973fe7fb1c127b4c8990adf66709dafca25e3f6f" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -363,14 +365,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-network-primitives" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0dbe56ff50065713ff8635d8712a0895db3ad7f209db9793ad8fcb6b1734aa" +checksum = "c1ed40adf21ae4be786ef5eb62db9c692f6a30f86d34452ca3f849d6390ce319" dependencies = [ "alloy-consensus", "alloy-eips", @@ -381,13 +383,13 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a0fb18dd5fb43ec5f0f6a20be1ce0287c79825827de5744afaa6c957737c33" +checksum = "3b88cf92ed20685979ed1d8472422f0c6c2d010cec77caf63aaa7669cc1a7bc2" dependencies = [ "alloy-rlp", "arbitrary", - "bytes 1.11.0", + "bytes 1.11.1", "cfg-if", "const-hex", "derive_more 2.1.1", @@ -408,14 +410,13 @@ dependencies = [ "rustc-hash", "serde", "sha3 0.10.8", - "tiny-keccak", ] [[package]] name = "alloy-provider" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b56f7a77513308a21a2ba0e9d57785a9d9d2d609e77f4e71a78a1192b83ff2d" +checksum = "a3ca4c15818be7ac86208aff3a91b951d14c24e1426e66624e75f2215ba5e2cc" dependencies = [ "alloy-chains", "alloy-consensus", @@ -448,7 +449,7 @@ dependencies = [ "reqwest 0.12.28", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", "url", @@ -457,9 +458,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94813abbd7baa30c700ea02e7f92319dbcb03bff77aeea92a3a9af7ba19c5c70" +checksum = "e9eb9c9371738ac47f589e40aae6e418cb5f7436ad25b87575a7f94a60ccf43b" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -479,20 +480,20 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +checksum = "e93e50f64a77ad9c5470bf2ad0ca02f228da70c792a8f06634801e202579f35e" dependencies = [ "alloy-rlp-derive", "arrayvec", - "bytes 1.11.0", + "bytes 1.11.1", ] [[package]] name = "alloy-rlp-derive" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" dependencies = [ "proc-macro2", "quote", @@ -501,9 +502,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff01723afc25ec4c5b04de399155bef7b6a96dfde2475492b1b7b4e7a4f46445" +checksum = "abe0addad5b8197e851062b49dc47157444bced173b601d91e3f9b561a060a50" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -527,9 +528,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91bf006bb06b7d812591b6ac33395cb92f46c6a65cda11ee30b348338214f0f" +checksum = "74d17d4645a717f0527e491f44f6f7a75c221b9c00ccf79ddba2d26c8e0df4c3" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -540,9 +541,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b934c3bcdc6617563b45deb36a40881c8230b94d0546ea739dff7edb3aa2f6fd" +checksum = "ded79e60d8fd0d7c851044f8b2f2dd7fa8dfa467c577d620595d4de3c31eff7e" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -552,9 +553,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e82145856df8abb1fefabef58cdec0f7d9abf337d4abd50c1ed7e581634acdd" +checksum = "2593ce5e1fd416e3b094e7671ef361f22e6944545e0e62ee309b6dfbd702225d" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -564,9 +565,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212ca1c1dab27f531d3858f8b1a2d6bfb2da664be0c1083971078eb7b71abe4b" +checksum = "d0e98aabb013a71a4b67b52825f7b503e5bb6057fb3b7b2290d514b0b0574b57" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -575,9 +576,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d92a9b4b268fac505ef7fb1dac9bb129d4fd7de7753f22a5b6e9f666f7f7de6" +checksum = "3a647a4e3acf49182135c2333d6f9b11ab8684559ff43ef1958ed762cfe9fe0e" dependencies = [ "alloy-eips", "alloy-primitives", @@ -588,16 +589,16 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tree_hash", "tree_hash_derive", ] [[package]] name = "alloy-rpc-types-debug" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab1ebed118b701c497e6541d2d11dfa6f3c6ae31a3c52999daa802fcdcc16b7" +checksum = "2a1dd760b6a798ee045ab6a7bbd1a02ad8bd6a64d8e18d6e41732f4fc4a4fe5c" dependencies = [ "alloy-primitives", "derive_more 2.1.1", @@ -607,9 +608,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "232f00fcbcd3ee3b9399b96223a8fc884d17742a70a44f9d7cef275f93e6e872" +checksum = "ddc871ae69688e358cf242a6a7ee6b6e0476a03fd0256434c68daedaec086ec4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -627,9 +628,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5715d0bf7efbd360873518bd9f6595762136b5327a9b759a8c42ccd9b5e44945" +checksum = "5899af8417dcf89f40f88fa3bdb2f3f172605d8e167234311ee34811bbfdb0bf" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -644,14 +645,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-rpc-types-mev" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7b61941d2add2ee64646612d3eda92cbbde8e6c933489760b6222c8898c79be" +checksum = "4d4c9229424e77bd97e629fba44dbfdadebe5bfadbb1e53ad4acbc955610b6c7" dependencies = [ "alloy-consensus", "alloy-eips", @@ -664,23 +665,23 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9763cc931a28682bd4b9a68af90057b0fbe80e2538a82251afd69d7ae00bbebf" +checksum = "410a80e9ac786a2d885adfd7da3568e8f392da106cb5432f00eb4787689d281a" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-rpc-types-txpool" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "359a8caaa98cb49eed62d03f5bc511dd6dd5dee292238e8627a6e5690156df0f" +checksum = "3a8074654c0292783d504bfa1f2691a69f420154ee9a7883f9212eaf611e60cd" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -690,9 +691,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed8531cae8d21ee1c6571d0995f8c9f0652a6ef6452fde369283edea6ab7138" +checksum = "feb73325ee881e42972a5a7bc85250f6af89f92c6ad1222285f74384a203abeb" dependencies = [ "alloy-primitives", "arbitrary", @@ -702,9 +703,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb10ccd49d0248df51063fce6b716f68a315dd912d55b32178c883fd48b4021d" +checksum = "1bea4c8f30eddb11d7ab56e83e49c814655daa78ca708df26c300c10d0189cbc" dependencies = [ "alloy-primitives", "async-trait", @@ -712,14 +713,14 @@ dependencies = [ "either", "elliptic-curve", "k256", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "alloy-signer-local" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4d992d44e6c414ece580294abbadb50e74cfd4eaa69787350a4dfd4b20eaa1b" +checksum = "c28bd71507db58477151a6fe6988fa62a4b778df0f166c3e3e1ef11d059fe5fa" dependencies = [ "alloy-consensus", "alloy-network", @@ -730,15 +731,15 @@ dependencies = [ "coins-bip39", "k256", "rand 0.8.5", - "thiserror 2.0.17", + "thiserror 2.0.18", "zeroize", ] [[package]] name = "alloy-sol-macro" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09eb18ce0df92b4277291bbaa0ed70545d78b02948df756bbd3d6214bf39a218" +checksum = "f5fa1ca7e617c634d2bd9fa71f9ec8e47c07106e248b9fcbd3eaddc13cabd625" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -750,9 +751,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d9fa2daf21f59aa546d549943f10b5cce1ae59986774019fbedae834ffe01b" +checksum = "27c00c0c3a75150a9dc7c8c679ca21853a137888b4e1c5569f92d7e2b15b5102" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -761,16 +762,16 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", + "sha3 0.10.8", "syn 2.0.114", "syn-solidity", - "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9396007fe69c26ee118a19f4dee1f5d1d6be186ea75b3881adf16d87f8444686" +checksum = "297db260eb4d67c105f68d6ba11b8874eec681caec5505eab8fbebee97f790bc" dependencies = [ "const-hex", "dunce", @@ -784,9 +785,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af67a0b0dcebe14244fc92002cd8d96ecbf65db4639d479f5fcd5805755a4c27" +checksum = "94b91b13181d3bcd23680fd29d7bc861d1f33fbe90fdd0af67162434aeba902d" dependencies = [ "serde", "winnow", @@ -794,9 +795,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09aeea64f09a7483bdcd4193634c7e5cf9fd7775ee767585270cd8ce2d69dc95" +checksum = "fc442cc2a75207b708d481314098a0f8b6f7b58e3148dd8d8cc7407b0d6f9385" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -806,9 +807,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f50a9516736d22dd834cc2240e5bf264f338667cc1d9e514b55ec5a78b987ca" +checksum = "b321f506bd67a434aae8e8a7dfe5373bf66137c149a5f09c9e7dfb0ca43d7c91" dependencies = [ "alloy-json-rpc", "auto_impl", @@ -819,7 +820,7 @@ dependencies = [ "parking_lot", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tower", "tracing", @@ -829,9 +830,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a18b541a6197cf9a084481498a766fdf32fefda0c35ea6096df7d511025e9f1" +checksum = "30bf12879a20e1261cd39c3b101856f52d18886907a826e102538897f0d2b66e" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -844,14 +845,14 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8075911680ebc537578cacf9453464fd394822a0f68614884a9c63f9fbaf5e89" +checksum = "b75f2334d400249e9672a1ec402536bab259e27a66201a94c3c9b3f1d3bae241" dependencies = [ "alloy-json-rpc", "alloy-pubsub", "alloy-transport", - "bytes 1.11.0", + "bytes 1.11.1", "futures", "interprocess", "pin-project", @@ -864,9 +865,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921d37a57e2975e5215f7dd0f28873ed5407c7af630d4831a4b5c737de4b0b8b" +checksum = "527a0d9c8bbc5c3215b03ad465d4ae8775384ff5faec7c41f033f087c851a9f9" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -881,9 +882,9 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428aa0f0e0658ff091f8f667c406e034b431cb10abd39de4f507520968acc499" +checksum = "4d7fd448ab0a017de542de1dcca7a58e7019fe0e7a34ed3f9543ebddf6aceffa" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -893,17 +894,18 @@ dependencies = [ "derive_more 2.1.1", "nybbles", "proptest", - "proptest-derive 0.5.1", + "proptest-derive 0.7.0", "serde", "smallvec", + "thiserror 2.0.18", "tracing", ] [[package]] name = "alloy-tx-macros" -version = "1.4.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2289a842d02fe63f8c466db964168bb2c7a9fdfb7b24816dbb17d45520575fb" +checksum = "6a91d6b4c2f6574fdbcb1611e460455c326667cf5b805c6bd1640dad8e8ee4d2" dependencies = [ "darling 0.21.3", "proc-macro2", @@ -970,20 +972,20 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" [[package]] name = "aquamarine" @@ -1375,9 +1377,9 @@ checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" [[package]] name = "async-compression" -version = "0.4.37" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d10e4f991a553474232bc0a31799f6d24b034a84c0971d80d2e2f78b2e576e40" +checksum = "68650b7df54f0293fd061972a0fb05aaf4fc0879d3b3d21a638a182c5c543b9f" dependencies = [ "compression-codecs", "compression-core", @@ -1557,7 +1559,7 @@ dependencies = [ "bitflags 2.10.0", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.13.0", "proc-macro2", "quote", "regex", @@ -1575,7 +1577,7 @@ dependencies = [ "bitflags 2.10.0", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.13.0", "proc-macro2", "quote", "regex", @@ -1797,7 +1799,7 @@ dependencies = [ "tag_ptr", "tap", "thin-vec", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "xsum", ] @@ -1976,9 +1978,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -2008,9 +2010,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" dependencies = [ "serde", ] @@ -2093,7 +2095,7 @@ dependencies = [ "semver 1.0.27", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -2113,10 +2115,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.15" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -2186,9 +2189,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.54" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31a" dependencies = [ "clap_builder", "clap_derive", @@ -2196,9 +2199,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238" dependencies = [ "anstream", "anstyle", @@ -2208,9 +2211,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", @@ -2287,7 +2290,7 @@ version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "memchr", ] @@ -2296,7 +2299,7 @@ name = "cometbft" version = "0.1.0-alpha.2" source = "git+https://github.com/bnb-chain/greenfield-cometbft-rs.git?rev=1282547#12825470f8b2df8e960e39a84ad4c9921492f512" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "cometbft-proto", "digest 0.10.7", "ed25519 2.2.3", @@ -2373,7 +2376,7 @@ name = "cometbft-proto" version = "0.1.0-alpha.2" source = "git+https://github.com/bnb-chain/greenfield-cometbft-rs.git?rev=1282547#12825470f8b2df8e960e39a84ad4c9921492f512" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "flex-error", "num-derive 0.4.2", "num-traits", @@ -2391,7 +2394,7 @@ version = "0.1.0-alpha.2" source = "git+https://github.com/bnb-chain/greenfield-cometbft-rs.git?rev=1282547#12825470f8b2df8e960e39a84ad4c9921492f512" dependencies = [ "async-trait", - "bytes 1.11.0", + "bytes 1.11.1", "cometbft", "cometbft-config", "cometbft-proto", @@ -2413,7 +2416,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid 1.19.0", + "uuid 1.20.0", "walkdir", ] @@ -3385,7 +3388,7 @@ checksum = "851bd664a3d3a3c175cff92b2f0df02df3c541b4895d0ae307611827aae46152" dependencies = [ "alloy-rlp", "base64 0.22.1", - "bytes 1.11.0", + "bytes 1.11.1", "ed25519-dalek 2.2.0", "hex 0.4.3", "k256", @@ -3605,7 +3608,7 @@ checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" dependencies = [ "arrayvec", "auto_impl", - "bytes 1.11.0", + "bytes 1.11.1", ] [[package]] @@ -3616,7 +3619,7 @@ checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" dependencies = [ "arrayvec", "auto_impl", - "bytes 1.11.0", + "bytes 1.11.1", ] [[package]] @@ -3647,16 +3650,21 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "fixed-cache" version = "0.1.7" @@ -3707,9 +3715,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -3803,9 +3811,9 @@ dependencies = [ [[package]] name = "futures-concurrency" -version = "7.7.0" +version = "7.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a9561702beff46b705a8ac9c0803ec4c7fc5d01330a99b1feaf86e206e92ba" +checksum = "175cd8cca9e1d45b87f18ffa75088f2099e3c4fe5e2f83e42de112560bea8ea6" dependencies = [ "fixedbitset", "futures-core", @@ -3983,9 +3991,9 @@ checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git2" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2b37e2f62729cdada11f0e6b3b6fe383c69c29fc619e391223e12856af308c" +checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" dependencies = [ "bitflags 2.10.0", "libc", @@ -4063,7 +4071,7 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "fnv", "futures-core", "futures-sink", @@ -4083,7 +4091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", - "bytes 1.11.0", + "bytes 1.11.1", "fnv", "futures-core", "futures-sink", @@ -4226,7 +4234,7 @@ dependencies = [ "rand 0.9.2", "ring", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tokio", "tracing", @@ -4250,7 +4258,7 @@ dependencies = [ "resolv-conf", "serde", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -4279,7 +4287,7 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "fnv", "itoa", ] @@ -4290,7 +4298,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "itoa", ] @@ -4300,7 +4308,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "http 0.2.12", "pin-project-lite", ] @@ -4311,7 +4319,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "http 1.4.0", ] @@ -4321,7 +4329,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "futures-core", "http 1.4.0", "http-body 1.0.1", @@ -4374,7 +4382,7 @@ version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "futures-channel", "futures-core", "futures-util", @@ -4399,7 +4407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", - "bytes 1.11.0", + "bytes 1.11.1", "futures-channel", "futures-core", "h2 0.4.13", @@ -4445,7 +4453,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.5", + "webpki-roots 1.0.6", ] [[package]] @@ -4463,14 +4471,13 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64 0.22.1", - "bytes 1.11.0", + "bytes 1.11.1", "futures-channel", - "futures-core", "futures-util", "http 1.4.0", "http-body 1.0.1", @@ -4479,7 +4486,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.2", "tokio", "tower-service", "tracing", @@ -4487,9 +4494,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -4773,9 +4780,9 @@ dependencies = [ [[package]] name = "interprocess" -version = "2.2.3" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +checksum = "53bf2b0e0785c5394a7392f66d7c4fb9c653633c29b27a932280da3cb344c66a" dependencies = [ "doctest-file", "futures-core", @@ -4923,9 +4930,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -4966,7 +4973,7 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-rustls 0.26.4", "tokio-util", @@ -4981,7 +4988,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "316c96719901f05d1137f19ba598b5fe9c9bc39f4335f67f6be8613921946480" dependencies = [ "async-trait", - "bytes 1.11.0", + "bytes 1.11.1", "futures-timer", "futures-util", "http 1.4.0", @@ -4994,7 +5001,7 @@ dependencies = [ "rustc-hash", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tower", @@ -5019,7 +5026,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tower", "url", @@ -5057,7 +5064,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -5074,7 +5081,7 @@ dependencies = [ "http 1.4.0", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -5144,9 +5151,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +checksum = "b646a74e746cd25045aa0fd42f4f7f78aa6d119380182c7e63a5593c4ab8df6f" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -5208,9 +5215,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libp2p-identity" @@ -5226,7 +5233,7 @@ dependencies = [ "multihash", "quick-protobuf", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", "zeroize", ] @@ -5244,13 +5251,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ "bitflags 2.10.0", "libc", - "redox_syscall", + "redox_syscall 0.7.0", ] [[package]] @@ -5388,12 +5395,9 @@ checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" [[package]] name = "mach2" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" -dependencies = [ - "libc", -] +checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" [[package]] name = "macro-string" @@ -5423,14 +5427,14 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.4.13", + "regex-automata 0.4.14", ] [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" @@ -5462,13 +5466,12 @@ dependencies = [ [[package]] name = "metrics-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3dbdd96ed57d565ec744cba02862d707acf373c5772d152abae6ec5c4e24f6c" +checksum = "37a87f4b19620e4c561f7b48f5e6ca085b1780def671696a6a3d9d0c137360ec" dependencies = [ "proc-macro2", "quote", - "regex", "syn 2.0.114", ] @@ -5483,14 +5486,14 @@ dependencies = [ "metrics", "metrics-util", "quanta", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "metrics-process" -version = "2.4.2" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f615e08e049bd14a44c4425415782efb9bcd479fc1e19ddeb971509074c060d0" +checksum = "4268d87f64a752f5a651314fc683f04da10be65701ea3e721ba4d74f79163cac" dependencies = [ "libc", "libproc", @@ -5600,9 +5603,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.12" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3dec6bd31b08944e08b58fd99373893a6c17054d6f3ea5006cc894f4f4eee2a" +checksum = "b4ac832c50ced444ef6be0767a008b02c106a909ba79d1d830501e94b96f6b7e" dependencies = [ "crossbeam-channel", "crossbeam-epoch", @@ -5612,7 +5615,7 @@ dependencies = [ "portable-atomic", "smallvec", "tagptr", - "uuid 1.19.0", + "uuid 1.20.0", ] [[package]] @@ -5692,15 +5695,18 @@ dependencies = [ [[package]] name = "notify-types" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" +dependencies = [ + "bitflags 2.10.0", +] [[package]] name = "ntapi" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "c70f219e21142367c70c0b30c6a9e3a14d55b4d12a204d897fbec83a0363f081" dependencies = [ "winapi", ] @@ -5750,9 +5756,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-derive" @@ -5860,9 +5866,9 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5676b5c379cf5b03da1df2b3061c4a4e2aa691086a56ac923e08c143f53f59" +checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" dependencies = [ "alloy-rlp", "arbitrary", @@ -5928,7 +5934,7 @@ dependencies = [ "derive_more 2.1.1", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -5978,7 +5984,7 @@ dependencies = [ "op-alloy-consensus", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -6000,7 +6006,7 @@ dependencies = [ "serde", "sha2 0.10.9", "snap", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -6034,9 +6040,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-probe" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "opentelemetry" @@ -6048,7 +6054,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] @@ -6071,7 +6077,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" dependencies = [ "async-trait", - "bytes 1.11.0", + "bytes 1.11.1", "http 1.4.0", "opentelemetry", "reqwest 0.12.28", @@ -6090,7 +6096,7 @@ dependencies = [ "opentelemetry_sdk", "prost 0.14.3", "reqwest 0.12.28", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tonic", "tracing", @@ -6127,7 +6133,7 @@ dependencies = [ "opentelemetry", "percent-encoding", "rand 0.9.2", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -6174,7 +6180,7 @@ dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", - "bytes 1.11.0", + "bytes 1.11.1", "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", @@ -6218,7 +6224,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link", ] @@ -6304,9 +6310,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", "ucd-trie", @@ -6478,9 +6484,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "potential_utf" @@ -6569,9 +6575,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -6624,9 +6630,9 @@ dependencies = [ [[package]] name = "proptest" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", @@ -6653,9 +6659,9 @@ dependencies = [ [[package]] name = "proptest-derive" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" +checksum = "095a99f75c69734802359b682be8daaf8980296731f6470434ea2c652af1dd30" dependencies = [ "proc-macro2", "quote", @@ -6664,9 +6670,9 @@ dependencies = [ [[package]] name = "proptest-derive" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "095a99f75c69734802359b682be8daaf8980296731f6470434ea2c652af1dd30" +checksum = "fb6dc647500e84a25a85b100e76c85b8ace114c209432dc174f20aac11d4ed6c" dependencies = [ "proc-macro2", "quote", @@ -6689,7 +6695,7 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "prost-derive 0.12.6", ] @@ -6699,7 +6705,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "prost-derive 0.14.3", ] @@ -6760,7 +6766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.114", @@ -6832,15 +6838,15 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", "rustls 0.23.36", - "socket2 0.6.1", - "thiserror 2.0.17", + "socket2 0.6.2", + "thiserror 2.0.18", "tokio", "tracing", "web-time", @@ -6852,7 +6858,7 @@ version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "getrandom 0.3.4", "lru-slab", "rand 0.9.2", @@ -6861,7 +6867,7 @@ dependencies = [ "rustls 0.23.36", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -6876,16 +6882,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.2", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -7025,9 +7031,9 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.2.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8b5b858a440a0bc02625b62dd95131b9201aa9f69f411195dd4a7cfb1de3d7" +checksum = "84816e4c99c467e92cf984ee6328caa976dfecd33a673544489d79ca2caaefe5" dependencies = [ "rand 0.9.2", "rustversion", @@ -7098,6 +7104,15 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "redox_syscall" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "redox_users" version = "0.4.6" @@ -7117,7 +7132,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -7142,13 +7157,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.13", + "regex-automata 0.4.14", "regex-syntax", ] @@ -7160,9 +7175,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -7171,9 +7186,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "regress" @@ -7192,7 +7207,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64 0.21.7", - "bytes 1.11.0", + "bytes 1.11.1", "encoding_rs", "futures-core", "futures-util", @@ -7233,7 +7248,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", - "bytes 1.11.0", + "bytes 1.11.1", "futures-channel", "futures-core", "futures-util", @@ -7266,7 +7281,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.5", + "webpki-roots 1.0.6", ] [[package]] @@ -7278,7 +7293,7 @@ checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "reth" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-rpc-types", "aquamarine", @@ -7324,7 +7339,7 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7348,7 +7363,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7379,7 +7394,7 @@ dependencies = [ [[package]] name = "reth-chainspec" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7399,7 +7414,7 @@ dependencies = [ [[package]] name = "reth-cli" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-genesis", "clap", @@ -7413,7 +7428,7 @@ dependencies = [ [[package]] name = "reth-cli-commands" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7499,7 +7514,7 @@ dependencies = [ [[package]] name = "reth-cli-runner" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "reth-tasks", "tokio", @@ -7509,7 +7524,7 @@ dependencies = [ [[package]] name = "reth-cli-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7520,14 +7535,14 @@ dependencies = [ "reth-fs-util", "secp256k1 0.30.0", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tikv-jemallocator", ] [[package]] name = "reth-codecs" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7535,7 +7550,7 @@ dependencies = [ "alloy-primitives", "alloy-trie", "arbitrary", - "bytes 1.11.0", + "bytes 1.11.1", "modular-bitfield", "op-alloy-consensus", "reth-codecs-derive", @@ -7547,7 +7562,7 @@ dependencies = [ [[package]] name = "reth-codecs-derive" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "proc-macro2", "quote", @@ -7557,7 +7572,7 @@ dependencies = [ [[package]] name = "reth-config" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "eyre", "humantime-serde", @@ -7573,20 +7588,20 @@ dependencies = [ [[package]] name = "reth-consensus" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", "reth-execution-types", "reth-primitives-traits", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-consensus-common" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7598,7 +7613,7 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7624,7 +7639,7 @@ dependencies = [ [[package]] name = "reth-db" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "derive_more 2.1.1", @@ -7644,19 +7659,19 @@ dependencies = [ "strum 0.27.2", "sysinfo", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-db-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-genesis", "alloy-primitives", "arbitrary", - "bytes 1.11.0", + "bytes 1.11.1", "derive_more 2.1.1", "metrics", "modular-bitfield", @@ -7678,7 +7693,7 @@ dependencies = [ [[package]] name = "reth-db-common" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7705,19 +7720,19 @@ dependencies = [ "rust-eth-triedb-state-trie", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] [[package]] name = "reth-db-models" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", "arbitrary", - "bytes 1.11.0", + "bytes 1.11.1", "modular-bitfield", "reth-codecs", "reth-primitives-traits", @@ -7727,7 +7742,7 @@ dependencies = [ [[package]] name = "reth-discv4" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7743,7 +7758,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -7752,7 +7767,7 @@ dependencies = [ [[package]] name = "reth-discv5" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7768,7 +7783,7 @@ dependencies = [ "reth-metrics 1.10.2", "reth-network-peers", "secp256k1 0.30.0", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -7776,7 +7791,7 @@ dependencies = [ [[package]] name = "reth-dns-discovery" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "data-encoding", @@ -7791,7 +7806,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -7800,7 +7815,7 @@ dependencies = [ [[package]] name = "reth-downloaders" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7825,7 +7840,7 @@ dependencies = [ "reth-tasks", "reth-testing-utils", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -7835,7 +7850,7 @@ dependencies = [ [[package]] name = "reth-ecies" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "aes", "alloy-primitives", @@ -7853,7 +7868,7 @@ dependencies = [ "reth-network-peers", "secp256k1 0.30.0", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -7863,7 +7878,7 @@ dependencies = [ [[package]] name = "reth-engine-local" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7886,7 +7901,7 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7904,14 +7919,14 @@ dependencies = [ "reth-primitives-traits", "reth-trie-common", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", ] [[package]] name = "reth-engine-service" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "futures", "pin-project", @@ -7934,7 +7949,7 @@ dependencies = [ [[package]] name = "reth-engine-tree" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eip7928", @@ -7986,7 +8001,7 @@ dependencies = [ "rust-eth-triedb", "schnellru", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -7994,7 +8009,7 @@ dependencies = [ [[package]] name = "reth-engine-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -8022,7 +8037,7 @@ dependencies = [ [[package]] name = "reth-era" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8031,16 +8046,16 @@ dependencies = [ "ethereum_ssz", "ethereum_ssz_derive", "snap", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-era-downloader" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", - "bytes 1.11.0", + "bytes 1.11.1", "eyre", "futures-util", "reqwest 0.12.28", @@ -8053,7 +8068,7 @@ dependencies = [ [[package]] name = "reth-era-utils" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8075,24 +8090,24 @@ dependencies = [ [[package]] name = "reth-errors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "reth-consensus", "reth-execution-errors", "reth-storage-errors", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-eth-wire" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-chains", "alloy-primitives", "alloy-rlp", "arbitrary", - "bytes 1.11.0", + "bytes 1.11.1", "derive_more 2.1.1", "futures", "pin-project", @@ -8105,7 +8120,7 @@ dependencies = [ "reth-primitives-traits", "serde", "snap", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -8115,7 +8130,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8124,7 +8139,7 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "arbitrary", - "bytes 1.11.0", + "bytes 1.11.1", "derive_more 2.1.1", "proptest", "proptest-arbitrary-interop", @@ -8133,13 +8148,13 @@ dependencies = [ "reth-ethereum-primitives", "reth-primitives-traits", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-ethereum-cli" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "clap", "eyre", @@ -8161,7 +8176,7 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8177,7 +8192,7 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8189,13 +8204,13 @@ dependencies = [ "reth-primitives-traits", "serde", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-ethereum-forks" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8209,7 +8224,7 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8238,7 +8253,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8258,7 +8273,7 @@ dependencies = [ [[package]] name = "reth-etl" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "rayon", "reth-db-api", @@ -8268,7 +8283,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8292,7 +8307,7 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8314,20 +8329,20 @@ dependencies = [ [[package]] name = "reth-execution-errors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-evm", "alloy-primitives", "alloy-rlp", "nybbles", "reth-storage-errors", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-execution-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8345,7 +8360,7 @@ dependencies = [ [[package]] name = "reth-exex" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8374,7 +8389,7 @@ dependencies = [ "reth-tasks", "reth-tracing", "rmp-serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-util", "tracing", @@ -8383,7 +8398,7 @@ dependencies = [ [[package]] name = "reth-exex-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8397,17 +8412,17 @@ dependencies = [ [[package]] name = "reth-fs-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-invalid-block-hooks" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8435,16 +8450,16 @@ dependencies = [ [[package]] name = "reth-ipc" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "futures", "futures-util", "interprocess", "jsonrpsee", "pin-project", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -8455,7 +8470,7 @@ dependencies = [ [[package]] name = "reth-libmdbx" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "bitflags 2.10.0", "byteorder", @@ -8464,14 +8479,14 @@ dependencies = [ "parking_lot", "reth-mdbx-sys", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] [[package]] name = "reth-mdbx-sys" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "bindgen 0.71.1", "cc", @@ -8492,7 +8507,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "futures", "metrics", @@ -8504,7 +8519,7 @@ dependencies = [ [[package]] name = "reth-net-banlist" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "ipnet", @@ -8513,13 +8528,13 @@ dependencies = [ [[package]] name = "reth-net-nat" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "futures-util", "if-addrs", "reqwest 0.12.28", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -8527,7 +8542,7 @@ dependencies = [ [[package]] name = "reth-network" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8573,7 +8588,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-util", @@ -8583,7 +8598,7 @@ dependencies = [ [[package]] name = "reth-network-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8600,7 +8615,7 @@ dependencies = [ "reth-network-types", "reth-tokio-util", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", ] @@ -8608,7 +8623,7 @@ dependencies = [ [[package]] name = "reth-network-p2p" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8631,14 +8646,14 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "alloy-rlp", "enr", "secp256k1 0.30.0", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "url", ] @@ -8646,7 +8661,7 @@ dependencies = [ [[package]] name = "reth-network-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8660,7 +8675,7 @@ dependencies = [ [[package]] name = "reth-nippy-jar" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "anyhow", "bincode", @@ -8669,7 +8684,7 @@ dependencies = [ "memmap2", "reth-fs-util", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", "zstd", ] @@ -8677,7 +8692,7 @@ dependencies = [ [[package]] name = "reth-node-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8701,7 +8716,7 @@ dependencies = [ [[package]] name = "reth-node-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8771,7 +8786,7 @@ dependencies = [ [[package]] name = "reth-node-core" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8816,7 +8831,7 @@ dependencies = [ "serde", "shellexpand", "strum 0.27.2", - "thiserror 2.0.17", + "thiserror 2.0.18", "toml 0.8.23", "tracing", "url", @@ -8827,7 +8842,7 @@ dependencies = [ [[package]] name = "reth-node-ethereum" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-network", @@ -8865,7 +8880,7 @@ dependencies = [ [[package]] name = "reth-node-ethstats" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8878,7 +8893,7 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tokio-tungstenite", @@ -8889,7 +8904,7 @@ dependencies = [ [[package]] name = "reth-node-events" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8913,9 +8928,9 @@ dependencies = [ [[package]] name = "reth-node-metrics" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "eyre", "http 1.4.0", "http-body-util", @@ -8937,7 +8952,7 @@ dependencies = [ [[package]] name = "reth-node-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "reth-chainspec", "reth-db-api", @@ -8949,7 +8964,7 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8964,7 +8979,7 @@ dependencies = [ [[package]] name = "reth-payload-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8985,7 +9000,7 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "pin-project", "reth-payload-primitives", @@ -8997,7 +9012,7 @@ dependencies = [ [[package]] name = "reth-payload-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9013,14 +9028,14 @@ dependencies = [ "reth-primitives-traits", "reth-trie-common", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", ] [[package]] name = "reth-payload-validator" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9030,7 +9045,7 @@ dependencies = [ [[package]] name = "reth-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "c-kzg", @@ -9044,7 +9059,7 @@ dependencies = [ [[package]] name = "reth-primitives-traits" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9056,7 +9071,7 @@ dependencies = [ "arbitrary", "auto_impl", "byteorder", - "bytes 1.11.0", + "bytes 1.11.1", "derive_more 2.1.1", "modular-bitfield", "once_cell", @@ -9071,13 +9086,13 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-provider" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9121,7 +9136,7 @@ dependencies = [ [[package]] name = "reth-prune" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9141,7 +9156,7 @@ dependencies = [ "reth-static-file-types", "reth-tokio-util", "rustc-hash", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -9149,7 +9164,7 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "arbitrary", @@ -9158,13 +9173,13 @@ dependencies = [ "reth-codecs", "serde", "strum 0.27.2", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-ress-protocol" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9183,7 +9198,7 @@ dependencies = [ [[package]] name = "reth-ress-provider" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9210,7 +9225,7 @@ dependencies = [ [[package]] name = "reth-revm" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9223,7 +9238,7 @@ dependencies = [ [[package]] name = "reth-rpc" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9295,7 +9310,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tower", @@ -9306,7 +9321,7 @@ dependencies = [ [[package]] name = "reth-rpc-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eip7928", "alloy-eips", @@ -9336,7 +9351,7 @@ dependencies = [ [[package]] name = "reth-rpc-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-network", "alloy-provider", @@ -9366,7 +9381,7 @@ dependencies = [ "reth-tokio-util", "reth-transaction-pool", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-util", "tower", @@ -9377,7 +9392,7 @@ dependencies = [ [[package]] name = "reth-rpc-convert" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-evm", @@ -9393,13 +9408,13 @@ dependencies = [ "reth-evm", "reth-primitives-traits", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-rpc-engine-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9421,7 +9436,7 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -9429,7 +9444,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9474,7 +9489,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9512,7 +9527,7 @@ dependencies = [ "revm-inspectors", "schnellru", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -9522,7 +9537,7 @@ dependencies = [ [[package]] name = "reth-rpc-layer" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-rpc-types-engine", "http 1.4.0", @@ -9536,7 +9551,7 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9552,7 +9567,7 @@ dependencies = [ [[package]] name = "reth-stages" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9596,7 +9611,7 @@ dependencies = [ "reth-trie-db", "rust-eth-triedb", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -9604,7 +9619,7 @@ dependencies = [ [[package]] name = "reth-stages-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9623,7 +9638,7 @@ dependencies = [ "reth-static-file", "reth-static-file-types", "reth-tokio-util", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -9631,11 +9646,11 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "arbitrary", - "bytes 1.11.0", + "bytes 1.11.1", "modular-bitfield", "reth-codecs", "reth-trie-common", @@ -9645,7 +9660,7 @@ dependencies = [ [[package]] name = "reth-static-file" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "parking_lot", @@ -9665,7 +9680,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "clap", @@ -9678,7 +9693,7 @@ dependencies = [ [[package]] name = "reth-storage-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9702,7 +9717,7 @@ dependencies = [ [[package]] name = "reth-storage-errors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9713,13 +9728,13 @@ dependencies = [ "reth-static-file-types", "revm-database-interface", "revm-state", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "reth-tasks" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "auto_impl", "dyn-clone", @@ -9728,7 +9743,7 @@ dependencies = [ "pin-project", "rayon", "reth-metrics 1.10.2", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", "tracing-futures", @@ -9737,7 +9752,7 @@ dependencies = [ [[package]] name = "reth-testing-utils" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9753,7 +9768,7 @@ dependencies = [ [[package]] name = "reth-tokio-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "tokio", "tokio-stream", @@ -9763,7 +9778,7 @@ dependencies = [ [[package]] name = "reth-tracing" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "clap", "eyre", @@ -9779,7 +9794,7 @@ dependencies = [ [[package]] name = "reth-tracing-otlp" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "clap", "eyre", @@ -9797,7 +9812,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9829,7 +9844,7 @@ dependencies = [ "serde", "serde_json", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -9838,7 +9853,7 @@ dependencies = [ [[package]] name = "reth-trie" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9864,7 +9879,7 @@ dependencies = [ [[package]] name = "reth-trie-common" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9874,7 +9889,7 @@ dependencies = [ "alloy-trie", "arbitrary", "arrayvec", - "bytes 1.11.0", + "bytes 1.11.1", "derive_more 2.1.1", "hash-db", "itertools 0.14.0", @@ -9893,7 +9908,7 @@ dependencies = [ [[package]] name = "reth-trie-db" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "metrics", @@ -9914,7 +9929,7 @@ dependencies = [ [[package]] name = "reth-trie-parallel" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9931,7 +9946,7 @@ dependencies = [ "reth-trie", "reth-trie-common", "reth-trie-sparse", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -9939,7 +9954,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9958,7 +9973,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse-parallel" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9976,7 +9991,7 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=rebase-v1.10.2-bnb#458f3a2b017ff2b23829fe9fb391aa9f11656ab3" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" dependencies = [ "zstd", ] @@ -10008,7 +10023,7 @@ dependencies = [ "bit-set 0.5.3", "bls_on_arkworks", "blst", - "bytes 1.11.0", + "bytes 1.11.1", "cfg-if", "cipher", "clap", @@ -10075,6 +10090,7 @@ dependencies = [ "reth-rpc-convert", "reth-rpc-engine-api", "reth-rpc-eth-api", + "reth-rpc-server-types", "reth-tasks", "reth-transaction-pool", "reth-trie-common", @@ -10091,13 +10107,13 @@ dependencies = [ "sha2 0.10.9", "signature 2.2.0", "tendermint", - "thiserror 2.0.17", + "thiserror 2.0.18", "tikv-jemalloc-ctl", "tikv-jemallocator", "tokio", "tokio-stream", "tracing", - "uuid 1.19.0", + "uuid 1.20.0", "zeroize", ] @@ -10190,7 +10206,7 @@ dependencies = [ "revm-primitives", "revm-state", "serde", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -10232,9 +10248,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.34.1" +version = "0.34.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24ca988ae1f7a0bb5688630579c00e867cd9f1df0a2f040623887f63d3b414c" +checksum = "6e435414e9de50a1b930da602067c76365fea2fea11e80ceb50783c94ddd127f" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -10247,7 +10263,7 @@ dependencies = [ "revm", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -10375,9 +10391,9 @@ dependencies = [ [[package]] name = "rlimit" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" +checksum = "f35ee2729c56bb610f6dba436bf78135f728b7373bdffae2ec815b2d3eb98cc3" dependencies = [ "libc", ] @@ -10388,7 +10404,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "rustc-hex", ] @@ -10457,7 +10473,7 @@ dependencies = [ "ark-ff 0.3.0", "ark-ff 0.4.2", "ark-ff 0.5.0", - "bytes 1.11.0", + "bytes 1.11.1", "fastrlp 0.3.1", "fastrlp 0.4.0", "num-bigint", @@ -10552,9 +10568,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" @@ -10646,7 +10662,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.9", "subtle", "zeroize", ] @@ -10669,7 +10685,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ - "openssl-probe 0.2.0", + "openssl-probe 0.2.1", "rustls-pki-types", "schannel", "security-framework 3.5.1", @@ -10686,9 +10702,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "web-time", "zeroize", @@ -10708,7 +10724,7 @@ dependencies = [ "rustls 0.23.36", "rustls-native-certs 0.8.3", "rustls-platform-verifier-android", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.9", "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs 0.26.11", @@ -10733,9 +10749,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "ring", "rustls-pki-types", @@ -10762,9 +10778,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "ryu-js" @@ -10813,9 +10829,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -11129,7 +11145,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.2.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -11230,9 +11246,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +checksum = "b31139435f327c93c6038ed350ae4588e2c70a13d50599509fee6349967ba35a" dependencies = [ "cc", "cfg-if", @@ -11323,15 +11339,15 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", ] [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "skeptic" @@ -11356,9 +11372,9 @@ checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "small_btree" @@ -11397,9 +11413,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -11412,7 +11428,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" dependencies = [ "base64 0.22.1", - "bytes 1.11.0", + "bytes 1.11.1", "futures", "http 1.4.0", "httparse", @@ -11537,9 +11553,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f92d01b5de07eaf324f7fca61cc6bd3d82bbc1de5b6c963e6fe79e86f36580d" +checksum = "2379beea9476b89d0237078be761cf8e012d92d5ae4ae0c9a329f974838870fc" dependencies = [ "paste", "proc-macro2", @@ -11737,11 +11753,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -11757,9 +11773,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -11817,9 +11833,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.45" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", @@ -11835,29 +11851,20 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinystr" version = "0.8.2" @@ -11890,13 +11897,13 @@ version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] @@ -11967,7 +11974,7 @@ version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "futures-core", "futures-io", "futures-sink", @@ -12058,13 +12065,13 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tonic" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" +checksum = "a286e33f82f8a1ee2df63f4fa35c0becf4a85a0cb03091a15fd7bf0b402dc94a" dependencies = [ "async-trait", "base64 0.22.1", - "bytes 1.11.0", + "bytes 1.11.1", "http 1.4.0", "http-body 1.0.1", "http-body-util", @@ -12084,11 +12091,11 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +checksum = "d6c55a2d6a14174563de34409c9f92ff981d006f56da9c6ecd40d9d4a31500b0" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "prost 0.14.3", "tonic", ] @@ -12122,7 +12129,7 @@ dependencies = [ "async-compression", "base64 0.22.1", "bitflags 2.10.0", - "bytes 1.11.0", + "bytes 1.11.1", "futures-core", "futures-util", "http 1.4.0", @@ -12141,7 +12148,7 @@ dependencies = [ "tower-layer", "tower-service", "tracing", - "uuid 1.19.0", + "uuid 1.20.0", ] [[package]] @@ -12175,7 +12182,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" dependencies = [ "crossbeam-channel", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tracing-subscriber 0.3.22", ] @@ -12235,9 +12242,9 @@ dependencies = [ [[package]] name = "tracing-logfmt" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" +checksum = "a250055a3518b5efba928a18ffac8d32d42ea607a9affff4532144cd5b2e378e" dependencies = [ "time", "tracing", @@ -12289,7 +12296,7 @@ dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex-automata 0.4.13", + "regex-automata 0.4.14", "serde", "serde_json", "sharded-slab", @@ -12352,7 +12359,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ - "bytes 1.11.0", + "bytes 1.11.1", "data-encoding", "http 1.4.0", "httparse", @@ -12361,7 +12368,7 @@ dependencies = [ "rustls 0.23.36", "rustls-pki-types", "sha1", - "thiserror 2.0.17", + "thiserror 2.0.18", "utf-8", ] @@ -12415,9 +12422,9 @@ checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" [[package]] name = "unicode-segmentation" @@ -12525,9 +12532,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -12646,18 +12653,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -12668,11 +12675,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -12681,9 +12689,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -12691,9 +12699,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", @@ -12704,9 +12712,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -12740,9 +12748,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ "js-sys", "wasm-bindgen", @@ -12764,14 +12772,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.6", ] [[package]] name = "webpki-root-certs" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" dependencies = [ "rustls-pki-types", ] @@ -12782,14 +12790,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.5", + "webpki-roots 1.0.6", ] [[package]] name = "webpki-roots" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" dependencies = [ "rustls-pki-types", ] @@ -13312,9 +13320,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" [[package]] name = "write16" @@ -13341,7 +13349,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror 2.0.17", + "thiserror 2.0.18", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -13403,18 +13411,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", @@ -13498,9 +13506,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.14" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" +checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index 67983036..b815369f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,57 +13,58 @@ name = "reth-bsc" path = "src/main.rs" [dependencies] -reth = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-cli = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-cli-commands = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-basic-payload-builder = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-db = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-engine-local = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-chainspec = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-cli-util = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-discv4 = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb", features = [ +reth = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-cli = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-cli-commands = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-basic-payload-builder = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-db = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-engine-local = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-chainspec = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-cli-util = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-discv4 = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = [ "test-utils", ] } -reth-engine-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-ethereum-forks = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb", features = [ +reth-engine-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-ethereum-forks = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = [ "serde", ] } -reth-ethereum-payload-builder = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-payload-builder-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-chain-state = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-ethereum-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-eth-wire = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-eth-wire-types = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-evm = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-evm-ethereum = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-execution-types = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-ipc = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-metrics = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-node-core = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-revm = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-network = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb", features = [ +reth-ethereum-payload-builder = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-payload-builder-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-chain-state = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-ethereum-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-eth-wire = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-eth-wire-types = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-evm = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-evm-ethereum = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-execution-types = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-ipc = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-metrics = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-node-core = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-revm = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-network = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = [ "test-utils", ] } -reth-network-p2p = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-network-api = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-node-ethereum = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb", features = [ +reth-network-p2p = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-network-api = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-node-ethereum = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = [ "test-utils", ] } -reth-network-peers = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-payload-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-ethereum-engine-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-primitives-traits = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-provider = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb", features = [ +reth-network-peers = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-payload-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-ethereum-engine-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-primitives-traits = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-provider = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = [ "test-utils", ] } -reth-rpc-eth-api = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-rpc-convert = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-rpc-engine-api = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-trie-common = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-trie-db = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-tasks = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } -reth-transaction-pool = { git = "https://github.com/bnb-chain/reth.git", branch = "rebase-v1.10.2-bnb" } +reth-rpc-eth-api = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-rpc-convert = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-rpc-engine-api = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-rpc-server-types = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-trie-common = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-trie-db = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-tasks = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-transaction-pool = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } revm = "34.0.0" revm-context-interface = "14.0.0" revm-database = "10.0.0" diff --git a/src/chainspec/parser.rs b/src/chainspec/parser.rs index e8170d4d..05587c20 100644 --- a/src/chainspec/parser.rs +++ b/src/chainspec/parser.rs @@ -194,6 +194,11 @@ fn add_hardforks_to_chainspec( if let Some(prague_time) = config.get("pragueTime").and_then(|v| v.as_u64()) { chain_spec = chain_spec.with_fork(EthereumHardfork::Prague, ForkCondition::Timestamp(prague_time)); } + + if let Some(osaka_time) = config.get("osakaTime").and_then(|v| v.as_u64()) { + chain_spec = chain_spec.with_fork(EthereumHardfork::Osaka, ForkCondition::Timestamp(osaka_time)); + chain_spec = chain_spec.with_fork(BscHardfork::Osaka, ForkCondition::Timestamp(osaka_time)); + } if let Some(pascal_time) = config.get("pascalTime").and_then(|v| v.as_u64()) { chain_spec = chain_spec.with_fork(BscHardfork::Pascal, ForkCondition::Timestamp(pascal_time)); @@ -210,6 +215,10 @@ fn add_hardforks_to_chainspec( if let Some(fermi_time) = config.get("fermiTime").and_then(|v| v.as_u64()) { chain_spec = chain_spec.with_fork(BscHardfork::Fermi, ForkCondition::Timestamp(fermi_time)); } + + if let Some(mendel_time) = config.get("mendelTime").and_then(|v| v.as_u64()) { + chain_spec = chain_spec.with_fork(BscHardfork::Mendel, ForkCondition::Timestamp(mendel_time)); + } Ok(chain_spec) -} \ No newline at end of file +} diff --git a/src/consensus/eip4844/bep657.rs b/src/consensus/eip4844/bep657.rs new file mode 100644 index 00000000..913a9be0 --- /dev/null +++ b/src/consensus/eip4844/bep657.rs @@ -0,0 +1,335 @@ +use alloy_consensus::BlockHeader; +use alloy_eips::eip7840::BlobParams; + +use crate::hardforks::BscHardforks; + +/// Blob-eligible block interval (BEP-657). Only blocks where N % interval == 0 can include blobs. +pub const BLOB_ELIGIBLE_BLOCK_INTERVAL: u64 = 5; + +/// Returns whether blob transactions are allowed in the given block. +pub fn is_blob_eligible_block( + chain_spec: &ChainSpec, + block_number: u64, + timestamp: u64, +) -> bool { + if !chain_spec.is_mendel_active_at_timestamp(block_number, timestamp) { + return true; + } + block_number.is_multiple_of(BLOB_ELIGIBLE_BLOCK_INTERVAL) +} + +/// Returns whether the excess blob gas should be recalculated for the given block. +pub fn should_recalculate_excess_blob_gas( + chain_spec: &ChainSpec, + block_number: u64, + timestamp: u64, +) -> bool { + if !chain_spec.is_mendel_active_at_timestamp(block_number, timestamp) { + return true; + } + block_number % BLOB_ELIGIBLE_BLOCK_INTERVAL == 1 +} + +/// Calculates the expected excess blob gas for the next block, applying BEP-657 rules when Mendel +/// is active. +pub fn next_block_excess_blob_gas_with_mendel( + chain_spec: &ChainSpec, + block_number: u64, + timestamp: u64, + parent: &H, + blob_params: Option, +) -> Option +where + ChainSpec: BscHardforks, + H: BlockHeader, +{ + let blob_params = blob_params?; + + if !should_recalculate_excess_blob_gas(chain_spec, block_number, timestamp) { + return Some(parent.excess_blob_gas().unwrap_or(0)); + } + + parent + .maybe_next_block_excess_blob_gas(Some(blob_params)) + .or_else(|| Some(BlobParams::cancun().next_block_excess_blob_gas_osaka(0, 0, 0))) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::hardforks::bsc::BscHardfork; + use alloy_consensus::Header; + use reth_chainspec::{ChainSpecBuilder, ForkCondition, EthereumHardfork}; + use crate::chainspec::BscChainSpec; + use std::sync::Arc; + + /// Creates a chain spec with Mendel active at timestamp 1000 + /// London must be active at block 0 for Mendel to be considered active + fn mendel_active_chain_spec() -> Arc { + Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(EthereumHardfork::London, ForkCondition::Block(0)) + .with_fork(BscHardfork::Mendel, ForkCondition::Timestamp(1000)) + .build(), + )) + } + + /// Creates a chain spec with Mendel not active (far future) + /// London is active so we can test pre-Mendel behavior + fn mendel_inactive_chain_spec() -> Arc { + Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(EthereumHardfork::London, ForkCondition::Block(0)) + .with_fork(BscHardfork::Mendel, ForkCondition::Timestamp(u64::MAX)) + .build(), + )) + } + + // ==================== is_blob_eligible_block tests ==================== + + #[test] + fn blob_eligible_before_mendel_all_blocks_allowed() { + let spec = mendel_inactive_chain_spec(); + + // Before Mendel, all blocks should be eligible for blobs + for block_number in 0..20 { + assert!( + is_blob_eligible_block(&*spec, block_number, 500), + "block {} should be eligible before Mendel", + block_number + ); + } + } + + #[test] + fn blob_eligible_after_mendel_only_multiples_of_5() { + let spec = mendel_active_chain_spec(); + let timestamp = 2000; // After Mendel activation (1000) + + // Blocks 0, 5, 10, 15 should be eligible + let eligible_blocks = [0, 5, 10, 15, 20, 25, 100, 1000]; + for block_number in eligible_blocks { + assert!( + is_blob_eligible_block(&*spec, block_number, timestamp), + "block {} should be eligible (multiple of 5)", + block_number + ); + } + + // Blocks 1, 2, 3, 4, 6, 7, 8, 9 should NOT be eligible + let ineligible_blocks = [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 99, 101]; + for block_number in ineligible_blocks { + assert!( + !is_blob_eligible_block(&*spec, block_number, timestamp), + "block {} should NOT be eligible (not multiple of 5)", + block_number + ); + } + } + + #[test] + fn blob_eligible_at_mendel_boundary() { + let spec = mendel_active_chain_spec(); + + // Just before Mendel (timestamp 999) - all blocks eligible + assert!(is_blob_eligible_block(&*spec, 1, 999)); + assert!(is_blob_eligible_block(&*spec, 6, 999)); + + // At Mendel activation (timestamp 1000) - only multiples of 5 + assert!(is_blob_eligible_block(&*spec, 0, 1000)); + assert!(is_blob_eligible_block(&*spec, 5, 1000)); + assert!(!is_blob_eligible_block(&*spec, 1, 1000)); + assert!(!is_blob_eligible_block(&*spec, 6, 1000)); + } + + // ==================== should_recalculate_excess_blob_gas tests ==================== + + #[test] + fn recalculate_excess_gas_before_mendel_always_true() { + let spec = mendel_inactive_chain_spec(); + + // Before Mendel, should always recalculate + for block_number in 0..20 { + assert!( + should_recalculate_excess_blob_gas(&*spec, block_number, 500), + "block {} should recalculate before Mendel", + block_number + ); + } + } + + #[test] + fn recalculate_excess_gas_after_mendel_only_n_mod_5_eq_1() { + let spec = mendel_active_chain_spec(); + let timestamp = 2000; + + // Blocks where N % 5 == 1 should recalculate: 1, 6, 11, 16, 21... + let recalculate_blocks = [1, 6, 11, 16, 21, 26, 101, 1001]; + for block_number in recalculate_blocks { + assert!( + should_recalculate_excess_blob_gas(&*spec, block_number, timestamp), + "block {} should recalculate (N %% 5 == 1)", + block_number + ); + } + + // All other blocks should NOT recalculate + let no_recalculate_blocks = [0, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 100, 102]; + for block_number in no_recalculate_blocks { + assert!( + !should_recalculate_excess_blob_gas(&*spec, block_number, timestamp), + "block {} should NOT recalculate (N %% 5 != 1)", + block_number + ); + } + } + + #[test] + fn recalculate_pattern_aligns_with_eligibility() { + // Recalculation happens at N%5==1, which is the block AFTER an eligible block (N%5==0) + // This ensures the fee is calculated once after each eligible block + let spec = mendel_active_chain_spec(); + let timestamp = 2000; + + // Block 0: eligible, no recalc (uses initial state) + assert!(is_blob_eligible_block(&*spec, 0, timestamp)); + assert!(!should_recalculate_excess_blob_gas(&*spec, 0, timestamp)); + + // Block 1: not eligible, recalculate (based on block 0's blob usage) + assert!(!is_blob_eligible_block(&*spec, 1, timestamp)); + assert!(should_recalculate_excess_blob_gas(&*spec, 1, timestamp)); + + // Blocks 2-4: not eligible, no recalc (inherit from block 1) + for n in 2..=4 { + assert!(!is_blob_eligible_block(&*spec, n, timestamp)); + assert!(!should_recalculate_excess_blob_gas(&*spec, n, timestamp)); + } + + // Block 5: eligible, no recalc + assert!(is_blob_eligible_block(&*spec, 5, timestamp)); + assert!(!should_recalculate_excess_blob_gas(&*spec, 5, timestamp)); + + // Block 6: not eligible, recalculate (based on block 5's blob usage) + assert!(!is_blob_eligible_block(&*spec, 6, timestamp)); + assert!(should_recalculate_excess_blob_gas(&*spec, 6, timestamp)); + } + + // ==================== next_block_excess_blob_gas_with_mendel tests ==================== + + #[test] + fn next_excess_gas_returns_none_without_blob_params() { + let spec = mendel_active_chain_spec(); + let parent = Header::default(); + + let result = next_block_excess_blob_gas_with_mendel( + &*spec, + 10, + 2000, + &parent, + None, // No blob params + ); + + assert!(result.is_none()); + } + + #[test] + fn next_excess_gas_inherits_parent_when_no_recalculate() { + let spec = mendel_active_chain_spec(); + let timestamp = 2000; + + // Create parent with specific excess_blob_gas + let mut parent = Header::default(); + parent.excess_blob_gas = Some(12345); + + let blob_params = Some(BlobParams::cancun()); + + // Block 2 should NOT recalculate (2 % 5 != 1), so it inherits parent's value + let result = next_block_excess_blob_gas_with_mendel( + &*spec, + 2, + timestamp, + &parent, + blob_params, + ); + + assert_eq!(result, Some(12345)); + } + + #[test] + fn next_excess_gas_inherits_zero_when_parent_has_none() { + let spec = mendel_active_chain_spec(); + let timestamp = 2000; + + // Parent without excess_blob_gas + let parent = Header::default(); + let blob_params = Some(BlobParams::cancun()); + + // Block 3 should NOT recalculate, inherit 0 + let result = next_block_excess_blob_gas_with_mendel( + &*spec, + 3, + timestamp, + &parent, + blob_params, + ); + + assert_eq!(result, Some(0)); + } + + #[test] + fn next_excess_gas_recalculates_at_correct_blocks() { + let spec = mendel_active_chain_spec(); + let timestamp = 2000; + + // Create parent with blob gas values for recalculation + let mut parent = Header::default(); + parent.excess_blob_gas = Some(0); + parent.blob_gas_used = Some(0); + + let blob_params = Some(BlobParams::cancun()); + + // Block 6 should recalculate (6 % 5 == 1) + let result = next_block_excess_blob_gas_with_mendel( + &*spec, + 6, + timestamp, + &parent, + blob_params, + ); + + // With 0 excess and 0 used, recalculation should return 0 + assert!(result.is_some()); + } + + #[test] + fn next_excess_gas_before_mendel_always_recalculates() { + let spec = mendel_inactive_chain_spec(); + let timestamp = 500; // Before Mendel + + let mut parent = Header::default(); + parent.excess_blob_gas = Some(1000); + parent.blob_gas_used = Some(0); + + let blob_params = Some(BlobParams::cancun()); + + // Any block before Mendel should recalculate + for block_number in [2, 3, 4, 7, 8, 9] { + let result = next_block_excess_blob_gas_with_mendel( + &*spec, + block_number, + timestamp, + &parent, + blob_params, + ); + // Should recalculate, not just inherit 1000 + assert!(result.is_some()); + } + } + + // ==================== BLOB_ELIGIBLE_BLOCK_INTERVAL constant test ==================== + + #[test] + fn blob_interval_is_five() { + assert_eq!(BLOB_ELIGIBLE_BLOCK_INTERVAL, 5); + } +} diff --git a/src/consensus/eip4844/mod.rs b/src/consensus/eip4844/mod.rs index 32c1951c..aef3f86e 100644 --- a/src/consensus/eip4844/mod.rs +++ b/src/consensus/eip4844/mod.rs @@ -1,12 +1,17 @@ //! EIP-4844 implementation for BSC mod blob_fee; +mod bep657; pub use blob_fee::{ calc_blob_fee, CANCUN_UPDATE_FRACTION, MIN_BLOB_GAS_PRICE, BLOB_TX_BLOB_GAS_PER_BLOB, }; +pub use bep657::{ + is_blob_eligible_block, next_block_excess_blob_gas_with_mendel, + should_recalculate_excess_blob_gas, BLOB_ELIGIBLE_BLOCK_INTERVAL, +}; // Re-export fake_exponential from alloy_eips -pub use alloy_eips::eip4844::fake_exponential; \ No newline at end of file +pub use alloy_eips::eip4844::fake_exponential; diff --git a/src/consensus/parlia/validation.rs b/src/consensus/parlia/validation.rs index 4e761efb..3a3ddeaa 100644 --- a/src/consensus/parlia/validation.rs +++ b/src/consensus/parlia/validation.rs @@ -1,15 +1,18 @@ -use reth::consensus::{HeaderValidator, ConsensusError, Consensus}; +use reth::consensus::{Consensus, ConsensusError, HeaderValidator, TxGasLimitTooHighErr}; use reth::primitives::SealedHeader; use reth_chainspec::{EthChainSpec, EthereumHardforks, EthereumHardfork}; use crate::consensus::parlia::util::calculate_millisecond_timestamp; use crate::hardforks::BscHardforks; +use crate::consensus::eip4844::is_blob_eligible_block; use super::Parlia; -use alloy_consensus::{Header, EMPTY_OMMER_ROOT_HASH}; +use alloy_consensus::{Header, Transaction, EMPTY_OMMER_ROOT_HASH}; use alloy_primitives::B256; use reth_primitives::GotExpected; use alloy_eips::eip4844::{DATA_GAS_PER_BLOB, MAX_DATA_GAS_PER_BLOCK_DENCUN}; use crate::BscBlock; -use reth_primitives_traits::Block; +use reth_primitives_traits::{constants::MAX_TX_GAS_LIMIT_OSAKA, Block}; + +const MAX_RLP_BLOCK_SIZE_OSAKA: usize = 8 * 1024 * 1024; pub const fn validate_header_gas(header: &Header) -> Result<(), ConsensusError> { @@ -38,9 +41,22 @@ pub fn validate_header_base_fee( /// Validate the 4844 header of BSC block. /// Compared to Ethereum, BSC block doesn't have `parent_beacon_block_root`. -pub fn validate_4844_header_of_bsc(header: &SealedHeader) -> Result<(), ConsensusError> { +pub fn validate_4844_header_of_bsc( + header: &SealedHeader, + chain_spec: &ChainSpec, +) -> Result<(), ConsensusError> { let blob_gas_used = header.blob_gas_used.ok_or(ConsensusError::BlobGasUsedMissing)?; let excess_blob_gas = header.excess_blob_gas.ok_or(ConsensusError::ExcessBlobGasMissing)?; + + // BEP-657: After Mendel, non-eligible blocks must have blob_gas_used == 0 + if !is_blob_eligible_block(chain_spec, header.number, header.timestamp) && blob_gas_used != 0 { + return Err(ConsensusError::Other(format!( + "blob transactions not allowed in block {} (N % {} != 0)", + header.number, + crate::consensus::eip4844::BLOB_ELIGIBLE_BLOCK_INTERVAL + ))); + } + if blob_gas_used > MAX_DATA_GAS_PER_BLOCK_DENCUN { return Err(ConsensusError::BlobGasUsedExceedsMaxBlobGasPerBlock { blob_gas_used, @@ -94,7 +110,7 @@ impl MAX_RLP_BLOCK_SIZE_OSAKA { + return Err(ConsensusError::BlockTooLarge { + rlp_length, + max_rlp_length: MAX_RLP_BLOCK_SIZE_OSAKA, + }); + } + + for tx in block.body().transactions() { + if tx.gas_limit() > MAX_TX_GAS_LIMIT_OSAKA { + return Err(TxGasLimitTooHighErr { + tx_hash: *tx.hash(), + gas_limit: tx.gas_limit(), + max_allowed: MAX_TX_GAS_LIMIT_OSAKA, + } + .into()); + } + } + } + // EIP-4844: Shard Blob Transactions if BscHardforks::is_cancun_active_at_timestamp(&*self.spec, block.number, block.timestamp) { + if !is_blob_eligible_block(&*self.spec, block.number, block.timestamp) + && block.body().transactions().any(|tx| tx.is_eip4844()) + { + return Err(ConsensusError::Other( + "blob transactions not allowed in this block".to_string(), + )); + } // Check that the blob gas used in the header matches the sum of the blob gas used by // each blob tx let header_blob_gas_used = block.blob_gas_used.ok_or(ConsensusError::BlobGasUsedMissing)?; - let total_blob_gas = block.blob_gas_used.ok_or(ConsensusError::BlobGasUsedMissing)?; + let total_blob_gas: u64 = block + .body() + .transactions() + .map(|tx| tx.blob_gas_used().unwrap_or(0)) + .sum(); if total_blob_gas != header_blob_gas_used { return Err(ConsensusError::BlobGasUsedDiff(GotExpected { got: header_blob_gas_used, diff --git a/src/consensus/parlia/vote_pool.rs b/src/consensus/parlia/vote_pool.rs index d4aef75b..f895301a 100644 --- a/src/consensus/parlia/vote_pool.rs +++ b/src/consensus/parlia/vote_pool.rs @@ -1,12 +1,16 @@ +use lru::LruCache; use once_cell::sync::Lazy; -use std::{collections::{BinaryHeap, HashMap, HashSet}, sync::RwLock, cmp::Reverse}; +use std::{cmp::Reverse, collections::{BinaryHeap, HashMap, HashSet}, num::NonZero, sync::RwLock}; use alloy_primitives::{BlockNumber, B256}; use super::vote::{VoteData, VoteEnvelope}; use crate::metrics::BscVoteMetrics; +use crate::shared; const LOWER_LIMIT_OF_VOTE_BLOCK_NUMBER: u64 = 256; +/// Size of the LRU cache for tracking finality notifications (matches geth's finalizedNotified) +const FINALIZED_NOTIFIED_CACHE_SIZE: usize = 21; /// Container for votes associated with a specific block hash. #[derive(Default)] @@ -105,6 +109,13 @@ impl VotePool { self.cur_votes.values().map(|vm| vm.vote_messages.len()).sum() } + fn len_for_block(&self, block_hash: &B256) -> usize { + self.cur_votes + .get(block_hash) + .map(|vm| vm.vote_messages.len()) + .unwrap_or(0) + } + fn fetch_vote_by_block_hash(&self, block_hash: B256) -> Vec { if let Some(vote_messages) = self.cur_votes.get(&block_hash) { vote_messages.vote_messages.clone() @@ -143,6 +154,12 @@ static VOTE_POOL: Lazy> = Lazy::new(|| RwLock::new(VotePool::ne /// Global metrics for vote operations. static VOTE_METRICS: Lazy = Lazy::new(BscVoteMetrics::default); +/// LRU cache to track which blocks have already been notified for finality. +/// This prevents repeated update_forkchoice calls for the same block (matches geth's finalizedNotified). +static FINALIZED_NOTIFIED: Lazy>> = Lazy::new(|| { + RwLock::new(LruCache::new(NonZero::new(FINALIZED_NOTIFIED_CACHE_SIZE).unwrap())) +}); + /// Update vote pool size metric. fn update_vote_pool_size_metric(size: usize) { VOTE_METRICS.vote_pool_size.set(size as f64); @@ -151,11 +168,14 @@ fn update_vote_pool_size_metric(size: usize) { /// Insert a single vote into the pool (deduplicated by hash). pub fn put_vote(vote: VoteEnvelope) { + let target_hash = vote.data.target_hash; let mut pool = VOTE_POOL.write().expect("vote pool poisoned"); pool.insert(vote); + let votes_for_block = pool.len_for_block(&target_hash); let size = pool.len(); drop(pool); update_vote_pool_size_metric(size); + maybe_notify_finality(target_hash, votes_for_block); } /// Drain all pending votes. @@ -189,4 +209,70 @@ pub fn prune(latest_block_number: BlockNumber) { update_vote_pool_size_metric(size); } +fn maybe_notify_finality(target_hash: B256, votes_for_block: usize) { + // Check if we've already notified for this block (de-duplication) + { + let cache = FINALIZED_NOTIFIED.read().expect("finalized notified cache poisoned"); + if cache.peek(&target_hash).is_some() { + return; + } + } + + let head_number = match shared::get_best_canonical_block_number() { + Some(number) => number, + None => return, + }; + let head = match shared::get_canonical_header_by_number(head_number) { + Some(header) => header, + None => return, + }; + if head.hash_slow() != target_hash { + return; + } + + let sp = match shared::get_snapshot_provider() { + Some(provider) => provider, + None => return, + }; + let snap = match sp.snapshot_by_hash(&target_hash) { + Some(snap) => snap, + None => return, + }; + if snap.validators.is_empty() { + return; + } + + let current_justified_number = snap.vote_data.target_number; + if head.number == 0 || head.number - 1 != current_justified_number { + return; + } + + let quorum = usize::div_ceil(snap.validators.len() * 2, 3); + if votes_for_block < quorum { + return; + } + + let eligible_votes = fetch_vote_by_block_hash(target_hash) + .into_iter() + .filter(|vote| { + vote.data.source_number == current_justified_number + && vote.data.target_number == head.number + }) + .count(); + + if eligible_votes < quorum { + return; + } + + // Mark as notified before sending to avoid duplicate notifications + { + let mut cache = FINALIZED_NOTIFIED.write().expect("finalized notified cache poisoned"); + cache.put(target_hash, ()); + } + if let Some(engine) = shared::get_fork_choice_engine() { + tokio::spawn(async move { + let _ = engine.update_forkchoice(&head).await; + }); + } +} diff --git a/src/evm/precompiles/mod.rs b/src/evm/precompiles/mod.rs index 1beab8e8..ccd48fdb 100644 --- a/src/evm/precompiles/mod.rs +++ b/src/evm/precompiles/mod.rs @@ -8,9 +8,8 @@ use revm::{ context::Cfg, handler::EthPrecompiles, precompile::{ - bls12_381, kzg_point_evaluation, modexp, secp256r1, u64_to_address, Precompile, - PrecompileError, PrecompileFn, PrecompileId, PrecompileOutput, PrecompileResult, - Precompiles, + bls12_381, kzg_point_evaluation, modexp, secp256r1, u64_to_address, Precompile, PrecompileError, PrecompileFn, + PrecompileId, PrecompileOutput, PrecompileResult, Precompiles, }, primitives::{hardfork::SpecId, Address as RevmAddress}, }; @@ -88,11 +87,7 @@ impl PrecompileTraceContext { tx_to: Option, tx_input: &[u8], ) -> Self { - let tx_selector = if tx_input.len() >= 4 { - Some(hex::encode(&tx_input[..4])) - } else { - None - }; + let tx_selector = if tx_input.len() >= 4 { Some(hex::encode(&tx_input[..4])) } else { None }; Self::from_parts(block_number, spec, is_system_tx, tx_hash, tx_to, tx_selector, tx_input.len()) } @@ -333,10 +328,7 @@ fn install_precompile_tracing(precompiles: &mut Precompiles) -> PrecompileTraceM }; let (id, address, original) = precompile.into(); - trace_map.insert( - address, - PrecompileTraceEntry { id: id.clone(), original }, - ); + trace_map.insert(address, PrecompileTraceEntry { id: id.clone(), original }); if let Some(wrapper) = traced_wrapper_for_address(address) { precompiles.extend([Precompile::new(id, address, wrapper)]); @@ -355,46 +347,31 @@ fn build_traced_precompiles(mut precompiles: Precompiles) -> TracedPrecompiles { fn build_istanbul_precompiles() -> Precompiles { let mut precompiles = Precompiles::istanbul().clone(); - precompiles.extend([ - tendermint::TENDERMINT_HEADER_VALIDATION, - iavl::IAVL_PROOF_VALIDATION, - ]); + precompiles.extend([tendermint::TENDERMINT_HEADER_VALIDATION, iavl::IAVL_PROOF_VALIDATION]); precompiles } fn build_nano_precompiles() -> Precompiles { let mut precompiles = build_istanbul_precompiles(); - precompiles.extend([ - tendermint::TENDERMINT_HEADER_VALIDATION_NANO, - iavl::IAVL_PROOF_VALIDATION_NANO, - ]); + precompiles.extend([tendermint::TENDERMINT_HEADER_VALIDATION_NANO, iavl::IAVL_PROOF_VALIDATION_NANO]); precompiles } fn build_moran_precompiles() -> Precompiles { let mut precompiles = build_istanbul_precompiles(); - precompiles.extend([ - tendermint::TENDERMINT_HEADER_VALIDATION, - iavl::IAVL_PROOF_VALIDATION_MORAN, - ]); + precompiles.extend([tendermint::TENDERMINT_HEADER_VALIDATION, iavl::IAVL_PROOF_VALIDATION_MORAN]); precompiles } fn build_planck_precompiles() -> Precompiles { let mut precompiles = build_istanbul_precompiles(); - precompiles.extend([ - tendermint::TENDERMINT_HEADER_VALIDATION, - iavl::IAVL_PROOF_VALIDATION_PLANCK, - ]); + precompiles.extend([tendermint::TENDERMINT_HEADER_VALIDATION, iavl::IAVL_PROOF_VALIDATION_PLANCK]); precompiles } fn build_luban_precompiles() -> Precompiles { let mut precompiles = build_planck_precompiles(); - precompiles.extend([ - bls::BLS_SIGNATURE_VALIDATION, - cometbft::COMETBFT_LIGHT_BLOCK_VALIDATION_BEFORE_HERTZ, - ]); + precompiles.extend([bls::BLS_SIGNATURE_VALIDATION, cometbft::COMETBFT_LIGHT_BLOCK_VALIDATION_BEFORE_HERTZ]); precompiles } @@ -406,19 +383,13 @@ fn build_plato_precompiles() -> Precompiles { fn build_hertz_precompiles() -> Precompiles { let mut precompiles = build_plato_precompiles(); - precompiles.extend([ - cometbft::COMETBFT_LIGHT_BLOCK_VALIDATION, - modexp::BERLIN, - ]); + precompiles.extend([cometbft::COMETBFT_LIGHT_BLOCK_VALIDATION, modexp::BERLIN]); precompiles } fn build_feynman_precompiles() -> Precompiles { let mut precompiles = build_hertz_precompiles(); - precompiles.extend([ - double_sign::DOUBLE_SIGN_EVIDENCE_VALIDATION, - tm_secp256k1::TM_SECP256K1_SIGNATURE_RECOVER, - ]); + precompiles.extend([double_sign::DOUBLE_SIGN_EVIDENCE_VALIDATION, tm_secp256k1::TM_SECP256K1_SIGNATURE_RECOVER]); precompiles } @@ -440,6 +411,15 @@ fn build_pascal_precompiles() -> Precompiles { precompiles } +fn build_mendel_precompiles() -> Precompiles { + let mut precompiles = build_pascal_precompiles(); + // EIP-7823 (MODEXP bounds) + EIP-7883 (MODEXP gas cost increase) + precompiles.extend([modexp::OSAKA]); + // EIP-7951/BEP-659: P256VERIFY gas cost increase (3450 -> 6900) + precompiles.extend([secp256r1::P256VERIFY_OSAKA]); + precompiles +} + // --- Traced precompile singletons --------------------------------------------------------------- fn istanbul_traced() -> &'static TracedPrecompiles { @@ -497,8 +477,16 @@ fn pascal_traced() -> &'static TracedPrecompiles { INSTANCE.get_or_init(|| Box::new(build_traced_precompiles(build_pascal_precompiles()))) } +fn mendel_traced() -> &'static TracedPrecompiles { + static INSTANCE: OnceBox = OnceBox::new(); + INSTANCE.get_or_init(|| Box::new(build_traced_precompiles(build_mendel_precompiles()))) +} + fn traced_precompiles_for_spec(spec: BscHardfork) -> &'static TracedPrecompiles { - if spec >= BscHardfork::Pascal { + // Osaka uses updated precompiles (EIP-7823/7883 MODEXP, EIP-7951 P256VERIFY) + if spec >= BscHardfork::Mendel { + mendel_traced() + } else if spec >= BscHardfork::Pascal { pascal_traced() } else if spec >= BscHardfork::Haber { haber_traced() @@ -584,6 +572,12 @@ pub fn pascal() -> &'static Precompiles { pascal_traced().precompiles() } +/// Returns precompiles for Mendel spec. +/// Includes EIP-7823/7883 (MODEXP) and EIP-7951 (P256VERIFY gas increase). +pub fn mendel() -> &'static Precompiles { + mendel_traced().precompiles() +} + // BSC precompile provider #[derive(Debug, Clone)] pub struct BscPrecompiles { diff --git a/src/hardforks/bsc.rs b/src/hardforks/bsc.rs index 6705953d..9fa55e0a 100644 --- a/src/hardforks/bsc.rs +++ b/src/hardforks/bsc.rs @@ -65,6 +65,10 @@ hardfork!( /// BSC `Fermi` hardfork #[default] Fermi, + /// BSC `Osaka` hardfork + Osaka, + /// BSC `Mendel` hardfork + Mendel, } ); @@ -255,6 +259,7 @@ impl From for SpecId { | BscHardfork::Lorentz | BscHardfork::Maxwell | BscHardfork::Fermi => SpecId::PRAGUE, + BscHardfork::Osaka | BscHardfork::Mendel => SpecId::OSAKA, } } } diff --git a/src/hardforks/mod.rs b/src/hardforks/mod.rs index ba231ee4..7780d528 100644 --- a/src/hardforks/mod.rs +++ b/src/hardforks/mod.rs @@ -323,4 +323,32 @@ pub trait BscHardforks: EthereumHardforks { self.is_london_active_at_block(block_number) && self.bsc_fork_activation(BscHardfork::Fermi).active_at_timestamp(timestamp) } + + /// Convenience method to check if [`BscHardfork::Osaka`] is firstly active at a given + /// timestamp and parent timestamp. + fn is_osaka_transition_at_timestamp(&self, block_number: u64, timestamp: u64, parent_timestamp: u64) -> bool { + let parent_number = block_number.saturating_sub(1); + !BscHardforks::is_osaka_active_at_timestamp(self, parent_number, parent_timestamp) + && BscHardforks::is_osaka_active_at_timestamp(self, block_number, timestamp) + } + + /// Convenience method to check if [`BscHardfork::Osaka`] is active at a given timestamp. + fn is_osaka_active_at_timestamp(&self, block_number: u64, timestamp: u64) -> bool { + self.is_london_active_at_block(block_number) && + self.bsc_fork_activation(BscHardfork::Osaka).active_at_timestamp(timestamp) + } + + /// Convenience method to check if [`BscHardfork::Mendel`] is firstly active at a given + /// timestamp and parent timestamp. + fn is_mendel_transition_at_timestamp(&self, block_number: u64, timestamp: u64, parent_timestamp: u64) -> bool { + let parent_number = block_number.saturating_sub(1); + !self.is_mendel_active_at_timestamp(parent_number, parent_timestamp) + && self.is_mendel_active_at_timestamp(block_number, timestamp) + } + + /// Convenience method to check if [`BscHardfork::Mendel`] is active at a given timestamp. + fn is_mendel_active_at_timestamp(&self, block_number: u64, timestamp: u64) -> bool { + self.is_london_active_at_block(block_number) && + self.bsc_fork_activation(BscHardfork::Mendel).active_at_timestamp(timestamp) + } } diff --git a/src/node/consensus.rs b/src/node/consensus.rs index cc1af5e9..631b451e 100644 --- a/src/node/consensus.rs +++ b/src/node/consensus.rs @@ -1,8 +1,10 @@ use crate::{ chainspec::BscChainSpec, consensus::{ + eip4844::should_recalculate_excess_blob_gas, parlia::{ provider::EnhancedDbSnapshotProvider, util::calculate_millisecond_timestamp, + vote_pool, BscForkChoiceRule, HeaderForForkchoice, Parlia, }, ParliaConsensusErr, @@ -133,7 +135,26 @@ impl HeaderValidator
header.header().timestamp, ) { if let Some(blob_params) = self.chain_spec.blob_params_at_timestamp(header.timestamp) { - if let Err(err) = + if self.chain_spec.is_mendel_active_at_timestamp(header.number, header.timestamp) + && !should_recalculate_excess_blob_gas( + &*self.chain_spec, + header.number, + header.timestamp, + ) + { + let expected = parent.header().excess_blob_gas.unwrap_or(0); + let got = header + .header() + .excess_blob_gas + .ok_or(ConsensusError::ExcessBlobGasMissing)?; + if got != expected { + return Err(ConsensusError::ExcessBlobGasDiff { + diff: GotExpected { got, expected }, + parent_excess_blob_gas: expected, + parent_blob_gas_used: parent.header().blob_gas_used.unwrap_or(0), + }); + } + } else if let Err(err) = validate_against_parent_4844(header.header(), parent.header(), blob_params) { tracing::warn!( @@ -234,6 +255,595 @@ impl + BscHardforks + 'static> FullCons } } +#[cfg(test)] +mod tests { + use super::*; + use crate::consensus::parlia::{ + provider::SnapshotProvider, vote_pool, Snapshot, VoteAddress, VoteData, VoteEnvelope, + VoteSignature, + }; + use crate::hardforks::bsc::BscHardfork; + use alloy_consensus::Header; + use alloy_primitives::{Address, B256}; + use reth_chainspec::{ChainInfo, ChainSpecBuilder, ForkCondition}; + use reth_engine_primitives::BeaconEngineMessage; + use reth_provider::{BlockHashReader, BlockNumReader, HeaderProvider}; + use std::collections::HashMap; + use std::sync::{Arc, RwLock}; + use tokio::sync::mpsc; + + #[derive(Clone, Default)] + struct TestProvider; + + impl BlockHashReader for TestProvider { + fn block_hash(&self, _number: u64) -> reth_provider::ProviderResult> { + Ok(None) + } + + fn canonical_hashes_range( + &self, + _start: u64, + _end: u64, + ) -> reth_provider::ProviderResult> { + Ok(Vec::new()) + } + } + + impl BlockNumReader for TestProvider { + fn chain_info(&self) -> reth_provider::ProviderResult { + Ok(ChainInfo::default()) + } + + fn best_block_number(&self) -> reth_provider::ProviderResult { + Ok(0) + } + + fn last_block_number(&self) -> reth_provider::ProviderResult { + Ok(0) + } + + fn block_number(&self, _hash: B256) -> reth_provider::ProviderResult> { + Ok(None) + } + } + + impl HeaderProvider for TestProvider { + type Header = Header; + + fn header(&self, _block_hash: B256) -> reth_provider::ProviderResult> { + Ok(None) + } + + fn header_by_number(&self, _num: u64) -> reth_provider::ProviderResult> { + Ok(None) + } + + fn headers_range( + &self, + _range: impl core::ops::RangeBounds, + ) -> reth_provider::ProviderResult> { + Ok(Vec::new()) + } + + fn sealed_header( + &self, + _number: u64, + ) -> reth_provider::ProviderResult>> { + Ok(None) + } + + fn sealed_headers_while( + &self, + _range: impl core::ops::RangeBounds, + _predicate: impl FnMut(&reth_primitives::SealedHeader) -> bool, + ) -> reth_provider::ProviderResult>> { + Ok(Vec::new()) + } + } + + #[derive(Default)] + struct TestSnapshotProvider { + snaps: RwLock>, + } + + impl SnapshotProvider for TestSnapshotProvider { + fn snapshot_by_hash(&self, block_hash: &B256) -> Option { + self.snaps.read().ok().and_then(|m| m.get(block_hash).cloned()) + } + + fn insert(&self, snapshot: Snapshot) { + if let Ok(mut m) = self.snaps.write() { + m.insert(snapshot.block_hash, snapshot); + } + } + } + + #[test] + fn finalized_uses_vote_pool_quorum_for_head_child() { + vote_pool::drain(); + + let chain_spec = Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(BscHardfork::Plato, ForkCondition::Block(0)) + .build(), + )); + + let (tx, _rx) = + mpsc::unbounded_channel::>(); + let engine = BscForkChoiceEngine::new( + TestProvider::default(), + ConsensusEngineHandle::new(tx), + chain_spec, + ); + + let mut parent = Header::default(); + parent.number = 9; + parent.timestamp = 1; + let parent_hash = parent.hash_slow(); + + let mut head = Header::default(); + head.number = 10; + head.timestamp = 2; + head.parent_hash = parent_hash; + let head_hash = head.hash_slow(); + + let fallback_hash = B256::from([7u8; 32]); + let validators = vec![ + Address::from([1u8; 20]), + Address::from([2u8; 20]), + Address::from([3u8; 20]), + ]; + let mut snap = Snapshot::new(validators, head.number, head_hash, 200, None); + snap.vote_data = VoteData { + source_number: 7, + source_hash: fallback_hash, + target_number: 9, + target_hash: parent_hash, + }; + + let provider: Arc = + if let Some(existing) = crate::shared::get_snapshot_provider() { + existing.clone() + } else { + let p: Arc = + Arc::new(TestSnapshotProvider::default()); + let _ = crate::shared::set_snapshot_provider(p.clone()); + p + }; + provider.insert(snap); + + let baseline = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(baseline, (7, fallback_hash)); + + let vote_data = VoteData { + source_number: 9, + source_hash: parent_hash, + target_number: 10, + target_hash: head_hash, + }; + let vote1 = VoteEnvelope { + vote_address: VoteAddress::from([1u8; 48]), + signature: VoteSignature::default(), + data: vote_data, + }; + let vote2 = VoteEnvelope { + vote_address: VoteAddress::from([2u8; 48]), + signature: VoteSignature::default(), + data: vote_data, + }; + + vote_pool::put_vote(vote1); + vote_pool::put_vote(vote2); + + let finalized = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(finalized, (9, parent_hash)); + + vote_pool::drain(); + } + + #[test] + fn finalized_requires_quorum_not_reached_with_one_vote() { + // With 3 validators, quorum is ceil(3 * 2 / 3) = 2 + // Only 1 vote should NOT advance finality + vote_pool::drain(); + + let chain_spec = Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(BscHardfork::Plato, ForkCondition::Block(0)) + .build(), + )); + + let (tx, _rx) = mpsc::unbounded_channel::>(); + let engine = BscForkChoiceEngine::new( + TestProvider::default(), + ConsensusEngineHandle::new(tx), + chain_spec, + ); + + let mut parent = Header::default(); + parent.number = 9; + parent.timestamp = 1; + let parent_hash = parent.hash_slow(); + + let mut head = Header::default(); + head.number = 10; + head.timestamp = 2; + head.parent_hash = parent_hash; + let head_hash = head.hash_slow(); + + let fallback_hash = B256::from([7u8; 32]); + let validators = vec![ + Address::from([1u8; 20]), + Address::from([2u8; 20]), + Address::from([3u8; 20]), + ]; + let mut snap = Snapshot::new(validators, head.number, head_hash, 200, None); + snap.vote_data = VoteData { + source_number: 7, + source_hash: fallback_hash, + target_number: 9, + target_hash: parent_hash, + }; + + let provider: Arc = + if let Some(existing) = crate::shared::get_snapshot_provider() { + existing.clone() + } else { + let p: Arc = + Arc::new(TestSnapshotProvider::default()); + let _ = crate::shared::set_snapshot_provider(p.clone()); + p + }; + provider.insert(snap); + + // Add only ONE vote (quorum requires 2) + let vote_data = VoteData { + source_number: 9, + source_hash: parent_hash, + target_number: 10, + target_hash: head_hash, + }; + let vote1 = VoteEnvelope { + vote_address: VoteAddress::from([1u8; 48]), + signature: VoteSignature::default(), + data: vote_data, + }; + vote_pool::put_vote(vote1); + + // Finality should NOT advance - still returns fallback + let finalized = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(finalized, (7, fallback_hash), "1 vote should not reach quorum of 2"); + + vote_pool::drain(); + } + + #[test] + fn finalized_ignores_votes_with_wrong_source_number() { + vote_pool::drain(); + + let chain_spec = Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(BscHardfork::Plato, ForkCondition::Block(0)) + .build(), + )); + + let (tx, _rx) = mpsc::unbounded_channel::>(); + let engine = BscForkChoiceEngine::new( + TestProvider::default(), + ConsensusEngineHandle::new(tx), + chain_spec, + ); + + let mut parent = Header::default(); + parent.number = 9; + parent.timestamp = 1; + let parent_hash = parent.hash_slow(); + + let mut head = Header::default(); + head.number = 10; + head.timestamp = 2; + head.parent_hash = parent_hash; + let head_hash = head.hash_slow(); + + let fallback_hash = B256::from([7u8; 32]); + let validators = vec![ + Address::from([1u8; 20]), + Address::from([2u8; 20]), + Address::from([3u8; 20]), + ]; + let mut snap = Snapshot::new(validators, head.number, head_hash, 200, None); + snap.vote_data = VoteData { + source_number: 7, + source_hash: fallback_hash, + target_number: 9, + target_hash: parent_hash, + }; + + let provider: Arc = + if let Some(existing) = crate::shared::get_snapshot_provider() { + existing.clone() + } else { + let p: Arc = + Arc::new(TestSnapshotProvider::default()); + let _ = crate::shared::set_snapshot_provider(p.clone()); + p + }; + provider.insert(snap); + + // Add votes with WRONG source_number (8 instead of 9) + let wrong_vote_data = VoteData { + source_number: 8, // Wrong! Should be 9 (current_justified_number) + source_hash: parent_hash, + target_number: 10, + target_hash: head_hash, + }; + let vote1 = VoteEnvelope { + vote_address: VoteAddress::from([1u8; 48]), + signature: VoteSignature::default(), + data: wrong_vote_data, + }; + let vote2 = VoteEnvelope { + vote_address: VoteAddress::from([2u8; 48]), + signature: VoteSignature::default(), + data: wrong_vote_data, + }; + vote_pool::put_vote(vote1); + vote_pool::put_vote(vote2); + + // Finality should NOT advance - votes have wrong source + let finalized = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(finalized, (7, fallback_hash), "votes with wrong source should be ignored"); + + vote_pool::drain(); + } + + #[test] + fn finalized_ignores_votes_with_wrong_target_number() { + vote_pool::drain(); + + let chain_spec = Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(BscHardfork::Plato, ForkCondition::Block(0)) + .build(), + )); + + let (tx, _rx) = mpsc::unbounded_channel::>(); + let engine = BscForkChoiceEngine::new( + TestProvider::default(), + ConsensusEngineHandle::new(tx), + chain_spec, + ); + + let mut parent = Header::default(); + parent.number = 9; + parent.timestamp = 1; + let parent_hash = parent.hash_slow(); + + let mut head = Header::default(); + head.number = 10; + head.timestamp = 2; + head.parent_hash = parent_hash; + let head_hash = head.hash_slow(); + + let fallback_hash = B256::from([7u8; 32]); + let validators = vec![ + Address::from([1u8; 20]), + Address::from([2u8; 20]), + Address::from([3u8; 20]), + ]; + let mut snap = Snapshot::new(validators, head.number, head_hash, 200, None); + snap.vote_data = VoteData { + source_number: 7, + source_hash: fallback_hash, + target_number: 9, + target_hash: parent_hash, + }; + + let provider: Arc = + if let Some(existing) = crate::shared::get_snapshot_provider() { + existing.clone() + } else { + let p: Arc = + Arc::new(TestSnapshotProvider::default()); + let _ = crate::shared::set_snapshot_provider(p.clone()); + p + }; + provider.insert(snap); + + // Add votes with WRONG target_number (11 instead of 10) + let wrong_vote_data = VoteData { + source_number: 9, + source_hash: parent_hash, + target_number: 11, // Wrong! Should be 10 (head.number) + target_hash: head_hash, + }; + let vote1 = VoteEnvelope { + vote_address: VoteAddress::from([1u8; 48]), + signature: VoteSignature::default(), + data: wrong_vote_data, + }; + let vote2 = VoteEnvelope { + vote_address: VoteAddress::from([2u8; 48]), + signature: VoteSignature::default(), + data: wrong_vote_data, + }; + vote_pool::put_vote(vote1); + vote_pool::put_vote(vote2); + + // Finality should NOT advance - votes have wrong target + let finalized = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(finalized, (7, fallback_hash), "votes with wrong target should be ignored"); + + vote_pool::drain(); + } + + #[test] + fn finalized_no_advance_when_head_not_direct_child_of_justified() { + // BEP-648 requires head.number - 1 == current_justified_number + // If there's a gap, finality should not advance via vote pool + vote_pool::drain(); + + let chain_spec = Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(BscHardfork::Plato, ForkCondition::Block(0)) + .build(), + )); + + let (tx, _rx) = mpsc::unbounded_channel::>(); + let engine = BscForkChoiceEngine::new( + TestProvider::default(), + ConsensusEngineHandle::new(tx), + chain_spec, + ); + + let mut head = Header::default(); + head.number = 12; // Head is at 12 + head.timestamp = 2; + let head_hash = head.hash_slow(); + + let fallback_hash = B256::from([7u8; 32]); + let validators = vec![ + Address::from([1u8; 20]), + Address::from([2u8; 20]), + Address::from([3u8; 20]), + ]; + let mut snap = Snapshot::new(validators, head.number, head_hash, 200, None); + snap.vote_data = VoteData { + source_number: 7, + source_hash: fallback_hash, + target_number: 9, // Justified is at 9, but head is at 12 (gap of 2) + target_hash: B256::from([9u8; 32]), + }; + + let provider: Arc = + if let Some(existing) = crate::shared::get_snapshot_provider() { + existing.clone() + } else { + let p: Arc = + Arc::new(TestSnapshotProvider::default()); + let _ = crate::shared::set_snapshot_provider(p.clone()); + p + }; + provider.insert(snap); + + // Add valid votes for head + let vote_data = VoteData { + source_number: 9, + source_hash: B256::from([9u8; 32]), + target_number: 12, + target_hash: head_hash, + }; + let vote1 = VoteEnvelope { + vote_address: VoteAddress::from([1u8; 48]), + signature: VoteSignature::default(), + data: vote_data, + }; + let vote2 = VoteEnvelope { + vote_address: VoteAddress::from([2u8; 48]), + signature: VoteSignature::default(), + data: vote_data, + }; + vote_pool::put_vote(vote1); + vote_pool::put_vote(vote2); + + // Finality should NOT advance because head.number - 1 (11) != current_justified_number (9) + let finalized = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(finalized, (7, fallback_hash), "should not advance when head is not direct child"); + + vote_pool::drain(); + } + + #[test] + fn finalized_with_larger_validator_set() { + // Test with 21 validators (typical BSC validator set) + // Quorum = ceil(21 * 2 / 3) = 14 + vote_pool::drain(); + + let chain_spec = Arc::new(BscChainSpec::from( + ChainSpecBuilder::mainnet() + .with_fork(BscHardfork::Plato, ForkCondition::Block(0)) + .build(), + )); + + let (tx, _rx) = mpsc::unbounded_channel::>(); + let engine = BscForkChoiceEngine::new( + TestProvider::default(), + ConsensusEngineHandle::new(tx), + chain_spec, + ); + + let mut parent = Header::default(); + parent.number = 99; + parent.timestamp = 1; + let parent_hash = parent.hash_slow(); + + let mut head = Header::default(); + head.number = 100; + head.timestamp = 2; + head.parent_hash = parent_hash; + let head_hash = head.hash_slow(); + + let fallback_hash = B256::from([7u8; 32]); + + // 21 validators + let validators: Vec
= (1..=21) + .map(|i| Address::from([i as u8; 20])) + .collect(); + + let mut snap = Snapshot::new(validators, head.number, head_hash, 200, None); + snap.vote_data = VoteData { + source_number: 97, + source_hash: fallback_hash, + target_number: 99, + target_hash: parent_hash, + }; + + let provider: Arc = + if let Some(existing) = crate::shared::get_snapshot_provider() { + existing.clone() + } else { + let p: Arc = + Arc::new(TestSnapshotProvider::default()); + let _ = crate::shared::set_snapshot_provider(p.clone()); + p + }; + provider.insert(snap); + + let vote_data = VoteData { + source_number: 99, + source_hash: parent_hash, + target_number: 100, + target_hash: head_hash, + }; + + // Add 13 votes (not enough, quorum is 14) + for i in 1..=13 { + let vote = VoteEnvelope { + vote_address: VoteAddress::from([i as u8; 48]), + signature: VoteSignature::default(), + data: vote_data, + }; + vote_pool::put_vote(vote); + } + + let finalized = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(finalized, (97, fallback_hash), "13 votes should not reach quorum of 14"); + + // Add 14th vote to reach quorum + let vote14 = VoteEnvelope { + vote_address: VoteAddress::from([14u8; 48]), + signature: VoteSignature::default(), + data: vote_data, + }; + vote_pool::put_vote(vote14); + + let finalized = engine.get_finalized_number_and_hash(&head).unwrap(); + assert_eq!(finalized, (99, parent_hash), "14 votes should reach quorum"); + + vote_pool::drain(); + } +} + /// Calculate the receipts root, and compare it against the expected receipts root and logs bloom. /// This is a direct copy of reth's implementation from: /// https://github.com/paradigmxyz/reth/blob/616e492c79bb4143071ac6bf0831a249a504359f/crates/ethereum/consensus/src/validation.rs#L71 @@ -558,7 +1168,28 @@ where let sp = shared::get_snapshot_provider()?; match sp.snapshot_by_hash(&header.hash_slow()) { - Some(snap) => Some((snap.vote_data.source_number, snap.vote_data.source_hash)), + Some(snap) => { + let current_justified_number = snap.vote_data.target_number; + let current_justified_hash = snap.vote_data.target_hash; + + if header.number > 0 && header.number - 1 == current_justified_number + && !snap.validators.is_empty() + { + let quorum = usize::div_ceil(snap.validators.len() * 2, 3); + let eligible_votes = vote_pool::fetch_vote_by_block_hash(header.hash_slow()) + .into_iter() + .filter(|vote| { + vote.data.source_number == current_justified_number + && vote.data.target_number == header.number + }) + .count(); + if eligible_votes >= quorum { + return Some((current_justified_number, current_justified_hash)); + } + } + + Some((snap.vote_data.source_number, snap.vote_data.source_hash)) + } None => { tracing::warn!( target: "bsc::forkchoice", diff --git a/src/node/evm/assembler.rs b/src/node/evm/assembler.rs index 92f80e86..4d59dc46 100644 --- a/src/node/evm/assembler.rs +++ b/src/node/evm/assembler.rs @@ -1,6 +1,9 @@ use crate::{ chainspec::BscChainSpec, - consensus::parlia::{Parlia, EMPTY_REQUESTS_HASH, EMPTY_WITHDRAWALS_HASH}, + consensus::{ + eip4844::next_block_excess_blob_gas_with_mendel, + parlia::{Parlia, EMPTY_REQUESTS_HASH, EMPTY_WITHDRAWALS_HASH}, + }, hardforks::BscHardforks, node::{ evm::config::{BscBlockExecutionCtx, BscBlockExecutorFactory}, @@ -8,11 +11,9 @@ use crate::{ primitives::{BscBlock, BscBlockBody}, } }; -use alloy_consensus::{ - proofs, BlockBody, BlockHeader, Header, Transaction, TxReceipt, EMPTY_OMMER_ROOT_HASH, -}; +use alloy_consensus::{proofs, BlockBody, Header, Transaction, TxReceipt, EMPTY_OMMER_ROOT_HASH}; use alloy_primitives::{keccak256, B256}; -use alloy_eips::{eip7840::BlobParams, merge::BEACON_NONCE}; +use alloy_eips::merge::BEACON_NONCE; use alloy_primitives::Bytes; use alloy_rpc_types::Withdrawals; use reth_chainspec::{EthChainSpec, EthereumHardforks}; @@ -134,15 +135,13 @@ where if BscHardforks::is_cancun_active_at_timestamp(self.chain_spec.as_ref(), block_number, timestamp) { blob_gas_used = Some(transactions.iter().map(|tx| tx.blob_gas_used().unwrap_or_default()).sum()); - excess_blob_gas = if BscHardforks::is_cancun_active_at_timestamp(self.chain_spec.as_ref(), parent.number, parent.timestamp) { - parent.maybe_next_block_excess_blob_gas( - self.chain_spec.blob_params_at_timestamp(timestamp), - ) - } else { - // for the first post-fork block, both parent.blob_gas_used and - // parent.excess_blob_gas are evaluated as 0 - Some(BlobParams::cancun().next_block_excess_blob_gas_osaka(0, 0, 0)) - }; + excess_blob_gas = next_block_excess_blob_gas_with_mendel( + self.chain_spec.as_ref(), + block_number, + timestamp, + parent.header(), + self.chain_spec.blob_params_at_timestamp(timestamp), + ); } // baseFee should only be set after London fork (EIP-1559) @@ -266,15 +265,13 @@ where if BscHardforks::is_cancun_active_at_timestamp(&*self.chain_spec, block_number, timestamp) { blob_gas_used = Some(transactions.iter().map(|tx| tx.blob_gas_used().unwrap_or_default()).sum()); - excess_blob_gas = if BscHardforks::is_cancun_active_at_timestamp(&*self.chain_spec, parent.number, parent.timestamp) { - parent.maybe_next_block_excess_blob_gas( - self.chain_spec.blob_params_at_timestamp(timestamp), - ) - } else { - // for the first post-fork block, both parent.blob_gas_used and - // parent.excess_blob_gas are evaluated as 0 - Some(BlobParams::cancun().next_block_excess_blob_gas_osaka(0, 0, 0)) - }; + excess_blob_gas = next_block_excess_blob_gas_with_mendel( + self.chain_spec.as_ref(), + block_number, + timestamp, + parent.header(), + self.chain_spec.blob_params_at_timestamp(timestamp), + ); } // baseFee should only be set after London fork (EIP-1559) diff --git a/src/node/evm/config.rs b/src/node/evm/config.rs index aa5144a6..b85a57d8 100644 --- a/src/node/evm/config.rs +++ b/src/node/evm/config.rs @@ -5,7 +5,13 @@ use super::{ factory::BscEvmFactory, }; use crate::{ - BscPrimitives, chainspec::BscChainSpec, consensus::parlia::VoteAddress, evm::transaction::BscTxEnv, hardforks::{BscHardforks, bsc::BscHardfork}, node::engine_api::validator::BscExecutionData, system_contracts::{SystemContract, feynman_fork::ValidatorElectionInfo} + BscPrimitives, + chainspec::BscChainSpec, + consensus::{eip4844::next_block_excess_blob_gas_with_mendel, parlia::VoteAddress}, + evm::transaction::BscTxEnv, + hardforks::{bsc::BscHardfork, BscHardforks}, + node::engine_api::validator::BscExecutionData, + system_contracts::{feynman_fork::ValidatorElectionInfo, SystemContract}, }; use alloy_consensus::{transaction::SignerRecoverable, BlockHeader, Header, TxReceipt}; use alloy_eips::eip7840::BlobParams; @@ -21,6 +27,7 @@ use reth_evm::{ }; use reth_evm_ethereum::RethReceiptBuilder; use reth_primitives::{BlockTy, HeaderTy, SealedBlock, SealedHeader, TransactionSigned}; +use reth_primitives_traits::constants::MAX_TX_GAS_LIMIT_OSAKA; use reth_revm::State; use revm::{ Inspector, context::{BlockEnv, CfgEnv}, context_interface::block::BlobExcessGasAndPrice, primitives::{hardfork::SpecId} @@ -231,6 +238,9 @@ where if let Some(blob_params) = &blob_params { cfg_env.set_max_blobs_per_tx(blob_params.max_blobs_per_tx); } + if BscHardforks::is_osaka_active_at_timestamp(self.chain_spec(), header.number, header.timestamp) { + cfg_env.tx_gas_limit_cap = Some(MAX_TX_GAS_LIMIT_OSAKA); + } // derive the EIP-4844 blob fees from the header's `excess_blob_gas` and the current // blobparams @@ -275,21 +285,29 @@ where ); // configure evm env based on parent block - let cfg_env = + let mut cfg_env = CfgEnv::new_with_spec(spec_id).with_chain_id(self.chain_spec().chain().id()); let blob_params = self.chain_spec().blob_params_at_timestamp(attributes.timestamp); // if the parent block did not have excess blob gas (i.e. it was pre-cancun), but it is // cancun now, we need to set the excess blob gas to the default value(0) - let blob_excess_gas_and_price = parent - .maybe_next_block_excess_blob_gas(blob_params) - .or_else(|| (SpecId::from(spec_id).is_enabled_in(SpecId::CANCUN)).then_some(0)) - .map(|excess_blob_gas| { - let blob_gasprice = - blob_params.unwrap_or_else(BlobParams::cancun).calc_blob_fee(excess_blob_gas); - BlobExcessGasAndPrice { excess_blob_gas, blob_gasprice } - }); + let blob_excess_gas_and_price = next_block_excess_blob_gas_with_mendel( + self.chain_spec(), + parent.number + 1, + attributes.timestamp, + parent, + blob_params, + ) + .map(|excess_blob_gas| { + let blob_gasprice = + blob_params.unwrap_or_else(BlobParams::cancun).calc_blob_fee(excess_blob_gas); + BlobExcessGasAndPrice { excess_blob_gas, blob_gasprice } + }); + + if BscHardforks::is_osaka_active_at_timestamp(self.chain_spec(), parent.number + 1, attributes.timestamp) { + cfg_env.tx_gas_limit_cap = Some(MAX_TX_GAS_LIMIT_OSAKA); + } // Refer to geth-bsc: https://github.com/bnb-chain/bsc/blob/master/consensus/misc/eip1559/eip1559.go#L61 @@ -448,7 +466,11 @@ pub fn revm_spec_by_timestamp_and_block_number( timestamp: u64, block_number: u64, ) -> BscHardfork { - if chain_spec.is_fermi_active_at_timestamp(block_number, timestamp) { + if chain_spec.is_mendel_active_at_timestamp(block_number, timestamp) { + BscHardfork::Mendel + } else if BscHardforks::is_osaka_active_at_timestamp(&chain_spec, block_number, timestamp) { + BscHardfork::Osaka + } else if chain_spec.is_fermi_active_at_timestamp(block_number, timestamp) { BscHardfork::Fermi } else if chain_spec.is_maxwell_active_at_timestamp(block_number, timestamp) { BscHardfork::Maxwell diff --git a/src/node/miner/bid_simulator.rs b/src/node/miner/bid_simulator.rs index 227426d3..4ca861cc 100644 --- a/src/node/miner/bid_simulator.rs +++ b/src/node/miner/bid_simulator.rs @@ -1,5 +1,5 @@ use crate::chainspec::BscChainSpec; -use crate::consensus::eip4844::calc_blob_fee; +use crate::consensus::eip4844::{calc_blob_fee, is_blob_eligible_block}; use crate::consensus::parlia::provider::SnapshotProvider; use crate::consensus::parlia::Snapshot; use crate::hardforks::BscHardforks; @@ -741,8 +741,13 @@ where { let base_fee: u64 = builder.evm().block().basefee(); let blob_params = self.chain_spec.blob_params_at_timestamp(self.attributes.timestamp()); - let max_blob_count = + let header = self.mining_ctx.header.as_ref().unwrap(); + let blob_eligible = is_blob_eligible_block(&self.chain_spec, header.number, header.timestamp); + let mut max_blob_count = blob_params.as_ref().map(|params| params.max_blob_count).unwrap_or_default(); + if !blob_eligible { + max_blob_count = 0; + } let start_time = std::time::Instant::now(); let delay_duration = std::time::Duration::from_millis(delay_ms); @@ -766,6 +771,12 @@ where } let is_blob_tx = recovered_tx.is_eip4844(); let tx_hash = *recovered_tx.hash(); + if is_blob_tx && !blob_eligible { + if from_pool { + continue; + } + return Err("blob transactions not allowed in this block".into()); + } if from_pool { // ensure we still have capacity for this transaction if self.gas_used + recovered_tx.gas_limit() > block_gas_limit { diff --git a/src/node/miner/payload.rs b/src/node/miner/payload.rs index d5a79006..466e78cc 100644 --- a/src/node/miner/payload.rs +++ b/src/node/miner/payload.rs @@ -1,5 +1,5 @@ use crate::chainspec::BscChainSpec; -use crate::consensus::eip4844::{calc_blob_fee, BLOB_TX_BLOB_GAS_PER_BLOB}; +use crate::consensus::eip4844::{calc_blob_fee, is_blob_eligible_block, BLOB_TX_BLOB_GAS_PER_BLOB}; use crate::consensus::parlia::Parlia; use crate::evm::blacklist; use crate::hardforks::BscHardforks; @@ -19,7 +19,6 @@ use reth::transaction_pool::BestTransactionsAttributes; use reth::transaction_pool::{PoolTransaction, TransactionPool}; use reth_basic_payload_builder::PayloadConfig; use reth_chainspec::EthChainSpec; -use reth_chainspec::EthereumHardforks; use reth_ethereum_payload_builder::EthereumBuilderConfig; use reth_evm::block::{BlockExecutionError, BlockValidationError}; use reth_evm::execute::BlockBuilder; @@ -58,6 +57,17 @@ pub fn generate_trace_id() -> u64 { TRACE_ID_COUNTER.fetch_add(1, Ordering::Relaxed) } +fn validate_bsc_sidecar( + sidecar: &alloy_eips::eip7594::BlobTransactionSidecarVariant, +) -> Result<(), Eip4844PoolTransactionError> { + // BSC only accepts legacy (EIP-4844) sidecars. + if sidecar.is_eip4844() { + Ok(()) + } else { + Err(Eip4844PoolTransactionError::UnexpectedEip7594SidecarBeforeOsaka) + } +} + /// Errors that can occur during payload job execution #[derive(Debug, thiserror::Error)] pub enum BscPayloadJobError { @@ -239,11 +249,19 @@ where } } } - let max_blob_count = + let blob_eligible = + is_blob_eligible_block(&self.chain_spec, header.number, header.timestamp); + let mut max_blob_count = blob_params.as_ref().map(|params| params.max_blob_count).unwrap_or_default(); + if !blob_eligible { + max_blob_count = 0; + } let mut best_tx_list = self.pool.best_transactions_with_attributes( BestTransactionsAttributes::new(base_fee, blob_fee.map(|fee| fee as u64)), ); + if !blob_eligible { + best_tx_list.skip_blobs(); + } while let Some(pool_tx) = best_tx_list.next() { if cancel.is_cancelled() { break; @@ -295,8 +313,12 @@ where } let tx = pool_tx.to_consensus(); + if tx.is_eip4844() && !blob_eligible { + best_tx_list.skip_blobs(); + continue; + } let tx_start = std::time::Instant::now(); - let mut blob_tx_sidecar = None; + let mut blob_tx_sidecar: Option> = None; trace!( target: "payload_builder", trace_id, @@ -362,16 +384,11 @@ where break 'sidecar Err(Eip4844PoolTransactionError::MissingEip4844BlobSidecar); }; - if self.chain_spec.is_osaka_active_at_timestamp(attributes.timestamp()) { - if sidecar.is_eip7594() { - Ok(sidecar) - } else { - Err(Eip4844PoolTransactionError::UnexpectedEip4844SidecarAfterOsaka) - } - } else if sidecar.is_eip4844() { - Ok(sidecar) + // BSC: Always accept legacy (EIP-4844) sidecars and reject EIP-7594 sidecars. + if let Err(err) = validate_bsc_sidecar(sidecar.as_ref()) { + Err(err) } else { - Err(Eip4844PoolTransactionError::UnexpectedEip7594SidecarBeforeOsaka) + Ok(sidecar) } }; @@ -686,6 +703,38 @@ where } } +#[cfg(test)] +mod tests { + use super::validate_bsc_sidecar; + use alloy_consensus::BlobTransactionSidecar; + use alloy_eips::eip4844::{Blob, Bytes48}; + use alloy_eips::eip7594::{ + BlobTransactionSidecarEip7594, BlobTransactionSidecarVariant, CELLS_PER_EXT_BLOB, + }; + use reth::transaction_pool::error::Eip4844PoolTransactionError; + + #[test] + fn bsc_sidecar_accepts_eip4844() { + let sidecar = BlobTransactionSidecar::default(); + let variant = BlobTransactionSidecarVariant::Eip4844(sidecar); + assert!(validate_bsc_sidecar(&variant).is_ok()); + } + + #[test] + fn bsc_sidecar_rejects_eip7594() { + let blob = Blob::default(); + let commitment = Bytes48::default(); + let cell_proofs = vec![Bytes48::default(); CELLS_PER_EXT_BLOB]; + let sidecar = BlobTransactionSidecarEip7594::new(vec![blob], vec![commitment], cell_proofs); + let variant = BlobTransactionSidecarVariant::Eip7594(sidecar); + + assert!(matches!( + validate_bsc_sidecar(&variant), + Err(Eip4844PoolTransactionError::UnexpectedEip7594SidecarBeforeOsaka) + )); + } +} + /// Handle for aborting a BscPayloadJob pub struct BscPayloadJobHandle { abort_tx: oneshot::Sender<()>, diff --git a/src/node/miner/util.rs b/src/node/miner/util.rs index 304c5d25..d1ff949f 100644 --- a/src/node/miner/util.rs +++ b/src/node/miner/util.rs @@ -1,7 +1,8 @@ use std::sync::Arc; -use alloy_consensus::{Header, BlockHeader}; +use alloy_consensus::Header; use alloy_primitives::{Address, Bytes, B256}; use crate::consensus::parlia::Snapshot; +use crate::consensus::eip4844::next_block_excess_blob_gas_with_mendel; use crate::consensus::parlia::consensus::Parlia; use crate::consensus::parlia::util::{calculate_difficulty, debug_header}; use crate::chainspec::BscChainSpec; @@ -51,7 +52,13 @@ where }; if BscHardforks::is_cancun_active_at_timestamp(parlia.spec.as_ref(), new_header.number, new_header.timestamp) { let blob_params = parlia.spec.blob_params_at_timestamp(new_header.timestamp); - new_header.excess_blob_gas = parent_header.maybe_next_block_excess_blob_gas(blob_params); + new_header.excess_blob_gas = next_block_excess_blob_gas_with_mendel( + parlia.spec.as_ref(), + new_header.number, + new_header.timestamp, + parent_header, + blob_params, + ); } new_header @@ -123,4 +130,4 @@ where } Ok(()) -} \ No newline at end of file +} diff --git a/src/node/mod.rs b/src/node/mod.rs index 688a413a..854d40c1 100644 --- a/src/node/mod.rs +++ b/src/node/mod.rs @@ -13,13 +13,19 @@ use evm::BscExecutorBuilder; use network::BscNetworkBuilder; use reth::{ api::{FullNodeComponents, FullNodeTypes, NodeTypes}, - builder::{components::ComponentsBuilder, rpc::RpcAddOns, DebugNode, Node, NodeAdapter}, + builder::{ + components::ComponentsBuilder, + rpc::{EthApiBuilder, RpcAddOns, RpcContext}, + DebugNode, Node, NodeAdapter, + }, }; use reth_engine_local::LocalPayloadAttributesBuilder; use reth_engine_primitives::ConsensusEngineHandle; use reth_node_ethereum::EthereumEthApiBuilder; use reth_payload_primitives::{PayloadAttributesBuilder, PayloadTypes}; use reth_primitives::BlockBody; +use reth_rpc_eth_api::helpers::config::{EthConfigApiServer, EthConfigHandler}; +use reth_rpc_server_types::RethRpcModule; use std::sync::Arc; use tokio::sync::{oneshot, Mutex}; @@ -117,7 +123,17 @@ where } fn add_ons(&self) -> Self::AddOns { - BscNodeAddOns::default() + BscNodeAddOns::default().extend_rpc_modules( + |ctx: RpcContext<'_, NodeAdapter, >>::EthApi>| { + let eth_config = EthConfigHandler::new( + ctx.node().provider().clone(), + ctx.node().evm_config().clone(), + ); + ctx.modules + .merge_if_module_configured(RethRpcModule::Eth, eth_config.into_rpc())?; + Ok(()) + }, + ) } } diff --git a/src/node/pool/mod.rs b/src/node/pool/mod.rs index cf5af5b6..fc7d1484 100644 --- a/src/node/pool/mod.rs +++ b/src/node/pool/mod.rs @@ -171,6 +171,8 @@ where let blob_store = create_blob_store_with_cache(ctx, blob_cache_size)?; // Build default Ethereum validator executor + // BSC rejected EIP-7594 (PeerDAS), so we disable EIP-7594 sidecar support to always + // use v0 (legacy) blob sidecars and reject v1 (EIP-7594) sidecars. let validator = TransactionValidationTaskExecutor::eth_builder(ctx.provider().clone()) .with_head_timestamp(ctx.head().timestamp) .with_max_tx_input_bytes(ctx.config().txpool.max_tx_input_bytes) @@ -180,6 +182,7 @@ where .with_max_tx_gas_limit(ctx.config().txpool.max_tx_gas_limit) .with_minimum_priority_fee(ctx.config().txpool.minimum_priority_fee) .with_additional_tasks(ctx.config().txpool.additional_validation_tasks) + .no_eip7594() .build_with_tasks(ctx.task_executor().clone(), blob_store.clone()); // Inject blacklist wrapper From 4d1d54e51e14bd9150ceeb1c2f009d23131484ad Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Mon, 2 Feb 2026 13:48:24 +0100 Subject: [PATCH 2/3] fix(evm): bypass EIP-7825 gas limit cap for BSC system transactions --- src/consensus/eip4844/bep657.rs | 19 ++- src/consensus/parlia/validation.rs | 20 +-- src/evm/handler.rs | 236 ++++++++++++++++++++++++++++- src/node/consensus.rs | 87 ++++++----- src/node/evm/pre_execution.rs | 18 ++- src/node/miner/bsc_miner.rs | 43 +++++- src/node/miner/payload.rs | 64 ++++---- 7 files changed, 384 insertions(+), 103 deletions(-) diff --git a/src/consensus/eip4844/bep657.rs b/src/consensus/eip4844/bep657.rs index 913a9be0..5c3b2d8e 100644 --- a/src/consensus/eip4844/bep657.rs +++ b/src/consensus/eip4844/bep657.rs @@ -238,8 +238,7 @@ mod tests { let timestamp = 2000; // Create parent with specific excess_blob_gas - let mut parent = Header::default(); - parent.excess_blob_gas = Some(12345); + let parent = Header { excess_blob_gas: Some(12345), ..Default::default() }; let blob_params = Some(BlobParams::cancun()); @@ -282,9 +281,11 @@ mod tests { let timestamp = 2000; // Create parent with blob gas values for recalculation - let mut parent = Header::default(); - parent.excess_blob_gas = Some(0); - parent.blob_gas_used = Some(0); + let parent = Header { + excess_blob_gas: Some(0), + blob_gas_used: Some(0), + ..Default::default() + }; let blob_params = Some(BlobParams::cancun()); @@ -306,9 +307,11 @@ mod tests { let spec = mendel_inactive_chain_spec(); let timestamp = 500; // Before Mendel - let mut parent = Header::default(); - parent.excess_blob_gas = Some(1000); - parent.blob_gas_used = Some(0); + let parent = Header { + excess_blob_gas: Some(1000), + blob_gas_used: Some(0), + ..Default::default() + }; let blob_params = Some(BlobParams::cancun()); diff --git a/src/consensus/parlia/validation.rs b/src/consensus/parlia/validation.rs index 3a3ddeaa..470cfdaa 100644 --- a/src/consensus/parlia/validation.rs +++ b/src/consensus/parlia/validation.rs @@ -1,4 +1,4 @@ -use reth::consensus::{Consensus, ConsensusError, HeaderValidator, TxGasLimitTooHighErr}; +use reth::consensus::{Consensus, ConsensusError, HeaderValidator}; use reth::primitives::SealedHeader; use reth_chainspec::{EthChainSpec, EthereumHardforks, EthereumHardfork}; use crate::consensus::parlia::util::calculate_millisecond_timestamp; @@ -10,7 +10,7 @@ use alloy_primitives::B256; use reth_primitives::GotExpected; use alloy_eips::eip4844::{DATA_GAS_PER_BLOB, MAX_DATA_GAS_PER_BLOCK_DENCUN}; use crate::BscBlock; -use reth_primitives_traits::{constants::MAX_TX_GAS_LIMIT_OSAKA, Block}; +use reth_primitives_traits::Block; const MAX_RLP_BLOCK_SIZE_OSAKA: usize = 8 * 1024 * 1024; @@ -168,17 +168,11 @@ impl MAX_TX_GAS_LIMIT_OSAKA { - return Err(TxGasLimitTooHighErr { - tx_hash: *tx.hash(), - gas_limit: tx.gas_limit(), - max_allowed: MAX_TX_GAS_LIMIT_OSAKA, - } - .into()); - } - } + // Note: Individual transaction gas limit validation (EIP-7825) is intentionally + // NOT performed here because system transactions use i64::MAX gas limit. + // The validation happens during EVM execution via cfg_env.tx_gas_limit_cap, + // where system transactions can be properly identified and exempted. + // This is consistent with go-bsc's block_validator.go behavior. } // EIP-4844: Shard Blob Transactions diff --git a/src/evm/handler.rs b/src/evm/handler.rs index b84147e3..631c6fb8 100644 --- a/src/evm/handler.rs +++ b/src/evm/handler.rs @@ -17,7 +17,7 @@ use revm::{ transaction::TransactionType, Cfg, ContextError, ContextTr, LocalContextTr, Transaction, }, - context_interface::{transaction::eip7702::AuthorizationTr, JournalTr}, + context_interface::{transaction::eip7702::AuthorizationTr, Block, JournalTr}, handler::{EthFrame, EvmTr, FrameResult, Handler, MainnetHandler}, inspector::{Inspector, InspectorHandler}, interpreter::{interpreter::EthInterpreter, Host, InitialAndFloorGas, SuccessOrHalt}, @@ -47,6 +47,34 @@ impl Handler for BscHandler { type Error = EVMError; type HaltReason = HaltReason; + /// Override validate_env to skip gas limit cap validation for system transactions. + /// System transactions in BSC use i64::MAX as gas limit, which would fail the + /// EIP-7825 gas limit cap check. This is consistent with go-bsc behavior where + /// system transactions set SkipTransactionChecks=true. + fn validate_env(&self, evm: &mut Self::Evm) -> Result<(), Self::Error> { + let is_system_tx = evm.ctx_ref().tx().is_system_transaction; + + if is_system_tx { + // For system transactions, only validate block-level requirements + // Skip transaction-level validation including gas limit cap + let ctx = evm.ctx_ref(); + let spec: SpecId = (*ctx.cfg().spec()).into(); + + // `prevrandao` is required for the merge + if spec.is_enabled_in(SpecId::MERGE) && ctx.block().prevrandao().is_none() { + return Err(revm::context_interface::result::InvalidHeader::PrevrandaoNotSet.into()); + } + // `excess_blob_gas` is required for Cancun + if spec.is_enabled_in(SpecId::CANCUN) && ctx.block().blob_excess_gas_and_price().is_none() { + return Err(revm::context_interface::result::InvalidHeader::ExcessBlobGasNotSet.into()); + } + Ok(()) + } else { + // For non-system transactions, use default validation + self.mainnet.validate_env(evm) + } + } + // This function is based on the implementation of the EIP-7702. // https://github.com/bluealloy/revm/blob/df467931c4b1b8b620ff2cb9f62501c7abc3ea03/crates/handler/src/pre_execution.rs#L186 // with slight modifications to support BSC specific validation. @@ -289,3 +317,209 @@ where { type IT = EthInterpreter; } + +#[cfg(test)] +mod tests { + use super::*; + use crate::{evm::transaction::BscTxEnv, hardforks::bsc::BscHardfork}; + use reth_evm::EvmEnv; + use revm::{ + context::{BlockEnv, CfgEnv, TxEnv}, + context_interface::result::InvalidTransaction, + handler::Handler, + inspector::NoOpInspector, + primitives::{Address, TxKind, U256}, + state::AccountInfo, + }; + use revm_database::InMemoryDB; + + use crate::evm::api::BscEvm; + + /// The EIP-7825 gas limit cap (2^24 = 16777216) + const MAX_TX_GAS_LIMIT_OSAKA: u64 = 2u64.pow(24); + + fn make_db_with_funded_caller(caller: Address) -> InMemoryDB { + let mut db = InMemoryDB::default(); + db.insert_account_info( + caller, + AccountInfo { balance: U256::from(1_000_000_000_000u64), ..AccountInfo::default() }, + ); + db + } + + #[test] + fn test_system_tx_bypasses_gas_limit_cap_validation() { + // Use Osaka spec which has the gas limit cap enabled + let spec = BscHardfork::Osaka; + let mut cfg_env = CfgEnv::new_with_spec(spec).with_chain_id(56); + // Set the gas limit cap + cfg_env.tx_gas_limit_cap = Some(MAX_TX_GAS_LIMIT_OSAKA); + + let block_env = BlockEnv { + prevrandao: Some(U256::from(1).into()), // Required for post-merge + ..Default::default() + }; + let env = EvmEnv::new(cfg_env, block_env); + + let caller = Address::from([0x11; 20]); + let contract = Address::from([0x22; 20]); + + // Create a system transaction with gas limit exceeding the cap (i64::MAX) + let system_tx_gas_limit = i64::MAX as u64; + assert!(system_tx_gas_limit > MAX_TX_GAS_LIMIT_OSAKA); + + let mut tx = BscTxEnv::new( + TxEnv::builder() + .caller(caller) + .chain_id(Some(56)) + .gas_limit(system_tx_gas_limit) + .gas_price(0) // System txs have 0 gas price + .kind(TxKind::Call(contract)) + .build() + .expect("tx env should build"), + ); + // Mark as system transaction + tx.is_system_transaction = true; + + let mut evm = BscEvm::new( + env, + make_db_with_funded_caller(caller), + NoOpInspector, + false, + false, + ); + + // Set the transaction directly on the inner context + evm.inner.ctx.tx = tx; + + // Create handler and validate env + let handler = BscHandler::::new(); + let result = handler.validate_env(&mut evm); + + // System transaction should pass validation despite exceeding gas limit cap + assert!( + result.is_ok(), + "System transaction should bypass gas limit cap validation, got error: {:?}", + result.err() + ); + } + + #[test] + fn test_non_system_tx_fails_gas_limit_cap_validation() { + // Use Osaka spec which has the gas limit cap enabled + let spec = BscHardfork::Osaka; + let mut cfg_env = CfgEnv::new_with_spec(spec).with_chain_id(56); + // Set the gas limit cap + cfg_env.tx_gas_limit_cap = Some(MAX_TX_GAS_LIMIT_OSAKA); + + let block_env = BlockEnv { + prevrandao: Some(U256::from(1).into()), // Required for post-merge + ..Default::default() + }; + let env = EvmEnv::new(cfg_env, block_env); + + let caller = Address::from([0x11; 20]); + let contract = Address::from([0x22; 20]); + + // Create a non-system transaction with gas limit exceeding the cap + let excessive_gas_limit = MAX_TX_GAS_LIMIT_OSAKA + 1; + + let tx = BscTxEnv::new( + TxEnv::builder() + .caller(caller) + .chain_id(Some(56)) + .gas_limit(excessive_gas_limit) + .gas_price(1) // Non-zero gas price + .kind(TxKind::Call(contract)) + .build() + .expect("tx env should build"), + ); + // is_system_transaction defaults to false + + let mut evm = BscEvm::new( + env, + make_db_with_funded_caller(caller), + NoOpInspector, + false, + false, + ); + + // Set the transaction directly on the inner context + evm.inner.ctx.tx = tx; + + // Create handler and validate env + let handler = BscHandler::::new(); + let result = handler.validate_env(&mut evm); + + // Non-system transaction should fail validation + assert!( + result.is_err(), + "Non-system transaction exceeding gas limit cap should fail validation" + ); + + // Verify it's the correct error type + if let Err(e) = result { + match e { + revm::context::result::EVMError::Transaction(InvalidTransaction::TxGasLimitGreaterThanCap { gas_limit, cap }) => { + assert_eq!(gas_limit, excessive_gas_limit); + assert_eq!(cap, MAX_TX_GAS_LIMIT_OSAKA); + } + _ => panic!("Expected TxGasLimitGreaterThanCap error, got: {:?}", e), + } + } + } + + #[test] + fn test_non_system_tx_within_cap_passes_validation() { + // Use Osaka spec which has the gas limit cap enabled + let spec = BscHardfork::Osaka; + let mut cfg_env = CfgEnv::new_with_spec(spec).with_chain_id(56); + // Set the gas limit cap + cfg_env.tx_gas_limit_cap = Some(MAX_TX_GAS_LIMIT_OSAKA); + + let block_env = BlockEnv { + prevrandao: Some(U256::from(1).into()), // Required for post-merge + ..Default::default() + }; + let env = EvmEnv::new(cfg_env, block_env); + + let caller = Address::from([0x11; 20]); + let contract = Address::from([0x22; 20]); + + // Create a non-system transaction with gas limit within the cap + let valid_gas_limit = MAX_TX_GAS_LIMIT_OSAKA - 1; + + let tx = BscTxEnv::new( + TxEnv::builder() + .caller(caller) + .chain_id(Some(56)) + .gas_limit(valid_gas_limit) + .gas_price(1) + .kind(TxKind::Call(contract)) + .build() + .expect("tx env should build"), + ); + + let mut evm = BscEvm::new( + env, + make_db_with_funded_caller(caller), + NoOpInspector, + false, + false, + ); + + // Set the transaction directly on the inner context + evm.inner.ctx.tx = tx; + + // Create handler and validate env + let handler = BscHandler::::new(); + let result = handler.validate_env(&mut evm); + + // Non-system transaction within cap should pass validation + assert!( + result.is_ok(), + "Non-system transaction within gas limit cap should pass validation, got error: {:?}", + result.err() + ); + } +} diff --git a/src/node/consensus.rs b/src/node/consensus.rs index 631b451e..6809097c 100644 --- a/src/node/consensus.rs +++ b/src/node/consensus.rs @@ -371,20 +371,20 @@ mod tests { let (tx, _rx) = mpsc::unbounded_channel::>(); let engine = BscForkChoiceEngine::new( - TestProvider::default(), + TestProvider, ConsensusEngineHandle::new(tx), chain_spec, ); - let mut parent = Header::default(); - parent.number = 9; - parent.timestamp = 1; + let parent = Header { number: 9, timestamp: 1, ..Default::default() }; let parent_hash = parent.hash_slow(); - let mut head = Header::default(); - head.number = 10; - head.timestamp = 2; - head.parent_hash = parent_hash; + let head = Header { + number: 10, + timestamp: 2, + parent_hash, + ..Default::default() + }; let head_hash = head.hash_slow(); let fallback_hash = B256::from([7u8; 32]); @@ -455,20 +455,20 @@ mod tests { let (tx, _rx) = mpsc::unbounded_channel::>(); let engine = BscForkChoiceEngine::new( - TestProvider::default(), + TestProvider, ConsensusEngineHandle::new(tx), chain_spec, ); - let mut parent = Header::default(); - parent.number = 9; - parent.timestamp = 1; + let parent = Header { number: 9, timestamp: 1, ..Default::default() }; let parent_hash = parent.hash_slow(); - let mut head = Header::default(); - head.number = 10; - head.timestamp = 2; - head.parent_hash = parent_hash; + let head = Header { + number: 10, + timestamp: 2, + parent_hash, + ..Default::default() + }; let head_hash = head.hash_slow(); let fallback_hash = B256::from([7u8; 32]); @@ -529,20 +529,20 @@ mod tests { let (tx, _rx) = mpsc::unbounded_channel::>(); let engine = BscForkChoiceEngine::new( - TestProvider::default(), + TestProvider, ConsensusEngineHandle::new(tx), chain_spec, ); - let mut parent = Header::default(); - parent.number = 9; - parent.timestamp = 1; + let parent = Header { number: 9, timestamp: 1, ..Default::default() }; let parent_hash = parent.hash_slow(); - let mut head = Header::default(); - head.number = 10; - head.timestamp = 2; - head.parent_hash = parent_hash; + let head = Header { + number: 10, + timestamp: 2, + parent_hash, + ..Default::default() + }; let head_hash = head.hash_slow(); let fallback_hash = B256::from([7u8; 32]); @@ -609,20 +609,20 @@ mod tests { let (tx, _rx) = mpsc::unbounded_channel::>(); let engine = BscForkChoiceEngine::new( - TestProvider::default(), + TestProvider, ConsensusEngineHandle::new(tx), chain_spec, ); - let mut parent = Header::default(); - parent.number = 9; - parent.timestamp = 1; + let parent = Header { number: 9, timestamp: 1, ..Default::default() }; let parent_hash = parent.hash_slow(); - let mut head = Header::default(); - head.number = 10; - head.timestamp = 2; - head.parent_hash = parent_hash; + let head = Header { + number: 10, + timestamp: 2, + parent_hash, + ..Default::default() + }; let head_hash = head.hash_slow(); let fallback_hash = B256::from([7u8; 32]); @@ -691,14 +691,13 @@ mod tests { let (tx, _rx) = mpsc::unbounded_channel::>(); let engine = BscForkChoiceEngine::new( - TestProvider::default(), + TestProvider, ConsensusEngineHandle::new(tx), chain_spec, ); - let mut head = Header::default(); - head.number = 12; // Head is at 12 - head.timestamp = 2; + // Head is at 12 + let head = Header { number: 12, timestamp: 2, ..Default::default() }; let head_hash = head.hash_slow(); let fallback_hash = B256::from([7u8; 32]); @@ -767,20 +766,20 @@ mod tests { let (tx, _rx) = mpsc::unbounded_channel::>(); let engine = BscForkChoiceEngine::new( - TestProvider::default(), + TestProvider, ConsensusEngineHandle::new(tx), chain_spec, ); - let mut parent = Header::default(); - parent.number = 99; - parent.timestamp = 1; + let parent = Header { number: 99, timestamp: 1, ..Default::default() }; let parent_hash = parent.hash_slow(); - let mut head = Header::default(); - head.number = 100; - head.timestamp = 2; - head.parent_hash = parent_hash; + let head = Header { + number: 100, + timestamp: 2, + parent_hash, + ..Default::default() + }; let head_hash = head.hash_slow(); let fallback_hash = B256::from([7u8; 32]); diff --git a/src/node/evm/pre_execution.rs b/src/node/evm/pre_execution.rs index 66cfdae0..0ac9ff70 100644 --- a/src/node/evm/pre_execution.rs +++ b/src/node/evm/pre_execution.rs @@ -188,10 +188,22 @@ where pub(crate) fn eth_call( - &mut self, - to: Address, + &mut self, + to: Address, data: Bytes ) -> Result { + // Use block gas limit (~36M on BSC) to match GASLIMIT opcode semantics. + // Mark as system transaction to bypass EIP-7825 gas limit cap (16M), + // since block gas limit exceeds the cap and these are internal queries. + // + // Trade-off accepted: is_system_transaction causes transact_raw to: + // - Set basefee to 0 (BASEFEE opcode returns 0 instead of actual basefee) + // - Disable nonce checks + // - Replace block.gas_limit with tx.gas_limit + // + // For BSC system contract reads (get_current_validators, get_validator_election_info, etc.), + // these side effects are acceptable because the contracts don't use BASEFEE in view functions. + // If future contracts depend on BASEFEE, this approach would need revisiting. let tx_env = BscTxEnv { base: TxEnv { caller: Address::default(), @@ -209,7 +221,7 @@ where tx_type: 0, authorization_list: Default::default(), }, - is_system_transaction: false, + is_system_transaction: true, }; let result_and_state = self.evm.transact(tx_env).map_err(BlockExecutionError::other)?; diff --git a/src/node/miner/bsc_miner.rs b/src/node/miner/bsc_miner.rs index 5840fb4e..6b79b7d8 100644 --- a/src/node/miner/bsc_miner.rs +++ b/src/node/miner/bsc_miner.rs @@ -867,6 +867,46 @@ where return Ok(()); } + // Check if parent is still canonical (handles reorg during delayed submission) + let parent_number = block_number.saturating_sub(1); + match self.provider.sealed_header(parent_number) { + Ok(Some(canonical_parent)) => { + if canonical_parent.hash() != parent_hash { + debug!( + target: "bsc::miner", + block_number, + parent_number, + expected_parent_hash = %parent_hash, + canonical_parent_hash = %canonical_parent.hash(), + "Skip to submit block due to parent no longer canonical (reorg occurred)" + ); + return Ok(()); + } + } + Ok(None) => { + // Parent header not found - likely reorged away + debug!( + target: "bsc::miner", + block_number, + parent_number, + parent_hash = %parent_hash, + "Skip to submit block due to parent not found in canonical chain" + ); + return Ok(()); + } + Err(e) => { + // Provider/DB error - log warning and skip to avoid potential issues + warn!( + target: "bsc::miner", + block_number, + parent_number, + error = %e, + "Failed to query canonical parent header, skipping block submission" + ); + return Ok(()); + } + } + { // check double sign let mut cache = self.recent_mined_blocks.lock().unwrap(); @@ -953,8 +993,7 @@ where ); // TODO: wait more times when huge chain import. - // TODO: only canonical head can broadcast, avoid sidechain blocks. - let parent_number = block_number.saturating_sub(1); + // Note: sidechain blocks are already filtered by parent canonical check above. let parent_td = self .provider .header_td_by_number(parent_number) diff --git a/src/node/miner/payload.rs b/src/node/miner/payload.rs index 466e78cc..9428cb8f 100644 --- a/src/node/miner/payload.rs +++ b/src/node/miner/payload.rs @@ -703,38 +703,6 @@ where } } -#[cfg(test)] -mod tests { - use super::validate_bsc_sidecar; - use alloy_consensus::BlobTransactionSidecar; - use alloy_eips::eip4844::{Blob, Bytes48}; - use alloy_eips::eip7594::{ - BlobTransactionSidecarEip7594, BlobTransactionSidecarVariant, CELLS_PER_EXT_BLOB, - }; - use reth::transaction_pool::error::Eip4844PoolTransactionError; - - #[test] - fn bsc_sidecar_accepts_eip4844() { - let sidecar = BlobTransactionSidecar::default(); - let variant = BlobTransactionSidecarVariant::Eip4844(sidecar); - assert!(validate_bsc_sidecar(&variant).is_ok()); - } - - #[test] - fn bsc_sidecar_rejects_eip7594() { - let blob = Blob::default(); - let commitment = Bytes48::default(); - let cell_proofs = vec![Bytes48::default(); CELLS_PER_EXT_BLOB]; - let sidecar = BlobTransactionSidecarEip7594::new(vec![blob], vec![commitment], cell_proofs); - let variant = BlobTransactionSidecarVariant::Eip7594(sidecar); - - assert!(matches!( - validate_bsc_sidecar(&variant), - Err(Eip4844PoolTransactionError::UnexpectedEip7594SidecarBeforeOsaka) - )); - } -} - /// Handle for aborting a BscPayloadJob pub struct BscPayloadJobHandle { abort_tx: oneshot::Sender<()>, @@ -1356,3 +1324,35 @@ where Some(best_payload) } } + +#[cfg(test)] +mod tests { + use super::validate_bsc_sidecar; + use alloy_consensus::BlobTransactionSidecar; + use alloy_eips::eip4844::{Blob, Bytes48}; + use alloy_eips::eip7594::{ + BlobTransactionSidecarEip7594, BlobTransactionSidecarVariant, CELLS_PER_EXT_BLOB, + }; + use reth::transaction_pool::error::Eip4844PoolTransactionError; + + #[test] + fn bsc_sidecar_accepts_eip4844() { + let sidecar = BlobTransactionSidecar::default(); + let variant = BlobTransactionSidecarVariant::Eip4844(sidecar); + assert!(validate_bsc_sidecar(&variant).is_ok()); + } + + #[test] + fn bsc_sidecar_rejects_eip7594() { + let blob = Blob::default(); + let commitment = Bytes48::default(); + let cell_proofs = vec![Bytes48::default(); CELLS_PER_EXT_BLOB]; + let sidecar = BlobTransactionSidecarEip7594::new(vec![blob], vec![commitment], cell_proofs); + let variant = BlobTransactionSidecarVariant::Eip7594(sidecar); + + assert!(matches!( + validate_bsc_sidecar(&variant), + Err(Eip4844PoolTransactionError::UnexpectedEip7594SidecarBeforeOsaka) + )); + } +} From bbbba4f36634b6d9826808e27a985f0087c204c4 Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Tue, 3 Feb 2026 15:43:44 +0100 Subject: [PATCH 3/3] feat(tests): add support of eth spec tests --- Cargo.lock | 258 ++-- Cargo.toml | 3 + Makefile | 27 + README.md | 21 + testing/bsc-ef-tests/.gitignore | 3 + testing/bsc-ef-tests/Cargo.toml | 51 + testing/bsc-ef-tests/src/case.rs | 27 + .../bsc-ef-tests/src/cases/blockchain_test.rs | 424 +++++++ testing/bsc-ef-tests/src/cases/mod.rs | 5 + testing/bsc-ef-tests/src/lib.rs | 18 + testing/bsc-ef-tests/src/models.rs | 1056 +++++++++++++++++ testing/bsc-ef-tests/src/result.rs | 85 ++ testing/bsc-ef-tests/src/suite.rs | 92 ++ testing/bsc-ef-tests/tests/tests.rs | 95 ++ testing/run-evm-tests.sh | 190 +++ 15 files changed, 2244 insertions(+), 111 deletions(-) create mode 100644 testing/bsc-ef-tests/.gitignore create mode 100644 testing/bsc-ef-tests/Cargo.toml create mode 100644 testing/bsc-ef-tests/src/case.rs create mode 100644 testing/bsc-ef-tests/src/cases/blockchain_test.rs create mode 100644 testing/bsc-ef-tests/src/cases/mod.rs create mode 100644 testing/bsc-ef-tests/src/lib.rs create mode 100644 testing/bsc-ef-tests/src/models.rs create mode 100644 testing/bsc-ef-tests/src/result.rs create mode 100644 testing/bsc-ef-tests/src/suite.rs create mode 100644 testing/bsc-ef-tests/tests/tests.rs create mode 100755 testing/run-evm-tests.sh diff --git a/Cargo.lock b/Cargo.lock index d4a0a891..51322400 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1941,6 +1941,42 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "bsc-ef-tests" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-rlp", + "rayon", + "reth-chainspec", + "reth-consensus", + "reth-db", + "reth-db-api", + "reth-db-common", + "reth-ethereum-consensus", + "reth-ethereum-forks", + "reth-ethereum-primitives", + "reth-evm", + "reth-evm-ethereum", + "reth-primitives", + "reth-primitives-traits", + "reth-provider", + "reth-revm", + "reth-tracing", + "reth-trie", + "reth-trie-db", + "reth_bsc", + "revm", + "serde", + "serde_json", + "thiserror 2.0.18", + "tikv-jemallocator", + "walkdir", +] + [[package]] name = "bstr" version = "0.2.17" @@ -7293,7 +7329,7 @@ checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "reth" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-rpc-types", "aquamarine", @@ -7339,7 +7375,7 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7363,7 +7399,7 @@ dependencies = [ [[package]] name = "reth-chain-state" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7394,7 +7430,7 @@ dependencies = [ [[package]] name = "reth-chainspec" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7414,7 +7450,7 @@ dependencies = [ [[package]] name = "reth-cli" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-genesis", "clap", @@ -7428,7 +7464,7 @@ dependencies = [ [[package]] name = "reth-cli-commands" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-chains", "alloy-consensus", @@ -7514,7 +7550,7 @@ dependencies = [ [[package]] name = "reth-cli-runner" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "reth-tasks", "tokio", @@ -7524,7 +7560,7 @@ dependencies = [ [[package]] name = "reth-cli-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7542,7 +7578,7 @@ dependencies = [ [[package]] name = "reth-codecs" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7562,7 +7598,7 @@ dependencies = [ [[package]] name = "reth-codecs-derive" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "proc-macro2", "quote", @@ -7572,7 +7608,7 @@ dependencies = [ [[package]] name = "reth-config" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "eyre", "humantime-serde", @@ -7588,7 +7624,7 @@ dependencies = [ [[package]] name = "reth-consensus" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7601,7 +7637,7 @@ dependencies = [ [[package]] name = "reth-consensus-common" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7613,7 +7649,7 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7639,7 +7675,7 @@ dependencies = [ [[package]] name = "reth-db" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "derive_more 2.1.1", @@ -7665,7 +7701,7 @@ dependencies = [ [[package]] name = "reth-db-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7693,7 +7729,7 @@ dependencies = [ [[package]] name = "reth-db-common" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7727,7 +7763,7 @@ dependencies = [ [[package]] name = "reth-db-models" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -7742,7 +7778,7 @@ dependencies = [ [[package]] name = "reth-discv4" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7767,7 +7803,7 @@ dependencies = [ [[package]] name = "reth-discv5" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7791,7 +7827,7 @@ dependencies = [ [[package]] name = "reth-dns-discovery" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "data-encoding", @@ -7815,7 +7851,7 @@ dependencies = [ [[package]] name = "reth-downloaders" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7850,7 +7886,7 @@ dependencies = [ [[package]] name = "reth-ecies" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "aes", "alloy-primitives", @@ -7878,7 +7914,7 @@ dependencies = [ [[package]] name = "reth-engine-local" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7901,7 +7937,7 @@ dependencies = [ [[package]] name = "reth-engine-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -7926,7 +7962,7 @@ dependencies = [ [[package]] name = "reth-engine-service" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "futures", "pin-project", @@ -7949,7 +7985,7 @@ dependencies = [ [[package]] name = "reth-engine-tree" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eip7928", @@ -8009,7 +8045,7 @@ dependencies = [ [[package]] name = "reth-engine-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -8037,7 +8073,7 @@ dependencies = [ [[package]] name = "reth-era" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8052,7 +8088,7 @@ dependencies = [ [[package]] name = "reth-era-downloader" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "bytes 1.11.1", @@ -8068,7 +8104,7 @@ dependencies = [ [[package]] name = "reth-era-utils" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8090,7 +8126,7 @@ dependencies = [ [[package]] name = "reth-errors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "reth-consensus", "reth-execution-errors", @@ -8101,7 +8137,7 @@ dependencies = [ [[package]] name = "reth-eth-wire" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-chains", "alloy-primitives", @@ -8130,7 +8166,7 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-chains", "alloy-consensus", @@ -8154,7 +8190,7 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "clap", "eyre", @@ -8176,7 +8212,7 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8192,7 +8228,7 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8210,7 +8246,7 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -8224,7 +8260,7 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8253,7 +8289,7 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8273,7 +8309,7 @@ dependencies = [ [[package]] name = "reth-etl" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "rayon", "reth-db-api", @@ -8283,7 +8319,7 @@ dependencies = [ [[package]] name = "reth-evm" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8307,7 +8343,7 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8329,7 +8365,7 @@ dependencies = [ [[package]] name = "reth-execution-errors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-evm", "alloy-primitives", @@ -8342,7 +8378,7 @@ dependencies = [ [[package]] name = "reth-execution-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8360,7 +8396,7 @@ dependencies = [ [[package]] name = "reth-exex" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8398,7 +8434,7 @@ dependencies = [ [[package]] name = "reth-exex-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -8412,7 +8448,7 @@ dependencies = [ [[package]] name = "reth-fs-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "serde", "serde_json", @@ -8422,7 +8458,7 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8450,7 +8486,7 @@ dependencies = [ [[package]] name = "reth-ipc" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "bytes 1.11.1", "futures", @@ -8470,7 +8506,7 @@ dependencies = [ [[package]] name = "reth-libmdbx" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "bitflags 2.10.0", "byteorder", @@ -8486,7 +8522,7 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "bindgen 0.71.1", "cc", @@ -8507,7 +8543,7 @@ dependencies = [ [[package]] name = "reth-metrics" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "futures", "metrics", @@ -8519,7 +8555,7 @@ dependencies = [ [[package]] name = "reth-net-banlist" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "ipnet", @@ -8528,7 +8564,7 @@ dependencies = [ [[package]] name = "reth-net-nat" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "futures-util", "if-addrs", @@ -8542,7 +8578,7 @@ dependencies = [ [[package]] name = "reth-network" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8598,7 +8634,7 @@ dependencies = [ [[package]] name = "reth-network-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8623,7 +8659,7 @@ dependencies = [ [[package]] name = "reth-network-p2p" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8646,7 +8682,7 @@ dependencies = [ [[package]] name = "reth-network-peers" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8661,7 +8697,7 @@ dependencies = [ [[package]] name = "reth-network-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8675,7 +8711,7 @@ dependencies = [ [[package]] name = "reth-nippy-jar" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "anyhow", "bincode", @@ -8692,7 +8728,7 @@ dependencies = [ [[package]] name = "reth-node-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8716,7 +8752,7 @@ dependencies = [ [[package]] name = "reth-node-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8786,7 +8822,7 @@ dependencies = [ [[package]] name = "reth-node-core" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8842,7 +8878,7 @@ dependencies = [ [[package]] name = "reth-node-ethereum" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-network", @@ -8880,7 +8916,7 @@ dependencies = [ [[package]] name = "reth-node-ethstats" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8904,7 +8940,7 @@ dependencies = [ [[package]] name = "reth-node-events" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8928,7 +8964,7 @@ dependencies = [ [[package]] name = "reth-node-metrics" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "bytes 1.11.1", "eyre", @@ -8952,7 +8988,7 @@ dependencies = [ [[package]] name = "reth-node-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "reth-chainspec", "reth-db-api", @@ -8964,7 +9000,7 @@ dependencies = [ [[package]] name = "reth-optimism-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -8979,7 +9015,7 @@ dependencies = [ [[package]] name = "reth-payload-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9000,7 +9036,7 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "pin-project", "reth-payload-primitives", @@ -9012,7 +9048,7 @@ dependencies = [ [[package]] name = "reth-payload-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9035,7 +9071,7 @@ dependencies = [ [[package]] name = "reth-payload-validator" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -9045,7 +9081,7 @@ dependencies = [ [[package]] name = "reth-primitives" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "c-kzg", @@ -9059,7 +9095,7 @@ dependencies = [ [[package]] name = "reth-primitives-traits" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9092,7 +9128,7 @@ dependencies = [ [[package]] name = "reth-provider" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9136,7 +9172,7 @@ dependencies = [ [[package]] name = "reth-prune" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9164,7 +9200,7 @@ dependencies = [ [[package]] name = "reth-prune-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "arbitrary", @@ -9179,7 +9215,7 @@ dependencies = [ [[package]] name = "reth-ress-protocol" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9198,7 +9234,7 @@ dependencies = [ [[package]] name = "reth-ress-provider" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9225,7 +9261,7 @@ dependencies = [ [[package]] name = "reth-revm" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "reth-primitives-traits", @@ -9238,7 +9274,7 @@ dependencies = [ [[package]] name = "reth-rpc" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9321,7 +9357,7 @@ dependencies = [ [[package]] name = "reth-rpc-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eip7928", "alloy-eips", @@ -9351,7 +9387,7 @@ dependencies = [ [[package]] name = "reth-rpc-builder" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-network", "alloy-provider", @@ -9392,7 +9428,7 @@ dependencies = [ [[package]] name = "reth-rpc-convert" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-evm", @@ -9414,7 +9450,7 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9444,7 +9480,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -9489,7 +9525,7 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9537,7 +9573,7 @@ dependencies = [ [[package]] name = "reth-rpc-layer" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-rpc-types-engine", "http 1.4.0", @@ -9551,7 +9587,7 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9567,7 +9603,7 @@ dependencies = [ [[package]] name = "reth-stages" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9619,7 +9655,7 @@ dependencies = [ [[package]] name = "reth-stages-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9646,7 +9682,7 @@ dependencies = [ [[package]] name = "reth-stages-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "arbitrary", @@ -9660,7 +9696,7 @@ dependencies = [ [[package]] name = "reth-static-file" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "parking_lot", @@ -9680,7 +9716,7 @@ dependencies = [ [[package]] name = "reth-static-file-types" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "clap", @@ -9693,7 +9729,7 @@ dependencies = [ [[package]] name = "reth-storage-api" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9717,7 +9753,7 @@ dependencies = [ [[package]] name = "reth-storage-errors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -9734,7 +9770,7 @@ dependencies = [ [[package]] name = "reth-tasks" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "auto_impl", "dyn-clone", @@ -9752,7 +9788,7 @@ dependencies = [ [[package]] name = "reth-testing-utils" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9768,7 +9804,7 @@ dependencies = [ [[package]] name = "reth-tokio-util" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "tokio", "tokio-stream", @@ -9778,7 +9814,7 @@ dependencies = [ [[package]] name = "reth-tracing" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "clap", "eyre", @@ -9794,7 +9830,7 @@ dependencies = [ [[package]] name = "reth-tracing-otlp" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "clap", "eyre", @@ -9812,7 +9848,7 @@ dependencies = [ [[package]] name = "reth-transaction-pool" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9853,7 +9889,7 @@ dependencies = [ [[package]] name = "reth-trie" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9879,7 +9915,7 @@ dependencies = [ [[package]] name = "reth-trie-common" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -9908,7 +9944,7 @@ dependencies = [ [[package]] name = "reth-trie-db" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "metrics", @@ -9929,7 +9965,7 @@ dependencies = [ [[package]] name = "reth-trie-parallel" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9954,7 +9990,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9973,7 +10009,7 @@ dependencies = [ [[package]] name = "reth-trie-sparse-parallel" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -9991,7 +10027,7 @@ dependencies = [ [[package]] name = "reth-zstd-compressors" version = "1.10.2" -source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#e84655ce9bc3a8a639ac146c558cae0d8b01dcbf" +source = "git+https://github.com/bnb-chain/reth.git?branch=feat%2Feip7594-sidecar-toggle#8105fbb03d340d94988b666cbcee68adf06a1ab1" dependencies = [ "zstd", ] diff --git a/Cargo.toml b/Cargo.toml index b815369f..6f7b1dbc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,6 @@ +[workspace] +members = [".", "testing/bsc-ef-tests"] + [package] name = "reth_bsc" version = "0.1.0" diff --git a/Makefile b/Makefile index ee4b02bd..1c62b242 100644 --- a/Makefile +++ b/Makefile @@ -34,3 +34,30 @@ check-features: --package reth-primitives-traits \ --package reth-primitives \ --feature-powerset + +##@ EVM Tests + +# Execution spec tests configuration +EEST_VERSION ?= v5.4.0 +EEST_URL := https://github.com/ethereum/execution-spec-tests/releases/download/$(EEST_VERSION)/fixtures_stable.tar.gz +EEST_DIR := ./testing/bsc-ef-tests/execution-spec-tests + +$(EEST_DIR): + @echo "Downloading execution spec tests $(EEST_VERSION)..." + mkdir -p $(EEST_DIR) + curl -sL $(EEST_URL) | tar -xzf - --strip-components=1 -C $(EEST_DIR) + +.PHONY: download-eest +download-eest: $(EEST_DIR) ## Download execution spec test fixtures + +.PHONY: ef-tests +ef-tests: $(EEST_DIR) ## Run BSC EVM execution spec tests + cargo test -p bsc-ef-tests --release --features ef-tests,jemalloc,asm-keccak + +.PHONY: ef-tests-nextest +ef-tests-nextest: $(EEST_DIR) ## Run BSC EVM execution spec tests with nextest (faster) + cargo nextest run -p bsc-ef-tests --release --features ef-tests,jemalloc,asm-keccak + +.PHONY: clean-eest +clean-eest: ## Remove downloaded execution spec test fixtures + rm -rf $(EEST_DIR) diff --git a/README.md b/README.md index 28dfa422..3f8f8358 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,27 @@ make build make maxperf ``` +## Testing + +### Ethereum Execution Spec Tests + +Run the [Ethereum Execution Spec Tests](https://github.com/ethereum/execution-spec-tests) to validate BSC EVM compatibility: + +```bash +# Download test fixtures (v5.4.0) +make download-eest + +# Run tests +make ef-tests + +# Or use nextest for faster parallel execution (requires cargo-nextest) +# Install with: cargo install cargo-nextest +make ef-tests-nextest + +# Clean up test fixtures +make clean-eest +``` + ## Running ### Full Node (Recommended) diff --git a/testing/bsc-ef-tests/.gitignore b/testing/bsc-ef-tests/.gitignore new file mode 100644 index 00000000..d2f24cc0 --- /dev/null +++ b/testing/bsc-ef-tests/.gitignore @@ -0,0 +1,3 @@ +# Test fixtures (downloaded) +execution-spec-tests/ +ethereum-tests/ diff --git a/testing/bsc-ef-tests/Cargo.toml b/testing/bsc-ef-tests/Cargo.toml new file mode 100644 index 00000000..c6a7665f --- /dev/null +++ b/testing/bsc-ef-tests/Cargo.toml @@ -0,0 +1,51 @@ +[package] +name = "bsc-ef-tests" +version = "0.1.0" +edition = "2021" +description = "Execution Spec Tests for BSC EVM" + +[features] +ef-tests = [] +jemalloc = ["dep:tikv-jemallocator"] +asm-keccak = ["alloy-primitives/asm-keccak"] + +[dependencies] +# BSC crate +reth_bsc = { path = "../.." } + +# reth dependencies from the same reth fork +reth-chainspec = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-consensus = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-ethereum-forks = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-db = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = ["mdbx", "test-utils", "disable-lock"] } +reth-db-api = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-db-common = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-ethereum-consensus = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-ethereum-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-evm = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-evm-ethereum = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-primitives = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-primitives-traits = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-provider = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = ["test-utils"] } +reth-revm = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle", features = ["std"] } +reth-tracing = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-trie = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } +reth-trie-db = { git = "https://github.com/bnb-chain/reth.git", branch = "feat/eip7594-sidecar-toggle" } + +# revm +revm = { version = "34.0.0", features = ["secp256k1", "blst", "c-kzg", "memory_limit"] } + +# alloy +alloy-consensus = "1.1.3" +alloy-eips = "1.1.3" +alloy-genesis = "1.1.3" +alloy-primitives = "1.4.1" +alloy-rlp = "0.3.12" + +# misc +rayon = "1" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +thiserror = "2.0" +tikv-jemallocator = { version = "0.6", optional = true } +walkdir = "2" diff --git a/testing/bsc-ef-tests/src/case.rs b/testing/bsc-ef-tests/src/case.rs new file mode 100644 index 00000000..cd08971e --- /dev/null +++ b/testing/bsc-ef-tests/src/case.rs @@ -0,0 +1,27 @@ +//! Test case abstractions + +use crate::result::Error; +use std::path::Path; + +/// A single test case. +pub trait Case: Sized { + /// Load the test from the given path. + fn load(path: &Path) -> Result; + + /// Run the test. + fn run(&self) -> Result<(), Error>; +} + +/// A collection of test cases. +#[derive(Debug)] +pub struct Cases { + /// The test cases. + pub tests: Vec, +} + +impl Cases { + /// Run all test cases. + pub fn run(&self) -> Vec> { + self.tests.iter().map(|case| case.run()).collect() + } +} diff --git a/testing/bsc-ef-tests/src/cases/blockchain_test.rs b/testing/bsc-ef-tests/src/cases/blockchain_test.rs new file mode 100644 index 00000000..f907ba87 --- /dev/null +++ b/testing/bsc-ef-tests/src/cases/blockchain_test.rs @@ -0,0 +1,424 @@ +//! Test runner for blockchain tests using BSC chain specs +//! +//! This test runner validates that the BSC hardfork rules are compatible with +//! standard Ethereum execution spec tests. It uses the BSC chain spec (with BSC +//! hardfork rules) but the standard Ethereum block executor, since the EF tests +//! use standard Ethereum block types. +//! +//! For BSC-specific features (system transactions, custom precompiles), separate +//! integration tests should be used. + +use crate::{ + models::{BlockchainTest, ForkSpec}, + result::ExecutionWitness, + Case, Error, Suite, +}; +use alloy_rlp::Decodable; +use rayon::iter::{ParallelBridge, ParallelIterator}; +use reth_bsc::chainspec::BscChainSpec; +use reth_chainspec::ChainSpec; +use reth_db_common::init::{insert_genesis_hashes, insert_genesis_history, insert_genesis_state}; +use reth_ethereum_primitives::Block; +use reth_evm::{execute::Executor, ConfigureEvm}; +use reth_evm_ethereum::EthEvmConfig; +use reth_primitives_traits::{RecoveredBlock, SealedBlock}; +use reth_provider::{ + test_utils::create_test_provider_factory_with_chain_spec, BlockWriter, DatabaseProviderFactory, + ExecutionOutcome, HistoryWriter, OriginalValuesKnown, StateWriteConfig, StateWriter, + StaticFileProviderFactory, StaticFileSegment, StaticFileWriter, +}; +use reth_revm::{database::StateProviderDatabase, State}; +use reth_trie::{HashedPostState, KeccakKeyHasher, StateRoot}; +use reth_trie_db::DatabaseStateRoot; +use std::{ + collections::BTreeMap, + fs, + path::{Path, PathBuf}, + sync::Arc, +}; + +/// A handler for the blockchain test suite. +#[derive(Debug)] +pub struct BlockchainTests { + suite_path: PathBuf, +} + +impl BlockchainTests { + /// Create a new suite for tests with blockchain tests format. + pub const fn new(suite_path: PathBuf) -> Self { + Self { suite_path } + } +} + +impl Suite for BlockchainTests { + type Case = BlockchainTestCase; + + fn suite_path(&self) -> &Path { + &self.suite_path + } +} + +/// An Ethereum blockchain test. +#[derive(Debug, PartialEq, Eq)] +pub struct BlockchainTestCase { + /// The tests within this test case. + pub tests: BTreeMap, + /// Whether to skip this test case. + pub skip: bool, +} + +impl BlockchainTestCase { + /// Returns `true` if the fork is not supported. + const fn excluded_fork(network: ForkSpec) -> bool { + matches!( + network, + ForkSpec::ByzantiumToConstantinopleAt5 + | ForkSpec::Constantinople + | ForkSpec::ConstantinopleFix + | ForkSpec::MergeEOF + | ForkSpec::MergeMeterInitCode + | ForkSpec::MergePush0 + ) + } + + /// If the test expects an exception, return the block number + /// at which it must occur together with the original message. + #[inline] + fn expected_failure(case: &BlockchainTest) -> Option<(u64, String)> { + case.blocks.iter().enumerate().find_map(|(idx, blk)| { + blk.expect_exception.as_ref().map(|msg| ((idx + 1) as u64, msg.clone())) + }) + } + + /// Execute a single `BlockchainTest`, validating the outcome against the + /// expectations encoded in the JSON file. + pub fn run_single_case( + name: &str, + case: &BlockchainTest, + ) -> Result, ExecutionWitness)>, Error> { + let expectation = Self::expected_failure(case); + match run_case(case) { + Ok(program_inputs) => { + if let Some((block, msg)) = expectation { + Err(Error::Assertion(format!( + "Test case: {name}\nExpected failure at block {block} - {msg}, but all blocks succeeded", + ))) + } else { + Ok(program_inputs) + } + } + + Err(Error::BlockProcessingFailed { block_number, partial_program_inputs, err }) => { + match expectation { + Some((expected, _)) if block_number == expected => Ok(partial_program_inputs), + Some((expected, _)) => Err(Error::Assertion(format!( + "Test case: {name}\nExpected failure at block {expected}\nGot failure at block {block_number}", + ))), + None => Err(Error::BlockProcessingFailed { block_number, partial_program_inputs, err }), + } + } + + Err(other) => Err(other), + } + } +} + +impl Case for BlockchainTestCase { + fn load(path: &Path) -> Result { + Ok(Self { + tests: { + let s = fs::read_to_string(path) + .map_err(|error| Error::Io { path: path.into(), error })?; + serde_json::from_str(&s) + .map_err(|error| Error::CouldNotDeserialize { path: path.into(), error })? + }, + skip: should_skip(path), + }) + } + + fn run(&self) -> Result<(), Error> { + if self.skip { + return Err(Error::Skipped); + } + + self.tests + .iter() + .filter(|(_, case)| !Self::excluded_fork(case.network)) + .par_bridge() + .try_for_each(|(name, case)| Self::run_single_case(name, case).map(|_| ()))?; + + Ok(()) + } +} + +/// Executes a single `BlockchainTest` using BSC chain specs. +/// +/// This uses the BSC chain specification (with BSC hardfork rules) but executes +/// using the standard Ethereum executor, since the EF tests use standard Ethereum +/// block types. +fn run_case( + case: &BlockchainTest, +) -> Result, ExecutionWitness)>, Error> { + // Create a BSC chain spec from the network fork specification + let bsc_chain_spec: Arc = case.network.into(); + + // Extract the inner ChainSpec which contains the hardfork rules + let chain_spec: Arc = Arc::new(bsc_chain_spec.inner.clone()); + + // Create the test provider factory with our chain spec + let factory = create_test_provider_factory_with_chain_spec(chain_spec.clone()); + let provider = factory.database_provider_rw().unwrap(); + + // Insert initial test state into the provider. + let genesis_block = SealedBlock::::from_sealed_parts( + case.genesis_block_header.clone().into(), + Default::default(), + ) + .try_recover() + .unwrap(); + + provider + .insert_block(&genesis_block) + .map_err(|err| Error::block_failed(0, Default::default(), err))?; + + // Increment block number for receipts static file + provider + .static_file_provider() + .latest_writer(StaticFileSegment::Receipts) + .and_then(|mut writer| writer.increment_block(0)) + .map_err(|err| Error::block_failed(0, Default::default(), err))?; + + let genesis_state = case.pre.clone().into_genesis_state(); + insert_genesis_state(&provider, genesis_state.iter()) + .map_err(|err| Error::block_failed(0, Default::default(), err))?; + insert_genesis_hashes(&provider, genesis_state.iter()) + .map_err(|err| Error::block_failed(0, Default::default(), err))?; + insert_genesis_history(&provider, genesis_state.iter()) + .map_err(|err| Error::block_failed(0, Default::default(), err))?; + + // Decode blocks + let blocks = decode_blocks(&case.blocks)?; + + // Use the standard Ethereum executor with BSC chain spec (for hardfork rules) + let executor_provider = EthEvmConfig::ethereum(chain_spec.clone()); + + let mut _parent = genesis_block; + let mut program_inputs = Vec::new(); + + for (block_index, block) in blocks.iter().enumerate() { + let block_number = (block_index + 1) as u64; + + // Insert the block into the database + provider + .insert_block(block) + .map_err(|err| Error::block_failed(block_number, Default::default(), err))?; + provider + .static_file_provider() + .commit() + .map_err(|err| Error::block_failed(block_number, Default::default(), err))?; + + // Execute the block + let state_provider = provider.latest(); + let state_db = StateProviderDatabase::new(&state_provider); + let executor = executor_provider.batch_executor(state_db); + + // Execute with state closure to get the full output including state + let output = executor + .execute_with_state_closure_always(&(*block).clone(), |_state: &State<_>| { + // State recorded for witness generation if needed + }) + .map_err(|err| Error::block_failed(block_number, program_inputs.clone(), err))?; + + // Build execution witness (simplified) + let exec_witness = ExecutionWitness::default(); + program_inputs.push((block.clone(), exec_witness)); + + // Compute and check the post state root + let hashed_state = + HashedPostState::from_bundle_state::(output.state.state()); + let (computed_state_root, _) = StateRoot::overlay_root_with_updates( + provider.tx_ref(), + &hashed_state.clone_into_sorted(), + ) + .map_err(|err| Error::block_failed(block_number, program_inputs.clone(), err))?; + + if computed_state_root != block.state_root { + return Err(Error::block_failed( + block_number, + program_inputs.clone(), + Error::Assertion(format!( + "state root mismatch: computed {computed_state_root:?}, expected {:?}", + block.state_root + )), + )); + } + + // Commit the post state to the database + provider + .write_state( + &ExecutionOutcome::single(block.number, output), + OriginalValuesKnown::Yes, + StateWriteConfig::default(), + ) + .map_err(|err| Error::block_failed(block_number, program_inputs.clone(), err))?; + + provider + .write_hashed_state(&hashed_state.into_sorted()) + .map_err(|err| Error::block_failed(block_number, program_inputs.clone(), err))?; + provider + .update_history_indices(block.number..=block.number) + .map_err(|err| Error::block_failed(block_number, program_inputs.clone(), err))?; + + _parent = block.clone(); + } + + // Validate the post-state + if let Some(expected_post_state) = &case.post_state { + for (address, account) in expected_post_state { + account.assert_db(*address, provider.tx_ref())?; + } + } + + Ok(program_inputs) +} + +fn decode_blocks( + test_case_blocks: &[crate::models::Block], +) -> Result>, Error> { + let mut blocks = Vec::with_capacity(test_case_blocks.len()); + for (block_index, block) in test_case_blocks.iter().enumerate() { + let block_number = (block_index + 1) as u64; + + let decoded = SealedBlock::::decode(&mut block.rlp.as_ref()) + .map_err(|err| Error::block_failed(block_number, Default::default(), err))?; + + let recovered_block = decoded + .clone() + .try_recover() + .map_err(|err| Error::block_failed(block_number, Default::default(), err))?; + + blocks.push(recovered_block); + } + + Ok(blocks) +} + +/// Returns whether the test at the given path should be skipped. +pub fn should_skip(path: &Path) -> bool { + let name = path.file_name().unwrap().to_str().unwrap(); + matches!( + name, + // funky test with `bigint 0x00` value in json + | "ValueOverflow.json" + | "ValueOverflowParis.json" + // txbyte is of type 02 and we don't parse tx bytes for this test to fail. + | "typeTwoBerlin.json" + // Test checks if nonce overflows. + | "CreateTransactionHighNonce.json" + // Test check if gas price overflows + | "HighGasPrice.json" + | "HighGasPriceParis.json" + // Skip test where basefee/accesslist/difficulty is present but it shouldn't be supported + | "accessListExample.json" + | "basefeeExample.json" + | "eip1559.json" + | "mergeTest.json" + // These tests take a lot of time to execute + | "loopExp.json" + | "Call50000_sha256.json" + | "static_Call50000_sha256.json" + | "loopMul.json" + | "CALLBlake2f_MaxRounds.json" + | "shiftCombinations.json" + // Skipped by revm as well + | "RevertInCreateInInit_Paris.json" + | "RevertInCreateInInit.json" + | "dynamicAccountOverwriteEmpty.json" + | "dynamicAccountOverwriteEmpty_Paris.json" + | "RevertInCreateInInitCreate2Paris.json" + | "create2collisionStorage.json" + | "RevertInCreateInInitCreate2.json" + | "create2collisionStorageParis.json" + | "InitCollision.json" + | "InitCollisionParis.json" + // ============================================================================= + // EIP-7610: Revert creation in case of non-empty storage + // https://eips.ethereum.org/EIPS/eip-7610 + // These tests are for CREATE/CREATE2 collision when target address has + // non-empty storage (nonce=0, code=empty, but storage exists). + // EIP-7610 is scheduled for Osaka/Fusaka hardfork, not Cancun. + // revm's SpecId::CANCUN does not include EIP-7610 support. + // ============================================================================= + | "test_init_collision_create_opcode.json" + | "test_init_collision_create_tx.json" + + // ============================================================================= + // Block Header Validation Tests + // These tests require consensus-level block validation that rejects invalid + // blocks BEFORE execution. The test harness uses NoProof consensus and + // EthEvmConfig which only validates EVM execution, not block headers. + // These would need a full consensus engine (like Parlia for BSC) to validate. + // ============================================================================= + + // Gas limit validation (EIP-150: minimum gas limit is 5000) + // Test sets gasLimit=0, expects BlockException.INVALID_GASLIMIT + | "test_gas_limit_below_minimum.json" + + // Base fee validation (EIP-1559) + // Test sets invalid base_fee_per_gas, expects BlockException.INVALID_BASEFEE_PER_GAS + | "test_invalid_header.json" + + // Withdrawals root validation (EIP-4895) + // Test provides mismatched withdrawals_root, expects BlockException.INVALID_WITHDRAWALS_ROOT + | "test_withdrawals_root.json" + + // ============================================================================= + // EIP-4844 Blob Gas Validation Tests + // These tests verify that blocks with invalid blob gas fields are rejected. + // The test harness doesn't validate excess_blob_gas or blob_gas_used in headers. + // Invalid blocks execute instead of being rejected, causing balance mismatches. + // ============================================================================= + | "test_invalid_excess_blob_gas_target_blobs_increase_from_zero.json" + | "test_invalid_non_multiple_excess_blob_gas.json" + | "test_invalid_static_excess_blob_gas.json" + | "test_invalid_excess_blob_gas_above_target_change.json" + | "test_invalid_excess_blob_gas_change.json" + | "test_invalid_zero_excess_blob_gas_in_header.json" + | "test_invalid_blob_gas_used_in_header.json" + | "test_invalid_static_excess_blob_gas_from_zero_on_blobs_above_target.json" + // Tests blob fields presence before Cancun fork activation + | "test_invalid_pre_fork_block_with_blob_fields.json" + + // ============================================================================= + // Prague (EIP-7685) Request Validation Tests + // These tests verify that blocks with invalid execution layer requests + // (deposits, withdrawals, consolidations) are rejected at consensus level. + // The test harness doesn't validate requests_hash in block headers. + // ============================================================================= + + // EIP-7002: Execution layer triggerable withdrawals + // Tests invalid withdrawal request lists, expects BlockException.INVALID_REQUESTS + | "test_withdrawal_requests_negative.json" + + // EIP-6110: Supply validator deposits on chain + // Tests invalid deposit lists, expects BlockException.INVALID_REQUESTS + | "test_deposit_negative.json" + + // EIP-7251: Increase MAX_EFFECTIVE_BALANCE (consolidations) + // Tests invalid consolidation lists, expects BlockException.INVALID_REQUESTS + | "test_consolidation_requests_negative.json" + + // Tests multiple request types with invalid data + | "test_invalid_multi_type_requests.json" + + // System contract deployment validation + // Tests expect BlockException.SYSTEM_CONTRACT_EMPTY when system contracts + // (deposit, withdrawal, consolidation contracts) don't exist at fork activation + | "test_system_contract_deployment.json" + + // Prague deposit contract log validation + // These test invalid deposit log formats from the deposit contract + | "test_invalid_log_length.json" + | "test_invalid_layout.json" + ) +} diff --git a/testing/bsc-ef-tests/src/cases/mod.rs b/testing/bsc-ef-tests/src/cases/mod.rs new file mode 100644 index 00000000..db162186 --- /dev/null +++ b/testing/bsc-ef-tests/src/cases/mod.rs @@ -0,0 +1,5 @@ +//! Test case implementations + +pub mod blockchain_test; + +pub use blockchain_test::BlockchainTests; diff --git a/testing/bsc-ef-tests/src/lib.rs b/testing/bsc-ef-tests/src/lib.rs new file mode 100644 index 00000000..28a6f493 --- /dev/null +++ b/testing/bsc-ef-tests/src/lib.rs @@ -0,0 +1,18 @@ +//! BSC Execution Spec Tests runner. +//! +//! This crate provides test infrastructure for running Ethereum execution spec tests +//! against the BSC EVM implementation. + +#[cfg(all(feature = "jemalloc", unix))] +#[global_allocator] +static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; + +pub mod case; +pub mod cases; +pub mod models; +pub mod result; +pub mod suite; + +pub use case::{Case, Cases}; +pub use result::{CaseResult, Error}; +pub use suite::Suite; diff --git a/testing/bsc-ef-tests/src/models.rs b/testing/bsc-ef-tests/src/models.rs new file mode 100644 index 00000000..d1e94f68 --- /dev/null +++ b/testing/bsc-ef-tests/src/models.rs @@ -0,0 +1,1056 @@ +//! Shared models for execution spec tests + +use alloy_consensus::Header as RethHeader; +use alloy_eips::eip4895::Withdrawals; +use alloy_genesis::GenesisAccount; +use alloy_primitives::{keccak256, Address, Bloom, Bytes, B256, B64, U256}; +use reth_bsc::{ + chainspec::BscChainSpec, + hardforks::bsc::BscHardfork, +}; +use reth_chainspec::{BaseFeeParams, BaseFeeParamsKind, Chain, ChainSpec, ForkCondition, Hardfork}; +use reth_ethereum_forks::{ChainHardforks, EthereumHardfork}; +use reth_db_api::{cursor::DbDupCursorRO, tables, transaction::DbTx}; +use reth_primitives_traits::SealedHeader; +use serde::Deserialize; +use std::{collections::BTreeMap, ops::Deref, sync::Arc}; + +use crate::Error; + +/// The definition of a blockchain test. +#[derive(Debug, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BlockchainTest { + /// Genesis block header. + pub genesis_block_header: Header, + /// RLP encoded genesis block. + #[serde(rename = "genesisRLP")] + pub genesis_rlp: Option, + /// Block data. + pub blocks: Vec, + /// The expected post state. + pub post_state: Option>, + /// The test pre-state. + pub pre: State, + /// Hash of the best block. + pub lastblockhash: B256, + /// Network spec. + pub network: ForkSpec, + #[serde(default)] + /// Engine spec. + pub seal_engine: SealEngine, +} + +/// A block header in an Ethereum blockchain test. +#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct Header { + /// Bloom filter. + pub bloom: Bloom, + /// Coinbase. + pub coinbase: Address, + /// Difficulty. + pub difficulty: U256, + /// Extra data. + pub extra_data: Bytes, + /// Gas limit. + pub gas_limit: U256, + /// Gas used. + pub gas_used: U256, + /// Block Hash. + pub hash: B256, + /// Mix hash. + pub mix_hash: B256, + /// Seal nonce. + pub nonce: B64, + /// Block number. + pub number: U256, + /// Parent hash. + pub parent_hash: B256, + /// Receipt trie. + pub receipt_trie: B256, + /// State root. + pub state_root: B256, + /// Timestamp. + pub timestamp: U256, + /// Transactions trie. + pub transactions_trie: B256, + /// Uncle hash. + pub uncle_hash: B256, + /// Base fee per gas. + pub base_fee_per_gas: Option, + /// Withdrawals root. + pub withdrawals_root: Option, + /// Blob gas used. + pub blob_gas_used: Option, + /// Excess blob gas. + pub excess_blob_gas: Option, + /// Parent beacon block root. + pub parent_beacon_block_root: Option, + /// Requests root. + pub requests_hash: Option, + /// Target blobs per block. + pub target_blobs_per_block: Option, +} + +impl From
for SealedHeader { + fn from(value: Header) -> Self { + let header = RethHeader { + base_fee_per_gas: value.base_fee_per_gas.map(|v| v.to::()), + beneficiary: value.coinbase, + difficulty: value.difficulty, + extra_data: value.extra_data, + gas_limit: value.gas_limit.to::(), + gas_used: value.gas_used.to::(), + mix_hash: value.mix_hash, + nonce: u64::from_be_bytes(value.nonce.0).into(), + number: value.number.to::(), + timestamp: value.timestamp.to::(), + transactions_root: value.transactions_trie, + receipts_root: value.receipt_trie, + ommers_hash: value.uncle_hash, + state_root: value.state_root, + parent_hash: value.parent_hash, + logs_bloom: value.bloom, + withdrawals_root: value.withdrawals_root, + blob_gas_used: value.blob_gas_used.map(|v| v.to::()), + excess_blob_gas: value.excess_blob_gas.map(|v| v.to::()), + parent_beacon_block_root: value.parent_beacon_block_root, + requests_hash: value.requests_hash, + }; + Self::new(header, value.hash) + } +} + +/// A block in an Ethereum blockchain test. +#[derive(Debug, PartialEq, Eq, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct Block { + /// Block header. + pub block_header: Option
, + /// RLP encoded block bytes + pub rlp: Bytes, + /// If the execution of the block should fail, + /// `expect_exception` is `Some`. + /// Its contents detail the reason for the failure. + pub expect_exception: Option, + /// Transactions + pub transactions: Option>, + /// Uncle/ommer headers + pub uncle_headers: Option>, + /// Transaction Sequence + pub transaction_sequence: Option>, + /// Withdrawals + pub withdrawals: Option, +} + +/// Transaction sequence in block +#[derive(Debug, PartialEq, Eq, Deserialize, Default)] +#[serde(deny_unknown_fields)] +#[serde(rename_all = "camelCase")] +pub struct TransactionSequence { + exception: String, + raw_bytes: Bytes, + valid: String, +} + +/// Ethereum blockchain test data state. +#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Default)] +pub struct State(BTreeMap); + +impl State { + /// Return state as genesis state. + pub fn into_genesis_state(self) -> BTreeMap { + self.0 + .into_iter() + .map(|(address, account)| { + let storage = account + .storage + .iter() + .filter(|(_, v)| !v.is_zero()) + .map(|(k, v)| { + ( + B256::from_slice(&k.to_be_bytes::<32>()), + B256::from_slice(&v.to_be_bytes::<32>()), + ) + }) + .collect(); + let account = GenesisAccount { + balance: account.balance, + nonce: Some(account.nonce.try_into().unwrap()), + code: Some(account.code).filter(|c| !c.is_empty()), + storage: Some(storage), + private_key: None, + }; + (address, account) + }) + .collect::>() + } +} + +impl Deref for State { + type Target = BTreeMap; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +/// An account. +#[derive(Debug, PartialEq, Eq, Deserialize, Clone, Default)] +#[serde(deny_unknown_fields)] +pub struct Account { + /// Balance. + pub balance: U256, + /// Code. + pub code: Bytes, + /// Nonce. + pub nonce: U256, + /// Storage. + pub storage: BTreeMap, +} + +impl Account { + /// Check that the account matches what is in the database. + /// + /// In case of a mismatch, `Err(Error::Assertion)` is returned. + pub fn assert_db(&self, address: Address, tx: &impl DbTx) -> Result<(), Error> { + let account = + tx.get_by_encoded_key::(&address)?.ok_or_else(|| { + Error::Assertion(format!( + "Expected account ({address}) is missing from DB: {self:?}" + )) + })?; + + assert_equal(self.balance, account.balance, "Balance does not match")?; + assert_equal(self.nonce.to(), account.nonce, "Nonce does not match")?; + + if let Some(bytecode_hash) = account.bytecode_hash { + assert_equal(keccak256(&self.code), bytecode_hash, "Bytecode does not match")?; + } else { + assert_equal( + self.code.is_empty(), + true, + "Expected empty bytecode, got bytecode in db.", + )?; + } + + let mut storage_cursor = tx.cursor_dup_read::()?; + for (slot, value) in &self.storage { + if let Some(entry) = + storage_cursor.seek_by_key_subkey(address, B256::new(slot.to_be_bytes()))? + { + if U256::from_be_bytes(entry.key.0) == *slot { + assert_equal( + *value, + entry.value, + &format!("Storage for slot {slot:?} does not match"), + )?; + } else { + return Err(Error::Assertion(format!( + "Slot {slot:?} is missing from the database. Expected {value:?}" + ))); + } + } else { + return Err(Error::Assertion(format!( + "Slot {slot:?} is missing from the database. Expected {value:?}" + ))); + } + } + + Ok(()) + } +} + +fn assert_equal( + got: T, + expected: T, + msg: &str, +) -> Result<(), Error> { + if got != expected { + Err(Error::Assertion(format!("{msg}: got {got:?}, expected {expected:?}"))) + } else { + Ok(()) + } +} + +/// Fork specification. +/// Includes both Ethereum and BSC hardforks. +#[derive(Debug, PartialEq, Eq, PartialOrd, Hash, Ord, Clone, Copy, Deserialize)] +pub enum ForkSpec { + // Ethereum forks + /// Frontier + Frontier, + /// Frontier to Homestead + FrontierToHomesteadAt5, + /// Homestead + Homestead, + /// Homestead to DAO + HomesteadToDaoAt5, + /// Homestead to Tangerine + HomesteadToEIP150At5, + /// Tangerine + EIP150, + /// Spurious Dragon + EIP158, + /// Spurious Dragon to Byzantium + EIP158ToByzantiumAt5, + /// Byzantium + Byzantium, + /// Byzantium to Constantinople + ByzantiumToConstantinopleAt5, + /// Byzantium to Constantinople Fix + ByzantiumToConstantinopleFixAt5, + /// Constantinople + Constantinople, + /// Constantinople fix + ConstantinopleFix, + /// Istanbul + Istanbul, + /// Berlin + Berlin, + /// Berlin to London + BerlinToLondonAt5, + /// London + London, + /// Paris aka The Merge + #[serde(alias = "Paris")] + Merge, + /// Paris to Shanghai at time 15k + ParisToShanghaiAtTime15k, + /// Shanghai + Shanghai, + /// Shanghai to Cancun at time 15k + ShanghaiToCancunAtTime15k, + /// Merge EOF test + #[serde(alias = "Merge+3540+3670")] + MergeEOF, + /// After Merge Init Code test + #[serde(alias = "Merge+3860")] + MergeMeterInitCode, + /// After Merge plus new PUSH0 opcode + #[serde(alias = "Merge+3855")] + MergePush0, + /// Cancun + Cancun, + /// Cancun to Prague at time 15k + CancunToPragueAtTime15k, + /// Prague + Prague, + /// Osaka + Osaka, + + // BSC-specific forks + /// BSC Ramanujan + Ramanujan, + /// BSC Niels + Niels, + /// BSC MirrorSync + MirrorSync, + /// BSC Bruno + Bruno, + /// BSC Euler + Euler, + /// BSC Nano + Nano, + /// BSC Moran + Moran, + /// BSC Gibbs + Gibbs, + /// BSC Planck + Planck, + /// BSC Luban + Luban, + /// BSC Plato + Plato, + /// BSC Hertz + Hertz, + /// BSC HertzFix + HertzFix, + /// BSC Kepler + Kepler, + /// BSC Feynman + Feynman, + /// BSC FeynmanFix + FeynmanFix, + /// BSC Haber + Haber, + /// BSC HaberFix + HaberFix, + /// BSC Bohr + Bohr, + /// BSC Pascal + Pascal, + /// BSC Lorentz + Lorentz, + /// BSC Maxwell + Maxwell, + /// BSC Fermi + Fermi, + /// BSC Mendel + Mendel, +} + +impl ForkSpec { + /// Returns `true` if this is a BSC-specific fork. + pub const fn is_bsc_fork(&self) -> bool { + matches!( + self, + Self::Ramanujan + | Self::Niels + | Self::MirrorSync + | Self::Bruno + | Self::Euler + | Self::Nano + | Self::Moran + | Self::Gibbs + | Self::Planck + | Self::Luban + | Self::Plato + | Self::Hertz + | Self::HertzFix + | Self::Kepler + | Self::Feynman + | Self::FeynmanFix + | Self::Haber + | Self::HaberFix + | Self::Bohr + | Self::Pascal + | Self::Lorentz + | Self::Maxwell + | Self::Fermi + | Self::Mendel + ) + } +} + +impl From for Arc { + fn from(fork_spec: ForkSpec) -> Self { + // Create hardforks list based on the fork spec + let hardforks = create_hardforks_for_spec(fork_spec); + + let inner = ChainSpec { + chain: Chain::from_id(1), // Use Ethereum mainnet chain ID for EF tests + genesis: Default::default(), + hardforks, + deposit_contract: None, + base_fee_params: BaseFeeParamsKind::Constant(BaseFeeParams::new(1, 1)), + prune_delete_limit: 3500, + ..Default::default() + }; + + Arc::new(BscChainSpec { inner }) + } +} + +/// Create the hardforks configuration for a given fork spec. +/// This ensures all prerequisite forks are enabled from genesis (block 0 / timestamp 0). +fn create_hardforks_for_spec(fork_spec: ForkSpec) -> ChainHardforks { + // Build fork-specific hardfork lists to ensure correct precompile gas costs + let mut forks: Vec<(Box, ForkCondition)> = Vec::new(); + + // Add forks based on the target spec + match fork_spec { + // Frontier + ForkSpec::Frontier => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + } + ForkSpec::FrontierToHomesteadAt5 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(5))); + } + + // Homestead + ForkSpec::Homestead => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + } + ForkSpec::HomesteadToDaoAt5 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Dao.boxed(), ForkCondition::Block(5))); + } + ForkSpec::HomesteadToEIP150At5 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(5))); + } + + // Tangerine Whistle (EIP-150) + ForkSpec::EIP150 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + } + + // Spurious Dragon (EIP-158) + ForkSpec::EIP158 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + } + ForkSpec::EIP158ToByzantiumAt5 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(5))); + } + + // Byzantium + ForkSpec::Byzantium => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + } + ForkSpec::ByzantiumToConstantinopleAt5 | ForkSpec::ByzantiumToConstantinopleFixAt5 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(5))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(5))); + } + + // Constantinople + ForkSpec::Constantinople | ForkSpec::ConstantinopleFix => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + } + + // Istanbul + ForkSpec::Istanbul => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + } + + // Berlin/London era + ForkSpec::Berlin => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + } + ForkSpec::BerlinToLondonAt5 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(5))); + } + ForkSpec::London => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + } + + // Post-merge (Paris) + ForkSpec::Merge | ForkSpec::MergeEOF | ForkSpec::MergeMeterInitCode | ForkSpec::MergePush0 => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + } + + // Shanghai + ForkSpec::ParisToShanghaiAtTime15k => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(15_000))); + } + ForkSpec::Shanghai => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + } + + // Cancun + ForkSpec::ShanghaiToCancunAtTime15k => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(15_000))); + } + ForkSpec::Cancun => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + } + + ForkSpec::CancunToPragueAtTime15k => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(15_000))); + } + + ForkSpec::Prague => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0))); + } + ForkSpec::Osaka => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Osaka.boxed(), ForkCondition::Timestamp(0))); + } + + // BSC-specific forks - add all prerequisites including base Ethereum forks + ForkSpec::Ramanujan | ForkSpec::Niels => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + } + ForkSpec::MirrorSync => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Bruno => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Euler => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Nano | ForkSpec::Moran | ForkSpec::Gibbs => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Planck => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Planck.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Luban => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Planck.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Luban.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Plato => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Planck.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Luban.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Plato.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Hertz | ForkSpec::HertzFix => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Planck.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Luban.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Plato.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Hertz.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::HertzFix.boxed(), ForkCondition::Block(0))); + } + ForkSpec::Kepler | ForkSpec::Feynman | ForkSpec::FeynmanFix => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Planck.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Luban.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Plato.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Hertz.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::HertzFix.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Kepler.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Feynman.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::FeynmanFix.boxed(), ForkCondition::Timestamp(0))); + } + ForkSpec::Haber | ForkSpec::HaberFix | ForkSpec::Bohr => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Planck.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Luban.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Plato.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Hertz.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::HertzFix.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Kepler.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Feynman.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::FeynmanFix.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Haber.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::HaberFix.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Bohr.boxed(), ForkCondition::Timestamp(0))); + } + ForkSpec::Pascal | ForkSpec::Lorentz | ForkSpec::Maxwell | ForkSpec::Fermi | ForkSpec::Mendel => { + forks.push((EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::London.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Paris.boxed(), ForkCondition::Block(0))); + forks.push((EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + forks.push((EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Ramanujan.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Niels.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::MirrorSync.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Bruno.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Euler.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Nano.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Moran.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Gibbs.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Planck.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Luban.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Plato.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Hertz.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::HertzFix.boxed(), ForkCondition::Block(0))); + forks.push((BscHardfork::Kepler.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Feynman.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::FeynmanFix.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Cancun.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Haber.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::HaberFix.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Bohr.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Pascal.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Lorentz.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Maxwell.boxed(), ForkCondition::Timestamp(0))); + forks.push((BscHardfork::Fermi.boxed(), ForkCondition::Timestamp(0))); + if matches!(fork_spec, ForkSpec::Mendel) { + forks.push((BscHardfork::Mendel.boxed(), ForkCondition::Timestamp(0))); + } + } + } + + ChainHardforks::new(forks) +} + +/// Possible seal engines. +#[derive(Debug, PartialEq, Eq, Default, Deserialize)] +pub enum SealEngine { + /// No consensus checks. + #[default] + NoProof, +} + +/// Ethereum blockchain test transaction data. +#[derive(Debug, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Transaction { + /// Transaction type + #[serde(rename = "type")] + pub transaction_type: Option, + /// Data. + pub data: Bytes, + /// Gas limit. + pub gas_limit: U256, + /// Gas price. + pub gas_price: Option, + /// Nonce. + pub nonce: U256, + /// Signature r part. + pub r: U256, + /// Signature s part. + pub s: U256, + /// Parity bit. + pub v: U256, + /// Transaction value. + pub value: U256, + /// Chain ID. + pub chain_id: Option, + /// Access list. + pub access_list: Option, + /// Max fee per gas. + pub max_fee_per_gas: Option, + /// Max priority fee per gas + pub max_priority_fee_per_gas: Option, + /// Transaction hash. + pub hash: Option, +} + +/// Access list item +#[derive(Debug, PartialEq, Eq, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct AccessListItem { + /// Account address + pub address: Address, + /// Storage key. + pub storage_keys: Vec, +} + +/// Access list. +pub type AccessList = Vec; diff --git a/testing/bsc-ef-tests/src/result.rs b/testing/bsc-ef-tests/src/result.rs new file mode 100644 index 00000000..c6a52b49 --- /dev/null +++ b/testing/bsc-ef-tests/src/result.rs @@ -0,0 +1,85 @@ +//! Test case result types + +use reth_ethereum_primitives::Block; +use reth_primitives_traits::RecoveredBlock; +use std::path::PathBuf; + +/// Blockchain test execution witness (placeholder for BSC). +#[derive(Debug, Clone, Default)] +pub struct ExecutionWitness { + /// Parent block headers needed for BLOCKHASH. + pub headers: Vec, +} + +/// A single test case result. +#[derive(Debug)] +pub struct CaseResult { + /// The path to the test case. + pub path: PathBuf, + /// The test name. + pub name: String, + /// The result of the test. + pub result: Result<(), Error>, +} + +/// Test error types. +#[derive(Debug, thiserror::Error)] +pub enum Error { + /// An IO error occurred. + #[error("IO error at {path}: {error}")] + Io { + /// The path to the file. + path: PathBuf, + /// The error. + error: std::io::Error, + }, + /// A deserialization error occurred. + #[error("Could not deserialize {path}: {error}")] + CouldNotDeserialize { + /// The path to the file. + path: PathBuf, + /// The error. + error: serde_json::Error, + }, + /// An assertion error occurred. + #[error("Assertion failed: {0}")] + Assertion(String), + /// The test was skipped. + #[error("Test skipped")] + Skipped, + /// Block processing failed at a specific block number. + #[error("Block processing failed at block {block_number}: {err}")] + BlockProcessingFailed { + /// The block number at which processing failed. + block_number: u64, + /// Partial execution witnesses collected before failure. + partial_program_inputs: Vec<(RecoveredBlock, ExecutionWitness)>, + /// The underlying error. + #[source] + err: Box, + }, + /// Database error. + #[error("Database error: {0}")] + Database(#[from] reth_db_api::DatabaseError), + /// Provider error. + #[error("Provider error: {0}")] + Provider(#[from] reth_provider::ProviderError), +} + +impl Error { + /// Create a block processing failure error. + pub fn block_failed( + block_number: u64, + partial_inputs: Vec<(RecoveredBlock, ExecutionWitness)>, + err: E, + ) -> Self + where + E: std::error::Error + Send + Sync + 'static, + { + Self::BlockProcessingFailed { + block_number, + partial_program_inputs: partial_inputs, + err: Box::new(err), + } + } +} diff --git a/testing/bsc-ef-tests/src/suite.rs b/testing/bsc-ef-tests/src/suite.rs new file mode 100644 index 00000000..0a997d78 --- /dev/null +++ b/testing/bsc-ef-tests/src/suite.rs @@ -0,0 +1,92 @@ +//! Test suite abstraction + +use crate::{Case, Error}; +use rayon::iter::{ParallelBridge, ParallelIterator}; +use std::path::Path; +use walkdir::{DirEntry, WalkDir}; + +/// A test suite. +pub trait Suite: Sized { + /// The type of test case in this suite. + type Case: Case + Send + Sync; + + /// The path to the suite. + fn suite_path(&self) -> &Path; + + /// Run the test suite. + fn run(&self) { + self.run_with_filter(|_| true) + } + + /// Run only tests matching the given filter. + fn run_only(&self, filter: &str) { + self.run_with_filter(|path| { + path.to_string_lossy().contains(filter) + }) + } + + /// Run tests with a custom filter. + fn run_with_filter(&self, filter: F) + where + F: Fn(&Path) -> bool + Send + Sync, + { + let suite_path = self.suite_path(); + if !suite_path.exists() { + panic!( + "Suite path does not exist: {}. Did you download the test fixtures?", + suite_path.display() + ); + } + + let results: Vec<_> = WalkDir::new(suite_path) + .into_iter() + .filter_map(Result::ok) + .filter(|e| e.file_type().is_file()) + .filter(|e| e.path().extension().is_some_and(|ext| ext == "json")) + .filter(|e| filter(e.path())) + .par_bridge() + .map(|entry| run_case::(&entry)) + .collect(); + + let (passed, failed, skipped) = count_results(&results); + + println!("\nTest Results:"); + println!(" Passed: {passed}"); + println!(" Failed: {failed}"); + println!(" Skipped: {skipped}"); + + if failed > 0 { + println!("\nFailed tests:"); + for (path, err) in results + .iter() + .filter_map(|(path, result)| result.as_ref().err().map(|e| (path, e))) + .filter(|(_, e)| !matches!(e, Error::Skipped)) + { + println!(" {}: {err}", path.display()); + } + panic!("{failed} tests failed"); + } + } +} + +fn run_case(entry: &DirEntry) -> (std::path::PathBuf, Result<(), Error>) { + let path = entry.path().to_path_buf(); + let result = T::load(&path).and_then(|case| case.run()); + (path, result) +} + +fn count_results(results: &[(std::path::PathBuf, Result<(), Error>)]) -> (usize, usize, usize) { + let mut passed = 0; + let mut failed = 0; + let mut skipped = 0; + + for (_, result) in results { + match result { + Ok(_) => passed += 1, + Err(Error::Skipped) => skipped += 1, + Err(_) => failed += 1, + } + } + + (passed, failed, skipped) +} diff --git a/testing/bsc-ef-tests/tests/tests.rs b/testing/bsc-ef-tests/tests/tests.rs new file mode 100644 index 00000000..c79a4747 --- /dev/null +++ b/testing/bsc-ef-tests/tests/tests.rs @@ -0,0 +1,95 @@ +#![allow(missing_docs)] +#![cfg(feature = "ef-tests")] + +use bsc_ef_tests::{cases::BlockchainTests, Suite}; +use std::path::PathBuf; + +macro_rules! general_state_test { + ($test_name:ident, $dir:ident) => { + #[test] + fn $test_name() { + reth_tracing::init_test_tracing(); + let suite_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("execution-spec-tests") + .join("blockchain_tests"); + + BlockchainTests::new(suite_path) + .run_only(&format!("GeneralStateTests/{}", stringify!($dir))); + } + }; +} + +mod general_state_tests { + use super::*; + + general_state_test!(shanghai, Shanghai); + general_state_test!(st_args_zero_one_balance, stArgsZeroOneBalance); + general_state_test!(st_attack, stAttackTest); + general_state_test!(st_bad_opcode, stBadOpcode); + general_state_test!(st_bugs, stBugs); + general_state_test!(st_call_codes, stCallCodes); + general_state_test!(st_call_create_call_code, stCallCreateCallCodeTest); + general_state_test!( + st_call_delegate_codes_call_code_homestead, + stCallDelegateCodesCallCodeHomestead + ); + general_state_test!(st_call_delegate_codes_homestead, stCallDelegateCodesHomestead); + general_state_test!(st_chain_id, stChainId); + general_state_test!(st_code_copy_test, stCodeCopyTest); + general_state_test!(st_code_size_limit, stCodeSizeLimit); + general_state_test!(st_create2, stCreate2); + general_state_test!(st_create, stCreateTest); + general_state_test!(st_delegate_call_test_homestead, stDelegatecallTestHomestead); + general_state_test!(st_eip150_gas_prices, stEIP150singleCodeGasPrices); + general_state_test!(st_eip150, stEIP150Specific); + general_state_test!(st_eip158, stEIP158Specific); + general_state_test!(st_eip1559, stEIP1559); + general_state_test!(st_eip2930, stEIP2930); + general_state_test!(st_eip3607, stEIP3607); + general_state_test!(st_example, stExample); + general_state_test!(st_ext_codehash, stExtCodeHash); + general_state_test!(st_homestead, stHomesteadSpecific); + general_state_test!(st_init_code, stInitCodeTest); + general_state_test!(st_log, stLogTests); + general_state_test!(st_mem_expanding_eip150_calls, stMemExpandingEIP150Calls); + general_state_test!(st_memory_stress, stMemoryStressTest); + general_state_test!(st_memory, stMemoryTest); + general_state_test!(st_non_zero_calls, stNonZeroCallsTest); + general_state_test!(st_precompiles, stPreCompiledContracts); + general_state_test!(st_precompiles2, stPreCompiledContracts2); + general_state_test!(st_quadratic_complexity, stQuadraticComplexityTest); + general_state_test!(st_random, stRandom); + general_state_test!(st_random2, stRandom2); + general_state_test!(st_recursive_create, stRecursiveCreate); + general_state_test!(st_refund, stRefundTest); + general_state_test!(st_return, stReturnDataTest); + general_state_test!(st_revert, stRevertTest); + general_state_test!(st_self_balance, stSelfBalance); + general_state_test!(st_shift, stShift); + general_state_test!(st_sload, stSLoadTest); + general_state_test!(st_solidity, stSolidityTest); + general_state_test!(st_special, stSpecialTest); + general_state_test!(st_sstore, stSStoreTest); + general_state_test!(st_stack, stStackTests); + general_state_test!(st_static_call, stStaticCall); + general_state_test!(st_static_flag, stStaticFlagEnabled); + general_state_test!(st_system_operations, stSystemOperationsTest); + general_state_test!(st_time_consuming, stTimeConsuming); + general_state_test!(st_transaction, stTransactionTest); + general_state_test!(st_wallet, stWalletTest); + general_state_test!(st_zero_calls_revert, stZeroCallsRevert); + general_state_test!(st_zero_calls, stZeroCallsTest); + general_state_test!(st_zero_knowledge, stZeroKnowledge); + general_state_test!(st_zero_knowledge2, stZeroKnowledge2); + general_state_test!(vm_tests, VMTests); +} + +#[test] +fn eest_fixtures() { + reth_tracing::init_test_tracing(); + let suite_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("execution-spec-tests") + .join("blockchain_tests"); + + BlockchainTests::new(suite_path).run(); +} diff --git a/testing/run-evm-tests.sh b/testing/run-evm-tests.sh new file mode 100755 index 00000000..0472d886 --- /dev/null +++ b/testing/run-evm-tests.sh @@ -0,0 +1,190 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Configuration +EEST_VERSION="${EEST_VERSION:-v5.4.0}" +FIXTURES_URL="https://github.com/ethereum/execution-spec-tests/releases/download/${EEST_VERSION}/fixtures_stable.tar.gz" +TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bsc-ef-tests" +FIXTURES_DIR="${TEST_DIR}/execution-spec-tests" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Download and extract test fixtures +download_fixtures() { + if [[ -d "${FIXTURES_DIR}/blockchain_tests" ]]; then + log_info "Test fixtures already exist at ${FIXTURES_DIR}" + return 0 + fi + + log_info "Downloading execution spec test fixtures ${EEST_VERSION}..." + mkdir -p "${FIXTURES_DIR}" + + local tmp_file + tmp_file=$(mktemp) + + if ! curl -sL "${FIXTURES_URL}" -o "${tmp_file}"; then + log_error "Failed to download fixtures from ${FIXTURES_URL}" + rm -f "${tmp_file}" + return 1 + fi + + log_info "Extracting fixtures..." + if ! tar -xzf "${tmp_file}" -C "${FIXTURES_DIR}" --strip-components=1; then + log_error "Failed to extract fixtures" + rm -f "${tmp_file}" + return 1 + fi + + rm -f "${tmp_file}" + log_info "Fixtures downloaded and extracted to ${FIXTURES_DIR}" +} + +# Run the tests +run_tests() { + local filter="${1:-}" + + log_info "Running BSC EVM execution spec tests..." + + cd "${TEST_DIR}" + + local cmd="cargo test --release --features ef-tests" + + if [[ -n "${filter}" ]]; then + cmd="${cmd} -- ${filter}" + fi + + log_info "Running: ${cmd}" + + if ${cmd}; then + log_info "All tests passed!" + return 0 + else + log_error "Some tests failed" + return 1 + fi +} + +# Run tests with nextest (faster parallel execution) +run_tests_nextest() { + local filter="${1:-}" + + log_info "Running BSC EVM execution spec tests with nextest..." + + cd "${TEST_DIR}" + + local cmd="cargo nextest run --release --features ef-tests" + + if [[ -n "${filter}" ]]; then + cmd="${cmd} -E 'test(${filter})'" + fi + + log_info "Running: ${cmd}" + + if ${cmd}; then + log_info "All tests passed!" + return 0 + else + log_error "Some tests failed" + return 1 + fi +} + +# Print usage +usage() { + echo "Usage: $0 [command] [options]" + echo "" + echo "Commands:" + echo " download Download test fixtures only" + echo " test Run tests (downloads fixtures if needed)" + echo " nextest Run tests with nextest (faster, downloads fixtures if needed)" + echo " clean Remove downloaded fixtures" + echo "" + echo "Options:" + echo " --filter Run only tests matching the pattern" + echo " --version Use specific EEST version (default: ${EEST_VERSION})" + echo "" + echo "Examples:" + echo " $0 download" + echo " $0 test" + echo " $0 test --filter shanghai" + echo " $0 nextest --filter st_eip1559" + echo "" +} + +# Main +main() { + local command="${1:-test}" + shift || true + + local filter="" + + # Parse options + while [[ $# -gt 0 ]]; do + case "$1" in + --filter) + filter="$2" + shift 2 + ;; + --version) + EEST_VERSION="$2" + FIXTURES_URL="https://github.com/ethereum/execution-spec-tests/releases/download/${EEST_VERSION}/fixtures_stable.tar.gz" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + *) + log_error "Unknown option: $1" + usage + exit 1 + ;; + esac + done + + case "${command}" in + download) + download_fixtures + ;; + test) + download_fixtures + run_tests "${filter}" + ;; + nextest) + download_fixtures + run_tests_nextest "${filter}" + ;; + clean) + log_info "Removing fixtures..." + rm -rf "${FIXTURES_DIR}" + log_info "Done" + ;; + -h|--help|help) + usage + exit 0 + ;; + *) + log_error "Unknown command: ${command}" + usage + exit 1 + ;; + esac +} + +main "$@"