diff --git a/Cargo.lock b/Cargo.lock index 62ee334f..9e53b962 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,81 +55,93 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.7.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a101d4d016f47f13890a74290fdd17b05dd175191d9337bc600791fb96e4dea8" +checksum = "5758065889c3e6c7ba7bf0a2b02d0f635747074a5527e2a77ba2615ccf06748f" dependencies = [ - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", + "alloy-serde", "alloy-trie", "auto_impl", "c-kzg", - "derive_more", + "derive_more 2.0.1", + "either", + "k256", + "once_cell", + "rand", "serde", + "serde_with", + "thiserror 2.0.4", ] [[package]] name = "alloy-consensus-any" -version = "0.7.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa60357dda9a3d0f738f18844bd6d0f4a5924cc5cf00bfad2ff1369897966123" +checksum = "1b34df6de2299d703ce4686717e60831aa7c47648fa2b07bf4dfa00508e4ec81" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", + "alloy-serde", + "serde", ] [[package]] -name = "alloy-eip2930" +name = "alloy-eip2124" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" dependencies = [ "alloy-primitives", "alloy-rlp", + "crc", "serde", + "thiserror 2.0.4", ] [[package]] -name = "alloy-eip7702" -version = "0.4.2" +name = "alloy-eip2930" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more", "serde", ] [[package]] name = "alloy-eip7702" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cabf647eb4650c91a9d38cb6f972bb320009e7e9d61765fb688a86f1563b33e8" +checksum = "9b15b13d38b366d01e818fe8e710d4d702ef7499eacd44926a06171dd9585d0c" dependencies = [ "alloy-primitives", "alloy-rlp", - "derive_more", "serde", + "thiserror 2.0.4", ] [[package]] name = "alloy-eips" -version = "0.7.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6755b093afef5925f25079dd5a7c8d096398b804ba60cb5275397b06b31689" +checksum = "44ddbb31b8112866c5db62f61fb3bc4b990d4fecd018bd5449102ebabd1d73fd" dependencies = [ + "alloy-eip2124", "alloy-eip2930", - "alloy-eip7702 0.4.2", + "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", + "alloy-serde", + "auto_impl", "c-kzg", - "derive_more", + "derive_more 2.0.1", + "either", "ethereum_ssz", "ethereum_ssz_derive", "once_cell", @@ -138,51 +150,44 @@ dependencies = [ ] [[package]] -name = "alloy-eips" -version = "0.9.2" +name = "alloy-json-abi" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dd5869ed09e399003e0e0ec6903d981b2a92e74c5d37e6b40890bad2517526" +checksum = "125601804507fef5ae7debcbf800906b12741f19800c1c05b953d0f1b990131a" dependencies = [ - "alloy-eip2930", - "alloy-eip7702 0.5.0", "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.9.2", - "c-kzg", - "derive_more", - "once_cell", + "alloy-sol-type-parser", "serde", - "sha2", + "serde_json", ] [[package]] name = "alloy-network-primitives" -version = "0.7.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20219d1ad261da7a6331c16367214ee7ded41d001fabbbd656fbf71898b2773" +checksum = "7117a8abeb3b5b764beb228b2f2c45e991864533d9cb6a0f2e4896a55b968e7c" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", - "alloy-serde 0.7.3", + "alloy-serde", "serde", ] [[package]] name = "alloy-primitives" -version = "0.8.15" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" +checksum = "8c66bb6715b7499ea755bde4c96223ae8eb74e05c014ab38b9db602879ffb825" dependencies = [ "alloy-rlp", "bytes", "cfg-if 1.0.0", "const-hex", - "derive_more", + "derive_more 2.0.1", "foldhash", "getrandom 0.2.15", "hashbrown 0.15.0", - "hex-literal", "indexmap 2.6.0", "itoa", "k256", @@ -191,7 +196,7 @@ dependencies = [ "proptest", "rand", "ruint", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "sha3", "tiny-keccak", @@ -199,9 +204,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -210,9 +215,9 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" dependencies = [ "proc-macro2", "quote", @@ -221,16 +226,16 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "0.7.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d297268357e3eae834ddd6888b15f764cbc0f4b3be9265f5f6ec239013f3d68" +checksum = "a05fbb14c707f1000b013dc842f7acc00ab856b28bdc1ffeb8aacf9f31118d70" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", - "derive_more", + "alloy-serde", + "derive_more 2.0.1", "ethereum_ssz", "ethereum_ssz_derive", "jsonwebtoken", @@ -241,40 +246,29 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.7.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0600b8b5e2dc0cab12cbf91b5a885c35871789fb7b3a57b434bd4fced5b7a8b" +checksum = "8b444e5a081bbc8e06dd1a524a3edfe2218490b5c57278cf6f22ab0956793306" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", + "alloy-serde", "alloy-sol-types", - "derive_more", "itertools 0.13.0", "serde", "serde_json", + "thiserror 2.0.4", ] [[package]] name = "alloy-serde" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afa753a97002a33b2ccb707d9f15f31c81b8c1b786c95b73cc62bb1d1fd0c3f" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.9.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae0465c71d4dced7525f408d84873aeebb71faf807d22d74c4a426430ccd9b55" +checksum = "c35fd0010ad1e00a8214e92739b3560037bf970f33437a432743062af8af6271" dependencies = [ "alloy-primitives", "serde", @@ -283,9 +277,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bfd7853b65a2b4f49629ec975fee274faf6dff15ab8894c620943398ef283c0" +checksum = "c7f9c3c7bc1f4e334e5c5fc59ec8dac894973a71b11da09065affc6094025049" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -297,9 +291,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82ec42f342d9a9261699f8078e57a7a4fda8aaa73c1a212ed3987080e6a9cd13" +checksum = "46ff7aa715eb2404cb87fa94390d2c5d5addd70d9617e20b2398ee6f48cb21f0" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -315,9 +309,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2c50e6a62ee2b4f7ab3c6d0366e5770a21cad426e109c2f40335a1b3aff3df" +checksum = "6f105fa700140c0cc6e2c3377adef650c389ac57b8ead8318a2e6bd52f1ae841" dependencies = [ "const-hex", "dunce", @@ -328,33 +322,60 @@ dependencies = [ "syn-solidity", ] +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c649acc6c9d3893e392c737faeadce30b4a1751eed148ae43bc2f27f29c4480c" +dependencies = [ + "serde", + "winnow 0.7.3", +] + [[package]] name = "alloy-sol-types" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9dc0fffe397aa17628160e16b89f704098bf3c9d74d5d369ebc239575936de5" +checksum = "5f819635439ebb06aa13c96beac9b2e7360c259e90f5160a6848ae0d94d10452" dependencies = [ + "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", "const-hex", + "serde", ] [[package]] name = "alloy-trie" -version = "0.7.6" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a5fd8fea044cc9a8c8a50bb6f28e31f0385d820f116c5b98f6f4e55d6e5590b" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" dependencies = [ "alloy-primitives", "alloy-rlp", "arrayvec", - "derive_more", + "derive_more 1.0.0", "nybbles", "serde", "smallvec", "tracing", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.17" @@ -955,6 +976,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -1075,6 +1109,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -1084,6 +1133,12 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-epoch" version = "0.9.18" @@ -1194,6 +1249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -1213,7 +1269,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "derive_more-impl", + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", ] [[package]] @@ -1228,6 +1293,18 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "unicode-xid", +] + [[package]] name = "difflib" version = "0.4.0" @@ -1255,6 +1332,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -1283,15 +1371,19 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", + "serdect", "signature", "spki", ] [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] [[package]] name = "elliptic-curve" @@ -1308,6 +1400,7 @@ dependencies = [ "pkcs8", "rand_core", "sec1", + "serdect", "subtle", "zeroize", ] @@ -1460,9 +1553,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "foreign-types" @@ -1769,12 +1862,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - [[package]] name = "hmac" version = "0.12.1" @@ -1955,6 +2042,147 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1963,12 +2191,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2005,6 +2244,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -2171,7 +2411,7 @@ dependencies = [ "parking_lot", "pin-project", "rand", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "serde_json", "thiserror 1.0.65", @@ -2307,6 +2547,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", + "serdect", "sha2", ] @@ -2380,6 +2621,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -2667,11 +2914,13 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.2.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95f06be0417d97f81fe4e5c86d7d01b392655a9cac9c19a848aa033e18937b23" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ + "alloy-rlp", "const-hex", + "proptest", "serde", "smallvec", ] @@ -2690,67 +2939,32 @@ name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "op-alloy-consensus" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f0daa0d0936d436a21b57571b1e27c5663aa2ab62f6edae5ba5be999f9f93e" -dependencies = [ - "alloy-consensus", - "alloy-eips 0.7.3", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 0.7.3", - "derive_more", - "serde", - "thiserror 2.0.4", -] - -[[package]] -name = "op-alloy-genesis" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb0964932faa7050b74689f017aca66ffa3e52501080278a81bb0a43836c8dd" dependencies = [ - "alloy-consensus", - "alloy-eips 0.7.3", - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_repr", - "thiserror 2.0.4", + "critical-section", + "portable-atomic", ] [[package]] -name = "op-alloy-protocol" -version = "0.7.3" +name = "op-alloy-consensus" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d8c057c1a5bdf72d1f86c470a4d90f2d2ad1b273caa547c04cd6affe45b466d" +checksum = "d297150146a63778a29400320700e804ec6e1e4d6ec99857cdbbaf17b3de9241" dependencies = [ - "alloc-no-stdlib", "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 0.7.3", - "async-trait", - "brotli", - "cfg-if 1.0.0", - "miniz_oxide", - "op-alloy-consensus", - "op-alloy-genesis", + "alloy-serde", + "derive_more 1.0.0", "serde", "thiserror 2.0.4", - "tracing", - "unsigned-varint", ] [[package]] name = "op-alloy-rpc-jsonrpsee" -version = "0.9.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446c38f9e3e86acac6f2972a4953ffdd8bfef032bec633b0280a95783c0babd" +checksum = "2c20026058b49704e52fcb2f24b106880a0f5d0d99d086778cf9810fc52859e7" dependencies = [ "alloy-primitives", "jsonrpsee", @@ -2758,17 +2972,17 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types" -version = "0.7.3" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73741855ffaa2041b33cb616d7db7180c1149b648c68c23bee9e15501073fb32" +checksum = "7095f87d34fc814e3de06a7af8ffff9121993f322231647f84df304821cc0275" dependencies = [ "alloy-consensus", - "alloy-eips 0.7.3", + "alloy-eips", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 0.7.3", - "derive_more", + "alloy-serde", + "derive_more 1.0.0", "op-alloy-consensus", "serde", "serde_json", @@ -2776,19 +2990,18 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types-engine" -version = "0.7.3" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebedc32e24013c8b3faea62d091bccbb90f871286fe2238c6f7e2ff29974df8e" +checksum = "955a7d0ef9161f4a2a8461ef5d784526741c325410103d654706863cf4a32736" dependencies = [ - "alloy-eips 0.7.3", + "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", - "alloy-serde 0.7.3", - "derive_more", + "alloy-serde", + "derive_more 1.0.0", "ethereum_ssz", "op-alloy-consensus", - "op-alloy-genesis", - "op-alloy-protocol", "serde", "snap", "thiserror 2.0.4", @@ -3437,8 +3650,8 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "1.1.2" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e022b6fd92a33cd44e3ae51ee2fc2ecc0f773222#e022b6fd92a33cd44e3ae51ee2fc2ecc0f773222" +version = "1.2.2" +source = "git+https://github.com/paradigmxyz/reth.git?rev=c1a255a8322d86a2735b847cd88a8f74acd733c5#c1a255a8322d86a2735b847cd88a8f74acd733c5" dependencies = [ "alloy-rpc-types-engine", "http 1.1.0", @@ -3497,8 +3710,9 @@ dependencies = [ name = "rollup-boost" version = "0.1.0" dependencies = [ - "alloy-eips 0.9.2", + "alloy-eips", "alloy-primitives", + "alloy-rlp", "alloy-rpc-types-engine", "alloy-rpc-types-eth", "anyhow", @@ -3547,6 +3761,7 @@ dependencies = [ "tracing", "tracing-opentelemetry", "tracing-subscriber", + "url", ] [[package]] @@ -3599,12 +3814,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" -dependencies = [ - "rand", -] +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc-hex" @@ -3797,6 +4009,7 @@ dependencies = [ "der", "generic-array", "pkcs8", + "serdect", "subtle", "zeroize", ] @@ -3888,25 +4101,54 @@ dependencies = [ ] [[package]] -name = "serde_repr" -version = "0.1.19" +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.6.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", "proc-macro2", "quote", "syn 2.0.90", ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "serdect" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", + "base16ct", "serde", ] @@ -4070,6 +4312,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -4084,18 +4332,18 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ "heck", "proc-macro2", @@ -4134,9 +4382,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.14" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0523f59468a2696391f2a772edc089342aacd53c3caa2ac3264e598edf119b" +checksum = "ac9f9798a84bca5cd4d1760db691075fda8f2c3a5d9647e8bfd29eb9b3fabb87" dependencies = [ "paste", "proc-macro2", @@ -4159,6 +4407,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "system-configuration" version = "0.6.1" @@ -4305,20 +4564,15 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.8.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.41.0" @@ -4409,7 +4663,7 @@ checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.6.0", "toml_datetime", - "winnow", + "winnow 0.6.20", ] [[package]] @@ -4654,39 +4908,18 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unsigned-varint" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" - [[package]] name = "untrusted" version = "0.9.0" @@ -4695,15 +4928,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -4931,7 +5176,16 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core", + "windows-core 0.58.0", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ "windows-targets", ] @@ -4970,6 +5224,12 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-registry" version = "0.2.0" @@ -5091,6 +5351,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.33.0" @@ -5100,6 +5369,18 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -5109,6 +5390,30 @@ dependencies = [ "tap", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -5130,6 +5435,27 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -5150,6 +5476,28 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "zstd" version = "0.13.2" diff --git a/Cargo.toml b/Cargo.toml index dc9daaa9..b035c410 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,14 @@ version = "0.1.0" edition = "2021" [dependencies] -op-alloy-rpc-types-engine = "0.7.3" -op-alloy-rpc-types = "0.7.3" -op-alloy-rpc-jsonrpsee = { version = "0.9.6", features = ["client"] } -alloy-rpc-types-engine = "0.7.3" -alloy-rpc-types-eth = "0.7.3" -alloy-primitives = { version = "0.8.10", features = ["rand"] } -alloy-eips = { version = "0.9.2", features = ["serde"] } +op-alloy-rpc-types-engine = "0.11.0" +op-alloy-rpc-types = "0.11.0" +op-alloy-rpc-jsonrpsee = { version = "0.11.0", features = ["client"] } +alloy-rlp = "0.3.10" +alloy-rpc-types-engine = "0.12.3" +alloy-rpc-types-eth = "0.12.3" +alloy-primitives = { version = "0.8.21", features = [ "getrandom" ] } +alloy-eips = { version = "0.12.3", features = ["serde"] } tokio = { version = "1", features = ["full"] } tracing = "0.1.4" tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] } @@ -48,6 +49,7 @@ metrics-process = "2.3.1" metrics-util = "0.18.0" eyre = "0.6.12" paste = "1.0.15" +url = { version = "2.3", default-features = false } # dev dependencies for integration tests time = { version = "0.3.36", features = ["macros", "formatting", "parsing"] } @@ -61,7 +63,7 @@ predicates = "3.1.2" tokio-util = { version = "0.7.13" } nix = "0.15.0" bytes = "1.2" -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "e022b6fd92a33cd44e3ae51ee2fc2ecc0f773222" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "c1a255a8322d86a2735b847cd88a8f74acd733c5" } ctor = "0.3.5" [features] diff --git a/src/client.rs b/src/client.rs index 78aeecb2..ba73d468 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,7 +1,7 @@ use crate::auth_layer::{AuthClientLayer, AuthClientService}; use crate::metrics::ClientMetrics; use crate::server::{EngineApiClient, PayloadSource}; -use alloy_primitives::B256; +use alloy_primitives::{Bytes, B256}; use alloy_rpc_types_engine::{ ExecutionPayload, ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, JwtError, JwtSecret, PayloadId, PayloadStatus, @@ -12,7 +12,10 @@ use jsonrpsee::core::{ClientError, RpcResult}; use jsonrpsee::http_client::transport::HttpBackend; use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; use jsonrpsee::types::ErrorCode; -use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; +use op_alloy_rpc_types_engine::{ + OpExecutionPayloadEnvelopeV3, OpExecutionPayloadEnvelopeV4, OpExecutionPayloadV4, + OpPayloadAttributes, +}; use paste::paste; use std::path::PathBuf; use std::sync::Arc; @@ -125,6 +128,33 @@ impl ExecutionClient { response } + pub async fn get_payload_v4( + &self, + payload_id: PayloadId, + ) -> RpcResult<(OpExecutionPayloadEnvelopeV4, PayloadSource)> { + let start = Instant::now(); + let response = self + .auth_client + .get_payload_v4(payload_id) + .await + .map(|payload| (payload, self.payload_source.clone())) + .map_err(|e| match e { + ClientError::Call(err) => err, + other_error => { + error!( + message = "error calling get_payload_v4", + "error" = %other_error, + "payload_id" = %payload_id + ); + ErrorCode::InternalError.into() + } + }); + if let Some(metrics) = &self.metrics { + metrics.record_get_payload_v4(start.elapsed(), self.get_response_code(&response)); + } + response + } + pub async fn new_payload_v3( &self, payload: ExecutionPayloadV3, @@ -156,6 +186,43 @@ impl ExecutionClient { response } + pub async fn new_payload_v4( + &self, + payload: OpExecutionPayloadV4, + versioned_hashes: Vec, + parent_beacon_block_root: B256, + execution_requests: Vec, + ) -> RpcResult { + let execution_payload = ExecutionPayload::from(payload.payload_inner.clone()); + let block_hash = execution_payload.block_hash(); + let start = Instant::now(); + let response = self + .auth_client + .new_payload_v4( + payload, + versioned_hashes, + parent_beacon_block_root, + execution_requests, + ) + .await + .map_err(|e| match e { + ClientError::Call(err) => err, + other_error => { + error!( + message = "error calling new_payload_v4", + "url" = ?self.auth_rpc, + "error" = %other_error, + "block_hash" = %block_hash + ); + ErrorCode::InternalError.into() + } + }); + if let Some(metrics) = &self.metrics { + metrics.record_new_payload_v4(start.elapsed(), self.get_response_code(&response)); + } + response + } + fn get_response_code(&self, response: &RpcResult) -> String { match response { Ok(_) => StatusCode::OK.to_string(), diff --git a/src/metrics.rs b/src/metrics.rs index 701258d0..5d916562 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -11,9 +11,15 @@ pub struct ServerMetrics { #[metric(describe = "Total latency for server `engine_newPayloadV3` call")] pub new_payload_v3_total: Histogram, + #[metric(describe = "Total latency for server `engine_newPayloadV4` call")] + pub new_payload_v4_total: Histogram, + #[metric(describe = "Total latency for server `engine_getPayloadV3` call")] pub get_payload_v3_total: Histogram, + #[metric(describe = "Total latency for server `engine_getPayloadV4` call")] + pub get_payload_v4_total: Histogram, + #[metric(describe = "Total latency for server `engine_forkChoiceUpdatedV3` call")] pub fork_choice_updated_v3_total: Histogram, @@ -43,18 +49,34 @@ pub struct ClientMetrics { #[allow(dead_code)] pub new_payload_v3: Histogram, + #[metric(describe = "Latency for client `engine_newPayloadV4` call")] + #[allow(dead_code)] + pub new_payload_v4: Histogram, + #[metric(describe = "Number of client `engine_newPayloadV3` responses", labels = ["code"])] #[allow(dead_code)] pub new_payload_v3_response_count: Counter, + #[metric(describe = "Number of client `engine_newPayloadV4` responses", labels = ["code"])] + #[allow(dead_code)] + pub new_payload_v4_response_count: Counter, + #[metric(describe = "Latency for client `engine_getPayloadV3` call")] #[allow(dead_code)] pub get_payload_v3: Histogram, + #[metric(describe = "Latency for client `engine_getPayloadV4` call")] + #[allow(dead_code)] + pub get_payload_v4: Histogram, + #[metric(describe = "Number of client `engine_getPayloadV3` responses", labels = ["code"])] #[allow(dead_code)] pub get_payload_v3_response_count: Counter, + #[metric(describe = "Number of client `engine_getPayloadV4` responses", labels = ["code"])] + #[allow(dead_code)] + pub get_payload_v4_response_count: Counter, + #[metric(describe = "Latency for client `engine_forkChoiceUpdatedV3` call")] #[allow(dead_code)] pub fork_choice_updated_v3: Histogram, @@ -111,9 +133,13 @@ impl ClientMetrics { Self { new_payload_v3: histogram!("rpc.new_payload_v3", "target" => source.to_string()), get_payload_v3: histogram!("rpc.get_payload_v3", "target" => source.to_string()), + new_payload_v4: histogram!("rpc.new_payload_v4", "target" => source.to_string()), + get_payload_v4: histogram!("rpc.get_payload_v4", "target" => source.to_string()), fork_choice_updated_v3: histogram!("rpc.fork_choice_updated_v3", "target" => source.to_string()), new_payload_v3_response_count: counter!("rpc.new_payload_v3_response_count"), get_payload_v3_response_count: counter!("rpc.get_payload_v3_response_count"), + new_payload_v4_response_count: counter!("rpc.new_payload_v4_response_count"), + get_payload_v4_response_count: counter!("rpc.get_payload_v4_response_count"), fork_choice_updated_v3_response_count: counter!( "rpc.fork_choice_updated_v3_response_count" ), @@ -130,6 +156,16 @@ impl ClientMetrics { counter!("rpc.get_payload_v3_response_count", "code" => code).increment(1); } + pub fn record_new_payload_v4(&self, latency: Duration, code: String) { + self.new_payload_v4.record(latency.as_secs_f64()); + counter!("rpc.new_payload_v4_response_count", "code" => code).increment(1); + } + + pub fn record_get_payload_v4(&self, latency: Duration, code: String) { + self.get_payload_v4.record(latency.as_secs_f64()); + counter!("rpc.get_payload_v4_response_count", "code" => code).increment(1); + } + pub fn record_fork_choice_updated_v3(&self, latency: Duration, code: String) { self.fork_choice_updated_v3.record(latency.as_secs_f64()); counter!("rpc.fork_choice_updated_v3_response_count", "code" => code).increment(1); diff --git a/src/server.rs b/src/server.rs index a2995ed8..8dbbbaee 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,7 +1,7 @@ use crate::client::ExecutionClient; use crate::debug_api; use crate::metrics::ServerMetrics; -use alloy_primitives::B256; +use alloy_primitives::{Bytes, B256}; use debug_api::DebugServer; use std::num::NonZero; use std::sync::Arc; @@ -13,10 +13,13 @@ use alloy_rpc_types_engine::{ }; use jsonrpsee::core::{async_trait, ClientError, RegisterMethodError, RpcResult}; use jsonrpsee::types::error::INVALID_REQUEST_CODE; -use jsonrpsee::types::ErrorObject; +use jsonrpsee::types::{ErrorCode, ErrorObject}; use jsonrpsee::RpcModule; use lru::LruCache; -use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpPayloadAttributes}; +use op_alloy_rpc_types_engine::{ + OpExecutionPayloadEnvelopeV3, OpExecutionPayloadEnvelopeV4, OpExecutionPayloadV4, + OpPayloadAttributes, +}; use opentelemetry::global::{self, BoxedSpan, BoxedTracer}; use opentelemetry::trace::{Span, TraceContextExt, Tracer}; use opentelemetry::{Context, KeyValue}; @@ -36,6 +39,167 @@ pub struct PayloadTraceContext { local_to_external_payload_ids: Arc>>, } +enum GetPayloadVersion { + V3, + V4, +} + +impl GetPayloadVersion { + pub fn as_str(&self) -> &'static str { + match self { + GetPayloadVersion::V3 => "v3", + GetPayloadVersion::V4 => "v4", + } + } + + pub async fn get_payload( + &self, + client: &ExecutionClient, + payload_id: PayloadId, + ) -> RpcResult<(OpExecutionPayloadEnvelope, PayloadSource)> { + match self { + GetPayloadVersion::V3 => client + .get_payload_v3(payload_id) + .await + .map(|(payload, source)| (OpExecutionPayloadEnvelope::V3(payload), source)), + GetPayloadVersion::V4 => client + .get_payload_v4(payload_id) + .await + .map(|(payload, source)| (OpExecutionPayloadEnvelope::V4(payload), source)), + } + } +} + +impl Clone for GetPayloadVersion { + fn clone(&self) -> Self { + match self { + GetPayloadVersion::V3 => GetPayloadVersion::V3, + GetPayloadVersion::V4 => GetPayloadVersion::V4, + } + } +} + +struct NewPayloadV3 { + payload: ExecutionPayloadV3, + versioned_hashes: Vec, + parent_beacon_block_root: B256, +} + +impl Clone for NewPayloadV3 { + fn clone(&self) -> Self { + NewPayloadV3 { + payload: self.payload.clone(), + versioned_hashes: self.versioned_hashes.clone(), + parent_beacon_block_root: self.parent_beacon_block_root, + } + } +} + +struct NewPayloadV4 { + payload: OpExecutionPayloadV4, + versioned_hashes: Vec, + parent_beacon_block_root: B256, + execution_requests: Vec, +} + +impl Clone for NewPayloadV4 { + fn clone(&self) -> Self { + NewPayloadV4 { + payload: self.payload.clone(), + versioned_hashes: self.versioned_hashes.clone(), + parent_beacon_block_root: self.parent_beacon_block_root, + execution_requests: self.execution_requests.clone(), + } + } +} +enum NewPayloadVersion { + V3(NewPayloadV3), + V4(NewPayloadV4), +} + +impl NewPayloadVersion { + pub fn as_str(&self) -> &'static str { + match self { + NewPayloadVersion::V3(_) => "v3", + NewPayloadVersion::V4(_) => "v4", + } + } + + pub fn execution_payload(&self) -> ExecutionPayloadV3 { + match self { + NewPayloadVersion::V3(payload) => payload.payload.clone(), + NewPayloadVersion::V4(payload) => payload.payload.payload_inner.clone(), + } + } + + pub async fn new_payload(&self, client: &ExecutionClient) -> RpcResult { + match self { + NewPayloadVersion::V3(payload) => { + client + .new_payload_v3( + payload.payload.clone(), + payload.versioned_hashes.clone(), + payload.parent_beacon_block_root, + ) + .await + } + NewPayloadVersion::V4(payload) => { + client + .new_payload_v4( + payload.payload.clone(), + payload.versioned_hashes.clone(), + payload.parent_beacon_block_root, + payload.execution_requests.clone(), + ) + .await + } + } + } +} + +impl Clone for NewPayloadVersion { + fn clone(&self) -> Self { + match self { + NewPayloadVersion::V3(payload) => NewPayloadVersion::V3(payload.clone()), + NewPayloadVersion::V4(payload) => NewPayloadVersion::V4(payload.clone()), + } + } +} + +enum OpExecutionPayloadEnvelope { + V3(OpExecutionPayloadEnvelopeV3), + V4(OpExecutionPayloadEnvelopeV4), +} + +impl OpExecutionPayloadEnvelope { + fn execution_payload(&self) -> ExecutionPayloadV3 { + match self { + OpExecutionPayloadEnvelope::V3(envelope) => envelope.execution_payload.clone(), + OpExecutionPayloadEnvelope::V4(envelope) => envelope.execution_payload.clone(), + } + } + + fn parent_beacon_block_root(&self) -> B256 { + match self { + OpExecutionPayloadEnvelope::V3(envelope) => envelope.parent_beacon_block_root, + OpExecutionPayloadEnvelope::V4(envelope) => envelope.parent_beacon_block_root, + } + } +} + +impl Clone for OpExecutionPayloadEnvelope { + fn clone(&self) -> Self { + match self { + OpExecutionPayloadEnvelope::V3(envelope) => { + OpExecutionPayloadEnvelope::V3(envelope.clone()) + } + OpExecutionPayloadEnvelope::V4(envelope) => { + OpExecutionPayloadEnvelope::V4(envelope.clone()) + } + } + } +} + impl PayloadTraceContext { fn new() -> Self { PayloadTraceContext { @@ -217,6 +381,12 @@ pub trait EngineApi { payload_id: PayloadId, ) -> RpcResult; + #[method(name = "getPayloadV4")] + async fn get_payload_v4( + &self, + payload_id: PayloadId, + ) -> RpcResult; + #[method(name = "newPayloadV3")] async fn new_payload_v3( &self, @@ -224,6 +394,15 @@ pub trait EngineApi { versioned_hashes: Vec, parent_beacon_block_root: B256, ) -> RpcResult; + + #[method(name = "newPayloadV4")] + async fn new_payload_v4( + &self, + payload: OpExecutionPayloadV4, + versioned_hashes: Vec, + parent_beacon_block_root: B256, + execution_requests: Vec, + ) -> RpcResult; } #[async_trait] @@ -249,12 +428,31 @@ impl EngineApiServer for RollupBoostServer { payload_id: PayloadId, ) -> RpcResult { let start = Instant::now(); - let res = self.get_payload_v3(payload_id).await; + let res = self.get_payload(GetPayloadVersion::V3, payload_id).await; let elapsed = start.elapsed(); if let Some(metrics) = &self.metrics { metrics.get_payload_v3_total.record(elapsed); } - res + res.and_then(|envelope| match envelope { + OpExecutionPayloadEnvelope::V3(payload) => Ok(payload), + _ => Err(ErrorCode::InternalError.into()), + }) + } + + async fn get_payload_v4( + &self, + payload_id: PayloadId, + ) -> RpcResult { + let start = Instant::now(); + let res = self.get_payload(GetPayloadVersion::V4, payload_id).await; + let elapsed = start.elapsed(); + if let Some(metrics) = &self.metrics { + metrics.get_payload_v4_total.record(elapsed); + } + res.and_then(|envelope| match envelope { + OpExecutionPayloadEnvelope::V4(payload) => Ok(payload), + _ => Err(ErrorCode::InternalError.into()), + }) } async fn new_payload_v3( @@ -265,7 +463,11 @@ impl EngineApiServer for RollupBoostServer { ) -> RpcResult { let start = Instant::now(); let res = self - .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) + .new_payload(NewPayloadVersion::V3(NewPayloadV3 { + payload, + versioned_hashes, + parent_beacon_block_root, + })) .await; let elapsed = start.elapsed(); if let Some(metrics) = &self.metrics { @@ -273,6 +475,29 @@ impl EngineApiServer for RollupBoostServer { } res } + + async fn new_payload_v4( + &self, + payload: OpExecutionPayloadV4, + versioned_hashes: Vec, + parent_beacon_block_root: B256, + execution_requests: Vec, + ) -> RpcResult { + let start = Instant::now(); + let res = self + .new_payload(NewPayloadVersion::V4(NewPayloadV4 { + payload, + versioned_hashes, + parent_beacon_block_root, + execution_requests, + })) + .await; + let elapsed = start.elapsed(); + if let Some(metrics) = &self.metrics { + metrics.new_payload_v4_total.record(elapsed); + } + res + } } impl RollupBoostServer { @@ -425,12 +650,17 @@ impl RollupBoostServer { Ok(l2_response) } - async fn get_payload_v3( + async fn get_payload( &self, + version: GetPayloadVersion, payload_id: PayloadId, - ) -> RpcResult { - info!(message = "received get_payload_v3", "payload_id" = %payload_id); - let l2_client_future = self.l2_client.get_payload_v3(payload_id); + ) -> RpcResult { + let label = version.as_str(); + info!(message = format!("received get_payload_{}", label), "payload_id" = %payload_id); + + let l2_version = version.clone(); + let l2_client_future = + async move { l2_version.get_payload(&self.l2_client, payload_id).await }; let builder_client_future = Box::pin(async move { let execution_mode = self.execution_mode.lock().await; @@ -482,19 +712,36 @@ impl RollupBoostServer { } let builder = self.builder_client.clone(); - let (payload, source) = builder.get_payload_v3(external_payload_id).await.map_err(|e| { - error!(message = "error calling get_payload_v3 from builder", "url" = ?builder.auth_rpc, "error" = %e, "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); + let (payload, source) = version.get_payload(&builder, external_payload_id).await.map_err(|e| { + error!(message = "error calling get_payload from builder", "url" = ?builder.auth_rpc, "error" = %e, "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); e - })?; + })?; - let block_hash = ExecutionPayload::from(payload.clone().execution_payload).block_hash(); + let block_hash = + ExecutionPayload::from(payload.clone().execution_payload()).block_hash(); info!(message = "received payload from builder", "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id, "block_hash" = %block_hash); // Send the payload to the local execution engine with engine_newPayload to validate the block from the builder. // Otherwise, we do not want to risk the network to a halt since op-node will not be able to propose the block. // If validation fails, return the local block since that one has already been validated. - let payload_status = self.l2_client.auth_client.new_payload_v3(payload.execution_payload.clone(), vec![], payload.parent_beacon_block_root).await.map_err(|e| { - error!(message = "error calling new_payload_v3 to validate builder payload", "url" = ?self.l2_client.auth_rpc, "error" = %e, "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); + let l2_call = match version { + GetPayloadVersion::V3 => self.l2_client.auth_client.new_payload_v3( + payload.execution_payload(), + vec![], + payload.parent_beacon_block_root(), + ), + GetPayloadVersion::V4 => self.l2_client.auth_client.new_payload_v4( + OpExecutionPayloadV4 { + payload_inner: payload.execution_payload(), + withdrawals_root: B256::ZERO, + }, + vec![], + payload.parent_beacon_block_root(), + vec![], + ), + }; + let payload_status = l2_call.await.map_err(|e| { + error!(message = format!("error calling new_payload_{} to validate builder payload", label), "url" = ?self.l2_client.auth_rpc, "error" = %e, "local_payload_id" = %payload_id, "external_payload_id" = %external_payload_id); e })?; if let Some(mut s) = span { @@ -527,7 +774,7 @@ impl RollupBoostServer { (Err(_), Err(e)) => Err(e), }; payload.map(|(payload, context)| { - let inner_payload = ExecutionPayload::from(payload.clone().execution_payload); + let inner_payload = ExecutionPayload::from(payload.clone().execution_payload()); let block_hash = inner_payload.block_hash(); let block_number = inner_payload.block_number(); @@ -545,20 +792,17 @@ impl RollupBoostServer { "context" = %context, "payload_id" = %payload_id ); + payload }) } - async fn new_payload_v3( - &self, - payload: ExecutionPayloadV3, - versioned_hashes: Vec, - parent_beacon_block_root: B256, - ) -> RpcResult { - let execution_payload = ExecutionPayload::from(payload.clone()); + async fn new_payload(&self, version: NewPayloadVersion) -> RpcResult { + let label = version.as_str(); + let execution_payload = ExecutionPayload::from(version.execution_payload()); let block_hash = execution_payload.block_hash(); let parent_hash = execution_payload.parent_hash(); - info!(message = "received new_payload_v3", "block_hash" = %block_hash); + info!(message = format!("received new_payload_{}", label), "block_hash" = %block_hash); // async call to builder to sync the builder node let execution_mode = self.execution_mode.lock().await; if self.boost_sync && !execution_mode.is_disabled() { @@ -583,18 +827,18 @@ impl RollupBoostServer { .await; let builder = self.builder_client.clone(); - let builder_payload = payload.clone(); - let builder_versioned_hashes = versioned_hashes.clone(); + let builder_version = version.clone(); tokio::spawn(async move { - let _ = builder.new_payload_v3(builder_payload, builder_versioned_hashes, parent_beacon_block_root).await + let new_payload_response = builder_version.new_payload(&builder).await; + let _ = new_payload_response .map(|response: PayloadStatus| { if response.is_invalid() { - error!(message = "builder rejected new_payload_v3", "url" = ?builder.auth_rpc, "block_hash" = %block_hash); + error!(message = format!("builder rejected new_payload_{}", label), "url" = ?builder.auth_rpc, "block_hash" = %block_hash); } else { - info!(message = "called new_payload_v3 to builder", "url" = ?builder.auth_rpc, "payload_status" = %response.status, "block_hash" = %block_hash); + info!(message = format!("called new_payload_{} to builder", label), "url" = ?builder.auth_rpc, "payload_status" = %response.status, "block_hash" = %block_hash); } }).map_err(|e| { - error!(message = "error calling new_payload_v3 to builder", "url" = ?builder.auth_rpc, "error" = %e, "block_hash" = %block_hash); + error!(message = format!("error calling new_payload_{} to builder", label), "url" = ?builder.auth_rpc, "error" = %e, "block_hash" = %block_hash); e }); if let Some(mut spans) = spans { @@ -602,9 +846,8 @@ impl RollupBoostServer { }; }); } - self.l2_client - .new_payload_v3(payload, versioned_hashes, parent_beacon_block_root) - .await + + version.new_payload(&self.l2_client).await } } @@ -640,57 +883,78 @@ mod tests { pub struct MockEngineServer { fcu_requests: Arc)>>>, get_payload_requests: Arc>>, + get_payload_v4_requests: Arc>>, new_payload_requests: Arc, B256)>>>, + new_payload_v4_requests: Arc, B256, Vec)>>>, fcu_response: RpcResult, get_payload_response: RpcResult, + get_payload_v4_response: RpcResult, new_payload_response: RpcResult, + new_payload_v4_response: RpcResult, pub override_payload_id: Option, } impl MockEngineServer { pub fn new() -> Self { + let execution_payload = ExecutionPayloadV3 { + payload_inner: ExecutionPayloadV2 { + payload_inner: ExecutionPayloadV1 { + base_fee_per_gas: U256::from(7u64), + block_number: 0xa946u64, + block_hash: hex!("a5ddd3f286f429458a39cafc13ffe89295a7efa8eb363cf89a1a4887dbcf272b").into(), + logs_bloom: hex!("00200004000000000000000080000000000200000000000000000000000000000000200000000000000000000000000000000000800000000200000000000000000000000000000000000008000000200000000000000000000001000000000000000000000000000000800000000000000000000100000000000030000000000000000040000000000000000000000000000000000800080080404000000000000008000000000008200000000000200000000000000000000000000000000000000002000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000100000000000000000000").into(), + extra_data: hex!("d883010d03846765746888676f312e32312e31856c696e7578").into(), + gas_limit: 0x1c9c380, + gas_used: 0x1f4a9, + timestamp: 0x651f35b8, + fee_recipient: hex!("f97e180c050e5ab072211ad2c213eb5aee4df134").into(), + parent_hash: hex!("d829192799c73ef28a7332313b3c03af1f2d5da2c36f8ecfafe7a83a3bfb8d1e").into(), + prev_randao: hex!("753888cc4adfbeb9e24e01c84233f9d204f4a9e1273f0e29b43c4c148b2b8b7e").into(), + receipts_root: hex!("4cbc48e87389399a0ea0b382b1c46962c4b8e398014bf0cc610f9c672bee3155").into(), + state_root: hex!("017d7fa2b5adb480f5e05b2c95cb4186e12062eed893fc8822798eed134329d1").into(), + transactions: vec![], + }, + withdrawals: vec![], + }, + blob_gas_used: 0xc0000, + excess_blob_gas: 0x580000, + }; + + let base_payload_envelope = OpExecutionPayloadEnvelopeV3 { + execution_payload: execution_payload.clone(), + block_value: U256::from(0), + blobs_bundle: BlobsBundleV1 { + commitments: vec![], + proofs: vec![], + blobs: vec![], + }, + should_override_builder: false, + parent_beacon_block_root: B256::ZERO, + }; + Self { fcu_requests: Arc::new(Mutex::new(vec![])), get_payload_requests: Arc::new(Mutex::new(vec![])), + get_payload_v4_requests: Arc::new(Mutex::new(vec![])), new_payload_requests: Arc::new(Mutex::new(vec![])), - fcu_response: Ok(ForkchoiceUpdated::new(PayloadStatus::from_status(PayloadStatusEnum::Valid))), - get_payload_response: Ok(OpExecutionPayloadEnvelopeV3{ - execution_payload: ExecutionPayloadV3 { - payload_inner: ExecutionPayloadV2 { - payload_inner: ExecutionPayloadV1 { - base_fee_per_gas: U256::from(7u64), - block_number: 0xa946u64, - block_hash: hex!("a5ddd3f286f429458a39cafc13ffe89295a7efa8eb363cf89a1a4887dbcf272b").into(), - logs_bloom: hex!("00200004000000000000000080000000000200000000000000000000000000000000200000000000000000000000000000000000800000000200000000000000000000000000000000000008000000200000000000000000000001000000000000000000000000000000800000000000000000000100000000000030000000000000000040000000000000000000000000000000000800080080404000000000000008000000000008200000000000200000000000000000000000000000000000000002000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000100000000000000000000").into(), - extra_data: hex!("d883010d03846765746888676f312e32312e31856c696e7578").into(), - gas_limit: 0x1c9c380, - gas_used: 0x1f4a9, - timestamp: 0x651f35b8, - fee_recipient: hex!("f97e180c050e5ab072211ad2c213eb5aee4df134").into(), - parent_hash: hex!("d829192799c73ef28a7332313b3c03af1f2d5da2c36f8ecfafe7a83a3bfb8d1e").into(), - prev_randao: hex!("753888cc4adfbeb9e24e01c84233f9d204f4a9e1273f0e29b43c4c148b2b8b7e").into(), - receipts_root: hex!("4cbc48e87389399a0ea0b382b1c46962c4b8e398014bf0cc610f9c672bee3155").into(), - state_root: hex!("017d7fa2b5adb480f5e05b2c95cb4186e12062eed893fc8822798eed134329d1").into(), - transactions: vec![], - }, - withdrawals: vec![], - }, - blob_gas_used: 0xc0000, - excess_blob_gas: 0x580000, - }, - block_value: U256::from(0), - blobs_bundle: BlobsBundleV1{ - commitments: vec![], - proofs: vec![], - blobs: vec![], - }, - should_override_builder: false, - parent_beacon_block_root: B256::ZERO, - }), - override_payload_id: None, - new_payload_response: Ok(PayloadStatus::from_status(PayloadStatusEnum::Valid)), - } + new_payload_v4_requests: Arc::new(Mutex::new(vec![])), + fcu_response: Ok(ForkchoiceUpdated::new(PayloadStatus::from_status( + PayloadStatusEnum::Valid, + ))), + get_payload_response: Ok(base_payload_envelope.clone()), + get_payload_v4_response: Ok(OpExecutionPayloadEnvelopeV4 { + execution_payload: base_payload_envelope.execution_payload.clone(), + block_value: base_payload_envelope.block_value, + blobs_bundle: base_payload_envelope.blobs_bundle.clone(), + should_override_builder: base_payload_envelope.should_override_builder, + parent_beacon_block_root: base_payload_envelope.parent_beacon_block_root, + execution_requests: vec![], + }), + override_payload_id: None, + new_payload_response: Ok(PayloadStatus::from_status(PayloadStatusEnum::Valid)), + new_payload_v4_response: Ok(PayloadStatus::from_status(PayloadStatusEnum::Valid)), + } } } @@ -836,6 +1100,53 @@ mod tests { assert_eq!(req.2, B256::ZERO); drop(new_payload_requests_mu); + // test new_payload_v4 success + let new_payload_response = test_harness + .client + .new_payload_v4( + OpExecutionPayloadV4 { + payload_inner: test_harness + .l2_mock + .get_payload_v4_response + .clone() + .unwrap() + .execution_payload + .clone(), + withdrawals_root: B256::ZERO, + }, + vec![], + B256::ZERO, + vec![], + ) + .await; + if let Err(ref err) = new_payload_response { + println!("Test encountered error: {:?}", err); + } + assert!(new_payload_response.is_ok()); + let new_payload_requests = test_harness.l2_mock.new_payload_v4_requests.clone(); + let new_payload_requests_mu = new_payload_requests.lock().unwrap(); + let new_payload_requests_builder = + test_harness.builder_mock.new_payload_v4_requests.clone(); + let new_payload_requests_builder_mu = new_payload_requests_builder.lock().unwrap(); + assert_eq!(new_payload_requests_mu.len(), 1); + assert_eq!(new_payload_requests_builder_mu.len(), 0); + let req: &(ExecutionPayloadV3, Vec>, B256, Vec) = + new_payload_requests_mu.first().unwrap(); + assert_eq!( + req.0, + test_harness + .l2_mock + .get_payload_v4_response + .clone() + .unwrap() + .execution_payload + .clone() + ); + assert_eq!(req.1, Vec::>::new()); + assert_eq!(req.2, B256::ZERO); + assert_eq!(req.3, Vec::::new()); + drop(new_payload_requests_mu); + // test get_payload_v3 success let get_payload_response = test_harness .client @@ -854,6 +1165,25 @@ mod tests { let req: &PayloadId = get_payload_requests_mu.first().unwrap(); assert_eq!(*req, PayloadId::new([0, 0, 0, 0, 0, 0, 0, 1])); + // test get_payload_v4 success + let get_payload_response = test_harness + .client + .get_payload_v4(PayloadId::new([0, 0, 0, 0, 0, 0, 1, 0])) + .await; + assert!(get_payload_response.is_ok()); + let get_payload_requests = test_harness.l2_mock.get_payload_v4_requests.clone(); + let get_payload_requests_mu = get_payload_requests.lock().unwrap(); + let get_payload_requests_builder = + test_harness.builder_mock.get_payload_v4_requests.clone(); + let get_payload_requests_builder_mu = get_payload_requests_builder.lock().unwrap(); + let new_payload_requests = test_harness.l2_mock.new_payload_v4_requests.clone(); + let new_payload_requests_mu = new_payload_requests.lock().unwrap(); + assert_eq!(get_payload_requests_builder_mu.len(), 1); + assert_eq!(get_payload_requests_mu.len(), 1); + assert_eq!(new_payload_requests_mu.len(), 2); + let req: &PayloadId = get_payload_requests_mu.first().unwrap(); + assert_eq!(*req, PayloadId::new([0, 0, 0, 0, 0, 0, 1, 0])); + test_harness.cleanup().await; } @@ -960,6 +1290,17 @@ mod tests { }) .unwrap(); + module + .register_method("engine_getPayloadV4", move |params, _, _| { + let params: (PayloadId,) = params.parse()?; + let mut get_payload_requests = + mock_engine_server.get_payload_v4_requests.lock().unwrap(); + get_payload_requests.push(params.0); + + mock_engine_server.get_payload_v4_response.clone() + }) + .unwrap(); + module .register_method("engine_newPayloadV3", move |params, _, _| { let params: (ExecutionPayloadV3, Vec, B256) = params.parse()?; @@ -971,6 +1312,17 @@ mod tests { }) .unwrap(); + module + .register_method("engine_newPayloadV4", move |params, _, _| { + let params: (ExecutionPayloadV3, Vec, B256, Vec) = params.parse()?; + let mut new_payload_requests = + mock_engine_server.new_payload_v4_requests.lock().unwrap(); + new_payload_requests.push(params); + + mock_engine_server.new_payload_v4_response.clone() + }) + .unwrap(); + server.start(module) }