@@ -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
877976fn extract_signature_from_trace (
0 commit comments