Skip to content

Commit 449f66a

Browse files
committed
chain/ethereum: Add tests for unknown transaction type
1 parent 66908fc commit 449f66a

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

chain/ethereum/src/codec.rs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,105 @@ mod test {
872872
format!(r#"{{"block":{{"data":null,"timestamp":"{}"}}}}"#, now)
873873
);
874874
}
875+
876+
#[test]
877+
fn test_unknown_transaction_type_conversion() {
878+
use super::TransactionTraceAt;
879+
use crate::codec::TransactionTrace;
880+
use graph::prelude::alloy::network::AnyTxEnvelope;
881+
use graph::prelude::alloy::primitives::B256;
882+
883+
let mut block = Block::default();
884+
let mut header = BlockHeader::default();
885+
header.number = 123456;
886+
header.timestamp = Some(Timestamp {
887+
seconds: 1234567890,
888+
nanos: 0,
889+
});
890+
block.header = Some(header);
891+
block.number = 123456;
892+
block.hash = vec![0u8; 32];
893+
894+
let mut trace = TransactionTrace::default();
895+
trace.r#type = 126; // 0x7e Optimism deposit transaction
896+
trace.hash = vec![1u8; 32];
897+
trace.from = vec![2u8; 20];
898+
trace.to = vec![3u8; 20];
899+
trace.nonce = 42;
900+
trace.gas_limit = 21000;
901+
trace.index = 0;
902+
903+
let trace_at = TransactionTraceAt::new(&trace, &block);
904+
let result: Result<
905+
graph::prelude::alloy::rpc::types::Transaction<AnyTxEnvelope>,
906+
graph::prelude::Error,
907+
> = trace_at.try_into();
908+
909+
assert!(
910+
result.is_ok(),
911+
"Should successfully convert unknown transaction type"
912+
);
913+
914+
let tx = result.unwrap();
915+
916+
match tx.inner.inner() {
917+
AnyTxEnvelope::Unknown(unknown_envelope) => {
918+
assert_eq!(unknown_envelope.inner.ty.0, 126);
919+
assert_eq!(unknown_envelope.hash, B256::from_slice(&trace.hash));
920+
assert!(
921+
!unknown_envelope.inner.fields.is_empty(),
922+
"OtherFields should contain transaction data"
923+
);
924+
}
925+
_ => panic!("Expected AnyTxEnvelope::Unknown, got Ethereum variant"),
926+
}
927+
928+
assert_eq!(tx.block_number, Some(123456));
929+
assert_eq!(tx.transaction_index, Some(0));
930+
assert_eq!(tx.block_hash, Some(B256::from_slice(&block.hash)));
931+
}
932+
933+
#[test]
934+
fn test_unknown_receipt_type_conversion() {
935+
use super::transaction_trace_to_alloy_txn_reciept;
936+
use crate::codec::TransactionTrace;
937+
938+
let mut block = Block::default();
939+
let mut header = BlockHeader::default();
940+
header.number = 123456;
941+
block.header = Some(header);
942+
block.hash = vec![0u8; 32];
943+
944+
let mut trace = TransactionTrace::default();
945+
trace.r#type = 126; // 0x7e Optimism deposit transaction
946+
trace.hash = vec![1u8; 32];
947+
trace.from = vec![2u8; 20];
948+
trace.to = vec![3u8; 20];
949+
trace.index = 0;
950+
trace.gas_used = 21000;
951+
trace.status = 1;
952+
953+
let mut receipt = super::TransactionReceipt::default();
954+
receipt.cumulative_gas_used = 21000;
955+
receipt.logs_bloom = vec![0u8; 256];
956+
trace.receipt = Some(receipt);
957+
958+
let result = transaction_trace_to_alloy_txn_reciept(&trace, &block);
959+
960+
assert!(
961+
result.is_ok(),
962+
"Should successfully convert receipt with unknown transaction type"
963+
);
964+
965+
let receipt_opt = result.unwrap();
966+
assert!(receipt_opt.is_some(), "Receipt should be present");
967+
968+
let receipt = receipt_opt.unwrap();
969+
970+
assert_eq!(receipt.inner.inner.r#type, 126);
971+
assert_eq!(receipt.gas_used, 21000);
972+
assert_eq!(receipt.transaction_index, Some(0));
973+
}
875974
}
876975

877976
fn extract_signature_from_trace(

0 commit comments

Comments
 (0)