@@ -4,6 +4,7 @@ package mcms
44
55import (
66 "crypto/ecdsa"
7+ "encoding/hex"
78 "slices"
89 "time"
910
@@ -14,6 +15,12 @@ import (
1415 mcmsencoder "github.com/smartcontractkit/chainlink-sui/bindings"
1516 "github.com/smartcontractkit/chainlink-sui/bindings/bind"
1617 "github.com/smartcontractkit/chainlink-sui/bindings/tests/testenv"
18+ "github.com/smartcontractkit/chainlink-sui/deployment"
19+ ccipops "github.com/smartcontractkit/chainlink-sui/deployment/ops/ccip"
20+ offrampops "github.com/smartcontractkit/chainlink-sui/deployment/ops/ccip_offramp"
21+ onrampops "github.com/smartcontractkit/chainlink-sui/deployment/ops/ccip_onramp"
22+ routerops "github.com/smartcontractkit/chainlink-sui/deployment/ops/ccip_router"
23+ linkops "github.com/smartcontractkit/chainlink-sui/deployment/ops/link"
1724 mcmsops "github.com/smartcontractkit/chainlink-sui/deployment/ops/mcms"
1825 "github.com/smartcontractkit/mcms"
1926 "github.com/smartcontractkit/mcms/sdk"
@@ -23,6 +30,7 @@ import (
2330 "github.com/stretchr/testify/suite"
2431
2532 cselectors "github.com/smartcontractkit/chain-selectors"
33+ "github.com/smartcontractkit/chainlink-deployments-framework/operations"
2634 cld_ops "github.com/smartcontractkit/chainlink-deployments-framework/operations"
2735 sui_ops "github.com/smartcontractkit/chainlink-sui/deployment/ops"
2836 opregistry "github.com/smartcontractkit/chainlink-sui/deployment/ops/registry"
@@ -85,8 +93,30 @@ type MCMSTestSuite struct {
8593 // Ops
8694 deps sui_ops.OpTxDeps
8795 bundle cld_ops.Bundle
96+
97+ // CCIP
98+ // LINK
99+ linkPackageId string
100+ linkObjects linkops.DeployLinkObjects
101+
102+ // CCIP
103+ ccipPackageId string
104+ ccipObjects ccipops.DeployCCIPSeqObjects
105+
106+ // Router
107+ ccipRouterPackageId string
108+ ccipRouterObjects routerops.DeployCCIPRouterObjects
109+
110+ // Onramp
111+ ccipOnrampPackageId string
112+ ccipOnrampObjects onrampops.DeployCCIPOnRampSeqObjects
113+
114+ // offramp
115+ ccipOfframpPackageId string
116+ ccipOfframpObjects offrampops.DeployCCIPOffRampSeqObjects
88117}
89118
119+ // TODO: refactor so suites are per product
90120func (s * MCMSTestSuite ) SetupSuite () {
91121 signer , client := testenv .SetupEnvironment (s .T ())
92122 deps := sui_ops.OpTxDeps {
@@ -169,6 +199,149 @@ func (s *MCMSTestSuite) SetupSuite() {
169199 })
170200 s .Require ().NoError (err , "executing ownership transfer to self" )
171201 s .T ().Logf ("✅ Transferred ownership of MCMS to itself in tx: %s" , rep .Output .Digest )
202+
203+ s .SetupCCIP ()
204+ }
205+
206+ func (s * MCMSTestSuite ) SetupCCIP () {
207+ // Deploy LINK
208+ linkReport , err := cld_ops .ExecuteOperation (s .bundle , linkops .DeployLINKOp , s .deps , cld_ops.EmptyInput {})
209+ require .NoError (s .T (), err , "failed to deploy LINK token" )
210+ s .linkPackageId = linkReport .Output .PackageId
211+ s .linkObjects = linkReport .Output .Objects
212+
213+ configDigestHex := "e3b1c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
214+ configDigest , err := hex .DecodeString (configDigestHex )
215+ require .NoError (s .T (), err , "failed to decode config digest" )
216+
217+ publicKey1Hex := "8a1b2c3d4e5f60718293a4b5c6d7e8f901234567"
218+ publicKey1 , err := hex .DecodeString (publicKey1Hex )
219+ require .NoError (s .T (), err , "failed to decode public key 1" )
220+
221+ publicKey2Hex := "7b8c9dab0c1d2e3f405162738495a6b7c8d9e0f1"
222+ publicKey2 , err := hex .DecodeString (publicKey2Hex )
223+ require .NoError (s .T (), err , "failed to decode public key 2" )
224+
225+ publicKey3Hex := "1234567890abcdef1234567890abcdef12345678"
226+ publicKey3 , err := hex .DecodeString (publicKey3Hex )
227+ require .NoError (s .T (), err , "failed to decode public key 3" )
228+
229+ publicKey4Hex := "90abcdef1234567890abcdef1234567890abcdef"
230+ publicKey4 , err := hex .DecodeString (publicKey4Hex )
231+ require .NoError (s .T (), err , "failed to decode public key 4" )
232+
233+ // Use the same seq as in production deployment
234+ ccipReport , err := cld_ops .ExecuteSequence (s .bundle , ccipops .DeployAndInitCCIPSequence , s .deps , ccipops.DeployAndInitCCIPSeqInput {
235+ LinkTokenCoinMetadataObjectId : linkReport .Output .Objects .CoinMetadataObjectId ,
236+ LocalChainSelector : 1 ,
237+ DestChainSelector : 2 ,
238+ DeployCCIPInput : ccipops.DeployCCIPInput {
239+ McmsPackageId : s .mcmsPackageID ,
240+ McmsOwner : s .mcmsOwnerAddress ,
241+ },
242+ MaxFeeJuelsPerMsg : "100000000" ,
243+ TokenPriceStalenessThreshold : 60 ,
244+ // Fee Quoter configuration
245+ AddMinFeeUsdCents : []uint32 {3000 },
246+ AddMaxFeeUsdCents : []uint32 {30000 },
247+ AddDeciBps : []uint16 {1000 },
248+ AddDestGasOverhead : []uint32 {1000000 },
249+ AddDestBytesOverhead : []uint32 {1000 },
250+ AddIsEnabled : []bool {true },
251+ RemoveTokens : []string {},
252+ // Fee Quoter destination chain configuration
253+ IsEnabled : true ,
254+ MaxNumberOfTokensPerMsg : 2 ,
255+ MaxDataBytes : 2000 ,
256+ MaxPerMsgGasLimit : 5000000 ,
257+ DestGasOverhead : 1000000 ,
258+ DestGasPerPayloadByteBase : byte (2 ),
259+ DestGasPerPayloadByteHigh : byte (5 ),
260+ DestGasPerPayloadByteThreshold : uint16 (10 ),
261+ DestDataAvailabilityOverheadGas : 300000 ,
262+ DestGasPerDataAvailabilityByte : 4 ,
263+ DestDataAvailabilityMultiplierBps : 1 ,
264+ ChainFamilySelector : []byte {0x28 , 0x12 , 0xd5 , 0x2c },
265+ EnforceOutOfOrder : false ,
266+ DefaultTokenFeeUsdCents : 3 ,
267+ DefaultTokenDestGasOverhead : 100000 ,
268+ DefaultTxGasLimit : 500000 ,
269+ GasMultiplierWeiPerEth : 100 ,
270+ GasPriceStalenessThreshold : 1000000000 ,
271+ NetworkFeeUsdCents : 10 ,
272+ // Premium multiplier updates
273+ PremiumMultiplierWeiPerEth : []uint64 {10 },
274+
275+ RmnHomeContractConfigDigest : configDigest ,
276+ SignerOnchainPublicKeys : [][]byte {publicKey1 , publicKey2 , publicKey3 , publicKey4 },
277+ NodeIndexes : []uint64 {0 , 1 , 2 , 3 },
278+ FSign : uint64 (1 ),
279+ })
280+ require .NoError (s .T (), err , "failed to execute CCIP deploy sequence" )
281+ require .NotEmpty (s .T (), ccipReport .Output .CCIPPackageId , "CCIP package ID should not be empty" )
282+
283+ s .linkObjects = linkReport .Output .Objects
284+ s .ccipPackageId = ccipReport .Output .CCIPPackageId
285+ s .ccipObjects = ccipReport .Output .Objects
286+
287+ // Deploy Router
288+ routerReport , err := cld_ops .ExecuteOperation (s .bundle , routerops .DeployCCIPRouterOp , s .deps , routerops.DeployCCIPRouterInput {
289+ McmsPackageId : s .mcmsPackageID ,
290+ McmsOwner : s .mcmsOwnerAddress ,
291+ })
292+ require .NoError (s .T (), err , "failed to execute CCIP deploy sequence" )
293+
294+ s .ccipRouterPackageId = routerReport .Output .PackageId
295+ s .ccipRouterObjects = routerReport .Output .Objects
296+
297+ // Deploy Onramp
298+ ccipOnRampSeqInput := deployment .DefaultOnRampSeqConfig
299+ ccipOnRampSeqInput .DeployCCIPOnRampInput .CCIPPackageId = ccipReport .Output .CCIPPackageId
300+ ccipOnRampSeqInput .DeployCCIPOnRampInput .MCMSPackageId = s .mcmsPackageID
301+ ccipOnRampSeqInput .DeployCCIPOnRampInput .MCMSOwnerPackageId = s .mcmsOwnerAddress
302+ ccipOnRampSeqInput .OnRampInitializeInput .NonceManagerCapId = ccipReport .Output .Objects .NonceManagerCapObjectId
303+ ccipOnRampSeqInput .OnRampInitializeInput .SourceTransferCapId = ccipReport .Output .Objects .SourceTransferCapObjectId
304+ ccipOnRampSeqInput .OnRampInitializeInput .ChainSelector = uint64 (s .chainSelector )
305+ ccipOnRampSeqInput .OnRampInitializeInput .FeeAggregator = s .mcmsOwnerAddress
306+ ccipOnRampSeqInput .OnRampInitializeInput .AllowListAdmin = s .mcmsOwnerAddress
307+ ccipOnRampSeqInput .OnRampInitializeInput .DestChainSelectors = []uint64 {cselectors .ETHEREUM_MAINNET .Selector }
308+ ccipOnRampSeqInput .OnRampInitializeInput .DestChainRouters = []string {routerReport .Output .PackageId }
309+ ccipOnRampSeqInput .ApplyDestChainConfigureOnRampInput .DestChainSelector = []uint64 {cselectors .ETHEREUM_MAINNET .Selector }
310+ ccipOnRampSeqInput .ApplyAllowListUpdatesInput .DestChainSelector = []uint64 {cselectors .ETHEREUM_MAINNET .Selector }
311+ ccipOnRampSeqInput .ApplyDestChainConfigureOnRampInput .DestChainRouters = []string {routerReport .Output .PackageId }
312+ ccipOnRampSeqInput .ApplyDestChainConfigureOnRampInput .CCIPObjectRefId = ccipReport .Output .Objects .CCIPObjectRefObjectId
313+
314+ ccipOnRampSeqReport , err := operations .ExecuteSequence (s .bundle , onrampops .DeployAndInitCCIPOnRampSequence , s .deps , ccipOnRampSeqInput )
315+ require .NoError (s .T (), err , "failed to execute CCIP OnRamp deploy sequence" )
316+
317+ s .ccipOnrampPackageId = ccipOnRampSeqReport .Output .CCIPOnRampPackageId
318+ s .ccipOnrampObjects = ccipOnRampSeqReport .Output .Objects
319+
320+ // Deploy offramp
321+ ccipOffRampSeqInput := deployment .DefaultOffRampSeqConfig
322+ // note: this is a regression, can't acess other chains state very cleanly
323+ onRampBytes := [][]byte {
324+ {0x12 , 0x34 , 0x56 , 0x78 , 0x9a , 0xbc , 0xde , 0xf0 , 0x11 , 0x22 , 0x33 , 0x44 , 0x55 , 0x66 , 0x77 , 0x88 , 0x99 , 0xaa , 0xbb , 0xcc , 0xdd , 0xee , 0xff , 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 },
325+ }
326+
327+ // Inject dynamic values for deployment
328+ ccipOffRampSeqInput .CCIPObjectRefId = ccipReport .Output .Objects .CCIPObjectRefObjectId
329+ ccipOffRampSeqInput .DeployCCIPOffRampInput .CCIPPackageId = ccipReport .Output .CCIPPackageId
330+ ccipOffRampSeqInput .DeployCCIPOffRampInput .MCMSPackageId = s .mcmsPackageID
331+
332+ ccipOffRampSeqInput .InitializeOffRampInput .DestTransferCapId = ccipReport .Output .Objects .DestTransferCapObjectId
333+ ccipOffRampSeqInput .InitializeOffRampInput .FeeQuoterCapId = ccipReport .Output .Objects .FeeQuoterCapObjectId
334+ ccipOffRampSeqInput .InitializeOffRampInput .ChainSelector = uint64 (s .chainSelector )
335+ ccipOffRampSeqInput .InitializeOffRampInput .SourceChainSelectors = []uint64 {
336+ cselectors .ETHEREUM_MAINNET .Selector ,
337+ }
338+ ccipOffRampSeqInput .InitializeOffRampInput .SourceChainsOnRamp = onRampBytes
339+
340+ ccipOffRampSeqReport , err := operations .ExecuteSequence (s .bundle , offrampops .DeployAndInitCCIPOffRampSequence , s .deps , ccipOffRampSeqInput )
341+ require .NoError (s .T (), err , "failed to execute CCIP OffRamp deploy sequence" )
342+
343+ s .ccipOfframpPackageId = ccipOffRampSeqReport .Output .CCIPOffRampPackageId
344+ s .ccipOfframpObjects = ccipOffRampSeqReport .Output .Objects
172345}
173346
174347func (s * MCMSTestSuite ) SignProposal (proposal * mcms.Proposal , roleConfig * RoleConfig ) {
0 commit comments