@@ -47,6 +47,7 @@ func TestMessageProtobufFlattening(t *testing.T) {
4747 DestTokenAddress : []byte ("dest-token" ),
4848 ExtraData : []byte ("token-extra" ),
4949 Amount : ccipocr3 .NewBigInt (big .NewInt (500 )),
50+ DestExecData : []byte ("dest-exec-data" ),
5051 },
5152 },
5253 },
@@ -765,18 +766,21 @@ func TestMessageTokenIDMapConversion(t *testing.T) {
765766 DestTokenAddress : ccipocr3 .UnknownAddress ("dest-token-1" ),
766767 ExtraData : ccipocr3 .Bytes ("extra-data-1" ),
767768 Amount : ccipocr3 .NewBigInt (big .NewInt (1000 )),
769+ DestExecData : ccipocr3 .Bytes ("dest-exec-data-1" ),
768770 },
769771 ccipocr3 .NewMessageTokenID (2 , 1 ): {
770772 SourcePoolAddress : ccipocr3 .UnknownAddress ("source-pool-2" ),
771773 DestTokenAddress : ccipocr3 .UnknownAddress ("dest-token-2" ),
772774 ExtraData : ccipocr3 .Bytes ("extra-data-2" ),
773775 Amount : ccipocr3 .NewBigInt (big .NewInt (2000 )),
776+ DestExecData : ccipocr3 .Bytes ("dest-exec-data-2" ),
774777 },
775778 ccipocr3 .NewMessageTokenID (10 , 5 ): {
776779 SourcePoolAddress : ccipocr3 .UnknownAddress ("source-pool-10" ),
777780 DestTokenAddress : ccipocr3 .UnknownAddress ("dest-token-10" ),
778781 ExtraData : ccipocr3 .Bytes ("" ),
779782 Amount : ccipocr3 .NewBigInt (big .NewInt (0 )),
783+ DestExecData : ccipocr3 .Bytes ("" ),
780784 },
781785 },
782786 },
@@ -795,6 +799,7 @@ func TestMessageTokenIDMapConversion(t *testing.T) {
795799 val , _ := new (big.Int ).SetString ("123456789012345678901234567890" , 10 )
796800 return ccipocr3 .NewBigInt (val )
797801 }(),
802+ DestExecData : ccipocr3 .Bytes ("very long dest exec data with many characters that tests the handling of large execution data asdlfk(&HEDHSKJ#OIUOIJDL)(@#UE)(#U(R&FH(E&HF0x" ),
798803 },
799804 },
800805 },
@@ -823,6 +828,7 @@ func TestMessageTokenIDMapConversion(t *testing.T) {
823828 assert .Equal (t , []byte (amount .DestTokenAddress ), pbAmount .DestTokenAddress )
824829 assert .Equal (t , []byte (amount .ExtraData ), pbAmount .ExtraData )
825830 assert .Equal (t , amount .Amount .Int .Bytes (), pbAmount .Amount .Value )
831+ assert .Equal (t , []byte (amount .DestExecData ), pbAmount .DestExecData )
826832 }
827833
828834 // Convert Protobuf -> Go (round-trip)
@@ -838,6 +844,7 @@ func TestMessageTokenIDMapConversion(t *testing.T) {
838844 assert .Equal (t , []byte (originalAmount .DestTokenAddress ), []byte (convertedAmount .DestTokenAddress ))
839845 assert .Equal (t , []byte (originalAmount .ExtraData ), []byte (convertedAmount .ExtraData ))
840846 assert .Equal (t , originalAmount .Amount .Int .String (), convertedAmount .Amount .Int .String ())
847+ assert .Equal (t , []byte (originalAmount .DestExecData ), []byte (convertedAmount .DestExecData ))
841848 }
842849 })
843850 }
@@ -962,6 +969,122 @@ func TestMessagesByTokenIDErrorHandling(t *testing.T) {
962969 })
963970}
964971
972+ // TestRampTokenAmountDestExecDataRoundTrip tests that DestExecData is properly preserved in round-trip conversions
973+ func TestRampTokenAmountDestExecDataRoundTrip (t * testing.T ) {
974+ testCases := []struct {
975+ name string
976+ tokenAmount ccipocr3.RampTokenAmount
977+ }{
978+ {
979+ name : "RampTokenAmount with DestExecData" ,
980+ tokenAmount : ccipocr3.RampTokenAmount {
981+ SourcePoolAddress : ccipocr3 .UnknownAddress ("source-pool-address" ),
982+ DestTokenAddress : ccipocr3 .UnknownAddress ("dest-token-address" ),
983+ ExtraData : ccipocr3 .Bytes ("extra-data" ),
984+ Amount : ccipocr3 .NewBigInt (big .NewInt (12345 )),
985+ DestExecData : ccipocr3 .Bytes ("dest-exec-data-content" ),
986+ },
987+ },
988+ {
989+ name : "RampTokenAmount with empty DestExecData" ,
990+ tokenAmount : ccipocr3.RampTokenAmount {
991+ SourcePoolAddress : ccipocr3 .UnknownAddress ("source-pool-address" ),
992+ DestTokenAddress : ccipocr3 .UnknownAddress ("dest-token-address" ),
993+ ExtraData : ccipocr3 .Bytes ("extra-data" ),
994+ Amount : ccipocr3 .NewBigInt (big .NewInt (54321 )),
995+ DestExecData : ccipocr3 .Bytes ("" ),
996+ },
997+ },
998+ {
999+ name : "RampTokenAmount with nil DestExecData" ,
1000+ tokenAmount : ccipocr3.RampTokenAmount {
1001+ SourcePoolAddress : ccipocr3 .UnknownAddress ("source-pool-address" ),
1002+ DestTokenAddress : ccipocr3 .UnknownAddress ("dest-token-address" ),
1003+ ExtraData : ccipocr3 .Bytes ("extra-data" ),
1004+ Amount : ccipocr3 .NewBigInt (big .NewInt (98765 )),
1005+ DestExecData : nil ,
1006+ },
1007+ },
1008+ {
1009+ name : "RampTokenAmount with large DestExecData" ,
1010+ tokenAmount : ccipocr3.RampTokenAmount {
1011+ SourcePoolAddress : ccipocr3 .UnknownAddress ("source-pool-address" ),
1012+ DestTokenAddress : ccipocr3 .UnknownAddress ("dest-token-address" ),
1013+ ExtraData : ccipocr3 .Bytes ("extra-data" ),
1014+ Amount : ccipocr3 .NewBigInt (big .NewInt (11111 )),
1015+ DestExecData : ccipocr3 .Bytes ("very long dest exec data with many characters that tests the handling of large execution data asdlfk(&HEDHSKJ#OIUOIJDL)(@#UE)(#U(R&FH(E&HF0x" ),
1016+ },
1017+ },
1018+ }
1019+
1020+ for _ , tc := range testCases {
1021+ t .Run (tc .name , func (t * testing.T ) {
1022+ // Test via pbToTokenAmounts and messageToPb functions
1023+ message := ccipocr3.Message {
1024+ Header : ccipocr3.RampMessageHeader {
1025+ MessageID : [32 ]byte {0x01 , 0x02 , 0x03 , 0x04 },
1026+ SourceChainSelector : ccipocr3 .ChainSelector (1 ),
1027+ DestChainSelector : ccipocr3 .ChainSelector (2 ),
1028+ SequenceNumber : ccipocr3 .SeqNum (1 ),
1029+ Nonce : 1 ,
1030+ MsgHash : [32 ]byte {0xAA , 0xBB , 0xCC , 0xDD },
1031+ OnRamp : []byte ("onramp" ),
1032+ TxHash : "0x123" ,
1033+ },
1034+ Sender : []byte ("sender" ),
1035+ Data : []byte ("data" ),
1036+ Receiver : []byte ("receiver" ),
1037+ ExtraArgs : []byte ("extra-args" ),
1038+ FeeToken : []byte ("fee-token" ),
1039+ FeeTokenAmount : ccipocr3 .NewBigInt (big .NewInt (1000 )),
1040+ FeeValueJuels : ccipocr3 .NewBigInt (big .NewInt (2000 )),
1041+ TokenAmounts : []ccipocr3.RampTokenAmount {tc .tokenAmount },
1042+ }
1043+
1044+ // Convert to protobuf
1045+ pbMessage := messageToPb (message )
1046+ require .NotNil (t , pbMessage )
1047+ require .Len (t , pbMessage .TokenAmounts , 1 )
1048+
1049+ // Verify DestExecData is preserved in protobuf
1050+ pbTokenAmount := pbMessage .TokenAmounts [0 ]
1051+ assert .Equal (t , []byte (tc .tokenAmount .DestExecData ), pbTokenAmount .DestExecData )
1052+
1053+ // Convert back to Go struct
1054+ convertedMessage := pbToMessage (pbMessage )
1055+ require .Len (t , convertedMessage .TokenAmounts , 1 )
1056+
1057+ // Verify DestExecData is preserved in round-trip
1058+ convertedTokenAmount := convertedMessage .TokenAmounts [0 ]
1059+ assert .Equal (t , []byte (tc .tokenAmount .DestExecData ), []byte (convertedTokenAmount .DestExecData ))
1060+
1061+ // Test via messageTokenIDMapToPb and pbToMessageTokenIDMap functions
1062+ tokenMap := map [ccipocr3.MessageTokenID ]ccipocr3.RampTokenAmount {
1063+ ccipocr3 .NewMessageTokenID (1 , 0 ): tc .tokenAmount ,
1064+ }
1065+
1066+ // Convert to protobuf map
1067+ pbMap := messageTokenIDMapToPb (tokenMap )
1068+ require .NotNil (t , pbMap )
1069+ require .Len (t , pbMap , 1 )
1070+
1071+ // Verify DestExecData is preserved in protobuf map
1072+ pbAmount := pbMap ["1_0" ]
1073+ require .NotNil (t , pbAmount )
1074+ assert .Equal (t , []byte (tc .tokenAmount .DestExecData ), pbAmount .DestExecData )
1075+
1076+ // Convert back to Go map
1077+ convertedMap , err := pbToMessageTokenIDMap (pbMap )
1078+ require .NoError (t , err )
1079+ require .Len (t , convertedMap , 1 )
1080+
1081+ // Verify DestExecData is preserved in round-trip map
1082+ convertedAmount := convertedMap [ccipocr3 .NewMessageTokenID (1 , 0 )]
1083+ assert .Equal (t , []byte (tc .tokenAmount .DestExecData ), []byte (convertedAmount .DestExecData ))
1084+ })
1085+ }
1086+ }
1087+
9651088// TestTokenUpdatesUnixConversion tests the TimestampedUnixBig token updates conversion functions
9661089func TestTokenUpdatesUnixConversion (t * testing.T ) {
9671090 testTime := time .Date (2024 , 1 , 15 , 12 , 0 , 0 , 0 , time .UTC )
0 commit comments