From 123e2def9d96668e202d7b11842821c7f4080283 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Sun, 9 Oct 2022 01:39:05 -0400 Subject: [PATCH] Fix Transaction decoding (#1773) * fix(core): accept both typed transaction formats * fix equality sign for rlp type check * remove printlns * remove redundant transaction_type assignment --- ethers-core/src/types/transaction/response.rs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/ethers-core/src/types/transaction/response.rs b/ethers-core/src/types/transaction/response.rs index ae2be49e..5ee768b4 100644 --- a/ethers-core/src/types/transaction/response.rs +++ b/ethers-core/src/types/transaction/response.rs @@ -343,8 +343,8 @@ impl Decodable for Transaction { let mut txn = Self::default(); // we can get the type from the first value let mut offset = 0; - let data = rlp.data()?; - let first = *data.first().ok_or(DecoderError::Custom("empty slice"))?; + + // only untyped legacy transactions are lists if rlp.is_list() { // Legacy (0x00) // use the original rlp @@ -356,6 +356,16 @@ impl Decodable for Transaction { // extract chain id if legacy txn.chain_id = extract_chain_id(sig.v).map(|id| id.as_u64().into()); } else { + // if it is not enveloped then we need to use rlp.as_raw instead of rlp.data + let first_byte = rlp.as_raw()[0]; + let (first, data) = if first_byte <= 0x7f { + (first_byte, rlp.as_raw()) + } else { + let data = rlp.data()?; + let first = *data.first().ok_or(DecoderError::Custom("empty slice"))?; + (first, data) + }; + let bytes = data.get(1..).ok_or(DecoderError::Custom("no tx body"))?; let rest = rlp::Rlp::new(bytes); match first { @@ -1046,4 +1056,19 @@ mod tests { a.transaction_index = 1u64.into(); assert!(a > b); } + + // from https://github.com/gakonst/ethers-rs/issues/1762 + #[test] + fn test_rlp_decoding_type_2() { + use crate::types::*; + + let raw_tx = "0x02f906f20103843b9aca0085049465153e830afdd19468b3465833fb72a70ecdf485e0e4c7bd8665fc4580b906845ae401dc00000000000000000000000000000000000000000000000000000000633c4c730000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000012b6893ce26ea6341919fe289212ef77e51688c800000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000017754984000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124b858183f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000017754984000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042dac17f958d2ee523a2206206994597c13d831ec7000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200271012b6893ce26ea6341919fe289212ef77e51688c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104b858183f00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000006d78ac6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bdac17f958d2ee523a2206206994597c13d831ec70001f4c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4472b43f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f8aa12f280116c88954000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000012b6893ce26ea6341919fe289212ef77e51688c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb00000000000000000000000012b6893ce26ea6341919fe289212ef77e51688c8000000000000000000000000000000000000000000002d092097defac5b7a01a000000000000000000000000f69a7cd9649a5b5477fa0e5395385fad03ac639f00000000000000000000000000000000000000000000000000000000c001a0127484994706ff8605f1da80e7bdf0efa3e26192a094413e58d409551398b0b5a06fd706e38eebeba2f235e37ceb0acb426f1e6c91702add97810ee677a15d1980"; + let mut decoded_tx = crate::utils::rlp::decode::( + &raw_tx.parse::().expect("unable to parse raw tx"), + ) + .expect("unable to decode raw tx"); + decoded_tx.recover_from_mut().unwrap(); + decoded_tx.hash = decoded_tx.hash(); + dbg!(&decoded_tx); + } }