@@ -872,6 +872,105 @@ mod test {
872
872
format!( r#"{{"block":{{"data":null,"timestamp":"{}"}}}}"# , now)
873
873
) ;
874
874
}
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
+ }
875
974
}
876
975
877
976
fn extract_signature_from_trace (
0 commit comments