Skip to content

Commit 8cb381f

Browse files
authored
Merge branch 'main' into PRIV-192
2 parents 392d609 + 0b78234 commit 8cb381f

File tree

7 files changed

+146
-4
lines changed

7 files changed

+146
-4
lines changed

pkg/loop/internal/pb/ccipocr3/models.pb.go

Lines changed: 13 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/loop/internal/pb/ccipocr3/models.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ message RampTokenAmount {
4343
bytes extra_data = 3;
4444
// Amount is the amount of tokens to be transferred.
4545
BigInt amount = 4;
46+
// DestExecData is destination chain specific execution data encoded in bytes.
47+
bytes dest_exec_data = 5;
4648
}
4749

4850
// Message is a gRPC adapter to [github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3.Message].

pkg/loop/internal/relayer/pluginprovider/ext/ccipocr3/codec_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66

77
"github.com/stretchr/testify/assert"
88
"github.com/stretchr/testify/require"
9-
9+
1010
ccipocr3pb "github.com/smartcontractkit/chainlink-common/pkg/loop/internal/pb/ccipocr3"
1111
"github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
1212
)
@@ -679,6 +679,7 @@ func createTestMessage(id string) ccipocr3.Message {
679679
DestTokenAddress: []byte("dest-token-address"),
680680
ExtraData: []byte("token-extra-data"),
681681
Amount: ccipocr3.NewBigInt(big.NewInt(500)),
682+
DestExecData: []byte("dest-exec-data"),
682683
},
683684
},
684685
}

pkg/loop/internal/relayer/pluginprovider/ext/ccipocr3/convert.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,7 @@ func messageToPb(msg ccipocr3.Message) *ccipocr3pb.Message {
699699
DestTokenAddress: ta.DestTokenAddress,
700700
ExtraData: ta.ExtraData,
701701
Amount: intToPbBigInt(ta.Amount.Int),
702+
DestExecData: ta.DestExecData,
702703
})
703704
}
704705

@@ -742,6 +743,7 @@ func pbToTokenAmounts(pbAmounts []*ccipocr3pb.RampTokenAmount) []ccipocr3.RampTo
742743
DestTokenAddress: pb.DestTokenAddress,
743744
ExtraData: pb.ExtraData,
744745
Amount: pbToBigInt(pb.Amount),
746+
DestExecData: pb.DestExecData,
745747
})
746748
}
747749
return amounts
@@ -800,6 +802,7 @@ func pbToMessageTokenIDMap(pbTokens map[string]*ccipocr3pb.RampTokenAmount) (map
800802
DestTokenAddress: pbAmount.DestTokenAddress,
801803
ExtraData: pbAmount.ExtraData,
802804
Amount: pbToBigInt(pbAmount.Amount),
805+
DestExecData: pbAmount.DestExecData,
803806
}
804807
}
805808
return result, nil
@@ -816,6 +819,7 @@ func messageTokenIDMapToPb(tokens map[ccipocr3.MessageTokenID]ccipocr3.RampToken
816819
DestTokenAddress: []byte(amount.DestTokenAddress),
817820
ExtraData: []byte(amount.ExtraData),
818821
Amount: intToPbBigInt(amount.Amount.Int),
822+
DestExecData: []byte(amount.DestExecData),
819823
}
820824
}
821825
return result

pkg/loop/internal/relayer/pluginprovider/ext/ccipocr3/convert_test.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
9661089
func TestTokenUpdatesUnixConversion(t *testing.T) {
9671090
testTime := time.Date(2024, 1, 15, 12, 0, 0, 0, time.UTC)

pkg/loop/internal/relayer/pluginprovider/ext/ccipocr3/test/chain_accessor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,7 @@ func (s staticChainAccessor) evaluateMessagesByTokenID(ctx context.Context, othe
959959
DestTokenAddress: ccipocr3.UnknownAddress("test-dest-token"),
960960
ExtraData: ccipocr3.Bytes("test-extra-data"),
961961
Amount: ccipocr3.NewBigInt(big.NewInt(12345)),
962+
DestExecData: ccipocr3.Bytes("test-dest-exec-data"),
962963
},
963964
}
964965

pkg/loop/internal/relayer/pluginprovider/ext/ccipocr3/test/chain_accessor_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ func TestChainAccessor(t *testing.T) {
123123
DestTokenAddress: ccipocr3.UnknownAddress("test-dest-token"),
124124
ExtraData: ccipocr3.Bytes("test-extra-data"),
125125
Amount: ccipocr3.NewBigInt(big.NewInt(12345)),
126+
DestExecData: ccipocr3.Bytes("test-dest-exec-data"),
126127
},
127128
}
128129
messages, err := chainAccessor.MessagesByTokenID(ctx, ccipocr3.ChainSelector(1), ccipocr3.ChainSelector(2), tokens)

0 commit comments

Comments
 (0)