feat: bump alloy (#12215)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
Arsenii Kulikov
2024-11-06 18:50:25 +04:00
committed by GitHub
parent 12b0637485
commit 38fdc93a12
52 changed files with 588 additions and 1046 deletions

216
Cargo.lock generated
View File

@ -112,9 +112,9 @@ dependencies = [
[[package]]
name = "alloy-consensus"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41ed961a48297c732a5d97ee321aa8bb5009ecadbcb077d8bec90cb54e651629"
checksum = "7109d565c7157ee2c10beea7911a71130aa6c3cb6dfeaf66905a98f69b96a754"
dependencies = [
"alloy-eips",
"alloy-primitives",
@ -124,15 +124,16 @@ dependencies = [
"auto_impl",
"c-kzg",
"derive_more 1.0.0",
"rand 0.8.5",
"serde",
"serde_with",
]
[[package]]
name = "alloy-contract"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "460ab80ce4bda1c80bcf96fe7460520476f2c7b734581c6567fac2708e2a60ef"
checksum = "08f16c29a39afa238e35ee4ba06ca2e1c3a4764c2096e94c66730688a0471be7"
dependencies = [
"alloy-dyn-abi",
"alloy-json-abi",
@ -150,9 +151,9 @@ dependencies = [
[[package]]
name = "alloy-dyn-abi"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5228b189b18b85761340dc9eaac0141148a8503657b36f9bc3a869413d987ca"
checksum = "85132f2698b520fab3f54beed55a44389f7006a7b557a0261e1e69439dcc1572"
dependencies = [
"alloy-json-abi",
"alloy-primitives",
@ -181,9 +182,9 @@ dependencies = [
[[package]]
name = "alloy-eip7702"
version = "0.3.2"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64ffc577390ce50234e02d841214b3dc0bea6aaaae8e04bbf3cb82e9a45da9eb"
checksum = "69fb9fd842fdf10a524bbf2c4de6942ad869c1c8c3d128a1b09e67ed5f7cedbd"
dependencies = [
"alloy-primitives",
"alloy-rlp",
@ -197,9 +198,9 @@ dependencies = [
[[package]]
name = "alloy-eips"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b69e06cf9c37be824b9d26d6d101114fdde6af0c87de2828b414c05c4b3daa71"
checksum = "711de3f04cf728259ff149f725df12a8595b6b10baefafb0a0447201c72d76de"
dependencies = [
"alloy-eip2930",
"alloy-eip7702",
@ -218,9 +219,9 @@ dependencies = [
[[package]]
name = "alloy-genesis"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dde15e14944a88bd6a57d325e9a49b75558746fe16aaccc79713ae50a6a9574c"
checksum = "76b8fa6253466bd6f4b5ba3d725d350f7a05de494dd1b8d01537eafe934667e9"
dependencies = [
"alloy-primitives",
"alloy-serde",
@ -229,9 +230,9 @@ dependencies = [
[[package]]
name = "alloy-json-abi"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31a0f0d51db8a1a30a4d98a9f90e090a94c8f44cb4d9eafc7e03aa6d00aae984"
checksum = "ded610181f3dad5810f6ff12d1a99994cf9b42d2fcb7709029352398a5da5ae6"
dependencies = [
"alloy-primitives",
"alloy-sol-type-parser",
@ -241,9 +242,9 @@ dependencies = [
[[package]]
name = "alloy-json-rpc"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af5979e0d5a7bf9c7eb79749121e8256e59021af611322aee56e77e20776b4b3"
checksum = "b9278d6d554510136d9e0e4e51de4f5a9a4baffc8975f29e9acd01e12b2e045c"
dependencies = [
"alloy-primitives",
"alloy-sol-types",
@ -255,9 +256,9 @@ dependencies = [
[[package]]
name = "alloy-network"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "204237129086ce5dc17a58025e93739b01b45313841f98fa339eb1d780511e57"
checksum = "85d356983dea86089b05674d5ef88a7168a5c34a523ef62e2e3c8a9847ce0822"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -271,14 +272,16 @@ dependencies = [
"async-trait",
"auto_impl",
"futures-utils-wasm",
"serde",
"serde_json",
"thiserror",
]
[[package]]
name = "alloy-network-primitives"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "514f70ee2a953db21631cd817b13a1571474ec77ddc03d47616d5e8203489fde"
checksum = "18fbc9778e7989877465888383a7533c7318a9200d7229336bcc2b0277df36ba"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -289,9 +292,9 @@ dependencies = [
[[package]]
name = "alloy-node-bindings"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27444ea67d360508753022807cdd0b49a95c878924c9c5f8f32668b7d7768245"
checksum = "6fe5fd811738d37c56318378802b7bc3cc44e4d12b532641374309a10a04c515"
dependencies = [
"alloy-genesis",
"alloy-primitives",
@ -306,9 +309,9 @@ dependencies = [
[[package]]
name = "alloy-primitives"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8edae627382349b56cd6a7a2106f4fd69b243a9233e560c55c2e03cabb7e1d3c"
checksum = "fd58d377699e6cfeab52c4a9d28bdc4ef37e2bd235ff2db525071fe37a2e9af5"
dependencies = [
"alloy-rlp",
"arbitrary",
@ -338,9 +341,9 @@ dependencies = [
[[package]]
name = "alloy-provider"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4814d141ede360bb6cd1b4b064f1aab9de391e7c4d0d4d50ac89ea4bc1e25fbd"
checksum = "fe3189c8cf3c3e9185862ac0d0b2a9d6bf00e4395746c7ec36307a4db0d5d486"
dependencies = [
"alloy-chains",
"alloy-consensus",
@ -379,9 +382,9 @@ dependencies = [
[[package]]
name = "alloy-pubsub"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96ba46eb69ddf7a9925b81f15229cb74658e6eebe5dd30a5b74e2cd040380573"
checksum = "51358f866bcb93b8440c08086557e415c455cdc8d63754fa339611a3e215b038"
dependencies = [
"alloy-json-rpc",
"alloy-primitives",
@ -420,9 +423,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-client"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fc2bd1e7403463a5f2c61e955bcc9d3072b63aa177442b0f9aa6a6d22a941e3"
checksum = "d847913cea3fcd64fb1fe1247fafe15aab4060a2d24e535bbffcaa4670de9a79"
dependencies = [
"alloy-json-rpc",
"alloy-primitives",
@ -445,9 +448,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eea9bf1abdd506f985a53533f5ac01296bcd6102c5e139bbc5d40bc468d2c916"
checksum = "37ef8fd215cf81ddb0565815e1592a87377fa1e259db8ca4e683e6659fdf5c08"
dependencies = [
"alloy-primitives",
"alloy-rpc-types-engine",
@ -458,9 +461,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-admin"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea02c25541fb19eaac4278aa5c41d2d7e0245898887e54a74bfc0f3103e99415"
checksum = "647f703e27edad1f9c97455a6434378ea70b4ca9ae95f5e1559acf354c69bc14"
dependencies = [
"alloy-genesis",
"alloy-primitives",
@ -470,20 +473,21 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-anvil"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2382fc63fb0cf3e02818d547b80cb66cc49a31f8803d0c328402b2008bc13650"
checksum = "6805b1626b084c231b2ec70c05090d45ce914d22e47f6cd4e8426f43098bbdf1"
dependencies = [
"alloy-primitives",
"alloy-rpc-types-eth",
"alloy-serde",
"serde",
]
[[package]]
name = "alloy-rpc-types-beacon"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45357a642081c8ce235c0ad990c4e9279f5f18a723545076b38cfcc05cc25234"
checksum = "7ed50d4f427bcb5bc561b3e6f45238158db6592deabcfbecb03c7ca9dadafe98"
dependencies = [
"alloy-eips",
"alloy-primitives",
@ -495,9 +499,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-debug"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5afe3ab1038f90faf56304aa0adf1e6a8c9844615d8f83967f932f3a70390b1"
checksum = "e00a212581221f03d18c4239a1b985d695205a9518468a0b11ef64a143dd0724"
dependencies = [
"alloy-primitives",
"serde",
@ -505,9 +509,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-engine"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "886d22d41992287a235af2f3af4299b5ced2bcafb81eb835572ad35747476946"
checksum = "7312fb85ef76428f8e20f50d1505494be9d081ffdb5cbf6a25c153c7b530994c"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -526,9 +530,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-eth"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00b034779a4850b4b03f5be5ea674a1cf7d746b2da762b34d1860ab45e48ca27"
checksum = "eba7afa617e7942ba5df88ca063a99e9f51e67df2de816fd52513e64926145a3"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -547,9 +551,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-mev"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3246948dfa5f5060a9abe04233d741ea656ef076b12958f3242416ce9f375058"
checksum = "8b479e525a57388821d05c99732b3f6195128d8b74c9372329287f5e0d47d0aa"
dependencies = [
"alloy-eips",
"alloy-primitives",
@ -560,9 +564,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-trace"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e5fb6c5c401321f802f69dcdb95b932f30f8158f6798793f914baac5995628e"
checksum = "563105a7fb420d44bd30bfe043f5bba8b6fe78432d8da99f4148aa7226d90d69"
dependencies = [
"alloy-primitives",
"alloy-rpc-types-eth",
@ -574,9 +578,9 @@ dependencies = [
[[package]]
name = "alloy-rpc-types-txpool"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ad066b49c3b1b5f64cdd2399177a19926a6a15db2dbf11e2098de621f9e7480"
checksum = "f0da9410a730ced6e30cd349e6d9f39bc9e37ca1bb58a39691e276d7a4061631"
dependencies = [
"alloy-primitives",
"alloy-rpc-types-eth",
@ -586,9 +590,9 @@ dependencies = [
[[package]]
name = "alloy-serde"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "028e72eaa9703e4882344983cfe7636ce06d8cce104a78ea62fd19b46659efc4"
checksum = "5c9f13d8c9180dcced875f91f1876e428941cec151fc501637f68ad30d088d89"
dependencies = [
"alloy-primitives",
"arbitrary",
@ -598,9 +602,9 @@ dependencies = [
[[package]]
name = "alloy-signer"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "592c185d7100258c041afac51877660c7bf6213447999787197db4842f0e938e"
checksum = "796f951bcd6a00f9fb53265676eed9fab6feb37d1eb912b70fc2654be5e5a560"
dependencies = [
"alloy-primitives",
"async-trait",
@ -612,9 +616,9 @@ dependencies = [
[[package]]
name = "alloy-signer-local"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6614f02fc1d5b079b2a4a5320018317b506fd0a6d67c1fd5542a71201724986c"
checksum = "56e2a3fb629bbe89cfba73699a4be64d6dc3bd73691f2e43f2a35448294ffbf9"
dependencies = [
"alloy-consensus",
"alloy-network",
@ -630,9 +634,9 @@ dependencies = [
[[package]]
name = "alloy-sol-macro"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "841eabaa4710f719fddbc24c95d386eae313f07e6da4babc25830ee37945be0c"
checksum = "8a1b42ac8f45e2f49f4bcdd72cbfde0bb148f5481d403774ffa546e48b83efc1"
dependencies = [
"alloy-sol-macro-expander",
"alloy-sol-macro-input",
@ -644,9 +648,9 @@ dependencies = [
[[package]]
name = "alloy-sol-macro-expander"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6672337f19d837b9f7073c45853aeb528ed9f7dd6a4154ce683e9e5cb7794014"
checksum = "06318f1778e57f36333e850aa71bd1bb5e560c10279e236622faae0470c50412"
dependencies = [
"alloy-sol-macro-input",
"const-hex",
@ -662,9 +666,9 @@ dependencies = [
[[package]]
name = "alloy-sol-macro-input"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dff37dd20bfb118b777c96eda83b2067f4226d2644c5cfa00187b3bc01770ba"
checksum = "eaebb9b0ad61a41345a22c9279975c0cdd231b97947b10d7aad1cf0a7181e4a5"
dependencies = [
"const-hex",
"dunce",
@ -677,9 +681,9 @@ dependencies = [
[[package]]
name = "alloy-sol-type-parser"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b853d42292dbb159671a3edae3b2750277ff130f32b726fe07dc2b17aa6f2b5"
checksum = "12c71028bfbfec210e24106a542aad3def7caf1a70e2c05710e92a98481980d3"
dependencies = [
"serde",
"winnow",
@ -687,9 +691,9 @@ dependencies = [
[[package]]
name = "alloy-sol-types"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa828bb1b9a6dc52208fbb18084fb9ce2c30facc2bfda6a5d922349b4990354f"
checksum = "374d7fb042d68ddfe79ccb23359de3007f6d4d53c13f703b64fb0db422132111"
dependencies = [
"alloy-json-abi",
"alloy-primitives",
@ -700,9 +704,9 @@ dependencies = [
[[package]]
name = "alloy-transport"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be77579633ebbc1266ae6fd7694f75c408beb1aeb6865d0b18f22893c265a061"
checksum = "4d315ab988e06f6b12038a3d7811957da28a8b378ff0d084b0819ebae1746ead"
dependencies = [
"alloy-json-rpc",
"base64 0.22.1",
@ -720,9 +724,9 @@ dependencies = [
[[package]]
name = "alloy-transport-http"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91fd1a5d0827939847983b46f2f79510361f901dc82f8e3c38ac7397af142c6e"
checksum = "166449a8d8867be0978d6fa85aa56b89a27988b09e57bfd1f3b9962a9c8d5bae"
dependencies = [
"alloy-json-rpc",
"alloy-transport",
@ -735,9 +739,9 @@ dependencies = [
[[package]]
name = "alloy-transport-ipc"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8073d1186bfeeb8fbdd1292b6f1a0731f3aed8e21e1463905abfae0b96a887a6"
checksum = "716b21dce8e7ea29a5d459ed4b6d29a13a71d2b766fd84ac15e68623662b5d87"
dependencies = [
"alloy-json-rpc",
"alloy-pubsub",
@ -754,9 +758,9 @@ dependencies = [
[[package]]
name = "alloy-transport-ws"
version = "0.5.4"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61f27837bb4a1d6c83a28231c94493e814882f0e9058648a97e908a5f3fc9fcf"
checksum = "b577974182a4e6d9b1a1ecd5a7fd48da9d239a1e214e2368d37b3179e86cd8c3"
dependencies = [
"alloy-pubsub",
"alloy-transport",
@ -5270,9 +5274,9 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9"
[[package]]
name = "op-alloy-consensus"
version = "0.5.2"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26c3b35b7b3e36d15e0563eebffe13c1d9ca16b7aaffcb6a64354633547e16b"
checksum = "ae4582945fa96ae0ed78babcac6e41f025460e30ed0c9781aaeedf878fc2b527"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -5288,9 +5292,9 @@ dependencies = [
[[package]]
name = "op-alloy-genesis"
version = "0.5.2"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccacc2efed3d60d98ea581bddb885df1c6c62a592e55de049cfefd94116112cd"
checksum = "d1ece4a037c56536d8b517d045cef9cc07364c578709c184d33817108309c31e"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -5302,23 +5306,24 @@ dependencies = [
[[package]]
name = "op-alloy-network"
version = "0.5.2"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ff6fc0f94702ea0f4d8466bffdc990067ae6df9213465df9b7957f74f1e5461"
checksum = "05e9b64d15a7bf27a06c16eb286349aa2d4e3173260a8ab1fe73bd2c13c89769"
dependencies = [
"alloy-consensus",
"alloy-network",
"alloy-primitives",
"alloy-rpc-types-eth",
"alloy-signer",
"op-alloy-consensus",
"op-alloy-rpc-types",
]
[[package]]
name = "op-alloy-protocol"
version = "0.5.2"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5f8e6ec6b91c6aaeb20860b455a52fd8e300acfe5d534e96e9073a24f853e74"
checksum = "aa989d1ea8deced466b0edd7a447264b1f934fd740ab895d32b8544dcce3b151"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -5336,9 +5341,9 @@ dependencies = [
[[package]]
name = "op-alloy-rpc-types"
version = "0.5.2"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94bae9bf91b620e1e2c2291562e5998bc1247bd8ada011773e1997b31a95de99"
checksum = "ca6e53039829ff0b3482d8dd02cb2de45d5c7b889023c7e4588a43ea7451664a"
dependencies = [
"alloy-consensus",
"alloy-eips",
@ -5347,6 +5352,7 @@ dependencies = [
"alloy-rpc-types-eth",
"alloy-serde",
"arbitrary",
"derive_more 1.0.0",
"op-alloy-consensus",
"serde",
"serde_json",
@ -5354,10 +5360,11 @@ dependencies = [
[[package]]
name = "op-alloy-rpc-types-engine"
version = "0.5.2"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b52ee59c86537cff83e8c7f2a6aa287a94f3608bb40c06d442aafd0c2e807a4"
checksum = "283b19e1e7fef1ca9078df39f45a48609cacf856b7b441ed6cf19301ed162cca"
dependencies = [
"alloy-eips",
"alloy-primitives",
"alloy-rpc-types-engine",
"alloy-serde",
@ -8442,6 +8449,7 @@ dependencies = [
"alloy-consensus",
"alloy-eips",
"alloy-genesis",
"alloy-network",
"alloy-primitives",
"alloy-rlp",
"alloy-rpc-types",
@ -9344,9 +9352,9 @@ dependencies = [
[[package]]
name = "revm"
version = "17.1.0"
version = "18.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "055bee6a81aaeee8c2389ae31f0d4de87f44df24f4444a1116f9755fd87a76ad"
checksum = "15689a3c6a8d14b647b4666f2e236ef47b5a5133cdfd423f545947986fff7013"
dependencies = [
"auto_impl",
"cfg-if",
@ -9359,9 +9367,9 @@ dependencies = [
[[package]]
name = "revm-inspectors"
version = "0.10.0"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e29c662f7887f3b659d4b0fd234673419a8fcbeaa1ecc29bf7034c0a75cc8ea"
checksum = "747291a18ad6726a08dd73f8b6a6b3a844db582ecae2063ccf0a04880c44f482"
dependencies = [
"alloy-primitives",
"alloy-rpc-types-eth",
@ -9378,9 +9386,9 @@ dependencies = [
[[package]]
name = "revm-interpreter"
version = "13.0.0"
version = "14.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fac2034454f8bc69dc7d3c94cdb1b57559e27f5ef0518771f1787de543d7d6a1"
checksum = "74e3f11d0fed049a4a10f79820c59113a79b38aed4ebec786a79d5c667bfeb51"
dependencies = [
"revm-primitives",
"serde",
@ -9388,9 +9396,9 @@ dependencies = [
[[package]]
name = "revm-precompile"
version = "14.0.0"
version = "15.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a88c8c7c5f9b988a9e65fc0990c6ce859cdb74114db705bd118a96d22d08027"
checksum = "e381060af24b750069a2b2d2c54bba273d84e8f5f9e8026fc9262298e26cc336"
dependencies = [
"aurora-engine-modexp",
"blst",
@ -9408,9 +9416,9 @@ dependencies = [
[[package]]
name = "revm-primitives"
version = "13.0.0"
version = "14.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d11fa1e195b0bebaf3fb18596f314a13ba3a4cb1fdd16d3465934d812fd921e"
checksum = "3702f132bb484f4f0d0ca4f6fbde3c82cfd745041abbedd6eda67730e1868ef0"
dependencies = [
"alloy-eip2930",
"alloy-eip7702",
@ -10388,9 +10396,9 @@ dependencies = [
[[package]]
name = "syn-solidity"
version = "0.8.10"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16320d4a2021ba1a32470b3759676114a918885e9800e68ad60f2c67969fba62"
checksum = "edf42e81491fb8871b74df3d222c64ae8cbc1269ea509fa768a3ed3e1b0ac8cb"
dependencies = [
"paste",
"proc-macro2",
@ -10522,18 +10530,18 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b"
[[package]]
name = "thiserror"
version = "1.0.66"
version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede"
checksum = "3b3c6efbfc763e64eb85c11c25320f0737cb7364c4b6336db90aa9ebe27a0bbd"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.66"
version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5"
checksum = "b607164372e89797d78b8e23a6d67d5d1038c1c65efd52e1389ef8b77caba2a6"
dependencies = [
"proc-macro2",
"quote",
@ -11437,9 +11445,9 @@ dependencies = [
[[package]]
name = "wasmtimer"
version = "0.2.1"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7ed9d8b15c7fb594d72bfb4b5a276f3d2029333cd93a932f376f5937f6f80ee"
checksum = "bb4f099acbc1043cc752b91615b24b02d7f6fcd975bd781fed9f50b3c3e15bf7"
dependencies = [
"futures",
"js-sys",

View File

@ -418,60 +418,60 @@ reth-trie-db = { path = "crates/trie/db" }
reth-trie-parallel = { path = "crates/trie/parallel" }
# revm
revm = { version = "17.0.0", features = ["std"], default-features = false }
revm-inspectors = "0.10.0"
revm-primitives = { version = "13.0.0", features = [
revm = { version = "18.0.0", features = ["std"], default-features = false }
revm-inspectors = "0.11.0"
revm-primitives = { version = "14.0.0", features = [
"std",
], default-features = false }
# eth
alloy-chains = "0.1.32"
alloy-dyn-abi = "0.8.0"
alloy-primitives = { version = "0.8.9", default-features = false }
alloy-dyn-abi = "0.8.11"
alloy-primitives = { version = "0.8.11", default-features = false }
alloy-rlp = "0.3.4"
alloy-sol-types = "0.8.0"
alloy-sol-types = "0.8.11"
alloy-trie = { version = "0.7", default-features = false }
alloy-consensus = { version = "0.5.4", default-features = false }
alloy-contract = { version = "0.5.4", default-features = false }
alloy-eips = { version = "0.5.4", default-features = false }
alloy-genesis = { version = "0.5.4", default-features = false }
alloy-json-rpc = { version = "0.5.4", default-features = false }
alloy-network = { version = "0.5.4", default-features = false }
alloy-network-primitives = { version = "0.5.4", default-features = false }
alloy-node-bindings = { version = "0.5.4", default-features = false }
alloy-provider = { version = "0.5.4", features = [
alloy-consensus = { version = "0.6.0", default-features = false }
alloy-contract = { version = "0.6.0", default-features = false }
alloy-eips = { version = "0.6.0", default-features = false }
alloy-genesis = { version = "0.6.0", default-features = false }
alloy-json-rpc = { version = "0.6.0", default-features = false }
alloy-network = { version = "0.6.0", default-features = false }
alloy-network-primitives = { version = "0.6.0", default-features = false }
alloy-node-bindings = { version = "0.6.0", default-features = false }
alloy-provider = { version = "0.6.0", features = [
"reqwest",
], default-features = false }
alloy-pubsub = { version = "0.5.4", default-features = false }
alloy-rpc-client = { version = "0.5.4", default-features = false }
alloy-rpc-types = { version = "0.5.4", features = [
alloy-pubsub = { version = "0.6.0", default-features = false }
alloy-rpc-client = { version = "0.6.0", default-features = false }
alloy-rpc-types = { version = "0.6.0", features = [
"eth",
], default-features = false }
alloy-rpc-types-admin = { version = "0.5.4", default-features = false }
alloy-rpc-types-anvil = { version = "0.5.4", default-features = false }
alloy-rpc-types-beacon = { version = "0.5.4", default-features = false }
alloy-rpc-types-debug = { version = "0.5.4", default-features = false }
alloy-rpc-types-engine = { version = "0.5.4", default-features = false }
alloy-rpc-types-eth = { version = "0.5.4", default-features = false }
alloy-rpc-types-mev = { version = "0.5.4", default-features = false }
alloy-rpc-types-trace = { version = "0.5.4", default-features = false }
alloy-rpc-types-txpool = { version = "0.5.4", default-features = false }
alloy-serde = { version = "0.5.4", default-features = false }
alloy-signer = { version = "0.5.4", default-features = false }
alloy-signer-local = { version = "0.5.4", default-features = false }
alloy-transport = { version = "0.5.4" }
alloy-transport-http = { version = "0.5.4", features = [
alloy-rpc-types-admin = { version = "0.6.0", default-features = false }
alloy-rpc-types-anvil = { version = "0.6.0", default-features = false }
alloy-rpc-types-beacon = { version = "0.6.0", default-features = false }
alloy-rpc-types-debug = { version = "0.6.0", default-features = false }
alloy-rpc-types-engine = { version = "0.6.0", default-features = false }
alloy-rpc-types-eth = { version = "0.6.0", default-features = false }
alloy-rpc-types-mev = { version = "0.6.0", default-features = false }
alloy-rpc-types-trace = { version = "0.6.0", default-features = false }
alloy-rpc-types-txpool = { version = "0.6.0", default-features = false }
alloy-serde = { version = "0.6.0", default-features = false }
alloy-signer = { version = "0.6.0", default-features = false }
alloy-signer-local = { version = "0.6.0", default-features = false }
alloy-transport = { version = "0.6.0" }
alloy-transport-http = { version = "0.6.0", features = [
"reqwest-rustls-tls",
], default-features = false }
alloy-transport-ipc = { version = "0.5.4", default-features = false }
alloy-transport-ws = { version = "0.5.4", default-features = false }
alloy-transport-ipc = { version = "0.6.0", default-features = false }
alloy-transport-ws = { version = "0.6.0", default-features = false }
# op
op-alloy-rpc-types = "0.5"
op-alloy-rpc-types-engine = "0.5"
op-alloy-network = "0.5"
op-alloy-consensus = "0.5"
op-alloy-rpc-types = "0.6"
op-alloy-rpc-types-engine = "0.6"
op-alloy-network = "0.6"
op-alloy-consensus = "0.6"
# misc
aquamarine = "0.6"
@ -633,4 +633,4 @@ tracy-client = "0.17.3"
#op-alloy-rpc-types = { git = "https://github.com/alloy-rs/op-alloy", rev = "6a042e7681b1" }
#op-alloy-rpc-types-engine = { git = "https://github.com/alloy-rs/op-alloy", rev = "6a042e7681b1" }
#op-alloy-network = { git = "https://github.com/alloy-rs/op-alloy", rev = "6a042e7681b1" }
#op-alloy-consensus = { git = "https://github.com/alloy-rs/op-alloy", rev = "6a042e7681b1" }
#op-alloy-consensus = { git = "https://github.com/alloy-rs/op-alloy", rev = "6a042e7681b1" }

View File

@ -74,14 +74,17 @@ impl BenchContext {
let first_block = match benchmark_mode {
BenchMode::Continuous => {
// fetch Latest block
block_provider.get_block_by_number(BlockNumberOrTag::Latest, true).await?.unwrap()
block_provider
.get_block_by_number(BlockNumberOrTag::Latest, true.into())
.await?
.unwrap()
}
BenchMode::Range(ref mut range) => {
match range.next() {
Some(block_number) => {
// fetch first block in range
block_provider
.get_block_by_number(block_number.into(), true)
.get_block_by_number(block_number.into(), true.into())
.await?
.unwrap()
}

View File

@ -43,16 +43,17 @@ impl Command {
let (sender, mut receiver) = tokio::sync::mpsc::channel(1000);
tokio::task::spawn(async move {
while benchmark_mode.contains(next_block) {
let block_res = block_provider.get_block_by_number(next_block.into(), true).await;
let block_res =
block_provider.get_block_by_number(next_block.into(), true.into()).await;
let block = block_res.unwrap().unwrap();
let block_hash = block.header.hash;
let block = Block::try_from(block.inner).unwrap().seal(block_hash);
let block = Block::try_from(block).unwrap().seal(block_hash);
let head_block_hash = block.hash();
let safe_block_hash = block_provider
.get_block_by_number(block.number.saturating_sub(32).into(), false);
.get_block_by_number(block.number.saturating_sub(32).into(), false.into());
let finalized_block_hash = block_provider
.get_block_by_number(block.number.saturating_sub(64).into(), false);
.get_block_by_number(block.number.saturating_sub(64).into(), false.into());
let (safe, finalized) = tokio::join!(safe_block_hash, finalized_block_hash,);

View File

@ -43,10 +43,11 @@ impl Command {
let (sender, mut receiver) = tokio::sync::mpsc::channel(1000);
tokio::task::spawn(async move {
while benchmark_mode.contains(next_block) {
let block_res = block_provider.get_block_by_number(next_block.into(), true).await;
let block_res =
block_provider.get_block_by_number(next_block.into(), true.into()).await;
let block = block_res.unwrap().unwrap();
let block_hash = block.header.hash;
let block = Block::try_from(block.inner).unwrap().seal(block_hash);
let block = Block::try_from(block).unwrap().seal(block_hash);
next_block += 1;
sender.send(block).await.unwrap();

View File

@ -1377,7 +1377,7 @@ mod tests {
use alloy_consensus::{TxEip1559, EMPTY_ROOT_HASH};
use alloy_eips::eip1559::INITIAL_BASE_FEE;
use alloy_genesis::{Genesis, GenesisAccount};
use alloy_primitives::{keccak256, Address, Sealable, Signature, B256};
use alloy_primitives::{keccak256, Address, PrimitiveSignature as Signature, Sealable, B256};
use assert_matches::assert_matches;
use linked_hash_set::LinkedHashSet;
use reth_chainspec::{ChainSpecBuilder, MAINNET, MIN_TRANSACTION_GAS};

View File

@ -277,7 +277,8 @@ mod tests {
use alloy_consensus::{TxEip4844, EMPTY_OMMER_ROOT_HASH, EMPTY_ROOT_HASH};
use alloy_eips::{eip4895::Withdrawal, BlockHashOrNumber};
use alloy_primitives::{
hex_literal::hex, Address, BlockHash, BlockNumber, Bytes, Parity, Sealable, Signature, U256,
hex_literal::hex, Address, BlockHash, BlockNumber, Bytes, PrimitiveSignature as Signature,
Sealable, U256,
};
use mockall::mock;
use rand::Rng;
@ -403,7 +404,7 @@ mod tests {
blob_versioned_hashes: std::iter::repeat_with(|| rng.gen()).take(num_blobs).collect(),
});
let signature = Signature::new(U256::default(), U256::default(), Parity::Parity(true));
let signature = Signature::new(U256::default(), U256::default(), true);
TransactionSigned::from_transaction_and_signature(request, signature)
}

View File

@ -1,4 +1,4 @@
use alloy_consensus::TxEnvelope;
use alloy_consensus::Transaction;
use alloy_eips::eip2718::Encodable2718;
use alloy_primitives::B256;
use alloy_rpc_types::{Block, BlockTransactions};
@ -184,18 +184,19 @@ pub fn block_to_execution_payload_v3(block: Block) -> ExecutionNewPayload {
// https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#specification
let versioned_hashes = transactions
.iter()
.flat_map(|tx| tx.blob_versioned_hashes.clone().unwrap_or_default())
.flat_map(|tx| tx.blob_versioned_hashes().unwrap_or_default())
.copied()
.collect();
let payload: ExecutionPayloadV3 = ExecutionPayloadV3 {
payload_inner: ExecutionPayloadV2 {
payload_inner: ExecutionPayloadV1 {
parent_hash: block.header.parent_hash,
fee_recipient: block.header.miner,
fee_recipient: block.header.beneficiary,
state_root: block.header.state_root,
receipts_root: block.header.receipts_root,
logs_bloom: block.header.logs_bloom,
prev_randao: block.header.mix_hash.unwrap(),
prev_randao: block.header.mix_hash,
block_number: block.header.number,
gas_limit: block.header.gas_limit,
gas_used: block.header.gas_used,
@ -205,15 +206,10 @@ pub fn block_to_execution_payload_v3(block: Block) -> ExecutionNewPayload {
block_hash: block.header.hash,
transactions: transactions
.into_iter()
.map(|tx| {
let envelope: TxEnvelope = tx.try_into().unwrap();
let mut buffer: Vec<u8> = vec![];
envelope.encode_2718(&mut buffer);
buffer.into()
})
.map(|tx| tx.inner.encoded_2718().into())
.collect(),
},
withdrawals: block.withdrawals.clone().unwrap_or_default(),
withdrawals: block.withdrawals.clone().unwrap_or_default().into_inner(),
},
blob_gas_used: block.header.blob_gas_used.unwrap(),
excess_blob_gas: block.header.excess_blob_gas.unwrap(),

View File

@ -30,9 +30,9 @@ impl BlockProvider for RpcBlockProvider {
.expect("failed to subscribe on new blocks")
.into_stream();
while let Some(block) = stream.next().await {
while let Some(header) = stream.next().await {
let full_block = ws_provider
.get_block_by_hash(block.header.hash, BlockTransactionsKind::Full)
.get_block_by_hash(header.hash, BlockTransactionsKind::Full)
.await
.expect("failed to get block")
.expect("block not found");
@ -49,7 +49,7 @@ impl BlockProvider for RpcBlockProvider {
.await
.expect("failed to create WS provider");
let block: Block = ws_provider
.get_block_by_number(BlockNumberOrTag::Number(block_number), true)
.get_block_by_number(BlockNumberOrTag::Number(block_number), true.into())
.await?
.ok_or_else(|| eyre::eyre!("block not found by number {}", block_number))?;
Ok(block)

View File

@ -157,7 +157,8 @@ async fn e2e_test_send_transactions() -> eyre::Result<()> {
assert_eq!(second_provider.get_block_number().await?, 0);
let head = provider.get_block_by_number(Default::default(), false).await?.unwrap().header.hash;
let head =
provider.get_block_by_number(Default::default(), false.into()).await?.unwrap().header.hash;
second_node.engine_api.update_forkchoice(head, head).await?;
let start = std::time::Instant::now();

View File

@ -69,7 +69,7 @@ async fn test_fee_history() -> eyre::Result<()> {
let receipt = builder.get_receipt().await?;
assert!(receipt.status());
let block = provider.get_block_by_number(1.into(), false).await?.unwrap();
let block = provider.get_block_by_number(1.into(), false.into()).await?.unwrap();
assert_eq!(block.header.gas_used as u128, receipt.gas_used,);
assert_eq!(block.header.base_fee_per_gas.unwrap(), expected_first_base_fee as u64);
@ -89,7 +89,7 @@ async fn test_fee_history() -> eyre::Result<()> {
let fee_history = provider.get_fee_history(block_count, latest_block.into(), &[]).await?;
let mut prev_header = provider
.get_block_by_number((latest_block + 1 - block_count).into(), false)
.get_block_by_number((latest_block + 1 - block_count).into(), false.into())
.await?
.unwrap()
.header;
@ -101,7 +101,8 @@ async fn test_fee_history() -> eyre::Result<()> {
chain_spec.base_fee_params_at_block(block),
);
let header = provider.get_block_by_number(block.into(), false).await?.unwrap().header;
let header =
provider.get_block_by_number(block.into(), false.into()).await?.unwrap().header;
assert_eq!(header.base_fee_per_gas.unwrap(), expected_base_fee as u64);
assert_eq!(

View File

@ -114,7 +114,7 @@ mod tests {
};
use alloy_consensus::TxLegacy;
use alloy_eips::BlockHashOrNumber;
use alloy_primitives::{hex, Parity, Signature, TxKind, U256};
use alloy_primitives::{hex, PrimitiveSignature as Signature, TxKind, U256};
use alloy_rlp::{Decodable, Encodable};
use reth_primitives::{Header, Transaction, TransactionSigned};
use std::str::FromStr;
@ -373,7 +373,7 @@ mod tests {
}), Signature::new(
U256::from_str("0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12").unwrap(),
U256::from_str("0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10").unwrap(),
Parity::Parity(false),
false,
),
),
TransactionSigned::from_transaction_and_signature(Transaction::Legacy(TxLegacy {
@ -387,7 +387,7 @@ mod tests {
}), Signature::new(
U256::from_str("0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb").unwrap(),
U256::from_str("0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb").unwrap(),
Parity::Parity(false),
false,
),
),
],
@ -446,7 +446,7 @@ mod tests {
Signature::new(
U256::from_str("0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12").unwrap(),
U256::from_str("0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10").unwrap(),
Parity::Eip155(37),
false,
),
),
TransactionSigned::from_transaction_and_signature(
@ -462,7 +462,7 @@ mod tests {
Signature::new(
U256::from_str("0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb").unwrap(),
U256::from_str("0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb").unwrap(),
Parity::Eip155(37),
false,
),
),
],

View File

@ -78,7 +78,7 @@ impl FromIterator<PooledTransactionsElement> for PooledTransactions {
mod tests {
use crate::{message::RequestPair, GetPooledTransactions, PooledTransactions};
use alloy_consensus::{TxEip1559, TxLegacy};
use alloy_primitives::{hex, Parity, Signature, TxKind, U256};
use alloy_primitives::{hex, PrimitiveSignature as Signature, TxKind, U256};
use alloy_rlp::{Decodable, Encodable};
use reth_chainspec::MIN_TRANSACTION_GAS;
use reth_primitives::{PooledTransactionsElement, Transaction, TransactionSigned};
@ -142,7 +142,7 @@ mod tests {
"0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10",
)
.unwrap(),
Parity::Parity(false),
false,
),
),
TransactionSigned::from_transaction_and_signature(
@ -164,7 +164,7 @@ mod tests {
"0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb",
)
.unwrap(),
Parity::Parity(false),
false,
),
),
];
@ -208,7 +208,7 @@ mod tests {
"0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10",
)
.unwrap(),
Parity::Eip155(37),
false,
),
),
TransactionSigned::from_transaction_and_signature(
@ -230,7 +230,7 @@ mod tests {
"0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb",
)
.unwrap(),
Parity::Eip155(37),
false,
),
),
];
@ -275,7 +275,7 @@ mod tests {
"0x612638fb29427ca33b9a3be2a0a561beecfe0269655be160d35e72d366a6a860",
)
.unwrap(),
Parity::Eip155(44),
true,
),
),
TransactionSigned::from_transaction_and_signature(
@ -299,7 +299,7 @@ mod tests {
"0x016b83f4f980694ed2eee4d10667242b1f40dc406901b34125b008d334d47469",
)
.unwrap(),
Parity::Parity(true),
true,
),
),
TransactionSigned::from_transaction_and_signature(
@ -321,7 +321,7 @@ mod tests {
"0x3ca3ae86580e94550d7c071e3a02eadb5a77830947c9225165cf9100901bee88",
)
.unwrap(),
Parity::Eip155(43),
false,
),
),
TransactionSigned::from_transaction_and_signature(
@ -343,7 +343,7 @@ mod tests {
"0x5406ad177223213df262cb66ccbb2f46bfdccfdfbbb5ffdda9e2c02d977631da",
)
.unwrap(),
Parity::Eip155(43),
false,
),
),
TransactionSigned::from_transaction_and_signature(
@ -365,7 +365,7 @@ mod tests {
"0x3a456401896b1b6055311536bf00a718568c744d8c1f9df59879e8350220ca18",
)
.unwrap(),
Parity::Eip155(43),
false,
),
),
];
@ -414,7 +414,7 @@ mod tests {
"0x612638fb29427ca33b9a3be2a0a561beecfe0269655be160d35e72d366a6a860",
)
.unwrap(),
Parity::Parity(true),
true,
),
),
TransactionSigned::from_transaction_and_signature(
@ -438,7 +438,7 @@ mod tests {
"0x016b83f4f980694ed2eee4d10667242b1f40dc406901b34125b008d334d47469",
)
.unwrap(),
Parity::Parity(true),
true,
),
),
TransactionSigned::from_transaction_and_signature(
@ -460,7 +460,7 @@ mod tests {
"0x3ca3ae86580e94550d7c071e3a02eadb5a77830947c9225165cf9100901bee88",
)
.unwrap(),
Parity::Parity(false),
false,
),
),
TransactionSigned::from_transaction_and_signature(
@ -482,7 +482,7 @@ mod tests {
"0x5406ad177223213df262cb66ccbb2f46bfdccfdfbbb5ffdda9e2c02d977631da",
)
.unwrap(),
Parity::Parity(false),
false,
),
),
TransactionSigned::from_transaction_and_signature(
@ -504,7 +504,7 @@ mod tests {
"0x3a456401896b1b6055311536bf00a718568c744d8c1f9df59879e8350220ca18",
)
.unwrap(),
Parity::Parity(false),
false,
),
),
];

View File

@ -1,4 +1,4 @@
use alloy_primitives::{Signature, B256};
use alloy_primitives::{PrimitiveSignature as Signature, B256};
use reth_eth_wire::{GetPooledTransactions, PooledTransactions};
use reth_network::{
test_utils::{NetworkEventStream, Testnet},

View File

@ -4,7 +4,7 @@
use std::sync::Arc;
use alloy_consensus::TxEip2930;
use alloy_primitives::{Bytes, Parity, Signature, TxKind, U256};
use alloy_primitives::{Bytes, PrimitiveSignature as Signature, TxKind, U256};
use rand::Rng;
use reth_eth_wire::HeadersDirection;
use reth_network::{
@ -31,7 +31,7 @@ pub fn rng_transaction(rng: &mut impl rand::RngCore) -> TransactionSigned {
input: Bytes::from(vec![1, 2]),
access_list: Default::default(),
});
let signature = Signature::new(U256::default(), U256::default(), Parity::Parity(true));
let signature = Signature::new(U256::default(), U256::default(), true);
TransactionSigned::from_transaction_and_signature(request, signature)
}

View File

@ -3,7 +3,7 @@
use std::sync::Arc;
use alloy_consensus::TxLegacy;
use alloy_primitives::{Signature, U256};
use alloy_primitives::{PrimitiveSignature as Signature, U256};
use futures::StreamExt;
use rand::thread_rng;
use reth_network::{test_utils::Testnet, NetworkEvent, NetworkEventListenerProvider};

View File

@ -20,7 +20,7 @@ mod op_sepolia;
use alloc::{boxed::Box, vec, vec::Vec};
use alloy_chains::Chain;
use alloy_genesis::Genesis;
use alloy_primitives::{Bytes, Parity, Signature, B256, U256};
use alloy_primitives::{Bytes, B256, U256};
pub use base::BASE_MAINNET;
pub use base_sepolia::BASE_SEPOLIA;
use derive_more::{Constructor, Deref, Display, From, Into};
@ -256,12 +256,6 @@ pub fn decode_holocene_1559_params(extra_data: Bytes) -> Result<(u32, u32), Deco
Ok((u32::from_be_bytes(denominator), u32::from_be_bytes(elasticity)))
}
/// Returns the signature for the optimism deposit transactions, which don't include a
/// signature.
pub fn optimism_deposit_tx_signature() -> Signature {
Signature::new(U256::ZERO, U256::ZERO, Parity::Parity(false))
}
impl EthChainSpec for OpChainSpec {
fn chain(&self) -> alloy_chains::Chain {
self.inner.chain()

View File

@ -297,7 +297,9 @@ mod tests {
use super::*;
use crate::OpChainSpec;
use alloy_consensus::TxEip1559;
use alloy_primitives::{b256, Address, Signature, StorageKey, StorageValue};
use alloy_primitives::{
b256, Address, PrimitiveSignature as Signature, StorageKey, StorageValue,
};
use op_alloy_consensus::TxDeposit;
use reth_chainspec::MIN_TRANSACTION_GAS;
use reth_evm::execute::{BasicBlockExecutorProvider, BatchExecutor, BlockExecutorProvider};

View File

@ -231,7 +231,7 @@ pub struct OpL1BlockInfo {
mod tests {
use crate::txpool::OpTransactionValidator;
use alloy_eips::eip2718::Encodable2718;
use alloy_primitives::{Signature, TxKind, U256};
use alloy_primitives::{PrimitiveSignature as Signature, TxKind, U256};
use op_alloy_consensus::TxDeposit;
use reth_chainspec::MAINNET;
use reth_primitives::{Transaction, TransactionSigned, TransactionSignedEcRecovered};

View File

@ -1,14 +1,13 @@
//! Loads and formats OP transaction RPC response.
use alloy_consensus::Transaction as _;
use alloy_consensus::Signed;
use alloy_primitives::{Bytes, B256};
use alloy_rpc_types::TransactionInfo;
use op_alloy_consensus::DepositTransaction;
use op_alloy_consensus::OpTxEnvelope;
use op_alloy_rpc_types::Transaction;
use reth_node_api::FullNodeComponents;
use reth_primitives::TransactionSignedEcRecovered;
use reth_primitives::{TransactionSigned, TransactionSignedEcRecovered};
use reth_provider::{BlockReaderIdExt, ReceiptProvider, TransactionsProvider};
use reth_rpc::eth::EthTxBuilder;
use reth_rpc_eth_api::{
helpers::{EthSigner, EthTransactions, LoadTransaction, SpawnBlocking},
FromEthApiError, FullEthApiTypes, RpcNodeCore, TransactionCompat,
@ -83,14 +82,25 @@ where
tx: TransactionSignedEcRecovered,
tx_info: TransactionInfo,
) -> Self::Transaction {
let signed_tx = tx.clone().into_signed();
let hash = tx.hash;
let from = tx.signer();
let TransactionSigned { transaction, signature, hash } = tx.into_signed();
let mut inner = EthTxBuilder.fill(tx, tx_info);
if signed_tx.is_deposit() {
inner.gas_price = Some(signed_tx.max_fee_per_gas())
}
let inner = match transaction {
reth_primitives::Transaction::Legacy(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Eip2930(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Eip1559(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Eip4844(_) => unreachable!(),
reth_primitives::Transaction::Eip7702(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Deposit(tx) => OpTxEnvelope::Deposit(tx),
};
let deposit_receipt_version = self
.inner
@ -100,22 +110,29 @@ where
.flatten()
.and_then(|receipt| receipt.deposit_receipt_version);
let TransactionInfo { block_hash, block_number, index: transaction_index, .. } = tx_info;
Transaction {
inner,
source_hash: signed_tx.source_hash(),
mint: signed_tx.mint(),
// only include is_system_tx if true: <https://github.com/ethereum-optimism/op-geth/blob/641e996a2dcf1f81bac9416cb6124f86a69f1de7/internal/ethapi/api.go#L1518-L1518>
is_system_tx: (signed_tx.is_deposit() && signed_tx.is_system_transaction())
.then_some(true),
inner: alloy_rpc_types::Transaction {
inner,
block_hash,
block_number,
transaction_index,
from,
},
deposit_receipt_version,
}
}
fn otterscan_api_truncate_input(tx: &mut Self::Transaction) {
tx.inner.input = tx.inner.input.slice(..4);
}
fn tx_type(tx: &Self::Transaction) -> u8 {
tx.inner.transaction_type.unwrap_or_default()
let input = match &mut tx.inner.inner {
OpTxEnvelope::Eip1559(tx) => &mut tx.tx_mut().input,
OpTxEnvelope::Eip2930(tx) => &mut tx.tx_mut().input,
OpTxEnvelope::Legacy(tx) => &mut tx.tx_mut().input,
OpTxEnvelope::Eip7702(tx) => &mut tx.tx_mut().input,
OpTxEnvelope::Deposit(tx) => &mut tx.input,
_ => return,
};
*input = input.slice(..4);
}
}

View File

@ -1,4 +1,5 @@
use super::Header;
use alloy_consensus::Sealed;
use alloy_eips::BlockNumHash;
use alloy_primitives::{keccak256, BlockHash, Sealable};
#[cfg(any(test, feature = "test-utils"))]
@ -132,6 +133,12 @@ impl SealedHeader {
}
}
impl<H> From<SealedHeader<H>> for Sealed<H> {
fn from(value: SealedHeader<H>) -> Self {
Self::new_unchecked(value.header, value.hash)
}
}
#[cfg(any(test, feature = "arbitrary"))]
impl<'a> arbitrary::Arbitrary<'a> for SealedHeader {
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {

View File

@ -6,7 +6,7 @@ use reth_codecs::Compact;
use alloy_consensus::Transaction;
use alloy_eips::eip2718::{Decodable2718, Encodable2718};
use alloy_primitives::{keccak256, Address, Signature, TxHash, B256};
use alloy_primitives::{keccak256, Address, PrimitiveSignature as Signature, TxHash, B256};
use revm_primitives::TxEnv;
/// Helper trait that unifies all behaviour required by block to support full node operations.

View File

@ -22,6 +22,7 @@ reth-codecs = { workspace = true, optional = true }
# ethereum
alloy-consensus.workspace = true
alloy-network = { workspace = true, optional = true }
alloy-primitives = { workspace = true, features = ["rand", "rlp"] }
alloy-rlp = { workspace = true, features = ["arrayvec"] }
alloy-rpc-types = { workspace = true, optional = true }
@ -138,6 +139,7 @@ alloy-compat = [
"dep:alloy-rpc-types",
"dep:alloy-serde",
"dep:op-alloy-rpc-types",
"dep:alloy-network",
]
test-utils = [
"reth-primitives-traits/test-utils",

View File

@ -1,26 +1,20 @@
//! Common conversions from alloy types.
use crate::{
transaction::extract_chain_id, Block, BlockBody, Transaction, TransactionSigned,
TransactionSignedEcRecovered, TransactionSignedNoHash, TxType,
};
use crate::{Block, BlockBody, Transaction, TransactionSigned};
use alloc::{string::ToString, vec::Vec};
use alloy_consensus::{
constants::EMPTY_TRANSACTIONS, Transaction as _, TxEip1559, TxEip2930, TxEip4844, TxLegacy,
};
use alloy_primitives::{Parity, Signature, TxKind};
use alloy_rlp::Error as RlpError;
use alloy_consensus::{constants::EMPTY_TRANSACTIONS, Header, TxEnvelope};
use alloy_network::{AnyHeader, AnyRpcBlock, AnyRpcTransaction, AnyTxEnvelope};
use alloy_serde::WithOtherFields;
use op_alloy_rpc_types as _;
impl TryFrom<alloy_rpc_types::Block<WithOtherFields<alloy_rpc_types::Transaction>>> for Block {
impl TryFrom<AnyRpcBlock> for Block {
type Error = alloy_rpc_types::ConversionError;
fn try_from(
block: alloy_rpc_types::Block<WithOtherFields<alloy_rpc_types::Transaction>>,
) -> Result<Self, Self::Error> {
fn try_from(block: AnyRpcBlock) -> Result<Self, Self::Error> {
use alloy_rpc_types::ConversionError;
let block = block.inner;
let transactions = {
let transactions: Result<Vec<TransactionSigned>, ConversionError> = match block
.transactions
@ -35,241 +29,134 @@ impl TryFrom<alloy_rpc_types::Block<WithOtherFields<alloy_rpc_types::Transaction
if block.header.transactions_root == EMPTY_TRANSACTIONS {
Ok(Vec::new())
} else {
Err(ConversionError::MissingFullTransactions)
Err(ConversionError::Custom("missing transactions".to_string()))
}
}
};
transactions?
};
let AnyHeader {
parent_hash,
ommers_hash,
beneficiary,
state_root,
transactions_root,
receipts_root,
logs_bloom,
difficulty,
number,
gas_limit,
gas_used,
timestamp,
extra_data,
mix_hash,
nonce,
base_fee_per_gas,
withdrawals_root,
blob_gas_used,
excess_blob_gas,
parent_beacon_block_root,
requests_hash,
} = block.header.inner;
Ok(Self {
header: block.header.try_into()?,
header: Header {
parent_hash,
ommers_hash,
beneficiary,
state_root,
transactions_root,
receipts_root,
logs_bloom,
difficulty,
number,
gas_limit,
gas_used,
timestamp,
extra_data,
mix_hash: mix_hash
.ok_or_else(|| ConversionError::Custom("missing mixHash".to_string()))?,
nonce: nonce.ok_or_else(|| ConversionError::Custom("missing nonce".to_string()))?,
base_fee_per_gas,
withdrawals_root,
blob_gas_used,
excess_blob_gas,
parent_beacon_block_root,
requests_hash,
},
body: BlockBody {
transactions,
ommers: Default::default(),
withdrawals: block.withdrawals.map(Into::into),
withdrawals: block.withdrawals.map(|w| w.into_inner().into()),
},
})
}
}
impl TryFrom<WithOtherFields<alloy_rpc_types::Transaction>> for Transaction {
impl TryFrom<AnyRpcTransaction> for TransactionSigned {
type Error = alloy_rpc_types::ConversionError;
fn try_from(tx: WithOtherFields<alloy_rpc_types::Transaction>) -> Result<Self, Self::Error> {
use alloy_eips::eip2718::Eip2718Error;
fn try_from(tx: AnyRpcTransaction) -> Result<Self, Self::Error> {
use alloy_rpc_types::ConversionError;
#[cfg(feature = "optimism")]
let WithOtherFields { inner: tx, other } = tx;
#[cfg(not(feature = "optimism"))]
let WithOtherFields { inner: tx, other: _ } = tx;
match tx.transaction_type.map(TryInto::try_into).transpose().map_err(|_| {
ConversionError::Eip2718Error(Eip2718Error::UnexpectedType(
tx.transaction_type.unwrap(),
))
})? {
None | Some(TxType::Legacy) => {
// legacy
if tx.max_fee_per_gas.is_some() || tx.max_priority_fee_per_gas.is_some() {
return Err(ConversionError::Eip2718Error(
RlpError::Custom("EIP-1559 fields are present in a legacy transaction")
.into(),
))
}
// extract the chain id if possible
let chain_id = match tx.chain_id {
Some(chain_id) => Some(chain_id),
None => {
if let Some(signature) = tx.signature {
// TODO: make this error conversion better. This is needed because
// sometimes rpc providers return legacy transactions without a chain id
// explicitly in the response, however those transactions may also have
// a chain id in the signature from eip155
extract_chain_id(signature.v.to())
.map_err(|err| ConversionError::Eip2718Error(err.into()))?
.1
} else {
return Err(ConversionError::MissingChainId)
}
}
};
Ok(Self::Legacy(TxLegacy {
chain_id,
nonce: tx.nonce,
gas_price: tx.gas_price.ok_or(ConversionError::MissingGasPrice)?,
gas_limit: tx.gas,
to: tx.to.map_or(TxKind::Create, TxKind::Call),
value: tx.value,
input: tx.input,
}))
let (transaction, signature, hash) = match tx.inner {
AnyTxEnvelope::Ethereum(TxEnvelope::Legacy(tx)) => {
let (tx, signature, hash) = tx.into_parts();
(Transaction::Legacy(tx), signature, hash)
}
Some(TxType::Eip2930) => {
// eip2930
Ok(Self::Eip2930(TxEip2930 {
chain_id: tx.chain_id.ok_or(ConversionError::MissingChainId)?,
nonce: tx.nonce,
gas_limit: tx.gas,
to: tx.to.map_or(TxKind::Create, TxKind::Call),
value: tx.value,
input: tx.input,
access_list: tx.access_list.ok_or(ConversionError::MissingAccessList)?,
gas_price: tx.gas_price.ok_or(ConversionError::MissingGasPrice)?,
}))
AnyTxEnvelope::Ethereum(TxEnvelope::Eip2930(tx)) => {
let (tx, signature, hash) = tx.into_parts();
(Transaction::Eip2930(tx), signature, hash)
}
Some(TxType::Eip1559) => {
// EIP-1559
Ok(Self::Eip1559(TxEip1559 {
chain_id: tx.chain_id.ok_or(ConversionError::MissingChainId)?,
nonce: tx.nonce,
max_priority_fee_per_gas: tx
.max_priority_fee_per_gas
.ok_or(ConversionError::MissingMaxPriorityFeePerGas)?,
max_fee_per_gas: tx
.max_fee_per_gas
.ok_or(ConversionError::MissingMaxFeePerGas)?,
gas_limit: tx.gas,
to: tx.to.map_or(TxKind::Create, TxKind::Call),
value: tx.value,
access_list: tx.access_list.ok_or(ConversionError::MissingAccessList)?,
input: tx.input,
}))
AnyTxEnvelope::Ethereum(TxEnvelope::Eip1559(tx)) => {
let (tx, signature, hash) = tx.into_parts();
(Transaction::Eip1559(tx), signature, hash)
}
Some(TxType::Eip4844) => {
// EIP-4844
Ok(Self::Eip4844(TxEip4844 {
chain_id: tx.chain_id.ok_or(ConversionError::MissingChainId)?,
nonce: tx.nonce,
max_priority_fee_per_gas: tx
.max_priority_fee_per_gas
.ok_or(ConversionError::MissingMaxPriorityFeePerGas)?,
max_fee_per_gas: tx
.max_fee_per_gas
.ok_or(ConversionError::MissingMaxFeePerGas)?,
gas_limit: tx.gas,
to: tx.to.unwrap_or_default(),
value: tx.value,
access_list: tx.access_list.ok_or(ConversionError::MissingAccessList)?,
input: tx.input,
blob_versioned_hashes: tx
.blob_versioned_hashes
.ok_or(ConversionError::MissingBlobVersionedHashes)?,
max_fee_per_blob_gas: tx
.max_fee_per_blob_gas
.ok_or(ConversionError::MissingMaxFeePerBlobGas)?,
}))
AnyTxEnvelope::Ethereum(TxEnvelope::Eip4844(tx)) => {
let (tx, signature, hash) = tx.into_parts();
(Transaction::Eip4844(tx.into()), signature, hash)
}
Some(TxType::Eip7702) => {
// this is currently unsupported as it is not present in alloy due to missing rpc
// specs
Err(ConversionError::Custom("Unimplemented".to_string()))
/*
// EIP-7702
Ok(Transaction::Eip7702(TxEip7702 {
chain_id: tx.chain_id.ok_or(ConversionError::MissingChainId)?,
nonce: tx.nonce,
max_priority_fee_per_gas: tx
.max_priority_fee_per_gas
.ok_or(ConversionError::MissingMaxPriorityFeePerGas)?,
max_fee_per_gas: tx
.max_fee_per_gas
.ok_or(ConversionError::MissingMaxFeePerGas)?,
gas_limit: tx
.gas
.try_into()
.map_err(|_| ConversionError::Eip2718Error(RlpError::Overflow.into()))?,
to: tx.to.map_or(TxKind::Create, TxKind::Call),
value: tx.value,
access_list: tx.access_list.ok_or(ConversionError::MissingAccessList)?,
authorization_list: tx
.authorization_list
.ok_or(ConversionError::MissingAuthorizationList)?,
input: tx.input,
}))*/
AnyTxEnvelope::Ethereum(TxEnvelope::Eip7702(tx)) => {
let (tx, signature, hash) = tx.into_parts();
(Transaction::Eip7702(tx), signature, hash)
}
#[cfg(feature = "optimism")]
Some(TxType::Deposit) => {
let fields = other
.deserialize_into::<op_alloy_rpc_types::OpTransactionFields>()
.map_err(|e| ConversionError::Custom(e.to_string()))?;
Ok(Self::Deposit(op_alloy_consensus::TxDeposit {
source_hash: fields
.source_hash
.ok_or_else(|| ConversionError::Custom("MissingSourceHash".to_string()))?,
from: tx.from,
to: TxKind::from(tx.to),
mint: fields.mint.filter(|n| *n != 0),
value: tx.value,
gas_limit: tx.gas,
is_system_transaction: fields.is_system_tx.unwrap_or(false),
input: tx.input,
}))
}
}
}
}
AnyTxEnvelope::Unknown(alloy_network::UnknownTxEnvelope { hash, inner }) => {
use alloy_consensus::Transaction as _;
impl TryFrom<WithOtherFields<alloy_rpc_types::Transaction>> for TransactionSigned {
type Error = alloy_rpc_types::ConversionError;
fn try_from(tx: WithOtherFields<alloy_rpc_types::Transaction>) -> Result<Self, Self::Error> {
use alloy_rpc_types::ConversionError;
let signature = tx.signature.ok_or(ConversionError::MissingSignature)?;
let transaction: Transaction = tx.try_into()?;
let y_parity = if let Some(y_parity) = signature.y_parity {
y_parity.0
} else {
match transaction.tx_type() {
// If the transaction type is Legacy, adjust the v component of the
// signature according to the Ethereum specification
TxType::Legacy => {
extract_chain_id(signature.v.to())
.map_err(|_| ConversionError::InvalidSignature)?
.0
if inner.ty() == crate::TxType::Deposit {
let fields: op_alloy_rpc_types::OpTransactionFields = inner
.fields
.clone()
.deserialize_into::<op_alloy_rpc_types::OpTransactionFields>()
.map_err(|e| ConversionError::Custom(e.to_string()))?;
(
Transaction::Deposit(op_alloy_consensus::TxDeposit {
source_hash: fields.source_hash.ok_or_else(|| {
ConversionError::Custom("MissingSourceHash".to_string())
})?,
from: tx.from,
to: revm_primitives::TxKind::from(inner.to()),
mint: fields.mint.filter(|n| *n != 0),
value: inner.value(),
gas_limit: inner.gas_limit(),
is_system_transaction: fields.is_system_tx.unwrap_or(false),
input: inner.input().clone(),
}),
op_alloy_consensus::TxDeposit::signature(),
hash,
)
} else {
return Err(ConversionError::Custom("unknown transaction type".to_string()))
}
_ => !signature.v.is_zero(),
}
_ => return Err(ConversionError::Custom("unknown transaction type".to_string())),
};
let mut parity = Parity::Parity(y_parity);
if matches!(transaction.tx_type(), TxType::Legacy) {
if let Some(chain_id) = transaction.chain_id() {
parity = parity.with_chain_id(chain_id)
}
}
Ok(Self::from_transaction_and_signature(
transaction,
Signature::new(signature.r, signature.s, parity),
))
}
}
impl TryFrom<WithOtherFields<alloy_rpc_types::Transaction>> for TransactionSignedEcRecovered {
type Error = alloy_rpc_types::ConversionError;
fn try_from(tx: WithOtherFields<alloy_rpc_types::Transaction>) -> Result<Self, Self::Error> {
use alloy_rpc_types::ConversionError;
let transaction: TransactionSigned = tx.try_into()?;
transaction.try_into_ecrecovered().map_err(|_| ConversionError::InvalidSignature)
}
}
impl TryFrom<WithOtherFields<alloy_rpc_types::Transaction>> for TransactionSignedNoHash {
type Error = alloy_rpc_types::ConversionError;
fn try_from(tx: WithOtherFields<alloy_rpc_types::Transaction>) -> Result<Self, Self::Error> {
Ok(Self {
signature: tx.signature.ok_or(Self::Error::MissingSignature)?.try_into()?,
transaction: tx.try_into()?,
})
Ok(Self { transaction, signature, hash })
}
}
@ -278,7 +165,7 @@ impl TryFrom<WithOtherFields<alloy_rpc_types::Transaction>> for TransactionSigne
mod tests {
use super::*;
use alloy_primitives::{address, Address, B256, U256};
use alloy_rpc_types::Transaction as AlloyTransaction;
use revm_primitives::TxKind;
#[test]
fn optimism_deposit_tx_conversion_no_mint() {
@ -302,10 +189,11 @@ mod tests {
"v": "0x0",
"value": "0x0"
}"#;
let alloy_tx: WithOtherFields<AlloyTransaction> =
let alloy_tx: WithOtherFields<alloy_rpc_types::Transaction<AnyTxEnvelope>> =
serde_json::from_str(input).expect("failed to deserialize");
let reth_tx: Transaction = alloy_tx.try_into().expect("failed to convert");
let TransactionSigned { transaction: reth_tx, .. } =
alloy_tx.try_into().expect("failed to convert");
if let Transaction::Deposit(deposit_tx) = reth_tx {
assert_eq!(
deposit_tx.source_hash,
@ -352,10 +240,11 @@ mod tests {
"v": "0x0",
"value": "0x239c2e16a5ca590000"
}"#;
let alloy_tx: WithOtherFields<AlloyTransaction> =
let alloy_tx: WithOtherFields<alloy_rpc_types::Transaction<AnyTxEnvelope>> =
serde_json::from_str(input).expect("failed to deserialize");
let reth_tx: Transaction = alloy_tx.try_into().expect("failed to convert");
let TransactionSigned { transaction: reth_tx, .. } =
alloy_tx.try_into().expect("failed to convert");
if let Transaction::Deposit(deposit_tx) = reth_tx {
assert_eq!(

View File

@ -3,7 +3,8 @@
#[cfg(any(test, feature = "reth-codec"))]
use alloy_consensus::constants::{EIP4844_TX_TYPE_ID, EIP7702_TX_TYPE_ID};
use alloy_consensus::{
SignableTransaction, Transaction as _, TxEip1559, TxEip2930, TxEip4844, TxEip7702, TxLegacy,
transaction::RlpEcdsaTx, SignableTransaction, Transaction as _, TxEip1559, TxEip2930,
TxEip4844, TxEip7702, TxLegacy,
};
use alloy_eips::{
eip1898::BlockHashOrNumber,
@ -11,7 +12,9 @@ use alloy_eips::{
eip2930::AccessList,
eip7702::SignedAuthorization,
};
use alloy_primitives::{keccak256, Address, Bytes, ChainId, Signature, TxHash, TxKind, B256, U256};
use alloy_primitives::{
keccak256, Address, Bytes, ChainId, PrimitiveSignature as Signature, TxHash, TxKind, B256, U256,
};
use alloy_rlp::{Decodable, Encodable, Error as RlpError, Header};
use core::mem;
use derive_more::{AsRef, Deref};
@ -22,7 +25,7 @@ use once_cell::sync::Lazy as LazyLock;
use op_alloy_consensus::DepositTransaction;
use rayon::prelude::{IntoParallelIterator, ParallelIterator};
use serde::{Deserialize, Serialize};
use signature::{decode_with_eip155_chain_id, with_eip155_parity};
use signature::decode_with_eip155_chain_id;
#[cfg(feature = "std")]
use std::sync::LazyLock;
@ -34,7 +37,7 @@ pub use pooled::{PooledTransactionsElement, PooledTransactionsElementEcRecovered
pub use sidecar::BlobTransaction;
pub use compat::FillTxEnv;
pub use signature::{extract_chain_id, legacy_parity, recover_signer, recover_signer_unchecked};
pub use signature::{recover_signer, recover_signer_unchecked};
pub use tx_type::TxType;
pub use variant::TransactionSignedVariant;
@ -383,38 +386,37 @@ impl Transaction {
/// This encodes the transaction _without_ the signature, and is only suitable for creating a
/// hash intended for signing.
pub fn encode_without_signature(&self, out: &mut dyn bytes::BufMut) {
Encodable::encode(self, out);
pub fn encode_for_signing(&self, out: &mut dyn bytes::BufMut) {
match self {
Self::Legacy(tx) => tx.encode_for_signing(out),
Self::Eip2930(tx) => tx.encode_for_signing(out),
Self::Eip1559(tx) => tx.encode_for_signing(out),
Self::Eip4844(tx) => tx.encode_for_signing(out),
Self::Eip7702(tx) => tx.encode_for_signing(out),
#[cfg(feature = "optimism")]
Self::Deposit(_) => {}
}
}
/// Inner encoding function that is used for both rlp [`Encodable`] trait and for calculating
/// hash that for eip2718 does not require rlp header
pub fn encode_with_signature(
&self,
signature: &Signature,
out: &mut dyn bytes::BufMut,
with_header: bool,
) {
/// Produces EIP-2718 encoding of the transaction
pub fn eip2718_encode(&self, signature: &Signature, out: &mut dyn bytes::BufMut) {
match self {
Self::Legacy(legacy_tx) => {
// do nothing w/ with_header
legacy_tx.encode_with_signature_fields(
&with_eip155_parity(signature, legacy_tx.chain_id),
out,
)
legacy_tx.eip2718_encode(signature, out);
}
Self::Eip2930(access_list_tx) => {
access_list_tx.encode_with_signature(signature, out, with_header)
access_list_tx.eip2718_encode(signature, out);
}
Self::Eip1559(dynamic_fee_tx) => {
dynamic_fee_tx.encode_with_signature(signature, out, with_header)
dynamic_fee_tx.eip2718_encode(signature, out);
}
Self::Eip4844(blob_tx) => blob_tx.encode_with_signature(signature, out, with_header),
Self::Eip4844(blob_tx) => blob_tx.eip2718_encode(signature, out),
Self::Eip7702(set_code_tx) => {
set_code_tx.encode_with_signature(signature, out, with_header)
set_code_tx.eip2718_encode(signature, out);
}
#[cfg(feature = "optimism")]
Self::Deposit(deposit_tx) => deposit_tx.encode_inner(out, with_header),
Self::Deposit(deposit_tx) => deposit_tx.eip2718_encode(out),
}
}
@ -649,46 +651,6 @@ impl Default for Transaction {
}
}
impl Encodable for Transaction {
/// This encodes the transaction _without_ the signature, and is only suitable for creating a
/// hash intended for signing.
fn encode(&self, out: &mut dyn bytes::BufMut) {
match self {
Self::Legacy(legacy_tx) => {
legacy_tx.encode_for_signing(out);
}
Self::Eip2930(access_list_tx) => {
access_list_tx.encode_for_signing(out);
}
Self::Eip1559(dynamic_fee_tx) => {
dynamic_fee_tx.encode_for_signing(out);
}
Self::Eip4844(blob_tx) => {
blob_tx.encode_for_signing(out);
}
Self::Eip7702(set_code_tx) => {
set_code_tx.encode_for_signing(out);
}
#[cfg(feature = "optimism")]
Self::Deposit(deposit_tx) => {
deposit_tx.encode_inner(out, true);
}
}
}
fn length(&self) -> usize {
match self {
Self::Legacy(legacy_tx) => legacy_tx.payload_len_for_signature(),
Self::Eip2930(access_list_tx) => access_list_tx.payload_len_for_signature(),
Self::Eip1559(dynamic_fee_tx) => dynamic_fee_tx.payload_len_for_signature(),
Self::Eip4844(blob_tx) => blob_tx.payload_len_for_signature(),
Self::Eip7702(set_code_tx) => set_code_tx.payload_len_for_signature(),
#[cfg(feature = "optimism")]
Self::Deposit(deposit_tx) => deposit_tx.encoded_len(true),
}
}
}
impl alloy_consensus::Transaction for Transaction {
fn chain_id(&self) -> Option<ChainId> {
match self {
@ -891,7 +853,7 @@ impl TransactionSignedNoHash {
pub fn hash(&self) -> B256 {
// pre-allocate buffer for the transaction
let mut buf = Vec::with_capacity(128 + self.transaction.input().len());
self.transaction.encode_with_signature(&self.signature, &mut buf, false);
self.transaction.eip2718_encode(&self.signature, &mut buf);
keccak256(&buf)
}
@ -925,7 +887,7 @@ impl TransactionSignedNoHash {
/// This makes it possible to import pre bedrock transactions via the sender recovery stage.
pub fn encode_and_recover_unchecked(&self, buffer: &mut Vec<u8>) -> Option<Address> {
buffer.clear();
self.transaction.encode_without_signature(buffer);
self.transaction.encode_for_signing(buffer);
// Optimism's Deposit transaction does not have a signature. Directly return the
// `from` address.
@ -1034,7 +996,7 @@ impl reth_codecs::Compact for TransactionSignedNoHash {
let bitflags = buf.get_u8() as usize;
let sig_bit = bitflags & 1;
let (mut signature, buf) = Signature::from_compact(buf, sig_bit);
let (signature, buf) = Signature::from_compact(buf, sig_bit);
let zstd_bit = bitflags >> 3;
let (transaction, buf) = if zstd_bit != 0 {
@ -1063,10 +1025,6 @@ impl reth_codecs::Compact for TransactionSignedNoHash {
Transaction::from_compact(buf, transaction_type)
};
if matches!(transaction, Transaction::Legacy(_)) {
signature = signature.with_parity(legacy_parity(&signature, transaction.chain_id()))
}
(Self { signature, transaction }, buf)
}
}
@ -1581,28 +1539,24 @@ impl Encodable2718 for TransactionSigned {
fn encode_2718_len(&self) -> usize {
match &self.transaction {
Transaction::Legacy(legacy_tx) => legacy_tx.encoded_len_with_signature(
&with_eip155_parity(&self.signature, legacy_tx.chain_id),
),
Transaction::Legacy(legacy_tx) => legacy_tx.eip2718_encoded_length(&self.signature),
Transaction::Eip2930(access_list_tx) => {
access_list_tx.encoded_len_with_signature(&self.signature, false)
access_list_tx.eip2718_encoded_length(&self.signature)
}
Transaction::Eip1559(dynamic_fee_tx) => {
dynamic_fee_tx.encoded_len_with_signature(&self.signature, false)
}
Transaction::Eip4844(blob_tx) => {
blob_tx.encoded_len_with_signature(&self.signature, false)
dynamic_fee_tx.eip2718_encoded_length(&self.signature)
}
Transaction::Eip4844(blob_tx) => blob_tx.eip2718_encoded_length(&self.signature),
Transaction::Eip7702(set_code_tx) => {
set_code_tx.encoded_len_with_signature(&self.signature, false)
set_code_tx.eip2718_encoded_length(&self.signature)
}
#[cfg(feature = "optimism")]
Transaction::Deposit(deposit_tx) => deposit_tx.encoded_len(false),
Transaction::Deposit(deposit_tx) => deposit_tx.eip2718_encoded_length(),
}
}
fn encode_2718(&self, out: &mut dyn alloy_rlp::BufMut) {
self.transaction.encode_with_signature(&self.signature, out, false)
self.transaction.eip2718_encode(&self.signature, out)
}
}
@ -1611,24 +1565,24 @@ impl Decodable2718 for TransactionSigned {
match ty.try_into().map_err(|_| Eip2718Error::UnexpectedType(ty))? {
TxType::Legacy => Err(Eip2718Error::UnexpectedType(0)),
TxType::Eip2930 => {
let (tx, signature, hash) = TxEip2930::decode_signed_fields(buf)?.into_parts();
let (tx, signature, hash) = TxEip2930::rlp_decode_signed(buf)?.into_parts();
Ok(Self { transaction: Transaction::Eip2930(tx), signature, hash })
}
TxType::Eip1559 => {
let (tx, signature, hash) = TxEip1559::decode_signed_fields(buf)?.into_parts();
let (tx, signature, hash) = TxEip1559::rlp_decode_signed(buf)?.into_parts();
Ok(Self { transaction: Transaction::Eip1559(tx), signature, hash })
}
TxType::Eip7702 => {
let (tx, signature, hash) = TxEip7702::decode_signed_fields(buf)?.into_parts();
let (tx, signature, hash) = TxEip7702::rlp_decode_signed(buf)?.into_parts();
Ok(Self { transaction: Transaction::Eip7702(tx), signature, hash })
}
TxType::Eip4844 => {
let (tx, signature, hash) = TxEip4844::decode_signed_fields(buf)?.into_parts();
let (tx, signature, hash) = TxEip4844::rlp_decode_signed(buf)?.into_parts();
Ok(Self { transaction: Transaction::Eip4844(tx), signature, hash })
}
#[cfg(feature = "optimism")]
TxType::Deposit => Ok(Self::from_transaction_and_signature(
Transaction::Deposit(TxDeposit::decode(buf)?),
Transaction::Deposit(TxDeposit::rlp_decode(buf)?),
TxDeposit::signature(),
)),
}
@ -1647,22 +1601,12 @@ impl<'a> arbitrary::Arbitrary<'a> for TransactionSigned {
let secp = secp256k1::Secp256k1::new();
let key_pair = secp256k1::Keypair::new(&secp, &mut rand::thread_rng());
let mut signature = crate::sign_message(
let signature = crate::sign_message(
B256::from_slice(&key_pair.secret_bytes()[..]),
transaction.signature_hash(),
)
.unwrap();
signature = if matches!(transaction, Transaction::Legacy(_)) {
if let Some(chain_id) = transaction.chain_id() {
signature.with_chain_id(chain_id)
} else {
signature.with_parity(alloy_primitives::Parity::NonEip155(bool::arbitrary(u)?))
}
} else {
signature.with_parity_bool()
};
#[cfg(feature = "optimism")]
// Both `Some(0)` and `None` values are encoded as empty string byte. This introduces
// ambiguity in roundtrip tests. Patch the mint value of deposit transaction here, so that
@ -1810,7 +1754,7 @@ pub mod serde_bincode_compat {
transaction::serde_bincode_compat::{TxEip1559, TxEip2930, TxEip7702, TxLegacy},
TxEip4844,
};
use alloy_primitives::{Signature, TxHash};
use alloy_primitives::{PrimitiveSignature as Signature, TxHash};
#[cfg(feature = "optimism")]
use op_alloy_consensus::serde_bincode_compat::TxDeposit;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
@ -2018,7 +1962,7 @@ mod tests {
use alloy_consensus::Transaction as _;
use alloy_eips::eip2718::{Decodable2718, Encodable2718};
use alloy_primitives::{
address, b256, bytes, hex, Address, Bytes, Parity, Signature, B256, U256,
address, b256, bytes, hex, Address, Bytes, PrimitiveSignature as Signature, B256, U256,
};
use alloy_rlp::{Decodable, Encodable, Error as RlpError};
use reth_chainspec::MIN_TRANSACTION_GAS;
@ -2127,7 +2071,7 @@ mod tests {
.unwrap(),
U256::from_str("0x3a456401896b1b6055311536bf00a718568c744d8c1f9df59879e8350220ca18")
.unwrap(),
Parity::Eip155(43),
false,
);
let hash = b256!("a517b206d2223278f860ea017d3626cacad4f52ff51030dc9a96b432f17f8d34");
test_decode_and_encode(&bytes, transaction, signature, Some(hash));
@ -2147,7 +2091,7 @@ mod tests {
.unwrap(),
U256::from_str("0x5406ad177223213df262cb66ccbb2f46bfdccfdfbbb5ffdda9e2c02d977631da")
.unwrap(),
Parity::Eip155(43),
false,
);
test_decode_and_encode(&bytes, transaction, signature, None);
@ -2166,7 +2110,7 @@ mod tests {
.unwrap(),
U256::from_str("0x3ca3ae86580e94550d7c071e3a02eadb5a77830947c9225165cf9100901bee88")
.unwrap(),
Parity::Eip155(43),
false,
);
test_decode_and_encode(&bytes, transaction, signature, None);
@ -2187,7 +2131,7 @@ mod tests {
.unwrap(),
U256::from_str("0x016b83f4f980694ed2eee4d10667242b1f40dc406901b34125b008d334d47469")
.unwrap(),
Parity::Parity(true),
true,
);
test_decode_and_encode(&bytes, transaction, signature, None);
@ -2206,7 +2150,7 @@ mod tests {
.unwrap(),
U256::from_str("0x612638fb29427ca33b9a3be2a0a561beecfe0269655be160d35e72d366a6a860")
.unwrap(),
Parity::Eip155(44),
true,
);
test_decode_and_encode(&bytes, transaction, signature, None);
}
@ -2370,7 +2314,7 @@ mod tests {
.unwrap(),
U256::from_str("0x3a456401896b1b6055311536bf00a718568c744d8c1f9df59879e8350220ca18")
.unwrap(),
Parity::Eip155(43),
false,
);
let inputs: Vec<Vec<u8>> = vec![

View File

@ -1,21 +1,17 @@
//! Defines the types for blob transactions, legacy, and other EIP-2718 transactions included in a
//! response to `GetPooledTransactions`.
use super::{
error::TransactionConversionError,
signature::{recover_signer, with_eip155_parity},
TxEip7702,
};
use super::{error::TransactionConversionError, signature::recover_signer, TxEip7702};
use crate::{BlobTransaction, Transaction, TransactionSigned, TransactionSignedEcRecovered};
use alloy_eips::eip4844::BlobTransactionSidecar;
use alloy_consensus::{
constants::EIP4844_TX_TYPE_ID,
transaction::{TxEip1559, TxEip2930, TxEip4844, TxLegacy},
transaction::{RlpEcdsaTx, TxEip1559, TxEip2930, TxEip4844, TxLegacy},
SignableTransaction, TxEip4844WithSidecar,
};
use alloy_eips::eip2718::{Decodable2718, Eip2718Result, Encodable2718};
use alloy_primitives::{Address, Signature, TxHash, B256};
use alloy_primitives::{Address, PrimitiveSignature as Signature, TxHash, B256};
use alloy_rlp::{Decodable, Encodable, Error as RlpError, Header};
use bytes::Buf;
use derive_more::{AsRef, Deref};
@ -402,59 +398,39 @@ impl Encodable2718 for PooledTransactionsElement {
fn encode_2718_len(&self) -> usize {
match self {
Self::Legacy { transaction, signature, .. } => {
// method computes the payload len with a RLP header
transaction.encoded_len_with_signature(&with_eip155_parity(
signature,
transaction.chain_id,
))
transaction.eip2718_encoded_length(signature)
}
Self::Eip2930 { transaction, signature, .. } => {
// method computes the payload len without a RLP header
transaction.encoded_len_with_signature(signature, false)
transaction.eip2718_encoded_length(signature)
}
Self::Eip1559 { transaction, signature, .. } => {
// method computes the payload len without a RLP header
transaction.encoded_len_with_signature(signature, false)
transaction.eip2718_encoded_length(signature)
}
Self::Eip7702 { transaction, signature, .. } => {
// method computes the payload len without a RLP header
transaction.encoded_len_with_signature(signature, false)
transaction.eip2718_encoded_length(signature)
}
Self::BlobTransaction(blob_tx) => {
// the encoding does not use a header, so we set `with_header` to false
blob_tx.payload_len_with_type(false)
Self::BlobTransaction(BlobTransaction { transaction, signature, .. }) => {
transaction.eip2718_encoded_length(signature)
}
}
}
fn encode_2718(&self, out: &mut dyn alloy_rlp::BufMut) {
// The encoding of `tx-data` depends on the transaction type. Refer to these docs for more
// information on the exact format:
// - Legacy: TxLegacy::encode_with_signature
// - EIP-2930: TxEip2930::encode_with_signature
// - EIP-1559: TxEip1559::encode_with_signature
// - EIP-4844: BlobTransaction::encode_with_type_inner
// - EIP-7702: TxEip7702::encode_with_signature
match self {
Self::Legacy { transaction, signature, .. } => transaction
.encode_with_signature_fields(
&with_eip155_parity(signature, transaction.chain_id),
out,
),
Self::Legacy { transaction, signature, .. } => {
transaction.eip2718_encode(signature, out)
}
Self::Eip2930 { transaction, signature, .. } => {
transaction.encode_with_signature(signature, out, false)
transaction.eip2718_encode(signature, out)
}
Self::Eip1559 { transaction, signature, .. } => {
transaction.encode_with_signature(signature, out, false)
transaction.eip2718_encode(signature, out)
}
Self::Eip7702 { transaction, signature, .. } => {
transaction.encode_with_signature(signature, out, false)
transaction.eip2718_encode(signature, out)
}
Self::BlobTransaction(blob_tx) => {
// The inner encoding is used with `with_header` set to true, making the final
// encoding:
// `tx_type || rlp([transaction_payload_body, blobs, commitments, proofs]))`
blob_tx.encode_with_type_inner(out, false);
Self::BlobTransaction(BlobTransaction { transaction, signature, .. }) => {
transaction.eip2718_encode(signature, out)
}
}
}

View File

@ -1,10 +1,9 @@
#![cfg_attr(docsrs, doc(cfg(feature = "c-kzg")))]
use crate::{Transaction, TransactionSigned};
use alloy_consensus::{constants::EIP4844_TX_TYPE_ID, TxEip4844WithSidecar};
use alloy_consensus::{transaction::RlpEcdsaTx, TxEip4844WithSidecar};
use alloy_eips::eip4844::BlobTransactionSidecar;
use alloy_primitives::{Signature, TxHash};
use alloy_rlp::Header;
use alloy_primitives::{PrimitiveSignature as Signature, TxHash};
use serde::{Deserialize, Serialize};
/// A response to `GetPooledTransactions` that includes blob data, their commitments, and their
@ -69,107 +68,6 @@ impl BlobTransaction {
(transaction, self.transaction.sidecar)
}
/// Encodes the [`BlobTransaction`] fields as RLP, with a tx type. If `with_header` is `false`,
/// the following will be encoded:
/// `tx_type (0x03) || rlp([transaction_payload_body, blobs, commitments, proofs])`
///
/// If `with_header` is `true`, the following will be encoded:
/// `rlp(tx_type (0x03) || rlp([transaction_payload_body, blobs, commitments, proofs]))`
///
/// NOTE: The header will be a byte string header, not a list header.
pub(crate) fn encode_with_type_inner(&self, out: &mut dyn bytes::BufMut, with_header: bool) {
// Calculate the length of:
// `tx_type || rlp([transaction_payload_body, blobs, commitments, proofs])`
//
// to construct and encode the string header
if with_header {
Header {
list: false,
// add one for the tx type
payload_length: 1 + self.payload_len(),
}
.encode(out);
}
out.put_u8(EIP4844_TX_TYPE_ID);
// Now we encode the inner blob transaction:
self.encode_inner(out);
}
/// Encodes the [`BlobTransaction`] fields as RLP, with the following format:
/// `rlp([transaction_payload_body, blobs, commitments, proofs])`
///
/// where `transaction_payload_body` is a list:
/// `[chain_id, nonce, max_priority_fee_per_gas, ..., y_parity, r, s]`
///
/// Note: this should be used only when implementing other RLP encoding methods, and does not
/// represent the full RLP encoding of the blob transaction.
pub(crate) fn encode_inner(&self, out: &mut dyn bytes::BufMut) {
self.transaction.encode_with_signature_fields(&self.signature, out);
}
/// Outputs the length of the RLP encoding of the blob transaction, including the tx type byte,
/// optionally including the length of a wrapping string header. If `with_header` is `false`,
/// the length of the following will be calculated:
/// `tx_type (0x03) || rlp([transaction_payload_body, blobs, commitments, proofs])`
///
/// If `with_header` is `true`, the length of the following will be calculated:
/// `rlp(tx_type (0x03) || rlp([transaction_payload_body, blobs, commitments, proofs]))`
pub(crate) fn payload_len_with_type(&self, with_header: bool) -> usize {
if with_header {
// Construct a header and use that to calculate the total length
let wrapped_header = Header {
list: false,
// add one for the tx type byte
payload_length: 1 + self.payload_len(),
};
// The total length is now the length of the header plus the length of the payload
// (which includes the tx type byte)
wrapped_header.length() + wrapped_header.payload_length
} else {
// Just add the length of the tx type to the payload length
1 + self.payload_len()
}
}
/// Outputs the length of the RLP encoding of the blob transaction with the following format:
/// `rlp([transaction_payload_body, blobs, commitments, proofs])`
///
/// where `transaction_payload_body` is a list:
/// `[chain_id, nonce, max_priority_fee_per_gas, ..., y_parity, r, s]`
///
/// Note: this should be used only when implementing other RLP encoding length methods, and
/// does not represent the full RLP encoding of the blob transaction.
pub(crate) fn payload_len(&self) -> usize {
// The `transaction_payload_body` length is the length of the fields, plus the length of
// its list header.
let tx_header = Header {
list: true,
payload_length: self.transaction.tx.fields_len() + self.signature.rlp_vrs_len(),
};
let tx_length = tx_header.length() + tx_header.payload_length;
// The payload length is the length of the `tranascation_payload_body` list, plus the
// length of the blobs, commitments, and proofs.
let payload_length = tx_length + self.transaction.sidecar.rlp_encoded_fields_length();
// We use the calculated payload len to construct the first list header, which encompasses
// everything in the tx - the length of the second, inner list header is part of
// payload_length
let blob_tx_header = Header { list: true, payload_length };
// The final length is the length of:
// * the outer blob tx header +
// * the inner tx header +
// * the inner tx fields +
// * the signature fields +
// * the sidecar fields
blob_tx_header.length() + blob_tx_header.payload_length
}
/// Decodes a [`BlobTransaction`] from RLP. This expects the encoding to be:
/// `rlp([transaction_payload_body, blobs, commitments, proofs])`
///
@ -180,7 +78,7 @@ impl BlobTransaction {
/// represent the full RLP decoding of the `PooledTransactionsElement` type.
pub(crate) fn decode_inner(data: &mut &[u8]) -> alloy_rlp::Result<Self> {
let (transaction, signature, hash) =
TxEip4844WithSidecar::decode_signed_fields(data)?.into_parts();
TxEip4844WithSidecar::rlp_decode_signed(data)?.into_parts();
Ok(Self { transaction, hash, signature })
}

View File

@ -1,6 +1,7 @@
use crate::transaction::util::secp256k1;
use alloy_primitives::{Address, Parity, Signature, B256, U256};
use alloy_rlp::{Decodable, Error as RlpError};
use alloy_consensus::transaction::from_eip155_value;
use alloy_primitives::{Address, PrimitiveSignature as Signature, B256, U256};
use alloy_rlp::Decodable;
/// The order of the secp256k1 curve, divided by two. Signatures that should be checked according
/// to EIP-2 should have an S value less than or equal to this.
@ -14,25 +15,23 @@ const SECP256K1N_HALF: U256 = U256::from_be_bytes([
pub(crate) fn decode_with_eip155_chain_id(
buf: &mut &[u8],
) -> alloy_rlp::Result<(Signature, Option<u64>)> {
let v: Parity = Decodable::decode(buf)?;
let v: u64 = Decodable::decode(buf)?;
let r: U256 = Decodable::decode(buf)?;
let s: U256 = Decodable::decode(buf)?;
#[cfg(not(feature = "optimism"))]
if matches!(v, Parity::Parity(_)) {
return Err(alloy_rlp::Error::Custom("invalid parity for legacy transaction"));
}
let Some((parity, chain_id)) = from_eip155_value(v) else {
// pre bedrock system transactions were sent from the zero address as legacy
// transactions with an empty signature
//
// NOTE: this is very hacky and only relevant for op-mainnet pre bedrock
#[cfg(feature = "optimism")]
if v == 0 && r.is_zero() && s.is_zero() {
return Ok((Signature::new(r, s, false), None))
}
return Err(alloy_rlp::Error::Custom("invalid parity for legacy transaction"))
};
#[cfg(feature = "optimism")]
// pre bedrock system transactions were sent from the zero address as legacy
// transactions with an empty signature
//
// NOTE: this is very hacky and only relevant for op-mainnet pre bedrock
if matches!(v, Parity::Parity(false)) && r.is_zero() && s.is_zero() {
return Ok((Signature::new(r, s, Parity::Parity(false)), None))
}
Ok((Signature::new(r, s, v), v.chain_id()))
Ok((Signature::new(r, s, parity), chain_id))
}
/// Recover signer from message hash, _without ensuring that the signature has a low `s`
@ -46,7 +45,7 @@ pub fn recover_signer_unchecked(signature: &Signature, hash: B256) -> Option<Add
sig[0..32].copy_from_slice(&signature.r().to_be_bytes::<32>());
sig[32..64].copy_from_slice(&signature.s().to_be_bytes::<32>());
sig[64] = signature.v().y_parity_byte();
sig[64] = signature.v() as u8;
// NOTE: we are removing error from underlying crypto library as it will restrain primitive
// errors and we care only if recovery is passing or not.
@ -66,68 +65,15 @@ pub fn recover_signer(signature: &Signature, hash: B256) -> Option<Address> {
recover_signer_unchecked(signature, hash)
}
/// Returns [Parity] value based on `chain_id` for legacy transaction signature.
#[allow(clippy::missing_const_for_fn)]
pub fn legacy_parity(signature: &Signature, chain_id: Option<u64>) -> Parity {
if let Some(chain_id) = chain_id {
Parity::Parity(signature.v().y_parity()).with_chain_id(chain_id)
} else {
#[cfg(feature = "optimism")]
// pre bedrock system transactions were sent from the zero address as legacy
// transactions with an empty signature
//
// NOTE: this is very hacky and only relevant for op-mainnet pre bedrock
if *signature == op_alloy_consensus::TxDeposit::signature() {
return Parity::Parity(false)
}
Parity::NonEip155(signature.v().y_parity())
}
}
/// Returns a signature with the given chain ID applied to the `v` value.
pub(crate) fn with_eip155_parity(signature: &Signature, chain_id: Option<u64>) -> Signature {
Signature::new(signature.r(), signature.s(), legacy_parity(signature, chain_id))
}
/// Outputs (`odd_y_parity`, `chain_id`) from the `v` value.
/// This doesn't check validity of the `v` value for optimism.
#[inline]
pub const fn extract_chain_id(v: u64) -> alloy_rlp::Result<(bool, Option<u64>)> {
if v < 35 {
// non-EIP-155 legacy scheme, v = 27 for even y-parity, v = 28 for odd y-parity
if v != 27 && v != 28 {
return Err(RlpError::Custom("invalid Ethereum signature (V is not 27 or 28)"))
}
Ok((v == 28, None))
} else {
// EIP-155: v = {0, 1} + CHAIN_ID * 2 + 35
let odd_y_parity = ((v - 35) % 2) != 0;
let chain_id = (v - 35) >> 1;
Ok((odd_y_parity, Some(chain_id)))
}
}
#[cfg(test)]
mod tests {
use crate::transaction::signature::{
legacy_parity, recover_signer, recover_signer_unchecked, SECP256K1N_HALF,
recover_signer, recover_signer_unchecked, SECP256K1N_HALF,
};
use alloy_eips::eip2718::Decodable2718;
use alloy_primitives::{hex, Address, Parity, Signature, B256, U256};
use alloy_primitives::{hex, Address, PrimitiveSignature as Signature, B256, U256};
use std::str::FromStr;
#[test]
fn test_legacy_parity() {
// Select 1 as an arbitrary nonzero value for R and S, as v() always returns 0 for (0, 0).
let signature = Signature::new(U256::from(1), U256::from(1), Parity::Parity(false));
assert_eq!(Parity::NonEip155(false), legacy_parity(&signature, None));
assert_eq!(Parity::Eip155(37), legacy_parity(&signature, Some(1)));
let signature = Signature::new(U256::from(1), U256::from(1), Parity::Parity(true));
assert_eq!(Parity::NonEip155(true), legacy_parity(&signature, None));
assert_eq!(Parity::Eip155(38), legacy_parity(&signature, Some(1)));
}
#[test]
fn test_recover_signer() {
let signature = Signature::new(
@ -139,7 +85,7 @@ mod tests {
"46948507304638947509940763649030358759909902576025900602547168820602576006531",
)
.unwrap(),
Parity::Parity(false),
false,
);
let hash =
B256::from_str("daf5a779ae972f972197303d7b574746c7ef83eadac0f2791ad23db92e4c8e53")

View File

@ -1,4 +1,4 @@
use alloy_primitives::{Address, Signature};
use alloy_primitives::{Address, PrimitiveSignature as Signature};
#[cfg(feature = "secp256k1")]
pub(crate) mod secp256k1 {
@ -18,7 +18,7 @@ mod impl_secp256k1 {
ecdsa::{RecoverableSignature, RecoveryId},
Message, PublicKey, SecretKey, SECP256K1,
};
use alloy_primitives::{keccak256, Parity, B256, U256};
use alloy_primitives::{keccak256, B256, U256};
/// Recovers the address of the sender using secp256k1 pubkey recovery.
///
@ -44,7 +44,7 @@ mod impl_secp256k1 {
let signature = Signature::new(
U256::try_from_be_slice(&data[..32]).expect("The slice has at most 32 bytes"),
U256::try_from_be_slice(&data[32..64]).expect("The slice has at most 32 bytes"),
Parity::Parity(rec_id.to_i32() != 0),
rec_id.to_i32() != 0,
);
Ok(signature)
}
@ -62,7 +62,7 @@ mod impl_secp256k1 {
#[cfg_attr(feature = "secp256k1", allow(unused, unreachable_pub))]
mod impl_k256 {
use super::*;
use alloy_primitives::{keccak256, Parity, B256, U256};
use alloy_primitives::{keccak256, B256};
pub(crate) use k256::ecdsa::Error;
use k256::ecdsa::{RecoveryId, SigningKey, VerifyingKey};
@ -92,15 +92,7 @@ mod impl_k256 {
/// Returns the corresponding signature.
pub fn sign_message(secret: B256, message: B256) -> Result<Signature, Error> {
let sec = SigningKey::from_slice(secret.as_ref())?;
let (sig, rec_id) = sec.sign_prehash_recoverable(&message.0)?;
let (r, s) = sig.split_bytes();
let signature = Signature::new(
U256::try_from_be_slice(&r).expect("The slice has at most 32 bytes"),
U256::try_from_be_slice(&s).expect("The slice has at most 32 bytes"),
Parity::Parity(rec_id.is_y_odd()),
);
Ok(signature)
sec.sign_prehash_recoverable(&message.0).map(Into::into)
}
/// Converts a public key into an ethereum address by hashing the encoded public key with
@ -131,7 +123,7 @@ mod tests {
let mut sig: [u8; 65] = [0; 65];
sig[0..32].copy_from_slice(&signature.r().to_be_bytes::<32>());
sig[32..64].copy_from_slice(&signature.s().to_be_bytes::<32>());
sig[64] = signature.v().y_parity_byte();
sig[64] = signature.v() as u8;
assert_eq!(recover_signer_unchecked(&sig, &hash), Ok(signer));
}
@ -189,14 +181,14 @@ mod tests {
sig[0..32].copy_from_slice(&secp256k1_signature.r().to_be_bytes::<32>());
sig[32..64].copy_from_slice(&secp256k1_signature.s().to_be_bytes::<32>());
sig[64] = secp256k1_signature.v().y_parity_byte();
sig[64] = secp256k1_signature.v() as u8;
let secp256k1_recovered =
impl_secp256k1::recover_signer_unchecked(&sig, &hash).expect("secp256k1 recover");
assert_eq!(secp256k1_recovered, secp256k1_signer);
sig[0..32].copy_from_slice(&k256_signature.r().to_be_bytes::<32>());
sig[32..64].copy_from_slice(&k256_signature.s().to_be_bytes::<32>());
sig[64] = k256_signature.v().y_parity_byte();
sig[64] = k256_signature.v() as u8;
let k256_recovered =
impl_k256::recover_signer_unchecked(&sig, &hash).expect("k256 recover");
assert_eq!(k256_recovered, k256_signer);

View File

@ -3,11 +3,11 @@
use std::sync::Arc;
use alloy_eips::BlockId;
use alloy_rpc_types::{Header, Index};
use alloy_rpc_types::{Block, Header, Index};
use futures::Future;
use reth_primitives::{Receipt, SealedBlock, SealedBlockWithSenders};
use reth_provider::{BlockIdReader, BlockReader, BlockReaderIdExt, HeaderProvider};
use reth_rpc_types_compat::block::{from_block, uncle_block_from_header};
use reth_rpc_types_compat::block::from_block;
use crate::{node::RpcNodeCoreExt, FromEthApiError, FullEthApiTypes, RpcBlock, RpcReceipt};
@ -189,7 +189,7 @@ pub trait EthBlocks: LoadBlock {
}
.unwrap_or_default();
Ok(uncles.into_iter().nth(index.into()).map(uncle_block_from_header))
Ok(uncles.into_iter().nth(index.into()).map(Block::uncle_from_header))
}
}
}

View File

@ -5,6 +5,7 @@ use crate::{
AsEthApiError, FromEthApiError, FromEvmError, FullEthApiTypes, IntoEthApiError, RpcBlock,
RpcNodeCore,
};
use alloy_consensus::BlockHeader;
use alloy_eips::{eip1559::calc_next_block_base_fee, eip2930::AccessListResult};
use alloy_primitives::{Address, Bytes, TxKind, B256, U256};
use alloy_rpc_types::{
@ -125,9 +126,9 @@ pub trait EthCall: Call + LoadPendingBlock {
let base_fee = if let Some(latest) = blocks.last() {
let header = &latest.inner.header;
calc_next_block_base_fee(
header.gas_used,
header.gas_limit,
header.base_fee_per_gas.unwrap_or_default(),
header.gas_used(),
header.gas_limit(),
header.base_fee_per_gas().unwrap_or_default(),
base_fee_params,
)
} else {
@ -192,19 +193,20 @@ pub trait EthCall: Call + LoadPendingBlock {
results.push((env.tx.caller, res.result));
}
let block = simulate::build_block(
results,
transactions,
&block_env,
parent_hash,
total_difficulty,
return_full_transactions,
&db,
this.tx_resp_builder(),
)?;
let block: SimulatedBlock<RpcBlock<Self::NetworkTypes>> =
simulate::build_block(
results,
transactions,
&block_env,
parent_hash,
total_difficulty,
return_full_transactions,
&db,
this.tx_resp_builder(),
)?;
parent_hash = block.inner.header.hash;
gas_used += block.inner.header.gas_used;
gas_used += block.inner.header.gas_used();
blocks.push(block);
}

View File

@ -1,7 +1,7 @@
//! An abstraction over ethereum signers.
use alloy_dyn_abi::TypedData;
use alloy_primitives::{Address, Signature};
use alloy_primitives::{Address, PrimitiveSignature as Signature};
use alloy_rpc_types_eth::TransactionRequest;
use dyn_clone::DynClone;
use reth_primitives::TransactionSigned;

View File

@ -74,7 +74,7 @@ pub trait EthState: LoadState + SpawnBlocking {
self.spawn_blocking_io(move |this| {
Ok(B256::new(
this.state_at_block_id_or_latest(block_id)?
.storage(address, index.0)
.storage(address, index.as_b256())
.map_err(Self::Error::from_eth_err)?
.unwrap_or_default()
.to_be_bytes(),
@ -118,7 +118,7 @@ pub trait EthState: LoadState + SpawnBlocking {
self.spawn_blocking_io(move |this| {
let state = this.state_at_block_id(block_id)?;
let storage_keys = keys.iter().map(|key| key.0).collect::<Vec<_>>();
let storage_keys = keys.iter().map(|key| key.as_b256()).collect::<Vec<_>>();
let proof = state
.proof(Default::default(), address, &storage_keys)
.map_err(Self::Error::from_eth_err)?;

View File

@ -1,6 +1,9 @@
//! Trait for specifying `eth` network dependent API types.
use std::{error::Error, fmt};
use std::{
error::Error,
fmt::{self},
};
use alloy_network::Network;
use alloy_rpc_types::Block;

View File

@ -1,7 +1,7 @@
//! Utilities for serving `eth_simulateV1`
use alloy_consensus::{Transaction as _, TxEip4844Variant, TxType, TypedTransaction};
use alloy_primitives::{Parity, Signature};
use alloy_primitives::PrimitiveSignature as Signature;
use alloy_rpc_types::{
simulate::{SimCallResult, SimulateError, SimulatedBlock},
Block, BlockTransactionsKind,
@ -133,8 +133,7 @@ where
};
// Create an empty signature for the transaction.
let signature =
Signature::new(Default::default(), Default::default(), Parity::Parity(false));
let signature = Signature::new(Default::default(), Default::default(), false);
let tx = match tx {
TypedTransaction::Legacy(tx) => {
@ -170,7 +169,7 @@ where
}
/// Handles outputs of the calls execution and builds a [`SimulatedBlock`].
#[expect(clippy::too_many_arguments)]
#[expect(clippy::complexity)]
pub fn build_block<T: TransactionCompat>(
results: Vec<(Address, ExecutionResult)>,
transactions: Vec<TransactionSigned>,
@ -306,6 +305,6 @@ pub fn build_block<T: TransactionCompat>(
let txs_kind =
if full_transactions { BlockTransactionsKind::Full } else { BlockTransactionsKind::Hashes };
let block = from_block(block, total_difficulty, txs_kind, None, tx_resp_builder)?;
let block = from_block::<T>(block, total_difficulty, txs_kind, None, tx_resp_builder)?;
Ok(SimulatedBlock { inner: block, calls })
}

View File

@ -1,13 +1,12 @@
//! Compatibility functions for rpc `Block` type.
use alloy_consensus::Sealed;
use alloy_primitives::{B256, U256};
use alloy_rlp::Encodable;
use alloy_rpc_types::{
Block, BlockError, BlockTransactions, BlockTransactionsKind, Header, TransactionInfo,
};
use reth_primitives::{
Block as PrimitiveBlock, BlockWithSenders, Header as PrimitiveHeader, SealedHeader, Withdrawals,
};
use reth_primitives::{Block as PrimitiveBlock, BlockWithSenders, Withdrawals};
use crate::{transaction::from_recovered_with_block_context, TransactionCompat};
@ -100,64 +99,6 @@ pub fn from_block_full<T: TransactionCompat>(
))
}
/// Converts from a [`reth_primitives::SealedHeader`] to a [`alloy-rpc-types::Header`]
///
/// # Note
///
/// This does not set the `totalDifficulty` field.
pub fn from_primitive_with_hash(primitive_header: reth_primitives::SealedHeader) -> Header {
let (header, hash) = primitive_header.split();
let PrimitiveHeader {
parent_hash,
ommers_hash,
beneficiary,
state_root,
transactions_root,
receipts_root,
logs_bloom,
difficulty,
number,
gas_limit,
gas_used,
timestamp,
mix_hash,
nonce,
base_fee_per_gas,
extra_data,
withdrawals_root,
blob_gas_used,
excess_blob_gas,
parent_beacon_block_root,
requests_hash,
} = header;
Header {
hash,
parent_hash,
uncles_hash: ommers_hash,
miner: beneficiary,
state_root,
transactions_root,
receipts_root,
withdrawals_root,
number,
gas_used,
gas_limit,
extra_data,
logs_bloom,
timestamp,
difficulty,
mix_hash: Some(mix_hash),
nonce: Some(nonce),
base_fee_per_gas,
blob_gas_used,
excess_blob_gas,
parent_beacon_block_root,
total_difficulty: None,
requests_hash,
}
}
#[inline]
fn from_block_with_transactions<T>(
block_length: usize,
@ -166,31 +107,19 @@ fn from_block_with_transactions<T>(
total_difficulty: U256,
transactions: BlockTransactions<T>,
) -> Block<T> {
let uncles = block.body.ommers.into_iter().map(|h| h.hash_slow()).collect();
let mut header = from_primitive_with_hash(SealedHeader::new(block.header, block_hash));
header.total_difficulty = Some(total_difficulty);
let withdrawals = header
let withdrawals = block
.header
.withdrawals_root
.is_some()
.then(|| block.body.withdrawals.map(Withdrawals::into_inner))
.then(|| block.body.withdrawals.map(Withdrawals::into_inner).map(Into::into))
.flatten();
Block { header, uncles, transactions, size: Some(U256::from(block_length)), withdrawals }
}
let uncles = block.body.ommers.into_iter().map(|h| h.hash_slow()).collect();
let header = Header::from_consensus(
Sealed::new_unchecked(block.header, block_hash),
Some(total_difficulty),
Some(U256::from(block_length)),
);
/// Build an RPC block response representing
/// an Uncle from its header.
pub fn uncle_block_from_header<T>(header: PrimitiveHeader) -> Block<T> {
let hash = header.hash_slow();
let uncle_block = PrimitiveBlock { header, ..Default::default() };
let size = Some(U256::from(uncle_block.length()));
let rpc_header = from_primitive_with_hash(SealedHeader::new(uncle_block.header, hash));
Block {
uncles: vec![],
header: rpc_header,
transactions: BlockTransactions::Uncle,
withdrawals: None,
size,
}
Block { header, uncles, transactions, withdrawals }
}

View File

@ -6,7 +6,11 @@ use reth_trie_common::{AccountProof, StorageProof};
/// Creates a new rpc storage proof from a primitive storage proof type.
pub fn from_primitive_storage_proof(proof: StorageProof) -> EIP1186StorageProof {
EIP1186StorageProof { key: JsonStorageKey(proof.key), value: proof.value, proof: proof.proof }
EIP1186StorageProof {
key: JsonStorageKey::Hash(proof.key),
value: proof.value,
proof: proof.proof,
}
}
/// Creates a new rpc account proof from a primitive account proof type.

View File

@ -1,7 +1,4 @@
//! Compatibility functions for rpc `Transaction` type.
mod signature;
pub use signature::*;
use std::fmt;
@ -10,7 +7,7 @@ use alloy_rpc_types::{
request::{TransactionInput, TransactionRequest},
TransactionInfo,
};
use reth_primitives::{TransactionSigned, TransactionSignedEcRecovered, TxType};
use reth_primitives::TransactionSignedEcRecovered;
use serde::{Deserialize, Serialize};
/// Create a new rpc transaction result for a mined transaction, using the given block hash,
@ -44,36 +41,8 @@ pub trait TransactionCompat: Send + Sync + Unpin + Clone + fmt::Debug {
+ Sync
+ Unpin
+ Clone
+ Default
+ fmt::Debug;
///
/// Formats gas price and max fee per gas for RPC transaction response w.r.t. network specific
/// transaction type.
fn gas_price(signed_tx: &TransactionSigned, base_fee: Option<u64>) -> GasPrice {
#[allow(unreachable_patterns)]
match signed_tx.tx_type() {
TxType::Legacy | TxType::Eip2930 => {
GasPrice { gas_price: Some(signed_tx.max_fee_per_gas()), max_fee_per_gas: None }
}
TxType::Eip1559 | TxType::Eip4844 | TxType::Eip7702 => {
// the gas price field for EIP1559 is set to `min(tip, gasFeeCap - baseFee) +
// baseFee`
let gas_price = base_fee
.and_then(|base_fee| {
signed_tx.effective_tip_per_gas(base_fee).map(|tip| tip + base_fee as u128)
})
.unwrap_or_else(|| signed_tx.max_fee_per_gas());
GasPrice {
gas_price: Some(gas_price),
max_fee_per_gas: Some(signed_tx.max_fee_per_gas()),
}
}
_ => GasPrice::default(),
}
}
/// Create a new rpc transaction result for a _pending_ signed transaction, setting block
/// environment related fields to `None`.
fn fill(&self, tx: TransactionSignedEcRecovered, tx_inf: TransactionInfo) -> Self::Transaction;
@ -82,19 +51,6 @@ pub trait TransactionCompat: Send + Sync + Unpin + Clone + fmt::Debug {
// todo: remove in favour of using constructor on `TransactionResponse` or similar
// <https://github.com/alloy-rs/alloy/issues/1315>.
fn otterscan_api_truncate_input(tx: &mut Self::Transaction);
/// Returns the transaction type.
// todo: remove when alloy TransactionResponse trait it updated.
fn tx_type(tx: &Self::Transaction) -> u8;
}
/// Gas price and max fee per gas for a transaction. Helper type to format transaction RPC response.
#[derive(Debug, Default)]
pub struct GasPrice {
/// Gas price for transaction.
pub gas_price: Option<u128>,
/// Max fee per gas for transaction.
pub max_fee_per_gas: Option<u128>,
}
/// Convert [`TransactionSignedEcRecovered`] to [`TransactionRequest`]

View File

@ -6,7 +6,7 @@ use crate::EthApi;
use alloy_dyn_abi::TypedData;
use alloy_eips::eip2718::Decodable2718;
use alloy_network::{eip2718::Encodable2718, EthereumWallet, TransactionBuilder};
use alloy_primitives::{eip191_hash_message, Address, Signature, B256};
use alloy_primitives::{eip191_hash_message, Address, PrimitiveSignature as Signature, B256};
use alloy_rpc_types_eth::TransactionRequest;
use alloy_signer::SignerSync;
use alloy_signer_local::PrivateKeySigner;
@ -109,7 +109,7 @@ impl EthSigner for DevSigner {
#[cfg(test)]
mod tests {
use alloy_primitives::{Bytes, Parity, U256};
use alloy_primitives::{Bytes, U256};
use alloy_rpc_types_eth::TransactionInput;
use revm_primitives::TxKind;
@ -205,7 +205,7 @@ mod tests {
16,
)
.unwrap(),
Parity::Parity(false),
false,
);
assert_eq!(sig, expected)
}
@ -227,7 +227,7 @@ mod tests {
16,
)
.unwrap(),
Parity::Parity(true),
true,
);
assert_eq!(sig, expected)
}

View File

@ -1,14 +1,10 @@
//! L1 `eth` API types.
use alloy_consensus::Transaction as _;
use alloy_consensus::{Signed, TxEip4844Variant, TxEnvelope};
use alloy_network::{Ethereum, Network};
use alloy_primitives::{Address, TxKind};
use alloy_rpc_types::{Transaction, TransactionInfo};
use reth_primitives::TransactionSignedEcRecovered;
use reth_rpc_types_compat::{
transaction::{from_primitive_signature, GasPrice},
TransactionCompat,
};
use reth_primitives::{TransactionSigned, TransactionSignedEcRecovered};
use reth_rpc_types_compat::TransactionCompat;
/// Builds RPC transaction response for l1.
#[derive(Debug, Clone, Copy)]
@ -25,65 +21,46 @@ where
tx: TransactionSignedEcRecovered,
tx_info: TransactionInfo,
) -> Self::Transaction {
let signer = tx.signer();
let signed_tx = tx.into_signed();
let from = tx.signer();
let TransactionSigned { transaction, signature, hash } = tx.into_signed();
let to: Option<Address> = match signed_tx.kind() {
TxKind::Create => None,
TxKind::Call(to) => Some(Address(*to)),
let inner = match transaction {
reth_primitives::Transaction::Legacy(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Eip2930(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Eip1559(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Eip4844(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
reth_primitives::Transaction::Eip7702(tx) => {
Signed::new_unchecked(tx, signature, hash).into()
}
#[allow(unreachable_patterns)]
_ => unreachable!(),
};
let TransactionInfo {
base_fee, block_hash, block_number, index: transaction_index, ..
} = tx_info;
let TransactionInfo { block_hash, block_number, index: transaction_index, .. } = tx_info;
let GasPrice { gas_price, max_fee_per_gas } =
Self::gas_price(&signed_tx, base_fee.map(|fee| fee as u64));
let input = signed_tx.input().to_vec().into();
let chain_id = signed_tx.chain_id();
let blob_versioned_hashes = signed_tx.blob_versioned_hashes().map(|hs| hs.to_vec());
let access_list = signed_tx.access_list().cloned();
let authorization_list = signed_tx.authorization_list().map(|l| l.to_vec());
let signature = from_primitive_signature(
*signed_tx.signature(),
signed_tx.tx_type(),
signed_tx.chain_id(),
);
Transaction {
hash: signed_tx.hash(),
nonce: signed_tx.nonce(),
from: signer,
to,
value: signed_tx.value(),
gas_price,
max_fee_per_gas,
max_priority_fee_per_gas: signed_tx.max_priority_fee_per_gas(),
signature: Some(signature),
gas: signed_tx.gas_limit(),
input,
chain_id,
access_list,
transaction_type: Some(signed_tx.tx_type() as u8),
// These fields are set to None because they are not stored as part of the
// transaction
block_hash,
block_number,
transaction_index,
// EIP-4844 fields
max_fee_per_blob_gas: signed_tx.max_fee_per_blob_gas(),
blob_versioned_hashes,
authorization_list,
}
Transaction { inner, block_hash, block_number, transaction_index, from }
}
fn otterscan_api_truncate_input(tx: &mut Self::Transaction) {
tx.input = tx.input.slice(..4);
}
fn tx_type(tx: &Self::Transaction) -> u8 {
tx.transaction_type.unwrap_or(0)
let input = match &mut tx.inner {
TxEnvelope::Eip1559(tx) => &mut tx.tx_mut().input,
TxEnvelope::Eip2930(tx) => &mut tx.tx_mut().input,
TxEnvelope::Legacy(tx) => &mut tx.tx_mut().input,
TxEnvelope::Eip4844(tx) => match tx.tx_mut() {
TxEip4844Variant::TxEip4844(tx) => &mut tx.input,
TxEip4844Variant::TxEip4844WithSidecar(tx) => &mut tx.tx.input,
},
TxEnvelope::Eip7702(tx) => &mut tx.tx_mut().input,
_ => return,
};
*input = input.slice(..4);
}
}

View File

@ -329,7 +329,7 @@ where
self.chain_events.canonical_state_stream().flat_map(|new_chain| {
let headers = new_chain.committed().headers().collect::<Vec<_>>();
futures::stream::iter(
headers.into_iter().map(reth_rpc_types_compat::block::from_primitive_with_hash),
headers.into_iter().map(|h| Header::from_consensus(h.into(), None, None)),
)
})
}

View File

@ -165,7 +165,7 @@ where
}
/// Handler for `ots_getBlockDetails`
async fn get_block_details(&self, block_number: u64) -> RpcResult<BlockDetails> {
async fn get_block_details(&self, block_number: u64) -> RpcResult<BlockDetails<Header>> {
let block_id = block_number.into();
let block = self.eth.block_by_number(block_id, true);
let block_id = block_id.into();
@ -178,7 +178,7 @@ where
}
/// Handler for `getBlockDetailsByHash`
async fn get_block_details_by_hash(&self, block_hash: B256) -> RpcResult<BlockDetails> {
async fn get_block_details_by_hash(&self, block_hash: B256) -> RpcResult<BlockDetails<Header>> {
let block = self.eth.block_by_hash(block_hash, true);
let block_id = block_hash.into();
let receipts = self.eth.block_receipts(block_id);
@ -195,7 +195,7 @@ where
block_number: u64,
page_number: usize,
page_size: usize,
) -> RpcResult<OtsBlockTransactions<RpcTransaction<Eth::NetworkTypes>>> {
) -> RpcResult<OtsBlockTransactions<RpcTransaction<Eth::NetworkTypes>, Header>> {
let block_id = block_number.into();
// retrieve full block and its receipts
let block = self.eth.block_by_number(block_id, true);
@ -239,7 +239,7 @@ where
let timestamp = Some(block.header.timestamp);
let receipts = receipts
.drain(page_start..page_end)
.zip(transactions.iter().map(Eth::TransactionCompat::tx_type))
.zip(transactions.iter().map(Transaction::ty))
.map(|(receipt, tx_ty)| {
let inner = OtsReceipt {
status: receipt.status(),

View File

@ -85,12 +85,11 @@ mod tests {
nonce: 1,
}
.into_signed(
alloy_primitives::Signature::from_rs_and_parity(
alloy_primitives::PrimitiveSignature::new(
b256!("1fd474b1f9404c0c5df43b7620119ffbc3a1c3f942c73b6e14e9f55255ed9b1d").into(),
b256!("29aca24813279a901ec13b5f7bb53385fa1fc627b946592221417ff74a49600d").into(),
false,
)
.unwrap(),
);
let mut compacted_authorization = Vec::<u8>::new();
let len = authorization.to_compact(&mut compacted_authorization);

View File

@ -1,7 +1,7 @@
//! Compact implementation for [`Signature`]
use crate::Compact;
use alloy_primitives::{Parity, Signature, U256};
use alloy_primitives::{PrimitiveSignature as Signature, U256};
impl Compact for Signature {
fn to_compact<B>(&self, buf: &mut B) -> usize
@ -10,7 +10,7 @@ impl Compact for Signature {
{
buf.put_slice(&self.r().as_le_bytes());
buf.put_slice(&self.s().as_le_bytes());
self.v().y_parity() as usize
self.v() as usize
}
fn from_compact(mut buf: &[u8], identifier: usize) -> (Self, &[u8]) {
@ -19,6 +19,6 @@ impl Compact for Signature {
let r = U256::from_le_slice(&buf[0..32]);
let s = U256::from_le_slice(&buf[32..64]);
buf.advance(64);
(Self::new(r, s, Parity::Parity(identifier != 0)), buf)
(Self::new(r, s, identifier != 0), buf)
}
}

View File

@ -1388,7 +1388,7 @@ impl<N: ProviderNodeTypes> StorageChangeSetReader for ConsistentProvider<N> {
.bundle
.reverts
.clone()
.into_plain_state_reverts()
.to_plain_state_reverts()
.storage
.into_iter()
.flatten()
@ -1441,7 +1441,7 @@ impl<N: ProviderNodeTypes> ChangeSetReader for ConsistentProvider<N> {
.bundle
.reverts
.clone()
.into_plain_state_reverts()
.to_plain_state_reverts()
.accounts
.into_iter()
.flatten()

View File

@ -1704,7 +1704,7 @@ impl<TX: DbTx, N: NodeTypes<ChainSpec: EthereumHardforks>> TransactionsProviderE
rlp_buf: &mut Vec<u8>,
) -> Result<(B256, TxNumber), Box<ProviderError>> {
let (tx_id, tx) = entry.map_err(|e| Box::new(e.into()))?;
tx.transaction.encode_with_signature(&tx.signature, rlp_buf, false);
tx.transaction.eip2718_encode(&tx.signature, rlp_buf);
Ok((keccak256(rlp_buf), tx_id))
}

View File

@ -1671,6 +1671,6 @@ fn calculate_hash(
rlp_buf: &mut Vec<u8>,
) -> Result<(B256, TxNumber), Box<ProviderError>> {
let (tx_id, tx) = entry;
tx.transaction.encode_with_signature(&tx.signature, rlp_buf, false);
tx.transaction.eip2718_encode(&tx.signature, rlp_buf);
Ok((keccak256(rlp_buf), tx_id))
}

View File

@ -2,12 +2,12 @@
use crate::{DatabaseProviderRW, ExecutionOutcome};
use alloy_consensus::{TxLegacy, EMPTY_OMMER_ROOT_HASH};
use alloy_primitives::{
b256, hex_literal::hex, map::HashMap, Address, BlockNumber, Bytes, Log, Parity, Sealable,
TxKind, B256, U256,
b256, hex_literal::hex, map::HashMap, Address, BlockNumber, Bytes, Log, Sealable, TxKind, B256,
U256,
};
use alloy_eips::eip4895::Withdrawal;
use alloy_primitives::Signature;
use alloy_primitives::PrimitiveSignature as Signature;
use reth_db::tables;
use reth_db_api::{database::Database, models::StoredBlockBodyIndices};
use reth_node_types::NodeTypes;
@ -99,7 +99,7 @@ pub(crate) static TEST_BLOCK: LazyLock<SealedBlock> = LazyLock::new(|| SealedBlo
"29056683545955299640297374067888344259176096769870751649153779895496107008675",
)
.unwrap(),
Parity::NonEip155(false),
false,
),
transaction: Transaction::Legacy(TxLegacy {
gas_price: 10,

View File

@ -523,7 +523,7 @@ where
is_value_known: OriginalValuesKnown,
) -> ProviderResult<()> {
let (plain_state, reverts) =
execution_outcome.bundle.into_plain_state_and_reverts(is_value_known);
execution_outcome.bundle.to_plain_state_and_reverts(is_value_known);
self.database().write_state_reverts(reverts, execution_outcome.first_block)?;
@ -664,8 +664,8 @@ mod tests {
let mut revm_bundle_state = state.take_bundle();
// Write plain state and reverts separately.
let reverts = revm_bundle_state.take_all_reverts().into_plain_state_reverts();
let plain_state = revm_bundle_state.into_plain_state(OriginalValuesKnown::Yes);
let reverts = revm_bundle_state.take_all_reverts().to_plain_state_reverts();
let plain_state = revm_bundle_state.to_plain_state(OriginalValuesKnown::Yes);
assert!(plain_state.storage.is_empty());
assert!(plain_state.contracts.is_empty());
provider.write_state_changes(plain_state).expect("Could not write plain state to DB");
@ -722,8 +722,8 @@ mod tests {
let mut revm_bundle_state = state.take_bundle();
// Write plain state and reverts separately.
let reverts = revm_bundle_state.take_all_reverts().into_plain_state_reverts();
let plain_state = revm_bundle_state.into_plain_state(OriginalValuesKnown::Yes);
let reverts = revm_bundle_state.take_all_reverts().to_plain_state_reverts();
let plain_state = revm_bundle_state.to_plain_state(OriginalValuesKnown::Yes);
// Account B selfdestructed so flag for it should be present.
assert_eq!(
plain_state.storage,

View File

@ -16,7 +16,9 @@ use alloy_eips::{
eip2930::AccessList,
eip4844::{BlobTransactionSidecar, BlobTransactionValidationError, DATA_GAS_PER_BLOB},
};
use alloy_primitives::{Address, Bytes, ChainId, Signature, TxHash, TxKind, B256, U256};
use alloy_primitives::{
Address, Bytes, ChainId, PrimitiveSignature as Signature, TxHash, TxKind, B256, U256,
};
use paste::paste;
use rand::{
distributions::{Uniform, WeightedIndex},

View File

@ -1506,7 +1506,7 @@ mod tests {
use super::*;
use alloy_consensus::{TxEip1559, TxEip2930, TxEip4844, TxEip7702, TxLegacy};
use alloy_eips::eip4844::DATA_GAS_PER_BLOB;
use alloy_primitives::Signature;
use alloy_primitives::PrimitiveSignature as Signature;
use reth_primitives::TransactionSigned;
#[test]

View File

@ -2,7 +2,7 @@
use alloy_consensus::{Transaction as _, TxLegacy};
use alloy_eips::eip4895::Withdrawal;
use alloy_primitives::{Address, BlockNumber, Bytes, Parity, Sealable, TxKind, B256, U256};
use alloy_primitives::{Address, BlockNumber, Bytes, Sealable, TxKind, B256, U256};
pub use rand::Rng;
use rand::{
distributions::uniform::SampleRange, rngs::StdRng, seq::SliceRandom, thread_rng, SeedableRng,
@ -148,17 +148,9 @@ pub fn sign_tx_with_random_key_pair<R: Rng>(rng: &mut R, tx: Transaction) -> Tra
/// Signs the [Transaction] with the given key pair.
pub fn sign_tx_with_key_pair(key_pair: Keypair, tx: Transaction) -> TransactionSigned {
let mut signature =
let signature =
sign_message(B256::from_slice(&key_pair.secret_bytes()[..]), tx.signature_hash()).unwrap();
if matches!(tx, Transaction::Legacy(_)) {
signature = if let Some(chain_id) = tx.chain_id() {
signature.with_chain_id(chain_id)
} else {
signature.with_parity(Parity::NonEip155(signature.v().y_parity()))
}
}
TransactionSigned::from_transaction_and_signature(tx, signature)
}
@ -464,7 +456,7 @@ mod tests {
use super::*;
use alloy_consensus::TxEip1559;
use alloy_eips::eip2930::AccessList;
use alloy_primitives::{hex, Parity, Signature};
use alloy_primitives::{hex, PrimitiveSignature as Signature};
use reth_primitives::public_key_to_address;
use std::str::FromStr;
@ -538,7 +530,7 @@ mod tests {
"46948507304638947509940763649030358759909902576025900602547168820602576006531",
)
.unwrap(),
Parity::Parity(false),
false,
);
assert_eq!(expected, signature);
}