mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: bump alloy (#12215)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
216
Cargo.lock
generated
216
Cargo.lock
generated
@ -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",
|
||||
|
||||
78
Cargo.toml
78
Cargo.toml
@ -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" }
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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,);
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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};
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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!(
|
||||
|
||||
@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@ -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,
|
||||
),
|
||||
),
|
||||
];
|
||||
|
||||
@ -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},
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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};
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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};
|
||||
|
||||
@ -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};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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> {
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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!(
|
||||
|
||||
@ -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![
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 })
|
||||
}
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)?;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 })
|
||||
}
|
||||
|
||||
@ -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 }
|
||||
}
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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`]
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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))
|
||||
}
|
||||
|
||||
|
||||
@ -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))
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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},
|
||||
|
||||
@ -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]
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user