diff --git a/Cargo.lock b/Cargo.lock index 7f8105d2..59b47991 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,14 +88,14 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a547705d5c1b42575a0542bae2ba45bc62a6154be86611afaef1c0ab5c38598e" +checksum = "d8010fc7e9e8643ef4e758cdccf3eef26734594aedf88a9d5ed35e51837d42ef" dependencies = [ "alloy-consensus", "alloy-contract", "alloy-core", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-network", "alloy-provider", "alloy-rpc-client", @@ -121,14 +121,14 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8c24c95e90c1608c2d91cff1b451d796474168d3310ccc8b7cd12502ca8169" +checksum = "e3d64da86c616b5092ea64eea648f311bbd58630a0b384c42d699175d6f9122b" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-trie", "alloy-tx-macros", "arbitrary", @@ -149,24 +149,24 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d211ad0ef468a70a7a829e49683ff59ad25f02b4ab3764344c4c2663329a52c" +checksum = "8fd98696ca3617d3a9ba1a6f2011880cbfd5618228dab6400c9f8bca457859a8" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "arbitrary", "serde", ] [[package]] name = "alloy-contract" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59d55233ac14aa7fa6bcdcad45ba305e90c556065e0947cd9f243c4469e7c2d" +checksum = "de3df0aadc569a8b277808a7d0ad0e421180654ea36a3c59e9ed2bb968c9a1cd" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -263,14 +263,15 @@ dependencies = [ [[package]] name = "alloy-eip7928" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8222b1d88f9a6d03be84b0f5e76bb60cd83991b43ad8ab6477f0e4a7809b98d" +checksum = "ec6ae911a2fc304a7cb80a79fb7bed6d1474aed4e7c203df1f8ff538f64fc78d" dependencies = [ "alloy-primitives", "alloy-rlp", "arbitrary", "borsh", + "once_cell", "serde", ] @@ -299,9 +300,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae69eaa5096b47ffe97e6a5d6bde7e7fa2dec106af22a9315621d11039c3de3c" +checksum = "64c0456f5f7a4497e9342d20f528e30f5288ddfa0d6a012bd5044afee46cd8a0" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -309,7 +310,7 @@ dependencies = [ "alloy-eip7928", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "arbitrary", "auto_impl", "borsh", @@ -325,12 +326,12 @@ dependencies = [ [[package]] name = "alloy-evm" -version = "0.33.2" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fc4b83cb672156663e6094d098beb509965b7fe684bb3d6e44bb9ca2e9ae714" +checksum = "c1ceeea6dcbbcd4e546b27700763a6f6c3b3fee30054209884f521078b6fda4f" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-hardforks", "alloy-primitives", "alloy-rpc-types-engine", @@ -345,13 +346,13 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39789db0b3f3bbef0e6549c87bc6842b73886ebabee1405b6941685b1cc34083" +checksum = "a71ff8b55d2b8aa05259f474cae7dea0e4991724dc18936b81cb23ec492a0c2a" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-trie", "borsh", "serde", @@ -386,9 +387,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662b525af73e86b2167dae923261c8edf440ba7e1426b30a8b993177bc214c02" +checksum = "19e352478b756bad5d7203148e4b461861282ea2ded3da406ba24868b52cd098" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -401,19 +402,19 @@ dependencies = [ [[package]] name = "alloy-network" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c657c2d9751d3c7d94990554b231e5372c3c2e4bad842806280b6151a0d6a05d" +checksum = "ed08ae169869e08370ed121612e0d3dadac33d1a256e9f2465926b23f0bd7d95" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-json-rpc", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-any", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-signer", "alloy-sol-types", "async-trait", @@ -427,14 +428,14 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e7c4bb0ebbd6d7406d2808968f43c0d5186c69c5e58cedcbee7380f4cd1fcf" +checksum = "02e6c7ad28afe348a9a9c5624b67ee5b3607b8de98d5816b3056ecdfa6fa2697" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", ] @@ -470,13 +471,13 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fea0fc2628cdbc851aaa333124f9d8ab9f567ab8d4c20202819db13aa1a534" +checksum = "93a7c17472b55482d4734154c2f5ed13f72e03f6752cebb927f6a2d8b52e646c" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-json-rpc", "alloy-network", "alloy-network-primitives", @@ -514,9 +515,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc7b42e514613c717887dc77bb58d35e845557ebd63a18c3f92a77094e4891f" +checksum = "a8d86958b02bca85103d64fa60d7b364a8b017c6e40f2b02c3f50ca22964a738" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -558,9 +559,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5ee7b51752c68fb95f21705e402700750e692b1d21ccc294ac48fadc8655d53" +checksum = "5beb5c2fe6b960c8e8b038e69fd502a90a2e930afa4770efb748b163b0767729" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -584,22 +585,22 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa76988f54105ad4398828e8aaf1a39b3f07f91fb79091529056689514ee8c2" +checksum = "4ee1257a278f6d293e05c5162c5940a1561b1aa85ded0028b464c81de37ebfa5" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", ] [[package]] name = "alloy-rpc-types-admin" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670b3a8e0d1b32e9886b7a419b8efe6754ea00b9fdd4c0ea3c7411b6c30431f4" +checksum = "e2144d5b2866e651796eac0a997d3b5a056449c12e0d91be3184129e0c722885" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -609,38 +610,38 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d276bea4e92e4991269d31b9abd3e722eed2565b82036478a4416adb8dd4992" +checksum = "df32156f085e74eac942b6103744be49b817c302341aaa8cb0c1c88dc29228d9" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", ] [[package]] name = "alloy-rpc-types-any" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1a9a3bda9be7f6515316eb792710532411878bbfc88934973f4b371376b00d" +checksum = "6a234bfbdf7a76c3d13808f729af5321852de3dedcaa6fc6d5f54787aaf54c6a" dependencies = [ "alloy-consensus-any", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", "serde_json", ] [[package]] name = "alloy-rpc-types-beacon" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5d68ddca890854fb78291cbde06115473ded00b2337d0f815e92c0c1f8003" +checksum = "296450f5e76bece0116c939b9437b0421a5da9c5d40031bf4cf9b38d3d94e475" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "derive_more", @@ -656,9 +657,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea21739e232c221779741eba7e7b9bc19ad8ff777b72736647ae519f5c9f6f33" +checksum = "0ab075ac1c25bcf697f133b7cd92e2fb26afe213e872ef79fdf77f0d7bcb3793" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -669,15 +670,15 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f05338cfb4ee5508ff76f01c88142cab8a4579db74b7d9432936c26e4f11374" +checksum = "73b12366c96f4013e1aeebc96c6b56e5f33f07853c42ea2f485045c0c157a4a1" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "arbitrary", "derive_more", "ethereum_ssz", @@ -690,17 +691,17 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda4ece0050154ab278241aeffade58916b04f38254832e8cb6e4671c6e72ed2" +checksum = "56a282daf869eeb7383d3d5c2deb35b0b3fb45ecb329513af4090fc61245ee18" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-sol-types", "arbitrary", "itertools 0.14.0", @@ -712,28 +713,28 @@ dependencies = [ [[package]] name = "alloy-rpc-types-mev" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df223478aec91d8fb0f8643234764042fa432e6111aca126774802b2618a3a5" +checksum = "7adc1243d55744a66b3a6cbbbba96436e8df5d248f2ee8186bef4238ef704ec7" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", "serde_json", ] [[package]] name = "alloy-rpc-types-trace" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5905ac3663b0859d67b82d912acce20887d20682a0cadde79c8a763b133a515" +checksum = "6184b5d14152b68b0bb8beb621339d94f0b761a37958bb365fbf7c00922125c2" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", "serde_json", "thiserror 2.0.18", @@ -741,13 +742,13 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fbf71892d4df9cae8d35dc96f15d522384bb93806205465e2c8c012b7f0a34" +checksum = "f00b631c361e7c7baaf4f1f5a9877730f3507fed2acb9d4b34841b8184b2ec28" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", ] @@ -764,9 +765,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beaa5c581a67e2743d95b4849eb9cfeb90866429cdaa6d8f6b75eb988b2d0cd9" +checksum = "a0eada2558e921b39dfcead33c487364df9b31374f5733c1c9d2c891c4529933" dependencies = [ "alloy-primitives", "arbitrary", @@ -776,9 +777,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5da9ae50f9b48d7b4e2e5cde87175257be7e5e56909a7794720597c1d9806f6" +checksum = "41eb29f7a8adcd8941fbb8e134022a133e6f8dfd345f2e3b7109599f8a7dca08" dependencies = [ "alloy-primitives", "async-trait", @@ -791,9 +792,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b794002d57fd2f71b4c87298a41ca24dfc0f2cf6630d95106a477e451747ba" +checksum = "bef839e7ce9b59aa60fa9a175e97986c6145c888d643b0f1fb0a3e7b8e56a2e2" dependencies = [ "alloy-consensus", "alloy-network", @@ -883,9 +884,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19dec9bfb59647254afdecbb5ddcddd7ba02edcd48ffa40510bddfbed0be1634" +checksum = "3ac7a80c0bac3e44559d53d002e34c461dc2f23262b42cafec019bc70551abbe" dependencies = [ "alloy-json-rpc", "auto_impl", @@ -906,9 +907,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2035f3c4d6bee20624da2dcf765d469b292398e48d766ffade61b0fcf8b4d45d" +checksum = "eed3ed3300a998f88639ed619fdbbd88bd82865e00c6a8ecb796c99eb12358f6" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -922,9 +923,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfad7aa9206fcb831ae401b6a1c893a402b8eed74f9c8ffbb7a7323afb0d9a4c" +checksum = "1075d9d30fd4d71e50000fd4afb19ed2664ceab20c2a29f3889a6e988329e02d" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -942,9 +943,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5aa8ff49386df3e008b73c7fb0a5479410e8493fdb86a8b916877a16e8aead9" +checksum = "0e3bff84b2b2a46eb34cc522dc3f889a2867c70be90a377421429b662b3ec4ce" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -981,9 +982,9 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3520337f3d3d063a7fe20f47aaa62d695e3dc0372b34f601560dee24e76988b9" +checksum = "99fce0350197dcd4ba4e9a7dd43915d908c0eb0e7352755791709a705e1c76b6" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -1036,7 +1037,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1047,7 +1048,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1079,6 +1080,26 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + [[package]] name = "archery" version = "1.2.2" @@ -1452,6 +1473,15 @@ dependencies = [ "rustc_version 0.4.1", ] +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -1597,15 +1627,30 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + [[package]] name = "bit-set" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec", + "bit-vec 0.8.0", ] +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bit-vec" version = "0.8.0" @@ -1795,6 +1840,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.11.1" @@ -1997,6 +2048,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + [[package]] name = "cmake" version = "0.1.58" @@ -2312,6 +2372,7 @@ dependencies = [ "crossterm_winapi", "derive_more", "document-features", + "futures-core", "mio", "parking_lot", "rustix", @@ -2358,6 +2419,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +dependencies = [ + "lab", + "phf 0.11.3", +] + [[package]] name = "ctr" version = "0.9.2" @@ -2503,7 +2574,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab67060fc6b8ef687992d439ca0fa36e7ed17e9a0b16b25b601e8757df720de" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] @@ -2523,6 +2594,12 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "deltae" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" + [[package]] name = "der" version = "0.7.10" @@ -2681,8 +2758,7 @@ dependencies = [ [[package]] name = "discv5" version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7999df38d0bd8f688212e1a4fae31fd2fea6d218649b9cd7c40bf3ec1318fc" +source = "git+https://github.com/sigp/discv5?rev=7663c00#7663c00ee0837ea98547caaedede95d9d6736f4d" dependencies = [ "aes", "aes-gcm", @@ -2710,6 +2786,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2894,9 +2980,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + [[package]] name = "ethereum_hashing" version = "0.8.0" @@ -2948,6 +3040,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + [[package]] name = "ev-common" version = "0.1.0" @@ -2979,19 +3080,28 @@ dependencies = [ name = "ev-dev" version = "0.1.0" dependencies = [ + "alloy-network", "alloy-primitives", + "alloy-provider", + "alloy-rpc-types", "alloy-signer-local", + "arboard", "clap", + "crossterm", "ev-deployer", "ev-node", "evolve-ev-reth", "eyre", + "futures", + "ratatui", "reth-cli-util", "reth-ethereum-cli", + "reth-tracing", "serde_json", "tempfile", "tokio", "tracing", + "tracing-subscriber 0.3.23", ] [[package]] @@ -3000,7 +3110,7 @@ version = "0.1.0" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-genesis", "alloy-network", @@ -3087,10 +3197,10 @@ name = "ev-primitives" version = "0.1.0" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "bytes", "reth-codecs", "reth-db-api", @@ -3103,7 +3213,7 @@ dependencies = [ name = "ev-reth" version = "0.1.0" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-network", "alloy-primitives", @@ -3163,7 +3273,7 @@ name = "ev-tests" version = "0.1.0" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-genesis", "alloy-network", "alloy-primitives", @@ -3222,7 +3332,7 @@ name = "evolve-ev-reth" version = "0.1.0" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-txpool", @@ -3259,6 +3369,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fancy-regex" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +dependencies = [ + "bit-set 0.5.3", + "regex", +] + [[package]] name = "fastrand" version = "2.4.1" @@ -3287,6 +3407,21 @@ dependencies = [ "bytes", ] +[[package]] +name = "fax" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "fdlimit" version = "0.3.0" @@ -3313,6 +3448,17 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + [[package]] name = "filetime" version = "0.2.27" @@ -3330,6 +3476,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "finl_unicode" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" + [[package]] name = "fixed-cache" version = "0.1.8" @@ -3374,6 +3526,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.1.9" @@ -3547,7 +3705,7 @@ dependencies = [ "libc", "log", "rustversion", - "windows-link 0.1.3", + "windows-link 0.2.1", "windows-result 0.4.1", ] @@ -3562,6 +3720,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix", + "windows-link 0.2.1", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -3708,6 +3876,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + [[package]] name = "hash-db" version = "0.15.2" @@ -4171,6 +4350,20 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", + "tiff", +] + [[package]] name = "imbl" version = "7.0.0" @@ -4721,6 +4914,12 @@ dependencies = [ "libc", ] +[[package]] +name = "lab" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" + [[package]] name = "lazy_static" version = "1.5.0" @@ -4948,6 +5147,16 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98c23545df7ecf1b16c303910a69b079e8e251d60f7dd2cc9b4177f2afaf1746" +[[package]] +name = "mac_address" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" +dependencies = [ + "nix", + "winapi", +] + [[package]] name = "mach2" version = "0.5.0" @@ -5009,6 +5218,21 @@ dependencies = [ "libc", ] +[[package]] +name = "memmem" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "metrics" version = "0.24.3" @@ -5164,6 +5388,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + [[package]] name = "multiaddr" version = "0.18.2" @@ -5205,6 +5439,19 @@ dependencies = [ "unsigned-varint", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + [[package]] name = "nom" version = "7.1.3" @@ -5257,7 +5504,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5299,6 +5546,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -5397,12 +5655,65 @@ dependencies = [ ] [[package]] -name = "objc2-core-foundation" -version = "0.3.2" +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-graphics", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", ] [[package]] @@ -5415,6 +5726,17 @@ dependencies = [ "objc2-core-foundation", ] +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -5523,6 +5845,15 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + [[package]] name = "p256" version = "0.13.2" @@ -5639,6 +5970,39 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "pest_derive" +version = "2.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pest_meta" +version = "2.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" +dependencies = [ + "pest", + "sha2", +] + [[package]] name = "pharos" version = "0.5.3" @@ -5649,17 +6013,47 @@ dependencies = [ "rustc_version 0.4.1", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.13.1", + "phf_shared 0.13.1", "serde", ] +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + [[package]] name = "phf_generator" version = "0.13.1" @@ -5667,7 +6061,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ "fastrand", - "phf_shared", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -5676,13 +6083,22 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", "syn 2.0.117", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "phf_shared" version = "0.13.1" @@ -5755,6 +6171,19 @@ dependencies = [ "crunchy", ] +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polyval" version = "0.6.2" @@ -5907,8 +6336,8 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ - "bit-set", - "bit-vec", + "bit-set 0.8.0", + "bit-vec 0.8.0", "bitflags 2.11.0", "num-traits", "rand 0.9.3", @@ -5964,6 +6393,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + [[package]] name = "quanta" version = "0.12.6" @@ -5985,6 +6420,12 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-protobuf" version = "0.8.1" @@ -6193,6 +6634,8 @@ dependencies = [ "instability", "ratatui-core", "ratatui-crossterm", + "ratatui-macros", + "ratatui-termwiz", "ratatui-widgets", ] @@ -6228,6 +6671,26 @@ dependencies = [ "ratatui-core", ] +[[package]] +name = "ratatui-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f1342a13e83e4bb9d0b793d0ea762be633f9582048c892ae9041ef39c936f4" +dependencies = [ + "ratatui-core", + "ratatui-widgets", +] + +[[package]] +name = "ratatui-termwiz" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f76fe0bd0ed4295f0321b1676732e2454024c15a35d01904ddb315afd3d545c" +dependencies = [ + "ratatui-core", + "termwiz", +] + [[package]] name = "ratatui-widgets" version = "0.3.0" @@ -6452,11 +6915,11 @@ checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "reth-basic-payload-builder" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "futures-core", "futures-util", @@ -6479,11 +6942,11 @@ dependencies = [ [[package]] name = "reth-chain-state" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-signer", "alloy-signer-local", @@ -6511,12 +6974,12 @@ dependencies = [ [[package]] name = "reth-chainspec" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-genesis", "alloy-primitives", @@ -6531,8 +6994,8 @@ dependencies = [ [[package]] name = "reth-cli" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-genesis", "clap", @@ -6544,12 +7007,12 @@ dependencies = [ [[package]] name = "reth-cli-commands" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "arbitrary", @@ -6632,8 +7095,8 @@ dependencies = [ [[package]] name = "reth-cli-runner" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "reth-tasks", "tokio", @@ -6642,10 +7105,10 @@ dependencies = [ [[package]] name = "reth-cli-util" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "cfg-if", "eyre", @@ -6668,7 +7131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fce542a96bf888f31854803e80b3340bc233927743aa580838014e8a88fe0d66" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-genesis", "alloy-primitives", "alloy-trie", @@ -6695,8 +7158,8 @@ dependencies = [ [[package]] name = "reth-config" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "eyre", "humantime-serde", @@ -6711,8 +7174,8 @@ dependencies = [ [[package]] name = "reth-consensus" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -6724,11 +7187,11 @@ dependencies = [ [[package]] name = "reth-consensus-common" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "reth-chainspec", "reth-consensus", @@ -6737,11 +7200,11 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-json-rpc", "alloy-primitives", "alloy-provider", @@ -6763,12 +7226,13 @@ dependencies = [ [[package]] name = "reth-db" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "derive_more", "eyre", + "libc", "metrics", "page_size", "parking_lot", @@ -6791,8 +7255,8 @@ dependencies = [ [[package]] name = "reth-db-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -6817,8 +7281,8 @@ dependencies = [ [[package]] name = "reth-db-common" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -6847,10 +7311,10 @@ dependencies = [ [[package]] name = "reth-db-models" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "arbitrary", "bytes", @@ -6862,8 +7326,8 @@ dependencies = [ [[package]] name = "reth-discv4" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -6887,8 +7351,8 @@ dependencies = [ [[package]] name = "reth-discv5" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -6911,8 +7375,8 @@ dependencies = [ [[package]] name = "reth-dns-discovery" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "dashmap", @@ -6935,11 +7399,11 @@ dependencies = [ [[package]] name = "reth-downloaders" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "async-compression", @@ -6970,11 +7434,11 @@ dependencies = [ [[package]] name = "reth-e2e-test-utils" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-network", "alloy-primitives", "alloy-provider", @@ -7027,8 +7491,8 @@ dependencies = [ [[package]] name = "reth-ecies" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "aes", "alloy-primitives", @@ -7055,8 +7519,8 @@ dependencies = [ [[package]] name = "reth-engine-local" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7078,11 +7542,11 @@ dependencies = [ [[package]] name = "reth-engine-primitives" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", @@ -7103,12 +7567,12 @@ dependencies = [ [[package]] name = "reth-engine-tree" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-eip7928", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-primitives", "alloy-rlp", @@ -7160,8 +7624,8 @@ dependencies = [ [[package]] name = "reth-engine-util" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -7188,23 +7652,24 @@ dependencies = [ [[package]] name = "reth-era" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "ethereum_ssz", "ethereum_ssz_derive", + "sha2", "snap", "thiserror 2.0.18", ] [[package]] name = "reth-era-downloader" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "bytes", @@ -7219,8 +7684,8 @@ dependencies = [ [[package]] name = "reth-era-utils" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7241,8 +7706,8 @@ dependencies = [ [[package]] name = "reth-errors" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "reth-consensus", "reth-execution-errors", @@ -7252,8 +7717,8 @@ dependencies = [ [[package]] name = "reth-eth-wire" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-chains", "alloy-primitives", @@ -7281,13 +7746,13 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-chains", "alloy-consensus", "alloy-eip7928", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-hardforks", "alloy-primitives", "alloy-rlp", @@ -7306,8 +7771,8 @@ dependencies = [ [[package]] name = "reth-ethereum" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -7346,8 +7811,8 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "clap", "eyre", @@ -7369,11 +7834,11 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "reth-chainspec", "reth-consensus", @@ -7385,10 +7850,10 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "reth-engine-primitives", @@ -7401,8 +7866,8 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -7415,11 +7880,11 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", @@ -7445,11 +7910,11 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-eth", "reth-codecs", @@ -7459,8 +7924,8 @@ dependencies = [ [[package]] name = "reth-etl" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "rayon", "reth-db-api", @@ -7469,11 +7934,11 @@ dependencies = [ [[package]] name = "reth-evm" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-primitives", "auto_impl", @@ -7493,11 +7958,11 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-primitives", "alloy-rpc-types-engine", @@ -7513,8 +7978,8 @@ dependencies = [ [[package]] name = "reth-execution-cache" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "fixed-cache", @@ -7531,8 +7996,8 @@ dependencies = [ [[package]] name = "reth-execution-errors" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-evm", "alloy-primitives", @@ -7544,11 +8009,11 @@ dependencies = [ [[package]] name = "reth-execution-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-primitives", "alloy-rlp", @@ -7563,11 +8028,11 @@ dependencies = [ [[package]] name = "reth-exex" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "eyre", "futures", @@ -7601,10 +8066,10 @@ dependencies = [ [[package]] name = "reth-exex-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "reth-chain-state", "reth-execution-types", @@ -7615,8 +8080,8 @@ dependencies = [ [[package]] name = "reth-fs-util" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "serde", "serde_json", @@ -7625,8 +8090,8 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7653,8 +8118,8 @@ dependencies = [ [[package]] name = "reth-ipc" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "bytes", "futures", @@ -7673,8 +8138,8 @@ dependencies = [ [[package]] name = "reth-libmdbx" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "bitflags 2.11.0", "byteorder", @@ -7690,8 +8155,8 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "bindgen", "cc", @@ -7699,20 +8164,21 @@ dependencies = [ [[package]] name = "reth-metrics" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "futures", "metrics", "metrics-derive", + "reth-primitives-traits", "tokio", "tokio-util", ] [[package]] name = "reth-net-banlist" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "ipnet", @@ -7720,8 +8186,8 @@ dependencies = [ [[package]] name = "reth-net-nat" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "futures-util", "if-addrs", @@ -7734,11 +8200,11 @@ dependencies = [ [[package]] name = "reth-network" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "aquamarine", @@ -7782,6 +8248,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", + "socket2", "thiserror 2.0.18", "tokio", "tokio-stream", @@ -7791,8 +8258,8 @@ dependencies = [ [[package]] name = "reth-network-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7816,11 +8283,11 @@ dependencies = [ [[package]] name = "reth-network-p2p" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "auto_impl", "derive_more", @@ -7839,8 +8306,8 @@ dependencies = [ [[package]] name = "reth-network-peers" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7854,8 +8321,8 @@ dependencies = [ [[package]] name = "reth-network-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -7868,8 +8335,8 @@ dependencies = [ [[package]] name = "reth-nippy-jar" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "anyhow", "bincode", @@ -7885,8 +8352,8 @@ dependencies = [ [[package]] name = "reth-node-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -7909,11 +8376,11 @@ dependencies = [ [[package]] name = "reth-node-builder" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-provider", "alloy-rpc-types", @@ -7977,11 +8444,11 @@ dependencies = [ [[package]] name = "reth-node-core" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "clap", @@ -8032,10 +8499,10 @@ dependencies = [ [[package]] name = "reth-node-ethereum" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-network", "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -8070,8 +8537,8 @@ dependencies = [ [[package]] name = "reth-node-ethstats" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8094,11 +8561,11 @@ dependencies = [ [[package]] name = "reth-node-events" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "derive_more", @@ -8118,8 +8585,8 @@ dependencies = [ [[package]] name = "reth-node-metrics" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "bytes", "eyre", @@ -8142,8 +8609,8 @@ dependencies = [ [[package]] name = "reth-node-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "reth-chainspec", "reth-db-api", @@ -8154,8 +8621,8 @@ dependencies = [ [[package]] name = "reth-payload-builder" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8178,8 +8645,8 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "pin-project", "reth-payload-primitives", @@ -8190,11 +8657,11 @@ dependencies = [ [[package]] name = "reth-payload-primitives" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", @@ -8214,8 +8681,8 @@ dependencies = [ [[package]] name = "reth-payload-validator" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -8224,12 +8691,12 @@ dependencies = [ [[package]] name = "reth-primitives-traits" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc759fd87c3f65440e5d3bfa3107fe8a13a61a6807cd485c62c49d63c7bf6717" +checksum = "8ee12e304adbacbb32248c9806ebafbe1e2811fbfefe53c5e5b710a8438b7ec0" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-genesis", "alloy-primitives", "alloy-rlp", @@ -8257,11 +8724,11 @@ dependencies = [ [[package]] name = "reth-provider" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-genesis", "alloy-primitives", "alloy-rpc-types-engine", @@ -8303,11 +8770,11 @@ dependencies = [ [[package]] name = "reth-prune" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "itertools 0.14.0", "metrics", @@ -8332,8 +8799,8 @@ dependencies = [ [[package]] name = "reth-prune-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "arbitrary", @@ -8348,8 +8815,8 @@ dependencies = [ [[package]] name = "reth-revm" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8363,12 +8830,12 @@ dependencies = [ [[package]] name = "reth-rpc" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-dyn-abi", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-genesis", "alloy-network", @@ -8384,7 +8851,7 @@ dependencies = [ "alloy-rpc-types-mev", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-signer", "alloy-signer-local", "async-trait", @@ -8440,10 +8907,10 @@ dependencies = [ [[package]] name = "reth-rpc-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-genesis", "alloy-json-rpc", "alloy-primitives", @@ -8457,7 +8924,7 @@ dependencies = [ "alloy-rpc-types-mev", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "jsonrpsee", "reth-chain-state", "reth-engine-primitives", @@ -8470,8 +8937,8 @@ dependencies = [ [[package]] name = "reth-rpc-builder" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-network", "alloy-provider", @@ -8513,8 +8980,8 @@ dependencies = [ [[package]] name = "reth-rpc-convert" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-evm", @@ -8533,10 +9000,10 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", @@ -8564,13 +9031,13 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-dyn-abi", "alloy-eip7928", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-json-rpc", "alloy-network", @@ -8578,7 +9045,7 @@ dependencies = [ "alloy-rlp", "alloy-rpc-types-eth", "alloy-rpc-types-mev", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "async-trait", "auto_impl", "dyn-clone", @@ -8610,11 +9077,11 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-evm", "alloy-network", "alloy-primitives", @@ -8658,8 +9125,8 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-rpc-types-engine", "http", @@ -8672,10 +9139,10 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "jsonrpsee-core", @@ -8688,9 +9155,9 @@ dependencies = [ [[package]] name = "reth-rpc-traits" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b766da61ec7c46596386b4bc88d9b57d1939d3da2bc9e927567a8a23650e5ce9" +checksum = "860fe223501a76ff14aa3bf164f739f31008c2a2905ac85708bfd88f042e6151" dependencies = [ "alloy-consensus", "alloy-network", @@ -8703,11 +9170,11 @@ dependencies = [ [[package]] name = "reth-stages" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "eyre", @@ -8755,10 +9222,10 @@ dependencies = [ [[package]] name = "reth-stages-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "aquamarine", "auto_impl", @@ -8783,8 +9250,8 @@ dependencies = [ [[package]] name = "reth-stages-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "arbitrary", @@ -8797,8 +9264,8 @@ dependencies = [ [[package]] name = "reth-static-file" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "parking_lot", @@ -8817,8 +9284,8 @@ dependencies = [ [[package]] name = "reth-static-file-types" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "clap", @@ -8832,11 +9299,11 @@ dependencies = [ [[package]] name = "reth-storage-api" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", @@ -8856,10 +9323,10 @@ dependencies = [ [[package]] name = "reth-storage-errors" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "derive_more", @@ -8874,8 +9341,8 @@ dependencies = [ [[package]] name = "reth-tasks" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "crossbeam-utils", "dashmap", @@ -8895,11 +9362,11 @@ dependencies = [ [[package]] name = "reth-testing-utils" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-genesis", "alloy-primitives", "rand 0.8.5", @@ -8911,8 +9378,8 @@ dependencies = [ [[package]] name = "reth-tokio-util" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "tokio", "tokio-stream", @@ -8921,8 +9388,8 @@ dependencies = [ [[package]] name = "reth-tracing" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "clap", "eyre", @@ -8938,8 +9405,8 @@ dependencies = [ [[package]] name = "reth-tracing-otlp" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "clap", "eyre", @@ -8955,11 +9422,11 @@ dependencies = [ [[package]] name = "reth-transaction-pool" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "aquamarine", @@ -9002,11 +9469,11 @@ dependencies = [ [[package]] name = "reth-trie" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "alloy-trie", @@ -9028,14 +9495,14 @@ dependencies = [ [[package]] name = "reth-trie-common" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-consensus", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-trie", "arbitrary", "arrayvec", @@ -9055,8 +9522,8 @@ dependencies = [ [[package]] name = "reth-trie-db" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "metrics", @@ -9075,8 +9542,8 @@ dependencies = [ [[package]] name = "reth-trie-parallel" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-eip7928", "alloy-evm", @@ -9103,13 +9570,12 @@ dependencies = [ [[package]] name = "reth-trie-sparse" -version = "2.1.0" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.1.0#d58c6e3d0723a28f655e89da83c3738e47dcc364" +version = "2.2.0" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v2.2.0#88505c7fcbfdebfd3b56d88c86b62e950043c6c4" dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-trie", - "auto_impl", "metrics", "rayon", "reth-execution-errors", @@ -9158,7 +9624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdbb3a3d735efa94c91f2ef6bf20a35f99a77bc78f3e25bd758336901bdf9661" dependencies = [ "bitvec", - "phf", + "phf 0.13.1", "revm-primitives", "serde", ] @@ -9305,6 +9771,7 @@ dependencies = [ "ark-serialize 0.5.0", "arrayref", "aurora-engine-modexp", + "aws-lc-rs", "blst", "c-kzg", "cfg-if", @@ -9421,9 +9888,9 @@ dependencies = [ [[package]] name = "roaring" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba9ce64a8f45d7fc86358410bb1a82e8c987504c0d4900e9141d69a9f26c885" +checksum = "1dedc5658c6ecb3bdb5ef5f3295bb9253f42dcf3fd1402c03f6b1f7659c3c4a9" dependencies = [ "bytemuck", "byteorder", @@ -9538,7 +10005,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -9618,7 +10085,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs 1.0.6", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -9652,7 +10119,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" dependencies = [ "fnv", - "quick-error", + "quick-error 1.2.3", "tempfile", "wait-timeout", ] @@ -10128,7 +10595,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -10303,7 +10770,70 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "terminfo" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" +dependencies = [ + "fnv", + "nom", + "phf 0.11.3", + "phf_codegen", +] + +[[package]] +name = "termios" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" +dependencies = [ + "libc", +] + +[[package]] +name = "termwiz" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bitflags 2.11.0", + "fancy-regex", + "filedescriptor", + "finl_unicode", + "fixedbitset", + "hex", + "lazy_static", + "libc", + "log", + "memmem", + "nix", + "num-derive", + "num-traits", + "ordered-float", + "pest", + "pest_derive", + "phf 0.11.3", + "sha2", + "signal-hook", + "siphasher", + "terminfo", + "termios", + "thiserror 1.0.69", + "ucd-trie", + "unicode-segmentation", + "vtparse", + "wezterm-bidi", + "wezterm-blob-leases", + "wezterm-color-types", + "wezterm-dynamic", + "wezterm-input-types", + "winapi", ] [[package]] @@ -10378,6 +10908,20 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "tiff" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error 2.0.1", + "weezl", + "zune-jpeg", +] + [[package]] name = "tikv-jemalloc-ctl" version = "0.6.1" @@ -10469,9 +11013,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.51.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -11106,6 +11650,7 @@ version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ + "atomic", "getrandom 0.4.2", "js-sys", "wasm-bindgen", @@ -11181,6 +11726,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "vtparse" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" +dependencies = [ + "utf8parse", +] + [[package]] name = "wait-timeout" version = "0.2.1" @@ -11405,6 +11959,84 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "wezterm-bidi" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" +dependencies = [ + "log", + "wezterm-dynamic", +] + +[[package]] +name = "wezterm-blob-leases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" +dependencies = [ + "getrandom 0.3.4", + "mac_address", + "sha2", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "wezterm-color-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" +dependencies = [ + "csscolorparser", + "deltae", + "lazy_static", + "wezterm-dynamic", +] + +[[package]] +name = "wezterm-dynamic" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" +dependencies = [ + "log", + "ordered-float", + "strsim", + "thiserror 1.0.69", + "wezterm-dynamic-derive", +] + +[[package]] +name = "wezterm-dynamic-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c0cf2d539c645b448eaffec9ec494b8b19bd5077d9e58cb1ae7efece8d575b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wezterm-input-types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" +dependencies = [ + "bitflags 1.3.2", + "euclid", + "lazy_static", + "serde", + "wezterm-dynamic", +] + [[package]] name = "wide" version = "0.7.33" @@ -11443,7 +12075,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -12033,6 +12665,23 @@ dependencies = [ "tap", ] +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "gethostname", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + [[package]] name = "xattr" version = "1.6.1" @@ -12199,3 +12848,18 @@ dependencies = [ "cc", "pkg-config", ] + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index 1744e7b4..63361789 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,50 +23,50 @@ repository = "https://github.com/evstack/ev-reth" authors = ["Evolve Stack Contributors"] [workspace.dependencies] -# Reth dependencies - Using v2.1.0 stable -reth-chainspec = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-cli-util = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-tracing-otlp = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-node-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-errors = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-trie-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-trie-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } +# Reth dependencies - Using v2.2.0 stable +reth-chainspec = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-cli-util = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-tracing-otlp = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-node-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-errors = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-trie-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-trie-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } reth-primitives-traits = { version = "0.3.0", default-features = false } -reth-provider = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-storage-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } -reth-network = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-network-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-chain-state = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-db-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-ethereum = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-ethereum-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-engine-local = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-engine-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-ethereum-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", features = ["serde", "reth-codec"] } -reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } -reth-evm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.1.0" } -reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.1.0" } -reth-execution-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-node-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-payload-builder-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-payload-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-ethereum-forks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-revm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.1.0" } -reth-rpc-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-rpc-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-rpc-engine-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-rpc = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } -reth-rpc-convert = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" } +reth-provider = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-storage-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } +reth-network = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-network-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-chain-state = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-db-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-ethereum-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-engine-local = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-engine-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-ethereum-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", features = ["serde", "reth-codec"] } +reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } +reth-evm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.2.0" } +reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.2.0" } +reth-execution-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-node-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-payload-builder-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-payload-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-ethereum-forks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-revm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.2.0" } +reth-rpc-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-rpc-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-rpc-engine-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-rpc = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } +reth-rpc-convert = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" } reth-codecs = { version = "0.3.1", default-features = false } ev-revm = { path = "crates/ev-revm" } @@ -74,43 +74,43 @@ ev-primitives = { path = "crates/ev-primitives" } # Consensus dependencies -reth-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } -reth-consensus-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } -reth-ethereum-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } +reth-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } +reth-consensus-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } +reth-ethereum-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } # Test dependencies -reth-testing-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } -reth-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } -reth-tasks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false } +reth-testing-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } +reth-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } +reth-tasks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false } revm = { version = "38.0.0", default-features = false } -# Alloy dependencies (aligned to reth v2.1.0) -alloy = { version = "2.0.0", features = [ +# Alloy dependencies (aligned to reth v2.2.0) +alloy = { version = "2.0.4", features = [ "contract", "providers", "provider-http", "signers", "reqwest-rustls-tls", ], default-features = false } -alloy-evm = { version = "0.33.0", default-features = false } -alloy-eips = { version = "2.0.0", default-features = false } -alloy-network = { version = "2.0.0", default-features = false } -alloy-provider = { version = "2.0.0", default-features = false } -alloy-rpc-client = { version = "2.0.0", default-features = false } -alloy-rpc-types = { version = "2.0.0", default-features = false } -alloy-json-rpc = { version = "2.0.0", default-features = false } -alloy-rpc-types-eth = { version = "2.0.0", default-features = false } -alloy-rpc-types-engine = { version = "2.0.0", default-features = false } -alloy-signer = { version = "2.0.0", default-features = false } -alloy-signer-local = { version = "2.0.0", features = ["mnemonic"] } -alloy-serde = { version = "2.0.0", default-features = false } +alloy-evm = { version = "0.34.0", default-features = false } +alloy-eips = { version = "2.0.4", default-features = false } +alloy-network = { version = "2.0.4", default-features = false } +alloy-provider = { version = "2.0.4", default-features = false } +alloy-rpc-client = { version = "2.0.4", default-features = false } +alloy-rpc-types = { version = "2.0.4", default-features = false } +alloy-json-rpc = { version = "2.0.4", default-features = false } +alloy-rpc-types-eth = { version = "2.0.4", default-features = false } +alloy-rpc-types-engine = { version = "2.0.4", default-features = false } +alloy-signer = { version = "2.0.4", default-features = false } +alloy-signer-local = { version = "2.0.4", features = ["mnemonic"] } +alloy-serde = { version = "2.0.4", default-features = false } alloy-primitives = { version = "1.5.6", default-features = false } -alloy-consensus = { version = "2.0.0", default-features = false } -alloy-consensus-any = { version = "2.0.0", default-features = false } +alloy-consensus = { version = "2.0.4", default-features = false } +alloy-consensus-any = { version = "2.0.4", default-features = false } alloy-rlp = { version = "0.3.13", default-features = false } -alloy-genesis = { version = "2.0.0", default-features = false } -alloy-rpc-types-txpool = { version = "2.0.0", default-features = false } +alloy-genesis = { version = "2.0.4", default-features = false } +alloy-rpc-types-txpool = { version = "2.0.4", default-features = false } alloy-sol-types = { version = "1.5.6", default-features = false } # Utility dependencies @@ -124,7 +124,7 @@ nybbles = "0.4.8" # Core dependencies eyre = "0.6" tracing = "0.1" -tokio = { version = "1.51", features = ["full"] } +tokio = { version = "1.52", features = ["full"] } serde = { version = "=1.0.228", default-features = false, features = [ "derive", ] } diff --git a/bin/ev-deployer/README.md b/bin/ev-deployer/README.md index 03b45d99..3d457509 100644 --- a/bin/ev-deployer/README.md +++ b/bin/ev-deployer/README.md @@ -16,13 +16,12 @@ Both modes read the same TOML config. The `address` field in each contract secti ## Quick Start ```bash -# 1. Generate a config pre-populated for your chain -ev-deployer init --chain-id 42170 --permit2 --output deploy.toml +# Genesis: embed contracts into the chain's genesis state +ev-deployer init genesis --chain-id 42170 --permit2 --deterministic-deployer --output genesis.toml +ev-deployer genesis --config genesis.toml --merge-into genesis.json --output genesis-out.json -# 2a. Genesis mode: embed into genesis state -ev-deployer genesis --config deploy.toml --merge-into genesis.json --output genesis-out.json - -# 2b. Deploy mode: deploy to a live chain +# Deploy: deploy contracts to a running chain via CREATE2 +ev-deployer init deploy --chain-id 42170 --permit2 --output deploy.toml ev-deployer deploy \ --config deploy.toml \ --rpc-url http://localhost:8545 \ @@ -40,23 +39,24 @@ The binary is output to `target/release/ev-deployer`. ## Commands -### `init` +### `init genesis` -Generate a starter config file. +Generate a starter config for **genesis mode** (contracts embedded at chain start). Includes `address` fields for each contract. ```bash # Bare template (all contracts commented out) -ev-deployer init +ev-deployer init genesis -# Pre-populated with chain ID, Permit2, and deterministic deployer -ev-deployer init --chain-id 42170 --permit2 --deterministic-deployer +# Pre-populated with Permit2 and deterministic deployer +ev-deployer init genesis --chain-id 42170 --permit2 --deterministic-deployer # Full config with all contracts -ev-deployer init \ +ev-deployer init genesis \ --chain-id 42170 \ --permit2 \ + --deterministic-deployer \ --admin-proxy-owner 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \ - --output deploy.toml + --output genesis.toml ``` | Flag | Description | @@ -64,7 +64,30 @@ ev-deployer init \ | `--output ` | Write to file instead of stdout | | `--chain-id ` | Set the chain ID (defaults to 0) | | `--permit2` | Enable Permit2 with its canonical address | -| `--deterministic-deployer` | Enable the deterministic deployer (Nick's factory) with its canonical address | +| `--deterministic-deployer` | Enable the deterministic deployer (Nick's factory) | +| `--admin-proxy-owner ` | Enable AdminProxy with the given owner | + +### `init deploy` + +Generate a starter config for **deploy mode** (contracts deployed via CREATE2 to a running chain). No `address` fields — addresses are computed deterministically. The deterministic deployer is not included in the config since it cannot be deployed via CREATE2 (it must already exist on-chain). + +```bash +# Config with Permit2 +ev-deployer init deploy --chain-id 42170 --permit2 + +# Full config +ev-deployer init deploy \ + --chain-id 42170 \ + --permit2 \ + --admin-proxy-owner 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \ + --output deploy.toml +``` + +| Flag | Description | +|------|-------------| +| `--output ` | Write to file instead of stdout | +| `--chain-id ` | Set the chain ID (defaults to 0) | +| `--permit2` | Enable Permit2 | | `--admin-proxy-owner ` | Enable AdminProxy with the given owner | ### `genesis` @@ -114,15 +137,17 @@ ev-deployer deploy \ The deploy pipeline: 1. Connects to the RPC and verifies the chain ID matches the config. -2. Checks that the deterministic deployer (`0x4e59b44847b379578588920ca78fbf26c0b4956c`) exists on-chain. +2. Checks that the [deterministic deployer](https://github.com/Arachnid/deterministic-deployment-proxy) (`0x4e59b44847b379578588920ca78fbf26c0b4956c`) exists on-chain. 3. Deploys each configured contract via CREATE2. 4. Verifies that the on-chain bytecode matches the expected bytecode (including patched immutables). -The `address` field in the config is **ignored** in deploy mode — addresses come from the CREATE2 computation. +Permit2 is deployed using the [canonical Uniswap salt](https://github.com/Uniswap/permit2/blob/main/script/DeployPermit2.s.sol), so it lands at its well-known address `0x000000000022D473030F116dDEE9F6B43aC78BA3` on any chain. + +> **Using with ev-dev**: The deterministic deployer can be included in the ev-dev genesis via `ev-deployer init genesis --deterministic-deployer`, so `ev-deployer deploy` works against ev-dev. See the [ev-dev README](../ev-dev/README.md#live-contract-deployment-create2) for examples. #### State file and resumability -The `--state` file tracks deployment progress. On first run it generates a random CREATE2 salt and records which contracts have been deployed. If the process is interrupted, re-running with the same state file resumes where it left off. +The `--state` file tracks deployment progress and records which contracts have been deployed. If the process is interrupted, re-running with the same state file resumes where it left off. Contracts with well-known salts (e.g. Permit2) use their canonical salt; others use a random salt generated on first run. Immutability rules protect against accidental misconfiguration on resume: diff --git a/bin/ev-deployer/src/contracts/permit2.rs b/bin/ev-deployer/src/contracts/permit2.rs index eabbbe70..9e66e6ba 100644 --- a/bin/ev-deployer/src/contracts/permit2.rs +++ b/bin/ev-deployer/src/contracts/permit2.rs @@ -73,6 +73,14 @@ pub(crate) const HASHED_NAME: B256 = B256::new(hex!( "9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a" )); +/// The CREATE2 salt used by Uniswap to deploy Permit2 at its canonical address +/// (`0x000000000022D473030F116dDEE9F6B43aC78BA3`) via Nick's factory. +/// +/// Source: +pub(crate) const PERMIT2_CANONICAL_SALT: B256 = B256::new(hex!( + "0000000000000000000000000000000000000000d3af2663da51c10215000000" +)); + /// Build the expected runtime bytecode for a Permit2 deployed at `address` on `chain_id`. /// Used by the deploy pipeline to verify on-chain bytecode matches. pub(crate) fn expected_runtime_bytecode(chain_id: u64, address: Address) -> Vec { diff --git a/bin/ev-deployer/src/deploy/create2.rs b/bin/ev-deployer/src/deploy/create2.rs index cb3b3cf6..32b6d24f 100644 --- a/bin/ev-deployer/src/deploy/create2.rs +++ b/bin/ev-deployer/src/deploy/create2.rs @@ -62,6 +62,16 @@ mod tests { assert_ne!(addr1, addr2); } + #[test] + fn permit2_canonical_salt_produces_canonical_address() { + use crate::contracts::permit2::{PERMIT2_CANONICAL_SALT, PERMIT2_INITCODE}; + let addr = compute_address(PERMIT2_CANONICAL_SALT, PERMIT2_INITCODE); + let expected: Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3" + .parse() + .unwrap(); + assert_eq!(addr, expected); + } + #[test] fn factory_calldata_format() { let salt = B256::with_last_byte(0x42); diff --git a/bin/ev-deployer/src/deploy/mod.rs b/bin/ev-deployer/src/deploy/mod.rs index 5fae4445..e32bf5a4 100644 --- a/bin/ev-deployer/src/deploy/mod.rs +++ b/bin/ev-deployer/src/deploy/mod.rs @@ -1,3 +1,5 @@ +//! On-chain deployment pipeline: CREATE2 addressing, state tracking, and orchestration. + pub mod create2; pub mod deployer; pub mod pipeline; diff --git a/bin/ev-deployer/src/deploy/pipeline.rs b/bin/ev-deployer/src/deploy/pipeline.rs index 56966386..2b190f55 100644 --- a/bin/ev-deployer/src/deploy/pipeline.rs +++ b/bin/ev-deployer/src/deploy/pipeline.rs @@ -60,8 +60,6 @@ pub async fn run(pipeline_cfg: &PipelineConfig, deployer: &dyn ChainDeployer) -> state }; - let salt = state.create2_salt; - // ── Step 2: Deploy Permit2 ── if let Some(ref p2_config) = pipeline_cfg.config.contracts.permit2 { eprintln!("[3/4] Deploying Permit2..."); @@ -70,8 +68,9 @@ pub async fn run(pipeline_cfg: &PipelineConfig, deployer: &dyn ChainDeployer) -> eprintln!(" WARN: contracts.permit2.address is ignored in deploy mode"); } + let permit2_salt = contracts::permit2::PERMIT2_CANONICAL_SALT; let initcode = contracts::permit2::PERMIT2_INITCODE.to_vec(); - let address = compute_address(salt, &initcode); + let address = compute_address(permit2_salt, &initcode); let expected_runtime = contracts::permit2::expected_runtime_bytecode(chain_id, address); @@ -81,7 +80,7 @@ pub async fn run(pipeline_cfg: &PipelineConfig, deployer: &dyn ChainDeployer) -> &DeployContractParams { name: "permit2", address, - salt, + salt: permit2_salt, initcode: &initcode, expected_runtime: &expected_runtime, state_path: &pipeline_cfg.state_path, diff --git a/bin/ev-deployer/src/init.rs b/bin/ev-deployer/src/init.rs index 08b7281a..52634c66 100644 --- a/bin/ev-deployer/src/init.rs +++ b/bin/ev-deployer/src/init.rs @@ -1,15 +1,26 @@ //! Dynamic config template generation for the `init` command. +/// Whether the config is for genesis injection or live CREATE2 deployment. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum InitMode { + /// Config for genesis injection. + Genesis, + /// Config for live CREATE2 deployment. + Deploy, +} + /// Parameters for generating the init template. #[derive(Debug)] pub struct InitParams { - /// Target chain ID. + /// Genesis or deploy mode. + pub mode: InitMode, + /// Target chain ID (written to `[chain]` section). pub chain_id: u64, - /// Whether to include Permit2 with its canonical address. + /// Whether to enable the `Permit2` contract section. pub permit2: bool, /// Whether to include the deterministic deployer (Nick's factory). pub deterministic_deployer: bool, - /// Optional `AdminProxy` owner address. + /// If set, enables `AdminProxy` with this owner address. pub admin_proxy_owner: Option, } @@ -17,8 +28,17 @@ pub struct InitParams { pub fn generate_template(params: &InitParams) -> String { let mut out = String::new(); + let is_genesis = params.mode == InitMode::Genesis; + + // In deploy mode, the deterministic deployer must already exist on-chain + // (verified by the pipeline) — it cannot be deployed via CREATE2 itself. + let deterministic_deployer = params.deterministic_deployer && is_genesis; + // Header - out.push_str("# EV Deployer configuration\n"); + let mode_label = if is_genesis { "genesis" } else { "deploy" }; + out.push_str(&format!( + "# EV Deployer configuration ({mode_label} mode)\n" + )); out.push_str("# See: bin/ev-deployer/README.md\n"); out.push('\n'); @@ -30,9 +50,13 @@ pub fn generate_template(params: &InitParams) -> String { // Contracts section header out.push('\n'); out.push_str("# ── Contracts ────────────────────────────────────────────\n"); - out.push_str("# Uncomment and configure the contracts you want to deploy.\n"); - out.push_str("# The `address` field is required for `genesis` mode but\n"); - out.push_str("# ignored in `deploy` mode (addresses come from CREATE2).\n"); + if is_genesis { + out.push_str("# Uncomment and configure the contracts you want in genesis.\n"); + out.push_str("# The `address` field is required for genesis mode.\n"); + } else { + out.push_str("# Uncomment the contracts you want to deploy via CREATE2.\n"); + out.push_str("# Addresses are computed deterministically; no `address` field needed.\n"); + } // AdminProxy out.push('\n'); @@ -40,11 +64,15 @@ pub fn generate_template(params: &InitParams) -> String { out.push_str("# The owner address is stored in slot 0.\n"); if let Some(ref owner) = params.admin_proxy_owner { out.push_str("[contracts.admin_proxy]\n"); - out.push_str("address = \"0x000000000000000000000000000000000000Ad00\"\n"); + if is_genesis { + out.push_str("address = \"0x000000000000000000000000000000000000Ad00\"\n"); + } out.push_str(&format!("owner = \"{owner}\"\n")); } else { out.push_str("# [contracts.admin_proxy]\n"); - out.push_str("# address = \"0x000000000000000000000000000000000000Ad00\"\n"); + if is_genesis { + out.push_str("# address = \"0x000000000000000000000000000000000000Ad00\"\n"); + } out.push_str("# owner = \"0x...\"\n"); } @@ -53,22 +81,33 @@ pub fn generate_template(params: &InitParams) -> String { out.push_str("# Permit2: Uniswap canonical token approval manager.\n"); if params.permit2 { out.push_str("[contracts.permit2]\n"); - out.push_str("address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\"\n"); + if is_genesis { + out.push_str("address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\"\n"); + } } else { out.push_str("# [contracts.permit2]\n"); - out.push_str("# address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\"\n"); + if is_genesis { + out.push_str("# address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\"\n"); + } } - // Deterministic deployer - out.push('\n'); - out.push_str("# Deterministic deployer (Nick's factory): CREATE2 factory for deploy mode.\n"); - out.push_str("# Required in genesis for post-merge chains where the keyless tx cannot land.\n"); - if params.deterministic_deployer { - out.push_str("[contracts.deterministic_deployer]\n"); - out.push_str("address = \"0x4e59b44847b379578588920cA78FbF26c0B4956C\"\n"); - } else { - out.push_str("# [contracts.deterministic_deployer]\n"); - out.push_str("# address = \"0x4e59b44847b379578588920cA78FbF26c0B4956C\"\n"); + // Deterministic deployer (only relevant for genesis mode — in deploy mode + // the pipeline verifies it exists on-chain, it cannot be deployed via CREATE2). + if is_genesis { + out.push('\n'); + out.push_str( + "# Deterministic deployer (Nick's factory): CREATE2 factory for deploy mode.\n", + ); + out.push_str( + "# Required in genesis for post-merge chains where the keyless tx cannot land.\n", + ); + if deterministic_deployer { + out.push_str("[contracts.deterministic_deployer]\n"); + out.push_str("address = \"0x4e59b44847b379578588920cA78FbF26c0B4956C\"\n"); + } else { + out.push_str("# [contracts.deterministic_deployer]\n"); + out.push_str("# address = \"0x4e59b44847b379578588920cA78FbF26c0B4956C\"\n"); + } } out @@ -78,24 +117,25 @@ pub fn generate_template(params: &InitParams) -> String { mod tests { use super::*; - /// The static template that the old `init` used to emit. - const LEGACY_TEMPLATE: &str = include_str!("init_template.toml"); + const LEGACY_GENESIS_TEMPLATE: &str = include_str!("init_template.toml"); #[test] - fn default_params_match_legacy_template() { + fn genesis_default_matches_legacy_template() { let params = InitParams { + mode: InitMode::Genesis, chain_id: 0, permit2: false, deterministic_deployer: false, admin_proxy_owner: None, }; let output = generate_template(¶ms); - assert_eq!(output, LEGACY_TEMPLATE); + assert_eq!(output, LEGACY_GENESIS_TEMPLATE); } #[test] - fn custom_chain_id() { + fn genesis_custom_chain_id() { let params = InitParams { + mode: InitMode::Genesis, chain_id: 42170, permit2: false, deterministic_deployer: false, @@ -108,8 +148,9 @@ mod tests { } #[test] - fn permit2_enabled() { + fn genesis_permit2_includes_address() { let params = InitParams { + mode: InitMode::Genesis, chain_id: 0, permit2: true, deterministic_deployer: false, @@ -121,12 +162,12 @@ mod tests { output.contains("address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\""), "{output}" ); - assert!(output.contains("# [contracts.admin_proxy]"), "{output}"); } #[test] - fn admin_proxy_with_owner() { + fn genesis_admin_proxy_with_owner() { let params = InitParams { + mode: InitMode::Genesis, chain_id: 0, permit2: false, deterministic_deployer: false, @@ -134,29 +175,30 @@ mod tests { }; let output = generate_template(¶ms); assert!(output.contains("[contracts.admin_proxy]\n"), "{output}"); + assert!( + output.contains("address = \"0x000000000000000000000000000000000000Ad00\""), + "{output}" + ); assert!( output.contains("owner = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\""), "{output}" ); - assert!(output.contains("# [contracts.permit2]"), "{output}"); } #[test] - fn all_flags_combined() { + fn genesis_all_flags() { let params = InitParams { + mode: InitMode::Genesis, chain_id: 1234, permit2: true, deterministic_deployer: true, admin_proxy_owner: Some("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266".to_string()), }; let output = generate_template(¶ms); + assert!(output.contains("(genesis mode)"), "{output}"); assert!(output.contains("chain_id = 1234"), "{output}"); assert!(output.contains("[contracts.permit2]\n"), "{output}"); assert!(output.contains("[contracts.admin_proxy]\n"), "{output}"); - assert!( - output.contains("owner = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\""), - "{output}" - ); assert!( output.contains("[contracts.deterministic_deployer]\n"), "{output}" @@ -164,8 +206,9 @@ mod tests { } #[test] - fn deterministic_deployer_enabled() { + fn genesis_deterministic_deployer_includes_address() { let params = InitParams { + mode: InitMode::Genesis, chain_id: 0, permit2: false, deterministic_deployer: true, @@ -180,12 +223,12 @@ mod tests { output.contains("address = \"0x4e59b44847b379578588920cA78FbF26c0B4956C\""), "{output}" ); - assert!(output.contains("# [contracts.permit2]"), "{output}"); } #[test] - fn deterministic_deployer_disabled() { + fn genesis_deterministic_deployer_disabled() { let params = InitParams { + mode: InitMode::Genesis, chain_id: 0, permit2: false, deterministic_deployer: false, @@ -197,4 +240,77 @@ mod tests { "{output}" ); } + + // ── Deploy mode tests ── + + #[test] + fn deploy_header() { + let params = InitParams { + mode: InitMode::Deploy, + chain_id: 1234, + permit2: false, + deterministic_deployer: false, + admin_proxy_owner: None, + }; + let output = generate_template(¶ms); + assert!(output.contains("(deploy mode)"), "{output}"); + assert!( + output.contains("Addresses are computed deterministically"), + "{output}" + ); + } + + #[test] + fn deploy_permit2_no_address() { + let params = InitParams { + mode: InitMode::Deploy, + chain_id: 1234, + permit2: true, + deterministic_deployer: false, + admin_proxy_owner: None, + }; + let output = generate_template(¶ms); + assert!(output.contains("[contracts.permit2]\n"), "{output}"); + assert!( + !output.contains("address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\""), + "deploy mode should not include address for permit2\n{output}" + ); + } + + #[test] + fn deploy_excludes_deterministic_deployer() { + let params = InitParams { + mode: InitMode::Deploy, + chain_id: 1234, + permit2: true, + deterministic_deployer: false, + admin_proxy_owner: None, + }; + let output = generate_template(¶ms); + assert!( + !output.contains("deterministic_deployer"), + "deploy mode should not include deterministic deployer section\n{output}" + ); + } + + #[test] + fn deploy_admin_proxy_no_address() { + let params = InitParams { + mode: InitMode::Deploy, + chain_id: 1234, + permit2: false, + deterministic_deployer: false, + admin_proxy_owner: Some("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266".to_string()), + }; + let output = generate_template(¶ms); + assert!(output.contains("[contracts.admin_proxy]\n"), "{output}"); + assert!( + !output.contains("address = \"0x000000000000000000000000000000000000Ad00\""), + "deploy mode should not include address for admin_proxy\n{output}" + ); + assert!( + output.contains("owner = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\""), + "{output}" + ); + } } diff --git a/bin/ev-deployer/src/init_template.toml b/bin/ev-deployer/src/init_template.toml index 79126c70..e1686d58 100644 --- a/bin/ev-deployer/src/init_template.toml +++ b/bin/ev-deployer/src/init_template.toml @@ -1,4 +1,4 @@ -# EV Deployer configuration +# EV Deployer configuration (genesis mode) # See: bin/ev-deployer/README.md [chain] @@ -6,9 +6,8 @@ chain_id = 0 # ── Contracts ──────────────────────────────────────────── -# Uncomment and configure the contracts you want to deploy. -# The `address` field is required for `genesis` mode but -# ignored in `deploy` mode (addresses come from CREATE2). +# Uncomment and configure the contracts you want in genesis. +# The `address` field is required for genesis mode. # AdminProxy: transparent proxy with owner-based access control. # The owner address is stored in slot 0. diff --git a/bin/ev-deployer/src/main.rs b/bin/ev-deployer/src/main.rs index 1f0e331e..89b8ca79 100644 --- a/bin/ev-deployer/src/main.rs +++ b/bin/ev-deployer/src/main.rs @@ -18,27 +18,10 @@ struct Cli { #[derive(Subcommand)] enum Command { - /// Generate a starter config file with all supported contracts. + /// Generate a starter config file for genesis or deploy mode. Init { - /// Write config to this file instead of stdout. - #[arg(long)] - output: Option, - - /// Set the chain ID (defaults to 0). - #[arg(long)] - chain_id: Option, - - /// Include `Permit2` with its canonical address. - #[arg(long)] - permit2: bool, - - /// Include the deterministic deployer (Nick's factory) with its canonical address. - #[arg(long)] - deterministic_deployer: bool, - - /// Include `AdminProxy` with the given owner address. - #[arg(long)] - admin_proxy_owner: Option
, + #[command(subcommand)] + subcommand: InitSubcommand, }, /// Generate genesis alloc JSON from a deploy config. Genesis { @@ -96,6 +79,50 @@ enum Command { }, } +#[derive(Subcommand)] +enum InitSubcommand { + /// Generate config for genesis injection (contracts embedded at chain start). + Genesis { + /// Write config to this file instead of stdout. + #[arg(long)] + output: Option, + + /// Set the chain ID (defaults to 0). + #[arg(long)] + chain_id: Option, + + /// Include `Permit2` with its canonical address. + #[arg(long)] + permit2: bool, + + /// Include the deterministic deployer (Nick's factory) with its canonical address. + #[arg(long)] + deterministic_deployer: bool, + + /// Include `AdminProxy` with the given owner address. + #[arg(long)] + admin_proxy_owner: Option
, + }, + /// Generate config for live CREATE2 deployment. + Deploy { + /// Write config to this file instead of stdout. + #[arg(long)] + output: Option, + + /// Set the chain ID (defaults to 0). + #[arg(long)] + chain_id: Option, + + /// Include `Permit2`. + #[arg(long)] + permit2: bool, + + /// Include `AdminProxy` with the given owner address. + #[arg(long)] + admin_proxy_owner: Option
, + }, +} + fn main() -> eyre::Result<()> { let cli = Cli::parse(); @@ -152,19 +179,41 @@ fn main() -> eyre::Result<()> { .build()? .block_on(deploy::pipeline::run(&pipeline_cfg, &deployer))?; } - Command::Init { - output, - chain_id, - permit2, - deterministic_deployer, - admin_proxy_owner, - } => { - let params = init::InitParams { - chain_id: chain_id.unwrap_or(0), - permit2, - deterministic_deployer, - admin_proxy_owner: admin_proxy_owner.map(|a| format!("{a}")), + Command::Init { subcommand } => { + let (params, output) = match subcommand { + InitSubcommand::Genesis { + output, + chain_id, + permit2, + deterministic_deployer, + admin_proxy_owner, + } => ( + init::InitParams { + mode: init::InitMode::Genesis, + chain_id: chain_id.unwrap_or(0), + permit2, + deterministic_deployer, + admin_proxy_owner: admin_proxy_owner.map(|a| format!("{a}")), + }, + output, + ), + InitSubcommand::Deploy { + output, + chain_id, + permit2, + admin_proxy_owner, + } => ( + init::InitParams { + mode: init::InitMode::Deploy, + chain_id: chain_id.unwrap_or(0), + permit2, + deterministic_deployer: false, + admin_proxy_owner: admin_proxy_owner.map(|a| format!("{a}")), + }, + output, + ), }; + let template = init::generate_template(¶ms); if let Some(ref out_path) = output { diff --git a/bin/ev-dev/Cargo.toml b/bin/ev-dev/Cargo.toml index 5a107433..db274636 100644 --- a/bin/ev-dev/Cargo.toml +++ b/bin/ev-dev/Cargo.toml @@ -25,6 +25,12 @@ reth-ethereum-cli.workspace = true # Alloy dependencies alloy-signer-local.workspace = true alloy-primitives.workspace = true +alloy-provider.workspace = true +alloy-rpc-types.workspace = true +alloy-network.workspace = true + +# Reth tracing (for Layers type) +reth-tracing.workspace = true # Core dependencies eyre.workspace = true @@ -33,6 +39,13 @@ tokio = { workspace = true, features = ["full"] } clap = { workspace = true, features = ["derive", "env"] } tempfile.workspace = true serde_json.workspace = true +futures.workspace = true + +# TUI +ratatui = "0.30" +crossterm = { version = "0.29", features = ["event-stream"] } +tracing-subscriber = { version = "0.3", features = ["env-filter", "registry"] } +arboard = "3" [lints] workspace = true diff --git a/bin/ev-dev/README.md b/bin/ev-dev/README.md index 731a6e2b..698a32fa 100644 --- a/bin/ev-dev/README.md +++ b/bin/ev-dev/README.md @@ -2,15 +2,24 @@ One-command local development chain for Evolve. Think of it as the Evolve equivalent of [Hardhat Node](https://hardhat.org/hardhat-network/docs/overview) or [Anvil](https://book.getfoundry.sh/reference/anvil/). +## Installation + +```bash +# Install to ~/.cargo/bin +just install-ev-dev + +# Or build without installing +just build-ev-dev +``` + ## Quick Start ```bash # Build and run just dev-chain -# Or build separately -just build-ev-dev -./target/release/ev-dev +# Or run directly after installing +ev-dev ``` The chain starts immediately with 10 pre-funded accounts, each holding 1,000,000 ETH. @@ -28,7 +37,31 @@ ev-dev [OPTIONS] | `--block-time` | `1` | Block time in seconds (`0` = mine on transaction) | | `--silent` | `false` | Suppress the startup banner | | `--accounts` | `10` | Number of accounts to display (1-20) | -| `--deploy-config` | — | Path to an ev-deployer TOML config to deploy contracts at genesis | +| `--genesis-config` | — | Path to an ev-deployer TOML config to deploy contracts at genesis | +| `--tui` | `false` | Launch with an interactive terminal UI instead of plain log output | + +### TUI Mode + +Pass `--tui` to launch an interactive terminal dashboard: + +```bash +ev-dev --tui +``` + +The TUI shows: + +- **Chain info** — chain ID, RPC URL, block time +- **Accounts** — addresses, private keys, and real-time balances (polled every 2s) +- **Deployed contracts** — when using `--genesis-config` +- **Logs** — live node logs with scrollback + +Keyboard shortcuts: + +| Key | Action | +|-----|--------| +| `Tab` | Cycle between panels | +| `↑` / `↓` | Scroll within the active panel | +| `q` / `Esc` / `Ctrl+C` | Quit | ### Examples @@ -43,18 +76,19 @@ ev-dev --host 0.0.0.0 ev-dev --port 9545 --block-time 2 # Start with genesis contracts deployed -ev-dev --deploy-config bin/ev-deployer/examples/devnet.toml +ev-deployer init genesis --permit2 --deterministic-deployer --chain-id 1234 --output genesis.toml +ev-dev --genesis-config genesis.toml ``` ## Genesis Contract Deployment -You can deploy contracts into the genesis state by passing a `--deploy-config` flag pointing to an [ev-deployer](../ev-deployer/README.md) TOML config file. +You can deploy contracts into the genesis state by passing a `--genesis-config` flag pointing to an [ev-deployer](../ev-deployer/README.md) TOML config file. ```bash -ev-dev --deploy-config path/to/deploy.toml +ev-dev --genesis-config path/to/deploy.toml ``` -When a deploy config is provided, ev-dev will: +When a genesis config is provided, ev-dev will: 1. Load and validate the config 2. Override the config's `chain_id` to match the devnet genesis (a warning is printed if they differ) @@ -73,6 +107,28 @@ Genesis Contracts (from path/to/deploy.toml) See the [ev-deployer README](../ev-deployer/README.md) for full config reference and available contracts. +## Live Contract Deployment (CREATE2) + +You can also deploy contracts to a running ev-dev chain using `ev-deployer deploy`. This uses the [deterministic deployer](https://github.com/Arachnid/deterministic-deployment-proxy) (Nick's CREATE2 factory at `0x4e59b44847b379578588920ca78fbf26c0b4956c`), which must be included in the genesis via `--genesis-config`. + +```bash +# Terminal 1: start the chain with Nick's factory in genesis +ev-deployer init genesis --deterministic-deployer --chain-id 1234 --output genesis.toml +ev-dev --genesis-config genesis.toml + +# Terminal 2: generate a deploy config and deploy Permit2 via CREATE2 +ev-deployer init deploy --permit2 --chain-id 1234 --output deploy.toml +ev-deployer deploy \ + --config deploy.toml \ + --rpc-url http://127.0.0.1:8545 \ + --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ + --state /tmp/deploy-state.json +``` + +Permit2 deploys to its canonical address (`0x000000000022D473030F116dDEE9F6B43aC78BA3`) using the original Uniswap CREATE2 salt. The `--state` file tracks progress and allows resuming interrupted deployments. + +**Genesis vs Deploy mode**: Use `--genesis-config` (genesis mode) when you want contracts available from block 0 with exact addresses. Use `ev-deployer deploy` when you want to simulate a real deployment pipeline — contracts land at their canonical CREATE2 addresses. + ## Chain Details | Property | Value | @@ -235,7 +291,7 @@ ev-dev includes all Evolve customizations out of the box: ev-dev is a thin wrapper around the full `ev-reth` node. On startup it: -1. If `--deploy-config` is provided, loads the config and merges contract alloc entries into the genesis +1. If `--genesis-config` is provided, loads the config and merges contract alloc entries into the genesis 2. Writes the (possibly extended) devnet genesis to a temp file 3. Creates a temporary data directory (clean state every run) 4. Launches `ev-reth` in `--dev` mode with networking disabled diff --git a/bin/ev-dev/assets/devnet-genesis.json b/bin/ev-dev/assets/devnet-genesis.json index 967352d3..1e39739a 100644 --- a/bin/ev-dev/assets/devnet-genesis.json +++ b/bin/ev-dev/assets/devnet-genesis.json @@ -107,6 +107,10 @@ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39Fd6e51aad88F6F4ce6aB8827279cffFb92266" } }, + "0x4e59b44847b379578588920ca78fbf26c0b4956c": { + "balance": "0x0", + "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3" + }, "0x0101010101010101010101010101010101010101": { "balance": "0x1" } diff --git a/bin/ev-dev/src/main.rs b/bin/ev-dev/src/main.rs index 6eeef394..715b1c53 100644 --- a/bin/ev-dev/src/main.rs +++ b/bin/ev-dev/src/main.rs @@ -5,6 +5,8 @@ #![allow(missing_docs, rustdoc::missing_crate_level_docs)] +mod tui; + use alloy_signer_local::{coins_bip39::English, MnemonicBuilder}; use clap::Parser; use ev_deployer::{config::DeployConfig, genesis::merge_alloc, output::build_manifest}; @@ -15,6 +17,7 @@ use evolve_ev_reth::{ use reth_ethereum_cli::Cli; use std::{io::Write, path::PathBuf}; use tracing::info; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; use ev_node::{EvolveArgs, EvolveChainSpecParser, EvolveNode}; @@ -57,9 +60,13 @@ struct EvDevArgs { #[arg(long, default_value_t = 10, value_parser = parse_accounts)] accounts: usize, - /// Path to an ev-deployer TOML config to deploy contracts at genesis. + /// Path to an ev-deployer TOML config to embed contracts in genesis. #[arg(long, value_name = "PATH")] - deploy_config: Option, + genesis_config: Option, + + /// Launch with terminal UI instead of plain log output + #[arg(long, default_value_t = false)] + tui: bool, } fn derive_keys(count: usize) -> Vec<(String, String)> { @@ -131,7 +138,7 @@ fn print_banner(args: &EvDevArgs, deploy_cfg: Option<&DeployConfig>) { println!(); if let Some(cfg) = deploy_cfg { - let config_path = args.deploy_config.as_ref().unwrap(); + let config_path = args.genesis_config.as_ref().unwrap(); println!("Genesis Contracts (from {})", config_path.display()); println!("=================="); let manifest = build_manifest(cfg); @@ -148,59 +155,11 @@ fn print_banner(args: &EvDevArgs, deploy_cfg: Option<&DeployConfig>) { println!(); } -fn main() { - reth_cli_util::sigsegv_handler::install(); - - if std::env::var_os("RUST_BACKTRACE").is_none() { - std::env::set_var("RUST_BACKTRACE", "1"); - } - - let dev_args = EvDevArgs::parse(); - - let deploy_cfg = dev_args.deploy_config.as_ref().map(|config_path| { - let mut cfg = DeployConfig::load(config_path) - .unwrap_or_else(|e| panic!("failed to load deploy config: {e}")); - - let genesis_chain_id = chain_id_from_genesis(); - if cfg.chain.chain_id != genesis_chain_id { - eprintln!( - "WARNING: deploy config chain_id ({}) differs from devnet genesis ({}), overriding to {}", - cfg.chain.chain_id, genesis_chain_id, genesis_chain_id - ); - cfg.chain.chain_id = genesis_chain_id; - } - cfg - }); - - if !dev_args.silent { - print_banner(&dev_args, deploy_cfg.as_ref()); - } - - let genesis_json = if let Some(ref cfg) = deploy_cfg { - let mut genesis: serde_json::Value = - serde_json::from_str(DEVNET_GENESIS).expect("valid genesis JSON"); - merge_alloc(cfg, &mut genesis, true).expect("failed to merge deploy config into genesis"); - serde_json::to_string(&genesis).expect("failed to serialize merged genesis") - } else { - DEVNET_GENESIS.to_string() - }; - - // Write genesis to a temp file that lives for the process duration - let mut genesis_file = - tempfile::NamedTempFile::new().expect("failed to create temp genesis file"); - genesis_file - .write_all(genesis_json.as_bytes()) - .expect("failed to write genesis"); - let genesis_path = genesis_file - .path() - .to_str() - .expect("valid path") - .to_string(); - - // Use a temp data directory so each run starts with clean state - let datadir = tempfile::TempDir::new().expect("failed to create temp data dir"); - let datadir_path = datadir.path().to_str().expect("valid path").to_string(); - +fn build_reth_args( + dev_args: &EvDevArgs, + genesis_path: String, + datadir_path: String, +) -> Vec { let mut args = vec![ "ev-dev".to_string(), "node".to_string(), @@ -236,6 +195,94 @@ fn main() { args.push(format!("{}s", dev_args.block_time)); } + args +} + +fn prepare_genesis( + deploy_cfg: &Option, +) -> (tempfile::NamedTempFile, tempfile::TempDir) { + let genesis_json = if let Some(ref cfg) = deploy_cfg { + let mut genesis: serde_json::Value = + serde_json::from_str(DEVNET_GENESIS).expect("valid genesis JSON"); + merge_alloc(cfg, &mut genesis, true).expect("failed to merge genesis config into genesis"); + serde_json::to_string(&genesis).expect("failed to serialize merged genesis") + } else { + DEVNET_GENESIS.to_string() + }; + + let mut genesis_file = + tempfile::NamedTempFile::new().expect("failed to create temp genesis file"); + genesis_file + .write_all(genesis_json.as_bytes()) + .expect("failed to write genesis"); + + let datadir = tempfile::TempDir::new().expect("failed to create temp data dir"); + + (genesis_file, datadir) +} + +fn load_genesis_config(dev_args: &EvDevArgs) -> Option { + dev_args.genesis_config.as_ref().map(|config_path| { + let mut cfg = DeployConfig::load(config_path) + .unwrap_or_else(|e| panic!("failed to load genesis config: {e}")); + + let genesis_chain_id = chain_id_from_genesis(); + if cfg.chain.chain_id != genesis_chain_id { + eprintln!( + "WARNING: genesis config chain_id ({}) differs from devnet genesis ({}), overriding to {}", + cfg.chain.chain_id, genesis_chain_id, genesis_chain_id + ); + cfg.chain.chain_id = genesis_chain_id; + } + cfg + }) +} + +fn deploy_contracts_list(deploy_cfg: &Option) -> Option> { + deploy_cfg.as_ref().map(|cfg| { + let manifest = build_manifest(cfg); + manifest + .as_object() + .map(|obj| { + obj.iter() + .map(|(name, addr)| (name.clone(), addr.as_str().unwrap_or("").to_string())) + .collect() + }) + .unwrap_or_default() + }) +} + +fn main() { + reth_cli_util::sigsegv_handler::install(); + + if std::env::var_os("RUST_BACKTRACE").is_none() { + std::env::set_var("RUST_BACKTRACE", "1"); + } + + let dev_args = EvDevArgs::parse(); + let deploy_cfg = load_genesis_config(&dev_args); + + if dev_args.tui { + run_with_tui(dev_args, deploy_cfg); + } else { + run_without_tui(dev_args, deploy_cfg); + } +} + +fn run_without_tui(dev_args: EvDevArgs, deploy_cfg: Option) { + if !dev_args.silent { + print_banner(&dev_args, deploy_cfg.as_ref()); + } + + let (genesis_file, datadir) = prepare_genesis(&deploy_cfg); + let genesis_path = genesis_file + .path() + .to_str() + .expect("valid path") + .to_string(); + let datadir_path = datadir.path().to_str().expect("valid path").to_string(); + let args = build_reth_args(&dev_args, genesis_path, datadir_path); + let cli = match Cli::::try_parse_from(args) { Ok(cli) => cli, Err(err) => { @@ -265,3 +312,78 @@ fn main() { std::process::exit(1); } } + +fn run_with_tui(dev_args: EvDevArgs, deploy_cfg: Option) { + let (log_tx, log_rx) = tokio::sync::mpsc::channel(10_000); + + // Install our tracing subscriber with the TUI layer BEFORE cli.run(). + // When reth's internal init_tracing calls try_init(), it will find a + // subscriber already installed and silently skip its own setup. + let tui_layer = tui::TuiTracingLayer::new(log_tx); + let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()); + + tracing_subscriber::registry() + .with(filter) + .with(tui_layer) + .init(); + + let chain_id = chain_id_from_genesis(); + let rpc_url = format!("http://{}:{}", dev_args.host, dev_args.port); + let block_time = dev_args.block_time; + let accounts = derive_keys(dev_args.accounts); + let contracts = deploy_contracts_list(&deploy_cfg); + + let (balance_tx, balance_rx) = tokio::sync::mpsc::channel(16); + let app = tui::App::new( + chain_id, + rpc_url.clone(), + block_time, + accounts.clone(), + contracts, + log_rx, + balance_rx, + ); + + let (genesis_file, datadir) = prepare_genesis(&deploy_cfg); + let genesis_path = genesis_file + .path() + .to_str() + .expect("valid path") + .to_string(); + let datadir_path = datadir.path().to_str().expect("valid path").to_string(); + let args = build_reth_args(&dev_args, genesis_path, datadir_path); + + let cli = match Cli::::try_parse_from(args) { + Ok(cli) => cli, + Err(err) => { + eprintln!("{err}"); + std::process::exit(2); + } + }; + + if let Err(err) = cli.run(|builder, _evolve_args| async move { + info!("=== EV-DEV: Starting local development chain (TUI) ==="); + let _handle = builder + .node(EvolveNode::new()) + .extend_rpc_modules(move |ctx| { + let evolve_cfg = EvolveConfig::default(); + let evolve_txpool = + EvolveTxpoolApiImpl::new(ctx.pool().clone(), evolve_cfg.max_txpool_bytes); + ctx.modules.merge_configured(evolve_txpool.into_rpc())?; + Ok(()) + }) + .launch_with_debug_capabilities() + .await?; + + info!("=== EV-DEV: Local chain running - RPC ready ==="); + + tui::spawn_balance_poller(rpc_url, accounts, balance_tx); + tui::run(app).await?; + + Ok(()) + }) { + let _ = tui::restore_terminal(); + eprintln!("Error: {err:?}"); + std::process::exit(1); + } +} diff --git a/bin/ev-dev/src/tui/app.rs b/bin/ev-dev/src/tui/app.rs new file mode 100644 index 00000000..b09d8766 --- /dev/null +++ b/bin/ev-dev/src/tui/app.rs @@ -0,0 +1,354 @@ +use std::{collections::VecDeque, time::Instant}; + +use alloy_primitives::{Address, U256}; +use tokio::sync::mpsc; + +const MAX_LOGS: usize = 1000; +const MAX_BLOCKS: usize = 200; + +#[derive(Debug, Clone)] +pub(crate) struct BlockInfo { + pub(crate) number: u64, + pub(crate) hash: String, + pub(crate) tx_count: u64, + pub(crate) gas_used: u64, +} + +#[derive(Debug, Clone)] +pub(crate) struct LogEntry { + pub(crate) level: tracing::Level, + pub(crate) target: String, + pub(crate) message: String, + pub(crate) fields: Vec<(String, String)>, + pub(crate) timestamp: Instant, +} + +#[derive(Debug, Clone)] +pub(crate) struct TxInfo { + pub(crate) hash: String, + pub(crate) from: String, + pub(crate) to: String, + pub(crate) value: String, +} + +#[derive(Debug, Clone)] +pub(crate) struct BlockDetail { + pub(crate) number: u64, + pub(crate) txs: Vec, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum Panel { + Blocks, + Logs, + Accounts, +} + +pub(crate) struct App { + // Static + pub(crate) chain_id: u64, + pub(crate) rpc_url: String, + pub(crate) block_time: u64, + pub(crate) accounts: Vec<(String, String)>, + pub(crate) deploy_contracts: Option>, + + // Dynamic + pub(crate) blocks: VecDeque, + pub(crate) logs: VecDeque, + pub(crate) current_block: u64, + pub(crate) start_time: Instant, + pub(crate) balances: Vec, + + // UI state + pub(crate) active_panel: Panel, + pub(crate) log_scroll: usize, + pub(crate) block_selected: usize, + pub(crate) account_selected: usize, + pub(crate) clipboard_msg: Option<(String, Instant)>, + pub(crate) block_detail: Option, + pub(crate) should_quit: bool, + + // Channels + pub(crate) log_rx: mpsc::Receiver, + pub(crate) balance_rx: mpsc::Receiver>, + pub(crate) detail_tx: mpsc::Sender, + pub(crate) detail_rx: mpsc::Receiver, +} + +impl App { + pub(crate) fn new( + chain_id: u64, + rpc_url: String, + block_time: u64, + accounts: Vec<(String, String)>, + deploy_contracts: Option>, + log_rx: mpsc::Receiver, + balance_rx: mpsc::Receiver>, + ) -> Self { + let initial_balance = "1000000 ETH".to_string(); + let balances = vec![initial_balance; accounts.len()]; + let (detail_tx, detail_rx) = mpsc::channel(4); + Self { + chain_id, + rpc_url, + block_time, + accounts, + deploy_contracts, + blocks: VecDeque::new(), + logs: VecDeque::new(), + current_block: 0, + start_time: Instant::now(), + balances, + active_panel: Panel::Logs, + log_scroll: 0, + block_selected: 0, + account_selected: 0, + clipboard_msg: None, + block_detail: None, + should_quit: false, + log_rx, + balance_rx, + detail_tx, + detail_rx, + } + } + + pub(crate) fn drain_balances(&mut self) { + while let Ok(new_balances) = self.balance_rx.try_recv() { + self.balances = new_balances; + } + } + + pub(crate) fn drain_logs(&mut self) { + while let Ok(entry) = self.log_rx.try_recv() { + if entry.message == "built block" { + if let Some(block) = self.parse_block_from_fields(&entry.fields) { + self.current_block = block.number; + self.blocks.push_front(block); + if self.blocks.len() > MAX_BLOCKS { + self.blocks.pop_back(); + } + } + } + + self.logs.push_back(entry); + if self.logs.len() > MAX_LOGS { + self.logs.pop_front(); + } + } + } + + fn parse_block_from_fields(&self, fields: &[(String, String)]) -> Option { + let mut number = None; + let mut hash = String::new(); + let mut tx_count = 0; + let mut gas_used = 0; + + for (k, v) in fields { + match k.as_str() { + "block_number" => number = v.parse().ok(), + "block_hash" => { + let h = v.trim_matches('"'); + hash = if h.len() > 10 { + format!("{}..{}", &h[..6], &h[h.len() - 4..]) + } else { + h.to_string() + }; + } + "tx_count" => tx_count = v.parse().unwrap_or(0), + "gas_used" => gas_used = v.parse().unwrap_or(0), + _ => {} + } + } + + number.map(|n| BlockInfo { + number: n, + hash, + tx_count, + gas_used, + }) + } + + pub(crate) fn next_panel(&mut self) { + self.active_panel = match self.active_panel { + Panel::Blocks => Panel::Logs, + Panel::Logs => Panel::Accounts, + Panel::Accounts => Panel::Blocks, + }; + } + + pub(crate) fn scroll_up(&mut self) { + match self.active_panel { + Panel::Logs => self.log_scroll = self.log_scroll.saturating_add(1), + Panel::Blocks => { + self.block_selected = self.block_selected.saturating_sub(1); + } + Panel::Accounts => { + self.account_selected = self.account_selected.saturating_sub(1); + } + } + } + + pub(crate) fn scroll_down(&mut self) { + match self.active_panel { + Panel::Logs => self.log_scroll = self.log_scroll.saturating_sub(1), + Panel::Blocks => { + if !self.blocks.is_empty() { + self.block_selected = (self.block_selected + 1).min(self.blocks.len() - 1); + } + } + Panel::Accounts => { + if !self.accounts.is_empty() { + self.account_selected = + (self.account_selected + 1).min(self.accounts.len() - 1); + } + } + } + } + + pub(crate) fn copy_account_address(&mut self) { + if let Some((addr, _)) = self.accounts.get(self.account_selected) { + if let Ok(mut clipboard) = arboard::Clipboard::new() { + let _ = clipboard.set_text(addr.clone()); + let truncated = if addr.len() > 10 { + format!("{}..{}", &addr[..6], &addr[addr.len() - 4..]) + } else { + addr.clone() + }; + self.clipboard_msg = Some((format!("Copied address {truncated}"), Instant::now())); + } + } + } + + pub(crate) fn copy_account_key(&mut self) { + if let Some((_, key)) = self.accounts.get(self.account_selected) { + if let Ok(mut clipboard) = arboard::Clipboard::new() { + let _ = clipboard.set_text(key.clone()); + self.clipboard_msg = Some(("Copied private key".to_string(), Instant::now())); + } + } + } + + pub(crate) fn fetch_block_detail(&self) { + let Some(block_info) = self.blocks.get(self.block_selected) else { + return; + }; + let tx = self.detail_tx.clone(); + let rpc_url = self.rpc_url.clone(); + let block_num = block_info.number; + + tokio::spawn(async move { + use alloy_network::TransactionResponse; + use alloy_provider::{Provider, ProviderBuilder}; + use alloy_rpc_types::{BlockNumberOrTag, TransactionTrait}; + + let provider = + ProviderBuilder::new().connect_http(rpc_url.parse().expect("valid RPC URL")); + + let result = provider + .get_block_by_number(BlockNumberOrTag::Number(block_num)) + .full() + .await; + + let txs = match result { + Ok(Some(block)) => block + .transactions + .into_transactions() + .map(|t| { + let hash = format!("{}", t.tx_hash()); + let from = format!("{}", t.from()); + let to = t.to().map_or_else( + || "Contract Creation".into(), + |a| truncate_hex(&format!("{a}")), + ); + let value = format_ether(t.value()); + TxInfo { + hash: truncate_hex(&hash), + from: truncate_hex(&from), + to, + value, + } + }) + .collect(), + _ => vec![], + }; + + let _ = tx + .send(BlockDetail { + number: block_num, + txs, + }) + .await; + }); + } + + pub(crate) fn drain_block_detail(&mut self) { + if let Ok(detail) = self.detail_rx.try_recv() { + self.block_detail = Some(detail); + } + } + + pub(crate) fn close_block_detail(&mut self) { + self.block_detail = None; + } +} + +fn truncate_hex(s: &str) -> String { + if s.len() > 10 { + format!("{}..{}", &s[..6], &s[s.len() - 4..]) + } else { + s.to_string() + } +} + +fn format_ether(wei: U256) -> String { + let ether_unit = U256::from(10u64).pow(U256::from(18)); + let whole = wei / ether_unit; + let remainder = wei % ether_unit; + + let frac_digits = 4; + let frac_unit = U256::from(10u64).pow(U256::from(18 - frac_digits)); + let frac = remainder / frac_unit; + + let frac_val: u64 = frac.try_into().unwrap_or(0); + let formatted = format!("{whole}.{frac_val:0>4}"); + // Trim trailing zeros but keep at least one decimal + let trimmed = formatted.trim_end_matches('0'); + let trimmed = trimmed.trim_end_matches('.'); + format!("{trimmed} ETH") +} + +pub(crate) fn spawn_balance_poller( + rpc_url: String, + accounts: Vec<(String, String)>, + tx: mpsc::Sender>, +) { + let addresses: Vec
= accounts + .iter() + .filter_map(|(addr, _)| addr.parse().ok()) + .collect(); + + tokio::spawn(async move { + use alloy_provider::{Provider, ProviderBuilder}; + + let mut interval = tokio::time::interval(std::time::Duration::from_secs(2)); + loop { + interval.tick().await; + + let provider = + ProviderBuilder::new().connect_http(rpc_url.parse().expect("valid RPC URL")); + + let mut balances = Vec::with_capacity(addresses.len()); + for addr in &addresses { + match provider.get_balance(*addr).await { + Ok(bal) => balances.push(format_ether(bal)), + Err(_) => balances.push("? ETH".to_string()), + } + } + + if tx.send(balances).await.is_err() { + break; + } + } + }); +} diff --git a/bin/ev-dev/src/tui/events.rs b/bin/ev-dev/src/tui/events.rs new file mode 100644 index 00000000..8e23ea9a --- /dev/null +++ b/bin/ev-dev/src/tui/events.rs @@ -0,0 +1,38 @@ +use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + +use super::app::{App, Panel}; + +pub(crate) fn handle_key(app: &mut App, key: KeyEvent) { + // If block detail overlay is open, handle it separately + if app.block_detail.is_some() { + match key.code { + KeyCode::Esc | KeyCode::Enter => app.close_block_detail(), + KeyCode::Char('q') => app.should_quit = true, + KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { + app.should_quit = true; + } + _ => {} + } + return; + } + + match key.code { + KeyCode::Char('q') | KeyCode::Esc => app.should_quit = true, + KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { + app.should_quit = true; + } + KeyCode::Tab => app.next_panel(), + KeyCode::Up => app.scroll_up(), + KeyCode::Down => app.scroll_down(), + KeyCode::Char('a') if app.active_panel == Panel::Accounts => { + app.copy_account_address(); + } + KeyCode::Char('k') if app.active_panel == Panel::Accounts => { + app.copy_account_key(); + } + KeyCode::Enter if app.active_panel == Panel::Blocks => { + app.fetch_block_detail(); + } + _ => {} + } +} diff --git a/bin/ev-dev/src/tui/mod.rs b/bin/ev-dev/src/tui/mod.rs new file mode 100644 index 00000000..10f09348 --- /dev/null +++ b/bin/ev-dev/src/tui/mod.rs @@ -0,0 +1,74 @@ +pub(crate) mod app; +mod events; +mod tracing_layer; +mod ui; + +pub(crate) use app::{spawn_balance_poller, App}; +pub(crate) use tracing_layer::TuiTracingLayer; + +use std::io::{self, stdout}; + +use crossterm::{ + event::{Event, EventStream}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, +}; +use futures::StreamExt; +use ratatui::prelude::CrosstermBackend; + +struct TerminalGuard; + +impl Drop for TerminalGuard { + fn drop(&mut self) { + let _ = disable_raw_mode(); + let _ = stdout().execute(LeaveAlternateScreen); + } +} + +pub(crate) async fn run(mut app: App) -> eyre::Result<()> { + let original_hook = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |info| { + let _ = disable_raw_mode(); + let _ = stdout().execute(LeaveAlternateScreen); + original_hook(info); + })); + + enable_raw_mode()?; + stdout().execute(EnterAlternateScreen)?; + let _guard = TerminalGuard; + + let backend = CrosstermBackend::new(stdout()); + let mut terminal = ratatui::Terminal::new(backend)?; + + let mut event_stream = EventStream::new(); + let mut tick = tokio::time::interval(std::time::Duration::from_millis(100)); + + loop { + if app.should_quit { + break; + } + + tokio::select! { + _ = tick.tick() => { + app.drain_logs(); + app.drain_balances(); + app.drain_block_detail(); + terminal.draw(|frame| ui::draw(frame, &app))?; + } + maybe_event = event_stream.next() => { + if let Some(Ok(Event::Key(key))) = maybe_event { + events::handle_key(&mut app, key); + } + } + } + } + + // Terminal restored by TerminalGuard drop + Ok(()) +} + +pub(crate) fn restore_terminal() -> io::Result<()> { + disable_raw_mode()?; + stdout().execute(LeaveAlternateScreen)?; + Ok(()) +} diff --git a/bin/ev-dev/src/tui/tracing_layer.rs b/bin/ev-dev/src/tui/tracing_layer.rs new file mode 100644 index 00000000..7ea78d5e --- /dev/null +++ b/bin/ev-dev/src/tui/tracing_layer.rs @@ -0,0 +1,83 @@ +use std::time::Instant; + +use tokio::sync::mpsc; +use tracing::{ + field::{Field, Visit}, + Subscriber, +}; +use tracing_subscriber::{layer::Context, registry::LookupSpan, Layer}; + +use super::app::LogEntry; + +struct FieldCollector { + fields: Vec<(String, String)>, +} + +impl FieldCollector { + const fn new() -> Self { + Self { fields: Vec::new() } + } + + fn take_message(&mut self) -> String { + if let Some(pos) = self.fields.iter().position(|(k, _)| k == "message") { + self.fields.remove(pos).1 + } else { + String::new() + } + } +} + +impl Visit for FieldCollector { + fn record_debug(&mut self, field: &Field, value: &dyn std::fmt::Debug) { + self.fields + .push((field.name().to_string(), format!("{:?}", value))); + } + + fn record_str(&mut self, field: &Field, value: &str) { + self.fields + .push((field.name().to_string(), value.to_string())); + } + + fn record_u64(&mut self, field: &Field, value: u64) { + self.fields + .push((field.name().to_string(), value.to_string())); + } + + fn record_i64(&mut self, field: &Field, value: i64) { + self.fields + .push((field.name().to_string(), value.to_string())); + } +} + +pub(crate) struct TuiTracingLayer { + tx: mpsc::Sender, +} + +impl TuiTracingLayer { + pub(crate) const fn new(tx: mpsc::Sender) -> Self { + Self { tx } + } +} + +impl Layer for TuiTracingLayer +where + S: Subscriber + for<'lookup> LookupSpan<'lookup>, +{ + fn on_event(&self, event: &tracing::Event<'_>, _ctx: Context<'_, S>) { + let mut collector = FieldCollector::new(); + event.record(&mut collector); + + let message = collector.take_message(); + let metadata = event.metadata(); + + let entry = LogEntry { + level: *metadata.level(), + target: metadata.target().to_string(), + message, + fields: collector.fields, + timestamp: Instant::now(), + }; + + let _ = self.tx.try_send(entry); + } +} diff --git a/bin/ev-dev/src/tui/ui.rs b/bin/ev-dev/src/tui/ui.rs new file mode 100644 index 00000000..8bf4cff2 --- /dev/null +++ b/bin/ev-dev/src/tui/ui.rs @@ -0,0 +1,448 @@ +use ratatui::{ + layout::{Constraint, Layout, Rect}, + style::{Color, Modifier, Style}, + text::{Line, Span}, + widgets::{Block, Borders, Cell, Clear, List, ListItem, Paragraph, Row, Table}, + Frame, +}; + +use super::app::{App, BlockDetail, Panel}; + +fn border_style(app: &App, panel: Panel) -> Style { + if app.active_panel == panel { + Style::default().fg(Color::Cyan) + } else { + Style::default().fg(Color::DarkGray) + } +} + +const fn level_color(level: &tracing::Level) -> Color { + match *level { + tracing::Level::ERROR => Color::Red, + tracing::Level::WARN => Color::Yellow, + tracing::Level::INFO => Color::Green, + tracing::Level::DEBUG | tracing::Level::TRACE => Color::DarkGray, + } +} + +fn format_uptime(secs: u64) -> String { + let h = secs / 3600; + let m = (secs % 3600) / 60; + let s = secs % 60; + if h > 0 { + format!("{h}h{m:02}m{s:02}s") + } else if m > 0 { + format!("{m}m{s:02}s") + } else { + format!("{s}s") + } +} + +fn format_gas(gas: u64) -> String { + if gas >= 1_000_000 { + format!("{:.1}M", gas as f64 / 1_000_000.0) + } else if gas >= 1_000 { + format!("{:.1}k", gas as f64 / 1_000.0) + } else { + gas.to_string() + } +} + +pub(crate) fn draw(frame: &mut Frame<'_>, app: &App) { + let area = frame.area(); + + let outer = Layout::vertical([ + Constraint::Length(3), // header + Constraint::Min(6), // main content + Constraint::Length(3), // footer + ]) + .split(area); + + draw_header(frame, app, outer[0]); + draw_main(frame, app, outer[1]); + draw_footer(frame, app, outer[2]); + + if let Some(ref detail) = app.block_detail { + draw_block_detail(frame, detail, area); + } +} + +fn draw_header(frame: &mut Frame<'_>, app: &App, area: Rect) { + let block_time_str = if app.block_time == 0 { + "auto".to_string() + } else { + format!("{}s", app.block_time) + }; + + let text = Line::from(vec![ + Span::styled(" Chain: ", Style::default().fg(Color::DarkGray)), + Span::styled(app.chain_id.to_string(), Style::default().fg(Color::White)), + Span::styled(" RPC: ", Style::default().fg(Color::DarkGray)), + Span::styled(&app.rpc_url, Style::default().fg(Color::Cyan)), + Span::styled(" Block: ", Style::default().fg(Color::DarkGray)), + Span::styled(block_time_str, Style::default().fg(Color::White)), + ]); + + let block = Block::default() + .borders(Borders::ALL) + .title(" ev-dev ") + .title_style( + Style::default() + .fg(Color::Cyan) + .add_modifier(Modifier::BOLD), + ) + .border_style(Style::default().fg(Color::Cyan)); + + let paragraph = Paragraph::new(text).block(block); + frame.render_widget(paragraph, area); +} + +fn draw_main(frame: &mut Frame<'_>, app: &App, area: Rect) { + let main_split = Layout::vertical([ + Constraint::Percentage(45), // top row (blocks + accounts) + Constraint::Percentage(55), // logs + ]) + .split(area); + + let top_split = Layout::horizontal([ + Constraint::Percentage(55), // blocks + Constraint::Percentage(45), // accounts + ]) + .split(main_split[0]); + + draw_blocks(frame, app, top_split[0]); + draw_accounts(frame, app, top_split[1]); + draw_logs(frame, app, main_split[1]); +} + +fn draw_blocks(frame: &mut Frame<'_>, app: &App, area: Rect) { + let is_focused = app.active_panel == Panel::Blocks; + + let block = Block::default() + .borders(Borders::ALL) + .title(" Blocks ") + .border_style(border_style(app, Panel::Blocks)); + + let header = Row::new(vec![ + Cell::from("Block").style(Style::default().add_modifier(Modifier::BOLD)), + Cell::from("Hash").style(Style::default().add_modifier(Modifier::BOLD)), + Cell::from("Txs").style(Style::default().add_modifier(Modifier::BOLD)), + Cell::from("Gas").style(Style::default().add_modifier(Modifier::BOLD)), + ]) + .style(Style::default().fg(Color::DarkGray)); + + // Auto-scroll to keep selected block visible + let inner_height = area.height.saturating_sub(4) as usize; // borders + header + header separator + let scroll = if inner_height > 0 && app.block_selected >= inner_height { + app.block_selected - inner_height + 1 + } else { + 0 + }; + + let rows: Vec> = app + .blocks + .iter() + .enumerate() + .skip(scroll) + .take(inner_height.max(1)) + .map(|(i, b)| { + let selected = is_focused && i == app.block_selected; + let marker = if selected { "▸" } else { " " }; + let style = if selected { + Style::default().fg(Color::Cyan) + } else { + Style::default() + }; + + Row::new(vec![ + Cell::from(format!("{marker}#{}", b.number)), + Cell::from(b.hash.clone()).style(Style::default().fg(Color::DarkGray)), + Cell::from(format!("{}", b.tx_count)), + Cell::from(format_gas(b.gas_used)), + ]) + .style(style) + }) + .collect(); + + let widths = [ + Constraint::Length(10), + Constraint::Length(12), + Constraint::Length(5), + Constraint::Min(6), + ]; + + let table = Table::new(rows, widths).header(header).block(block); + + frame.render_widget(table, area); +} + +fn draw_accounts(frame: &mut Frame<'_>, app: &App, area: Rect) { + let is_focused = app.active_panel == Panel::Accounts; + let mut items: Vec> = app + .accounts + .iter() + .enumerate() + .map(|(i, (addr, _key))| { + let truncated = if addr.len() > 10 { + format!("{}..{}", &addr[..6], &addr[addr.len() - 4..]) + } else { + addr.clone() + }; + let balance = app + .balances + .get(i) + .cloned() + .unwrap_or_else(|| "? ETH".to_string()); + + let selected = is_focused && i == app.account_selected; + let marker = if selected { "▸ " } else { " " }; + let addr_color = if selected { Color::Cyan } else { Color::White }; + + ListItem::new(Line::from(vec![ + Span::styled(marker, Style::default().fg(Color::Cyan)), + Span::styled(format!("({i}) "), Style::default().fg(Color::DarkGray)), + Span::styled(truncated, Style::default().fg(addr_color)), + Span::styled(format!(" {balance}"), Style::default().fg(Color::Green)), + ])) + }) + .collect(); + + if let Some(ref contracts) = app.deploy_contracts { + items.push(ListItem::new(Line::from(""))); + items.push(ListItem::new(Line::from(Span::styled( + "Genesis Contracts", + Style::default() + .fg(Color::Yellow) + .add_modifier(Modifier::BOLD), + )))); + for (name, addr) in contracts { + let truncated = if addr.len() > 10 { + format!("{}..{}", &addr[..6], &addr[addr.len() - 4..]) + } else { + addr.clone() + }; + items.push(ListItem::new(Line::from(vec![ + Span::styled(format!("{name:18} "), Style::default().fg(Color::DarkGray)), + Span::styled(truncated, Style::default().fg(Color::White)), + ]))); + } + } + + let block = Block::default() + .borders(Borders::ALL) + .title(" Accounts ") + .border_style(border_style(app, Panel::Accounts)); + + let list = List::new(items).block(block); + frame.render_widget(list, area); +} + +fn draw_logs(frame: &mut Frame<'_>, app: &App, area: Rect) { + let block = Block::default() + .borders(Borders::ALL) + .title(" Logs ") + .border_style(border_style(app, Panel::Logs)); + + let inner_height = area.height.saturating_sub(2) as usize; + let total = app.logs.len(); + + let end = total.saturating_sub(app.log_scroll); + let start = end.saturating_sub(inner_height); + + let items: Vec> = app + .logs + .iter() + .skip(start) + .take(end.saturating_sub(start)) + .map(|entry| { + let color = level_color(&entry.level); + let level_str = format!("{:5}", entry.level); + let elapsed = entry.timestamp.elapsed().as_secs(); + let ts = format!("{elapsed:>4}s"); + + let target_short = entry.target.rsplit("::").next().unwrap_or(&entry.target); + + let mut spans = vec![ + Span::styled(ts, Style::default().fg(Color::DarkGray)), + Span::raw(" "), + Span::styled(level_str, Style::default().fg(color)), + Span::raw(" "), + Span::styled( + format!("{target_short:>16} "), + Style::default().fg(Color::DarkGray), + ), + Span::styled(entry.message.clone(), Style::default().fg(Color::White)), + ]; + + for (k, v) in &entry.fields { + spans.push(Span::raw(" ")); + spans.push(Span::styled( + format!("{k}="), + Style::default().fg(Color::DarkGray), + )); + spans.push(Span::styled(v.clone(), Style::default().fg(Color::Gray))); + } + + ListItem::new(Line::from(spans)) + }) + .collect(); + + let list = List::new(items).block(block); + frame.render_widget(list, area); +} + +fn draw_block_detail(frame: &mut Frame<'_>, detail: &BlockDetail, area: Rect) { + let popup = centered_rect(80, 60, area); + frame.render_widget(Clear, popup); + + let title = format!(" Block #{} ({} txs) ", detail.number, detail.txs.len()); + + let block = Block::default() + .borders(Borders::ALL) + .title(title) + .title_style( + Style::default() + .fg(Color::Cyan) + .add_modifier(Modifier::BOLD), + ) + .border_style(Style::default().fg(Color::Cyan)); + + if detail.txs.is_empty() { + let text = Paragraph::new(Line::from(vec![Span::styled( + " No transactions in this block", + Style::default().fg(Color::DarkGray), + )])) + .block(block); + frame.render_widget(text, popup); + } else { + let header = Row::new(vec![ + Cell::from("Hash").style(Style::default().add_modifier(Modifier::BOLD)), + Cell::from("From").style(Style::default().add_modifier(Modifier::BOLD)), + Cell::from("To").style(Style::default().add_modifier(Modifier::BOLD)), + Cell::from("Value").style(Style::default().add_modifier(Modifier::BOLD)), + ]) + .style(Style::default().fg(Color::DarkGray)); + + let rows: Vec> = detail + .txs + .iter() + .map(|tx| { + Row::new(vec![ + Cell::from(tx.hash.clone()).style(Style::default().fg(Color::DarkGray)), + Cell::from(tx.from.clone()), + Cell::from(tx.to.clone()), + Cell::from(tx.value.clone()).style(Style::default().fg(Color::Green)), + ]) + }) + .collect(); + + let widths = [ + Constraint::Length(14), + Constraint::Length(14), + Constraint::Length(18), + Constraint::Min(10), + ]; + + let table = Table::new(rows, widths).header(header).block(block); + frame.render_widget(table, popup); + } +} + +fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { + let popup_layout = Layout::vertical([ + Constraint::Percentage((100 - percent_y) / 2), + Constraint::Percentage(percent_y), + Constraint::Percentage((100 - percent_y) / 2), + ]) + .split(r); + + Layout::horizontal([ + Constraint::Percentage((100 - percent_x) / 2), + Constraint::Percentage(percent_x), + Constraint::Percentage((100 - percent_x) / 2), + ]) + .split(popup_layout[1])[1] +} + +fn draw_footer(frame: &mut Frame<'_>, app: &App, area: Rect) { + let uptime = app.start_time.elapsed().as_secs(); + + // Check for clipboard flash message (show for 2 seconds) + let clipboard_flash = app.clipboard_msg.as_ref().and_then(|(msg, when)| { + if when.elapsed().as_secs() < 2 { + Some(msg.clone()) + } else { + None + } + }); + + let mut spans = vec![ + Span::styled(" Up: ", Style::default().fg(Color::DarkGray)), + Span::styled(format_uptime(uptime), Style::default().fg(Color::White)), + Span::styled(" Block: ", Style::default().fg(Color::DarkGray)), + Span::styled( + format!("#{}", app.current_block), + Style::default().fg(Color::Cyan), + ), + Span::styled(" | ", Style::default().fg(Color::DarkGray)), + Span::styled("[q]", Style::default().fg(Color::Yellow)), + Span::styled("uit ", Style::default().fg(Color::DarkGray)), + Span::styled("[Tab]", Style::default().fg(Color::Yellow)), + Span::styled("focus ", Style::default().fg(Color::DarkGray)), + ]; + + if app.block_detail.is_some() { + spans.extend([ + Span::styled("[Esc]", Style::default().fg(Color::Yellow)), + Span::styled("close", Style::default().fg(Color::DarkGray)), + ]); + } else { + match app.active_panel { + Panel::Accounts => { + spans.extend([ + Span::styled("[↑↓]", Style::default().fg(Color::Yellow)), + Span::styled("select ", Style::default().fg(Color::DarkGray)), + Span::styled("[a]", Style::default().fg(Color::Yellow)), + Span::styled("ddress ", Style::default().fg(Color::DarkGray)), + Span::styled("[k]", Style::default().fg(Color::Yellow)), + Span::styled("ey", Style::default().fg(Color::DarkGray)), + ]); + } + Panel::Blocks => { + spans.extend([ + Span::styled("[↑↓]", Style::default().fg(Color::Yellow)), + Span::styled("select ", Style::default().fg(Color::DarkGray)), + Span::styled("[Enter]", Style::default().fg(Color::Yellow)), + Span::styled("txs", Style::default().fg(Color::DarkGray)), + ]); + } + Panel::Logs => { + spans.extend([ + Span::styled("[↑↓]", Style::default().fg(Color::Yellow)), + Span::styled("scroll", Style::default().fg(Color::DarkGray)), + ]); + } + } + } + + if let Some(msg) = clipboard_flash { + spans.extend([ + Span::styled(" ", Style::default()), + Span::styled( + format!("✓ {msg}"), + Style::default() + .fg(Color::Green) + .add_modifier(Modifier::BOLD), + ), + ]); + } + + let text = Line::from(spans); + + let block = Block::default() + .borders(Borders::ALL) + .border_style(Style::default().fg(Color::DarkGray)); + + let paragraph = Paragraph::new(text).block(block); + frame.render_widget(paragraph, area); +} diff --git a/clients/tests/e2e/flows.e2e.test.ts b/clients/tests/e2e/flows.e2e.test.ts index c78bc660..16ae8947 100644 --- a/clients/tests/e2e/flows.e2e.test.ts +++ b/clients/tests/e2e/flows.e2e.test.ts @@ -1,6 +1,15 @@ import { describe, it, before, after } from 'node:test'; import assert from 'node:assert/strict'; -import { createClient, hexToBigInt, http, type Hex, toHex } from 'viem'; +import { + createClient, + createPublicClient, + createWalletClient, + defineChain, + hexToBigInt, + http, + type Hex, + toHex, +} from 'viem'; import { privateKeyToAccount, sign } from 'viem/accounts'; import { randomBytes } from 'node:crypto'; import { createEvnodeClient, type Call } from '../../src/index.ts'; @@ -11,6 +20,14 @@ const EXECUTOR_KEY = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7b const TRANSFER_AMOUNT = BigInt('1000000000000000'); // 0.001 ETH const SPONSOR_FUND_WEI = BigInt('10000000000000000'); // 0.01 ETH const RECEIPT_TIMEOUT_MS = 30_000; +const EV_RETH_TEST_CHAIN = defineChain({ + id: 1234, + name: 'ev-reth e2e', + nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 }, + rpcUrls: { + default: { http: ['http://127.0.0.1:8545'] }, + }, +}); describe('flows e2e', { timeout: 120_000 }, () => { let ctx: TestContext; @@ -52,6 +69,48 @@ describe('flows e2e', { timeout: 120_000 }, () => { assert.ok(balanceBefore > balanceAfter, 'executor should have spent gas'); }); + it('standard viem transfer estimates 21000 gas and sends without gas override', async () => { + const { executorAccount } = makeClient(); + const transport = http(rpcUrl); + const publicClient = createPublicClient({ + chain: EV_RETH_TEST_CHAIN, + transport, + }); + const walletClient = createWalletClient({ + account: executorAccount, + chain: EV_RETH_TEST_CHAIN, + transport, + }); + const recipient = privateKeyToAccount(toHex(randomBytes(32)) as `0x${string}`).address; + + const estimatedGas = await publicClient.estimateGas({ + account: executorAccount.address, + to: recipient, + value: TRANSFER_AMOUNT, + }); + assert.equal(estimatedGas, 21_000n, 'plain ETH transfer should estimate to intrinsic gas'); + + const recipientBefore = await publicClient.getBalance({ address: recipient }); + const hash = await walletClient.sendTransaction({ + to: recipient, + value: TRANSFER_AMOUNT, + }); + const receipt = await publicClient.waitForTransactionReceipt({ + hash, + timeout: RECEIPT_TIMEOUT_MS, + }); + + assert.equal(receipt.status, 'success', 'standard viem transfer should succeed'); + assert.equal(receipt.gasUsed, 21_000n, 'plain ETH transfer should use intrinsic gas'); + + const recipientAfter = await publicClient.getBalance({ address: recipient }); + assert.equal( + recipientAfter - recipientBefore, + TRANSFER_AMOUNT, + 'recipient should receive exact transfer amount', + ); + }); + it('unsponsored batch (two transfers)', async () => { const { client, executorAccount, executor } = makeClient(); const evnode = createEvnodeClient({ client, executor }); diff --git a/crates/node/src/builder.rs b/crates/node/src/builder.rs index c9457183..27398d62 100644 --- a/crates/node/src/builder.rs +++ b/crates/node/src/builder.rs @@ -170,7 +170,7 @@ where match builder.execute_transaction(recovered_tx) { Ok(gas_used) => { - debug!(gas_used, "transaction executed successfully"); + debug!(gas_used = ?gas_used, "transaction executed successfully"); } Err(err) => { tracing::warn!(error = ?err, tx_hash = %tx.tx_hash(), "transaction execution failed"); diff --git a/crates/node/src/evm_executor.rs b/crates/node/src/evm_executor.rs index 0e711055..c0dec0e3 100644 --- a/crates/node/src/evm_executor.rs +++ b/crates/node/src/evm_executor.rs @@ -7,8 +7,8 @@ use alloy_evm::{ block::{ state_changes::{balance_increment_state, post_block_balance_increments}, BlockExecutionError, BlockExecutionResult, BlockExecutor, BlockExecutorFactory, - BlockExecutorFor, BlockValidationError, ExecutableTx, GasOutput, OnStateHook, - StateChangePostBlockSource, StateChangeSource, SystemCaller, + BlockValidationError, ExecutableTx, GasOutput, OnStateHook, StateChangePostBlockSource, + StateChangeSource, SystemCaller, }, eth::{ dao_fork, eip6110, @@ -41,7 +41,11 @@ pub struct EvTxResult { pub tx_type: T, } -impl alloy_evm::block::TxResult for EvTxResult { +impl alloy_evm::block::TxResult for EvTxResult +where + H: Send + 'static, + T: Send + 'static, +{ type HaltReason = H; fn result(&self) -> &ResultAndState { @@ -142,6 +146,7 @@ where >, Spec: EthExecutorSpec, R: ReceiptBuilder>, + ::TxType: Send + 'static, { type Transaction = R::Transaction; type Receipt = R::Receipt; @@ -198,10 +203,7 @@ where }) } - fn commit_transaction( - &mut self, - output: Self::Result, - ) -> Result { + fn commit_transaction(&mut self, output: Self::Result) -> GasOutput { let EvTxResult { result: ResultAndState { result, state }, blob_gas_used, @@ -237,7 +239,7 @@ where self.evm.db_mut().commit(state); - Ok(GasOutput::with_state_gas(tx_gas_used, state_gas_used)) + GasOutput::with_state_gas(tx_gas_used, state_gas_used) } fn receipts(&self) -> &[Self::Receipt] { @@ -373,16 +375,22 @@ impl EvBlockExecutorFactory { impl BlockExecutorFactory for EvBlockExecutorFactory where - R: ReceiptBuilder> - + Clone, - Spec: EthExecutorSpec + Clone, + R: ReceiptBuilder>, + Spec: EthExecutorSpec, EvmF: EvmFactory + FromTxWithEncoded>, + ::TxType: Send + 'static, Self: 'static, { type EvmFactory = EvmF; type ExecutionCtx<'a> = EthBlockExecutionCtx<'a>; type Transaction = R::Transaction; type Receipt = R::Receipt; + type TxExecutionResult = EvTxResult< + ::HaltReason, + ::TxType, + >; + type Executor<'a, DB: alloy_evm::block::state::StateDB, I: Inspector>> = + EvBlockExecutor<'a, EvmF::Evm, &'a Spec, &'a R>; fn evm_factory(&self) -> &Self::EvmFactory { &self.evm_factory @@ -392,11 +400,11 @@ where &'a self, evm: EvmF::Evm, ctx: Self::ExecutionCtx<'a>, - ) -> impl BlockExecutorFor<'a, Self, DB, I> + ) -> Self::Executor<'a, DB, I> where - DB: alloy_evm::block::state::StateDB + 'a, - I: Inspector> + 'a, + DB: alloy_evm::block::state::StateDB, + I: Inspector>, { - EvBlockExecutor::new(evm, ctx, self.spec.clone(), self.receipt_builder.clone()) + EvBlockExecutor::new(evm, ctx, &self.spec, &self.receipt_builder) } }