diff --git a/prdoc/pr_10290.prdoc b/prdoc/pr_10290.prdoc new file mode 100644 index 0000000000000..a8d59477a60a5 --- /dev/null +++ b/prdoc/pr_10290.prdoc @@ -0,0 +1,7 @@ +title: 'pallet-revive: fix eth tx decoding' +doc: +- audience: Runtime Dev + description: 'Fix Ethereum transaction decoding' +crates: +- name: pallet-revive + bump: patch diff --git a/substrate/frame/revive/src/evm/api/rlp_codec.rs b/substrate/frame/revive/src/evm/api/rlp_codec.rs index 0bee83f340165..ae3c9d1f7009e 100644 --- a/substrate/frame/revive/src/evm/api/rlp_codec.rs +++ b/substrate/frame/revive/src/evm/api/rlp_codec.rs @@ -98,15 +98,22 @@ impl TransactionSigned { /// Decode the Ethereum transaction from bytes. pub fn decode(data: &[u8]) -> Result { - if data.len() < 1 { + if data.is_empty() { return Err(rlp::DecoderError::RlpIsTooShort); } - match data[0] { - TYPE_EIP2930 => rlp::decode::(&data[1..]).map(Into::into), - TYPE_EIP1559 => rlp::decode::(&data[1..]).map(Into::into), - TYPE_EIP4844 => rlp::decode::(&data[1..]).map(Into::into), - TYPE_EIP7702 => rlp::decode::(&data[1..]).map(Into::into), - _ => rlp::decode::(data).map(Into::into), + let first_byte = data[0]; + + // EIP-2718: Typed transactions use type identifiers in [0x00, 0x7f]. + if first_byte <= 0x7f { + match first_byte { + TYPE_EIP2930 => rlp::decode::(&data[1..]).map(Into::into), + TYPE_EIP1559 => rlp::decode::(&data[1..]).map(Into::into), + TYPE_EIP4844 => rlp::decode::(&data[1..]).map(Into::into), + TYPE_EIP7702 => rlp::decode::(&data[1..]).map(Into::into), + _ => Err(rlp::DecoderError::Custom("Unknown transaction type")), + } + } else { + rlp::decode::(data).map(Into::into) } } }