diff --git a/bindings/generated/latest/ccip/burnminttokenpool/burnminttokenpool.go b/bindings/generated/latest/ccip/burnminttokenpool/burnminttokenpool.go index 5044ce2a2..2eb05ec98 100644 --- a/bindings/generated/latest/ccip/burnminttokenpool/burnminttokenpool.go +++ b/bindings/generated/latest/ccip/burnminttokenpool/burnminttokenpool.go @@ -29,7 +29,7 @@ var ( const ( PackageName = "ccip-burn-mint-token-pool" - PackageID = "d1c200384a96e3cdc157ab8177d866c6ce9b13e1744954dcbc25f0b1b75aad31" + PackageID = "2ed1bbec4cb986f1cfca23bbe7d803a63063df2da9020e30ad02285742886845" SDKVersion = "3.4.11" ) diff --git a/bindings/generated/latest/ccip/ccipapi/ccipapi.go b/bindings/generated/latest/ccip/ccipapi/ccipapi.go new file mode 100644 index 000000000..b67688046 --- /dev/null +++ b/bindings/generated/latest/ccip/ccipapi/ccipapi.go @@ -0,0 +1,359 @@ +package ccipapi + +import ( + "errors" + "fmt" + "math/big" + "strings" + + splice_api_token_holding_v1 "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/splice/splice_api_token_holding_v1" + splice_api_token_metadata_v1 "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/splice/splice_api_token_metadata_v1" + "github.com/smartcontractkit/go-daml/pkg/bind" + "github.com/smartcontractkit/go-daml/pkg/codec" + "github.com/smartcontractkit/go-daml/pkg/model" + "github.com/smartcontractkit/go-daml/pkg/types" +) + +var ( + _ = fmt.Sprintf + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = model.Command{} + _ bind.BoundTemplate +) + +const ( + PackageName = "ccip-api" + PackageID = "c352ceb205c1317b0932a5640e6b4a40d234abf40d8dff68cae45fc576440e05" + SDKVersion = "3.4.11" +) + +type Template interface { + CreateCommand() *model.CreateCommand + GetTemplateID() string +} + +// IEventEmitter is a DAML interface +type IEventEmitter interface { + + // Archive executes the Archive choice + Archive(contractID string) *model.ExerciseCommand + + // EventEmitterEmitCCIPMessageSentEvent executes the EventEmitter_EmitCCIPMessageSentEvent choice + EventEmitterEmitCCIPMessageSentEvent(contractID string, args EventEmitterEmitCCIPMessageSentEvent) *model.ExerciseCommand +} + +func argsToMap(args any) map[string]any { + if args == nil { + return map[string]any{} + } + + if m, ok := args.(map[string]any); ok { + return m + } + + type mapper interface { + ToMap() map[string]any + } + if mapper, ok := args.(mapper); ok { + return mapper.ToMap() + } + + return map[string]any{"args": args} +} + +// EventEmitterView is a Record type +type EventEmitterView struct { + CcipOwner types.PARTY `json:"ccipOwner"` + InstanceId types.TEXT `json:"instanceId"` +} + +// ToMap converts EventEmitterView to a map for DAML arguments +func (t EventEmitterView) ToMap() map[string]any { + m := make(map[string]any) + + m["ccipOwner"] = t.CcipOwner.ToMap() + + m["instanceId"] = string(t.InstanceId) + + return m +} + +func (t EventEmitterView) MarshalJSON() ([]byte, error) { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Marshal(t) +} + +func (t *EventEmitterView) UnmarshalJSON(data []byte) error { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Unmarshal(data, t) +} + +// MarshalHex encodes EventEmitterView to hex string (Canton MCMS format) +func (t EventEmitterView) MarshalHex() (string, error) { + hexCodec := codec.NewHexCodec() + return hexCodec.Marshal(t) +} + +// UnmarshalHex decodes EventEmitterView from hex string (Canton MCMS format) +func (t *EventEmitterView) UnmarshalHex(data string) error { + hexCodec := codec.NewHexCodec() + return hexCodec.Unmarshal(data, t) +} + +// EventEmitterEmitCCIPMessageSentEvent is a Record type +type EventEmitterEmitCCIPMessageSentEvent struct { + DestChainSelector types.NUMERIC `json:"destChainSelector"` + SequenceNumber types.NUMERIC `json:"sequenceNumber"` + Sender types.PARTY `json:"sender"` + EncodedMessage types.TEXT `json:"encodedMessage"` + FeeToken splice_api_token_holding_v1.InstrumentId `json:"feeToken"` + TokenAmountBeforeTokenPoolFees types.NUMERIC `json:"tokenAmountBeforeTokenPoolFees"` + Receipts []Receipt `json:"receipts"` + CcvOwners []types.PARTY `json:"ccvOwners"` + VerifierBlobs []types.TEXT `json:"verifierBlobs"` + Observers []types.PARTY `json:"observers"` + ExtraActors []types.PARTY `json:"extraActors"` + Context splice_api_token_metadata_v1.ChoiceContext `json:"context"` +} + +// ToMap converts EventEmitterEmitCCIPMessageSentEvent to a map for DAML arguments +func (t EventEmitterEmitCCIPMessageSentEvent) ToMap() map[string]any { + m := make(map[string]any) + + m["destChainSelector"] = t.DestChainSelector + + m["sequenceNumber"] = t.SequenceNumber + + m["sender"] = t.Sender.ToMap() + + m["encodedMessage"] = string(t.EncodedMessage) + + m["feeToken"] = model.NestedToDAMLValue(t.FeeToken) + + m["tokenAmountBeforeTokenPoolFees"] = t.TokenAmountBeforeTokenPoolFees + + m["receipts"] = func() []any { + res := make([]any, 0, len(t.Receipts)) + for _, e := range t.Receipts { + res = append(res, model.NestedToDAMLValue(e)) + } + return res + }() + + m["ccvOwners"] = func() []any { + res := make([]any, 0, len(t.CcvOwners)) + for _, e := range t.CcvOwners { + res = append(res, e.ToMap()) + } + return res + }() + + m["verifierBlobs"] = func() []any { + res := make([]any, 0, len(t.VerifierBlobs)) + for _, e := range t.VerifierBlobs { + res = append(res, string(e)) + } + return res + }() + + m["observers"] = func() []any { + res := make([]any, 0, len(t.Observers)) + for _, e := range t.Observers { + res = append(res, e.ToMap()) + } + return res + }() + + m["extraActors"] = func() []any { + res := make([]any, 0, len(t.ExtraActors)) + for _, e := range t.ExtraActors { + res = append(res, e.ToMap()) + } + return res + }() + + m["context"] = model.NestedToDAMLValue(t.Context) + + return m +} + +func (t EventEmitterEmitCCIPMessageSentEvent) MarshalJSON() ([]byte, error) { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Marshal(t) +} + +func (t *EventEmitterEmitCCIPMessageSentEvent) UnmarshalJSON(data []byte) error { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Unmarshal(data, t) +} + +// MarshalHex encodes EventEmitterEmitCCIPMessageSentEvent to hex string (Canton MCMS format) +func (t EventEmitterEmitCCIPMessageSentEvent) MarshalHex() (string, error) { + hexCodec := codec.NewHexCodec() + return hexCodec.Marshal(t) +} + +// UnmarshalHex decodes EventEmitterEmitCCIPMessageSentEvent from hex string (Canton MCMS format) +func (t *EventEmitterEmitCCIPMessageSentEvent) UnmarshalHex(data string) error { + hexCodec := codec.NewHexCodec() + return hexCodec.Unmarshal(data, t) +} + +// IssuerType is an enum type +type IssuerType string + +const ( + IssuerTypeIssuerType_CCV IssuerType = "IssuerType_CCV" + + IssuerTypeIssuerType_Pool IssuerType = "IssuerType_Pool" + + IssuerTypeIssuerType_Executor IssuerType = "IssuerType_Executor" + + IssuerTypeIssuerType_Network IssuerType = "IssuerType_Network" +) + +func (e IssuerType) GetEnumConstructor() string { return string(e) } + +func (e IssuerType) GetEnumTypeID() string { + return fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.API.EventEmitterV1", "IssuerType") +} + +// GetEnumTypeIDWithPackageID returns the enum type ID using the provided package ID instead of package name +func (e IssuerType) GetEnumTypeIDWithPackageID(packageID string) string { + return fmt.Sprintf("#%s:%s:%s", packageID, "CCIP.API.EventEmitterV1", "IssuerType") +} + +func (e IssuerType) MarshalJSON() ([]byte, error) { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Marshal(e) +} + +func (e *IssuerType) UnmarshalJSON(data []byte) error { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Unmarshal(data, e) +} + +// MarshalHex encodes IssuerType to hex string (Canton MCMS format) +func (e IssuerType) MarshalHex() (string, error) { + hexCodec := codec.NewHexCodec() + return hexCodec.Marshal(e) +} + +// UnmarshalHex decodes IssuerType from hex string (Canton MCMS format) +func (e *IssuerType) UnmarshalHex(data string) error { + hexCodec := codec.NewHexCodec() + return hexCodec.Unmarshal(data, e) +} + +var _ types.ENUM = IssuerType("") + +// Receipt is a Record type +type Receipt struct { + IssuerType IssuerType `json:"issuerType"` + IssuerAddress types.TEXT `json:"issuerAddress"` + VersionTag *types.TEXT `json:"versionTag" hex:"optional"` + DestGasLimit types.INT64 `json:"destGasLimit"` + DestBytesOverhead types.INT64 `json:"destBytesOverhead"` + FeeTokenAmount types.NUMERIC `json:"feeTokenAmount"` + ExtraArgs types.TEXT `json:"extraArgs"` +} + +// ToMap converts Receipt to a map for DAML arguments +func (t Receipt) ToMap() map[string]any { + m := make(map[string]any) + + m["issuerType"] = model.NestedToDAMLValue(t.IssuerType) + + m["issuerAddress"] = string(t.IssuerAddress) + + if t.VersionTag != nil { + m["versionTag"] = map[string]any{ + "_type": "optional", + "value": string(*t.VersionTag), + } + } else { + m["versionTag"] = map[string]any{ + "_type": "optional", + "value": nil, + } + } + + m["destGasLimit"] = int64(t.DestGasLimit) + + m["destBytesOverhead"] = int64(t.DestBytesOverhead) + + m["feeTokenAmount"] = t.FeeTokenAmount + + m["extraArgs"] = string(t.ExtraArgs) + + return m +} + +func (t Receipt) MarshalJSON() ([]byte, error) { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Marshal(t) +} + +func (t *Receipt) UnmarshalJSON(data []byte) error { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Unmarshal(data, t) +} + +// MarshalHex encodes Receipt to hex string (Canton MCMS format) +func (t Receipt) MarshalHex() (string, error) { + hexCodec := codec.NewHexCodec() + return hexCodec.Marshal(t) +} + +// UnmarshalHex decodes Receipt from hex string (Canton MCMS format) +func (t *Receipt) UnmarshalHex(data string) error { + hexCodec := codec.NewHexCodec() + return hexCodec.Unmarshal(data, t) +} + +// IEventEmitterInterfaceID returns the interface ID for the IEventEmitter interface using the package name +func IEventEmitterInterfaceID() string { + return fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.API.EventEmitterV1", "EventEmitter") +} + +// IEventEmitterInterfaceIDWithPackageID returns the interface ID using the provided package ID instead of package name +func IEventEmitterInterfaceIDWithPackageID(packageID string) string { + return fmt.Sprintf("%s:%s:%s", packageID, "CCIP.API.EventEmitterV1", "EventEmitter") +} + +// MCMSEncoder interface for typed encoding methods. +// Implemented by Encoder for method-based encoding. +type MCMSEncoder interface { +} + +// encoder provides typed encoding methods for choice parameters (unexported). +// It wraps bind.BoundTemplate to encode parameters to hex-encoded operation data. +type encoder struct { + *bind.BoundTemplate +} + +// Contract wraps template operations with Sui-style API access. +// Use NewContract to create instances, then call Encoder() for encoding methods. +type Contract struct { + enc *encoder +} + +// NewContract creates a Contract with encoder for the given template. +// This provides Sui-style API: contract.Encoder().Method(args) +func NewContract(packageID, moduleName, templateName string) *Contract { + return &Contract{ + enc: &encoder{ + BoundTemplate: bind.NewBoundTemplate(packageID, moduleName, templateName), + }, + } +} + +// Encoder returns the encoder for Sui-style contract.Encoder().Method() usage. +func (c *Contract) Encoder() MCMSEncoder { + return c.enc +} + +// Verify MCMSEncoder interface implementation +var _ MCMSEncoder = (*encoder)(nil) diff --git a/bindings/generated/latest/ccip/ccipruntime/ccipruntime.go b/bindings/generated/latest/ccip/ccipruntime/ccipruntime.go index 895aeab45..f38f34857 100644 --- a/bindings/generated/latest/ccip/ccipruntime/ccipruntime.go +++ b/bindings/generated/latest/ccip/ccipruntime/ccipruntime.go @@ -6,6 +6,7 @@ import ( "math/big" "strings" + ccipapi "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/ccipapi" core "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/core" extensionapi "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/extensionapi" chainlinkapi "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/chainlink/chainlinkapi" @@ -29,7 +30,7 @@ var ( const ( PackageName = "ccip-runtime" - PackageID = "e72c7b81e9cc09ed2d35ba3333f561851d5f8a5f81527d05249060ad1edd1eb5" + PackageID = "a56f22abace5597bdcf2528934e2a2fa02c4df51a7671109f162b2eaf0e5e651" SDKVersion = "3.4.11" ) @@ -284,6 +285,207 @@ func (t ArchivedExecutedMessages) ArchiveWithPackageID(contractID string, packag } } +// CCIPMessageSent is a Template type +type CCIPMessageSent struct { + CcipOwner types.PARTY `json:"ccipOwner"` + CcvOwners []types.PARTY `json:"ccvOwners"` + Sender types.PARTY `json:"sender"` + Observers []types.PARTY `json:"observers"` + Event CCIPMessageSentEvent `json:"event"` +} + +// GetTemplateID returns the template ID for this template using the package name +func (t CCIPMessageSent) GetTemplateID() string { + return fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.OnRamp", "CCIPMessageSent") +} + +// GetTemplateIDWithPackageID returns the template ID using the provided package ID instead of package name +func (t CCIPMessageSent) GetTemplateIDWithPackageID(packageID string) string { + return fmt.Sprintf("%s:%s:%s", packageID, "CCIP.OnRamp", "CCIPMessageSent") +} + +// CreateCommand returns a CreateCommand for this template using the package name +func (t CCIPMessageSent) CreateCommand() *model.CreateCommand { + args := make(map[string]any) + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["ccipOwner"] = t.CcipOwner.ToMap() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["ccvOwners"] = func() []any { + res := make([]any, 0, len(t.CcvOwners)) + for _, e := range t.CcvOwners { + res = append(res, e.ToMap()) + } + return res + }() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["sender"] = t.Sender.ToMap() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["observers"] = func() []any { + res := make([]any, 0, len(t.Observers)) + for _, e := range t.Observers { + res = append(res, e.ToMap()) + } + return res + }() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["event"] = model.NestedToDAMLValue(t.Event) + + return &model.CreateCommand{ + TemplateID: t.GetTemplateID(), + Arguments: args, + } +} + +// CreateCommandWithPackageID returns a CreateCommand using the provided package ID instead of package name +func (t CCIPMessageSent) CreateCommandWithPackageID(packageID string) *model.CreateCommand { + args := make(map[string]any) + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["ccipOwner"] = t.CcipOwner.ToMap() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["ccvOwners"] = func() []any { + res := make([]any, 0, len(t.CcvOwners)) + for _, e := range t.CcvOwners { + res = append(res, e.ToMap()) + } + return res + }() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["sender"] = t.Sender.ToMap() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["observers"] = func() []any { + res := make([]any, 0, len(t.Observers)) + for _, e := range t.Observers { + res = append(res, e.ToMap()) + } + return res + }() + + // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty + args["event"] = model.NestedToDAMLValue(t.Event) + + return &model.CreateCommand{ + TemplateID: t.GetTemplateIDWithPackageID(packageID), + Arguments: args, + } +} + +func (t CCIPMessageSent) MarshalJSON() ([]byte, error) { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Marshal(t) +} + +func (t *CCIPMessageSent) UnmarshalJSON(data []byte) error { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Unmarshal(data, t) +} + +// MarshalHex encodes CCIPMessageSent to hex string (Canton MCMS format) +func (t CCIPMessageSent) MarshalHex() (string, error) { + hexCodec := codec.NewHexCodec() + return hexCodec.Marshal(t) +} + +// UnmarshalHex decodes CCIPMessageSent from hex string (Canton MCMS format) +func (t *CCIPMessageSent) UnmarshalHex(data string) error { + hexCodec := codec.NewHexCodec() + return hexCodec.Unmarshal(data, t) +} + +// Choice methods for CCIPMessageSent + +// Archive exercises the Archive choice on this CCIPMessageSent contract +// This method uses the package name in the template ID +func (t CCIPMessageSent) Archive(contractID string) *model.ExerciseCommand { + return &model.ExerciseCommand{ + TemplateID: fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.OnRamp", "CCIPMessageSent"), + ContractID: contractID, + Choice: "Archive", + Arguments: map[string]any{}, + } +} + +// ArchiveWithPackageID exercises the Archive choice using the provided package ID instead of package name +func (t CCIPMessageSent) ArchiveWithPackageID(contractID string, packageID string) *model.ExerciseCommand { + return &model.ExerciseCommand{ + TemplateID: fmt.Sprintf("#%s:%s:%s", packageID, "CCIP.OnRamp", "CCIPMessageSent"), + ContractID: contractID, + Choice: "Archive", + Arguments: map[string]any{}, + } +} + +// CCIPMessageSentEvent is a Record type +type CCIPMessageSentEvent struct { + DestChainSelector types.NUMERIC `json:"destChainSelector"` + SequenceNumber types.NUMERIC `json:"sequenceNumber"` + MessageId types.TEXT `json:"messageId"` + EncodedMessage types.TEXT `json:"encodedMessage"` + VerifierBlobs []types.TEXT `json:"verifierBlobs"` + Receipts []ccipapi.Receipt `json:"receipts"` +} + +// ToMap converts CCIPMessageSentEvent to a map for DAML arguments +func (t CCIPMessageSentEvent) ToMap() map[string]any { + m := make(map[string]any) + + m["destChainSelector"] = t.DestChainSelector + + m["sequenceNumber"] = t.SequenceNumber + + m["messageId"] = string(t.MessageId) + + m["encodedMessage"] = string(t.EncodedMessage) + + m["verifierBlobs"] = func() []any { + res := make([]any, 0, len(t.VerifierBlobs)) + for _, e := range t.VerifierBlobs { + res = append(res, string(e)) + } + return res + }() + + m["receipts"] = func() []any { + res := make([]any, 0, len(t.Receipts)) + for _, e := range t.Receipts { + res = append(res, model.NestedToDAMLValue(e)) + } + return res + }() + + return m +} + +func (t CCIPMessageSentEvent) MarshalJSON() ([]byte, error) { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Marshal(t) +} + +func (t *CCIPMessageSentEvent) UnmarshalJSON(data []byte) error { + jsonCodec := codec.NewJsonCodec() + return jsonCodec.Unmarshal(data, t) +} + +// MarshalHex encodes CCIPMessageSentEvent to hex string (Canton MCMS format) +func (t CCIPMessageSentEvent) MarshalHex() (string, error) { + hexCodec := codec.NewHexCodec() + return hexCodec.Marshal(t) +} + +// UnmarshalHex decodes CCIPMessageSentEvent from hex string (Canton MCMS format) +func (t *CCIPMessageSentEvent) UnmarshalHex(data string) error { + hexCodec := codec.NewHexCodec() + return hexCodec.Unmarshal(data, t) +} + // CCIPSend is a Record type type CCIPSend struct { Context splice_api_token_metadata_v1.ChoiceContext `json:"context"` @@ -413,7 +615,7 @@ type CCIPSendFromRouterResult struct { CcipMessageSent types.CONTRACT_ID `json:"ccipMessageSent"` VerifierBlobs []types.TEXT `json:"verifierBlobs"` MessageSentObservers []types.PARTY `json:"messageSentObservers"` - Receipts []core.Receipt `json:"receipts"` + Receipts []ccipapi.Receipt `json:"receipts"` } // ToMap converts CCIPSendFromRouterResult to a map for DAML arguments @@ -2152,11 +2354,11 @@ func (t OnRamp) FinalizeFeeFromRouterWithPackageID(contractID string, packageID } } -// Archive exercises the Archive choice on this OnRamp contract via the IMCMSReceiver interface +// Archive exercises the Archive choice on this OnRamp contract via the IEventEmitter interface // This method uses the package name in the template ID func (t OnRamp) Archive(contractID string) *model.ExerciseCommand { return &model.ExerciseCommand{ - TemplateID: fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.OnRamp", "MCMSReceiver"), + TemplateID: fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.OnRamp", "EventEmitter"), ContractID: contractID, Choice: "Archive", Arguments: map[string]any{}, @@ -2166,7 +2368,7 @@ func (t OnRamp) Archive(contractID string) *model.ExerciseCommand { // ArchiveWithPackageID exercises the Archive choice using the provided package ID instead of package name func (t OnRamp) ArchiveWithPackageID(contractID string, packageID string) *model.ExerciseCommand { return &model.ExerciseCommand{ - TemplateID: fmt.Sprintf("#%s:%s:%s", packageID, "CCIP.OnRamp", "MCMSReceiver"), + TemplateID: fmt.Sprintf("#%s:%s:%s", packageID, "CCIP.OnRamp", "EventEmitter"), ContractID: contractID, Choice: "Archive", Arguments: map[string]any{}, @@ -2215,10 +2417,33 @@ func (t OnRamp) MCMSReceiverEntrypointWithPackageID(contractID string, packageID } } +// EventEmitterEmitCCIPMessageSentEvent exercises the EventEmitter_EmitCCIPMessageSentEvent choice on this OnRamp contract via the IEventEmitter interface +// This method uses the package name in the template ID +func (t OnRamp) EventEmitterEmitCCIPMessageSentEvent(contractID string, args ccipapi.EventEmitterEmitCCIPMessageSentEvent) *model.ExerciseCommand { + return &model.ExerciseCommand{ + TemplateID: fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.OnRamp", "EventEmitter"), + ContractID: contractID, + Choice: "EventEmitter_EmitCCIPMessageSentEvent", + Arguments: argsToMap(args), + } +} + +// EventEmitterEmitCCIPMessageSentEventWithPackageID exercises the EventEmitter_EmitCCIPMessageSentEvent choice using the provided package ID instead of package name +func (t OnRamp) EventEmitterEmitCCIPMessageSentEventWithPackageID(contractID string, packageID string, args ccipapi.EventEmitterEmitCCIPMessageSentEvent) *model.ExerciseCommand { + return &model.ExerciseCommand{ + TemplateID: fmt.Sprintf("#%s:%s:%s", packageID, "CCIP.OnRamp", "EventEmitter"), + ContractID: contractID, + Choice: "EventEmitter_EmitCCIPMessageSentEvent", + Arguments: argsToMap(args), + } +} + // Verify interface implementations for OnRamp var _ api.IMCMSReceiver = (*OnRamp)(nil) +var _ ccipapi.IEventEmitter = (*OnRamp)(nil) + // OnRampDeps is a Record type type OnRampDeps struct { GlobalConfig chainlinkapi.RawInstanceAddress `json:"globalConfig"` diff --git a/bindings/generated/latest/ccip/committeeverifier/committeeverifier.go b/bindings/generated/latest/ccip/committeeverifier/committeeverifier.go index 36a66a8e9..44c3d6940 100644 --- a/bindings/generated/latest/ccip/committeeverifier/committeeverifier.go +++ b/bindings/generated/latest/ccip/committeeverifier/committeeverifier.go @@ -27,7 +27,7 @@ var ( const ( PackageName = "ccip-committee-verifier" - PackageID = "5ae7d01fcbf94b3a26bb9b5b8c8d1431eeebb652a951d3f6cbdf4d8991e62499" + PackageID = "916441665a4619bcb06e17edf9b858a0ccd557f825078688fdf05f823665901e" SDKVersion = "3.4.11" ) diff --git a/bindings/generated/latest/ccip/core/core.go b/bindings/generated/latest/ccip/core/core.go index d502b9258..29ec3425c 100644 --- a/bindings/generated/latest/ccip/core/core.go +++ b/bindings/generated/latest/ccip/core/core.go @@ -6,6 +6,7 @@ import ( "math/big" "strings" + ccipapi "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/ccipapi" chainlinkapi "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/chainlink/chainlinkapi" api "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/mcms/api" splice_api_token_holding_v1 "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/splice/splice_api_token_holding_v1" @@ -26,7 +27,7 @@ var ( const ( PackageName = "ccip-core" - PackageID = "3c0d1879db1609b9905505a25500909a49f47918d7b4b121115f45a010e612f1" + PackageID = "c4101a4c7fd249eae7a88c7ebd68478720914e624036ad058fd6fce17070089a" SDKVersion = "3.4.11" ) @@ -1078,207 +1079,6 @@ func (t *BuildMessageMCMSParams) UnmarshalHex(data string) error { return hexCodec.Unmarshal(data, t) } -// CCIPMessageSent is a Template type -type CCIPMessageSent struct { - CcipOwner types.PARTY `json:"ccipOwner"` - CcvOwners []types.PARTY `json:"ccvOwners"` - Sender types.PARTY `json:"sender"` - Observers []types.PARTY `json:"observers"` - Event CCIPMessageSentEvent `json:"event"` -} - -// GetTemplateID returns the template ID for this template using the package name -func (t CCIPMessageSent) GetTemplateID() string { - return fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.Events", "CCIPMessageSent") -} - -// GetTemplateIDWithPackageID returns the template ID using the provided package ID instead of package name -func (t CCIPMessageSent) GetTemplateIDWithPackageID(packageID string) string { - return fmt.Sprintf("%s:%s:%s", packageID, "CCIP.Events", "CCIPMessageSent") -} - -// CreateCommand returns a CreateCommand for this template using the package name -func (t CCIPMessageSent) CreateCommand() *model.CreateCommand { - args := make(map[string]any) - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["ccipOwner"] = t.CcipOwner.ToMap() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["ccvOwners"] = func() []any { - res := make([]any, 0, len(t.CcvOwners)) - for _, e := range t.CcvOwners { - res = append(res, e.ToMap()) - } - return res - }() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["sender"] = t.Sender.ToMap() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["observers"] = func() []any { - res := make([]any, 0, len(t.Observers)) - for _, e := range t.Observers { - res = append(res, e.ToMap()) - } - return res - }() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["event"] = model.NestedToDAMLValue(t.Event) - - return &model.CreateCommand{ - TemplateID: t.GetTemplateID(), - Arguments: args, - } -} - -// CreateCommandWithPackageID returns a CreateCommand using the provided package ID instead of package name -func (t CCIPMessageSent) CreateCommandWithPackageID(packageID string) *model.CreateCommand { - args := make(map[string]any) - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["ccipOwner"] = t.CcipOwner.ToMap() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["ccvOwners"] = func() []any { - res := make([]any, 0, len(t.CcvOwners)) - for _, e := range t.CcvOwners { - res = append(res, e.ToMap()) - } - return res - }() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["sender"] = t.Sender.ToMap() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["observers"] = func() []any { - res := make([]any, 0, len(t.Observers)) - for _, e := range t.Observers { - res = append(res, e.ToMap()) - } - return res - }() - - // IMPORTANT: always include non-optional fields (GENMAP/MAP/LIST/[] etc), even if empty - args["event"] = model.NestedToDAMLValue(t.Event) - - return &model.CreateCommand{ - TemplateID: t.GetTemplateIDWithPackageID(packageID), - Arguments: args, - } -} - -func (t CCIPMessageSent) MarshalJSON() ([]byte, error) { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Marshal(t) -} - -func (t *CCIPMessageSent) UnmarshalJSON(data []byte) error { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Unmarshal(data, t) -} - -// MarshalHex encodes CCIPMessageSent to hex string (Canton MCMS format) -func (t CCIPMessageSent) MarshalHex() (string, error) { - hexCodec := codec.NewHexCodec() - return hexCodec.Marshal(t) -} - -// UnmarshalHex decodes CCIPMessageSent from hex string (Canton MCMS format) -func (t *CCIPMessageSent) UnmarshalHex(data string) error { - hexCodec := codec.NewHexCodec() - return hexCodec.Unmarshal(data, t) -} - -// Choice methods for CCIPMessageSent - -// Archive exercises the Archive choice on this CCIPMessageSent contract -// This method uses the package name in the template ID -func (t CCIPMessageSent) Archive(contractID string) *model.ExerciseCommand { - return &model.ExerciseCommand{ - TemplateID: fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.Events", "CCIPMessageSent"), - ContractID: contractID, - Choice: "Archive", - Arguments: map[string]any{}, - } -} - -// ArchiveWithPackageID exercises the Archive choice using the provided package ID instead of package name -func (t CCIPMessageSent) ArchiveWithPackageID(contractID string, packageID string) *model.ExerciseCommand { - return &model.ExerciseCommand{ - TemplateID: fmt.Sprintf("#%s:%s:%s", packageID, "CCIP.Events", "CCIPMessageSent"), - ContractID: contractID, - Choice: "Archive", - Arguments: map[string]any{}, - } -} - -// CCIPMessageSentEvent is a Record type -type CCIPMessageSentEvent struct { - DestChainSelector types.NUMERIC `json:"destChainSelector"` - SequenceNumber types.NUMERIC `json:"sequenceNumber"` - MessageId types.TEXT `json:"messageId"` - EncodedMessage types.TEXT `json:"encodedMessage"` - VerifierBlobs []types.TEXT `json:"verifierBlobs"` - Receipts []Receipt `json:"receipts"` -} - -// ToMap converts CCIPMessageSentEvent to a map for DAML arguments -func (t CCIPMessageSentEvent) ToMap() map[string]any { - m := make(map[string]any) - - m["destChainSelector"] = t.DestChainSelector - - m["sequenceNumber"] = t.SequenceNumber - - m["messageId"] = string(t.MessageId) - - m["encodedMessage"] = string(t.EncodedMessage) - - m["verifierBlobs"] = func() []any { - res := make([]any, 0, len(t.VerifierBlobs)) - for _, e := range t.VerifierBlobs { - res = append(res, string(e)) - } - return res - }() - - m["receipts"] = func() []any { - res := make([]any, 0, len(t.Receipts)) - for _, e := range t.Receipts { - res = append(res, model.NestedToDAMLValue(e)) - } - return res - }() - - return m -} - -func (t CCIPMessageSentEvent) MarshalJSON() ([]byte, error) { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Marshal(t) -} - -func (t *CCIPMessageSentEvent) UnmarshalJSON(data []byte) error { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Unmarshal(data, t) -} - -// MarshalHex encodes CCIPMessageSentEvent to hex string (Canton MCMS format) -func (t CCIPMessageSentEvent) MarshalHex() (string, error) { - hexCodec := codec.NewHexCodec() - return hexCodec.Marshal(t) -} - -// UnmarshalHex decodes CCIPMessageSentEvent from hex string (Canton MCMS format) -func (t *CCIPMessageSentEvent) UnmarshalHex(data string) error { - hexCodec := codec.NewHexCodec() - return hexCodec.Unmarshal(data, t) -} - // CCVExtraArg is a Record type type CCVExtraArg struct { CcvAddress chainlinkapi.RawInstanceAddress `json:"ccvAddress"` @@ -4038,16 +3838,19 @@ func (t *FinalizeFee) UnmarshalHex(data string) error { // FinalizeSend is a Record type type FinalizeSend struct { - MessageSender types.PARTY `json:"messageSender"` - MessageSentObservers []types.PARTY `json:"messageSentObservers"` - VerifierBlobs []types.TEXT `json:"verifierBlobs"` - Receipts []Receipt `json:"receipts"` + EventEmitter types.CONTRACT_ID `json:"eventEmitter"` + MessageSender types.PARTY `json:"messageSender"` + MessageSentObservers []types.PARTY `json:"messageSentObservers"` + VerifierBlobs []types.TEXT `json:"verifierBlobs"` + Receipts []ccipapi.Receipt `json:"receipts"` } // ToMap converts FinalizeSend to a map for DAML arguments func (t FinalizeSend) ToMap() map[string]any { m := make(map[string]any) + m["eventEmitter"] = model.NestedToDAMLValue(t.EventEmitter) + m["messageSender"] = t.MessageSender.ToMap() m["messageSentObservers"] = func() []any { @@ -5215,54 +5018,6 @@ func (t *IsCursedForChainMCMSParams) UnmarshalHex(data string) error { return hexCodec.Unmarshal(data, t) } -// IssuerType is an enum type -type IssuerType string - -const ( - IssuerTypeIssuerType_CCV IssuerType = "IssuerType_CCV" - - IssuerTypeIssuerType_Pool IssuerType = "IssuerType_Pool" - - IssuerTypeIssuerType_Executor IssuerType = "IssuerType_Executor" - - IssuerTypeIssuerType_Network IssuerType = "IssuerType_Network" -) - -func (e IssuerType) GetEnumConstructor() string { return string(e) } - -func (e IssuerType) GetEnumTypeID() string { - return fmt.Sprintf("#%s:%s:%s", PackageName, "CCIP.Tickets", "IssuerType") -} - -// GetEnumTypeIDWithPackageID returns the enum type ID using the provided package ID instead of package name -func (e IssuerType) GetEnumTypeIDWithPackageID(packageID string) string { - return fmt.Sprintf("#%s:%s:%s", packageID, "CCIP.Tickets", "IssuerType") -} - -func (e IssuerType) MarshalJSON() ([]byte, error) { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Marshal(e) -} - -func (e *IssuerType) UnmarshalJSON(data []byte) error { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Unmarshal(data, e) -} - -// MarshalHex encodes IssuerType to hex string (Canton MCMS format) -func (e IssuerType) MarshalHex() (string, error) { - hexCodec := codec.NewHexCodec() - return hexCodec.Marshal(e) -} - -// UnmarshalHex decodes IssuerType from hex string (Canton MCMS format) -func (e *IssuerType) UnmarshalHex(data string) error { - hexCodec := codec.NewHexCodec() - return hexCodec.Unmarshal(data, e) -} - -var _ types.ENUM = IssuerType("") - // LocalAmountConversionResult is a Record type type LocalAmountConversionResult struct { LocalAmount types.NUMERIC `json:"localAmount"` @@ -6602,70 +6357,6 @@ func (t RateLimiter) MCMSReceiverEntrypointWithPackageID(contractID string, pack var _ api.IMCMSReceiver = (*RateLimiter)(nil) -// Receipt is a Record type -type Receipt struct { - IssuerType IssuerType `json:"issuerType"` - IssuerAddress types.TEXT `json:"issuerAddress"` - VersionTag *types.TEXT `json:"versionTag" hex:"optional"` - DestGasLimit types.INT64 `json:"destGasLimit"` - DestBytesOverhead types.INT64 `json:"destBytesOverhead"` - FeeTokenAmount types.NUMERIC `json:"feeTokenAmount"` - ExtraArgs types.TEXT `json:"extraArgs"` -} - -// ToMap converts Receipt to a map for DAML arguments -func (t Receipt) ToMap() map[string]any { - m := make(map[string]any) - - m["issuerType"] = model.NestedToDAMLValue(t.IssuerType) - - m["issuerAddress"] = string(t.IssuerAddress) - - if t.VersionTag != nil { - m["versionTag"] = map[string]any{ - "_type": "optional", - "value": string(*t.VersionTag), - } - } else { - m["versionTag"] = map[string]any{ - "_type": "optional", - "value": nil, - } - } - - m["destGasLimit"] = int64(t.DestGasLimit) - - m["destBytesOverhead"] = int64(t.DestBytesOverhead) - - m["feeTokenAmount"] = t.FeeTokenAmount - - m["extraArgs"] = string(t.ExtraArgs) - - return m -} - -func (t Receipt) MarshalJSON() ([]byte, error) { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Marshal(t) -} - -func (t *Receipt) UnmarshalJSON(data []byte) error { - jsonCodec := codec.NewJsonCodec() - return jsonCodec.Unmarshal(data, t) -} - -// MarshalHex encodes Receipt to hex string (Canton MCMS format) -func (t Receipt) MarshalHex() (string, error) { - hexCodec := codec.NewHexCodec() - return hexCodec.Marshal(t) -} - -// UnmarshalHex decodes Receipt from hex string (Canton MCMS format) -func (t *Receipt) UnmarshalHex(data string) error { - hexCodec := codec.NewHexCodec() - return hexCodec.Unmarshal(data, t) -} - // RemoveCustomObservers is a Record type type RemoveCustomObservers struct { Parties []types.PARTY `json:"parties"` diff --git a/bindings/generated/latest/ccip/executor/executor.go b/bindings/generated/latest/ccip/executor/executor.go index c03cb289b..5c880f271 100644 --- a/bindings/generated/latest/ccip/executor/executor.go +++ b/bindings/generated/latest/ccip/executor/executor.go @@ -28,7 +28,7 @@ var ( const ( PackageName = "ccip-executor" - PackageID = "df2d8d8f288b160402feee5f8d056e7c776b5c9a99eab50afc1e6e5f8d6d428a" + PackageID = "2a5a7e2cbbf25272ecede608caa565f80bb3de068f9c919d72342178b2a9474c" SDKVersion = "3.4.11" ) diff --git a/bindings/generated/latest/ccip/extensionapi/extensionapi.go b/bindings/generated/latest/ccip/extensionapi/extensionapi.go index dd6903965..9bb6c04be 100644 --- a/bindings/generated/latest/ccip/extensionapi/extensionapi.go +++ b/bindings/generated/latest/ccip/extensionapi/extensionapi.go @@ -6,7 +6,6 @@ import ( "math/big" "strings" - core "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/core" chainlinkapi "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/chainlink/chainlinkapi" splice_api_token_holding_v1 "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/splice/splice_api_token_holding_v1" splice_api_token_metadata_v1 "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/splice/splice_api_token_metadata_v1" @@ -27,7 +26,7 @@ var ( const ( PackageName = "ccip-extension-api" - PackageID = "ee0ce484b84662844791067b50f89f98959b9259841bb00b7a70d60a768ff351" + PackageID = "abf82ef630cd2f176e69385616004d4a5012a1d1ed2a4d5552560acc2351d21b" SDKVersion = "3.4.11" ) @@ -1008,12 +1007,12 @@ func (t *TokenPoolGetFee) UnmarshalHex(data string) error { // TokenPoolGetRequiredCCVs is a Record type type TokenPoolGetRequiredCCVs struct { - RemoteChainSelector types.NUMERIC `json:"remoteChainSelector"` - SourceAmount types.TEXT `json:"sourceAmount"` - Finality core.FinalityConfig `json:"finality"` - ExtraData types.TEXT `json:"extraData"` - Direction TransferDirection `json:"direction"` - Caller types.PARTY `json:"caller"` + RemoteChainSelector types.NUMERIC `json:"remoteChainSelector"` + SourceAmount types.TEXT `json:"sourceAmount"` + Finality types.TEXT `json:"finality"` + ExtraData types.TEXT `json:"extraData"` + Direction TransferDirection `json:"direction"` + Caller types.PARTY `json:"caller"` } // ToMap converts TokenPoolGetRequiredCCVs to a map for DAML arguments @@ -1024,7 +1023,7 @@ func (t TokenPoolGetRequiredCCVs) ToMap() map[string]any { m["sourceAmount"] = string(t.SourceAmount) - m["finality"] = model.NestedToDAMLValue(t.Finality) + m["finality"] = string(t.Finality) m["extraData"] = string(t.ExtraData) diff --git a/bindings/generated/latest/ccip/factory/factory.go b/bindings/generated/latest/ccip/factory/factory.go index 12595d657..96d773f45 100644 --- a/bindings/generated/latest/ccip/factory/factory.go +++ b/bindings/generated/latest/ccip/factory/factory.go @@ -34,7 +34,7 @@ var ( const ( PackageName = "ccip-factory" - PackageID = "9fe505c991e91a2e1b1cdaf3bb666a4354415bdd72e906b2fce2cfd4e8bd6edd" + PackageID = "ab902bb97e8f95d538fc9c1337aa676f3b1c23cd97fe12c50212b8cd0ee23fbb" SDKVersion = "3.4.11" ) diff --git a/bindings/generated/latest/ccip/lockreleasetokenpool/lockreleasetokenpool.go b/bindings/generated/latest/ccip/lockreleasetokenpool/lockreleasetokenpool.go index 641481abf..72ad58106 100644 --- a/bindings/generated/latest/ccip/lockreleasetokenpool/lockreleasetokenpool.go +++ b/bindings/generated/latest/ccip/lockreleasetokenpool/lockreleasetokenpool.go @@ -29,7 +29,7 @@ var ( const ( PackageName = "ccip-lock-release-token-pool" - PackageID = "91d0fb5eebbd1eab9139f8d95db42b3c0ea9bb3669cb34f48f1f2d597d65b119" + PackageID = "77b0a3ab3fdf1ecf03a1d58fbb6f9460f6a12c8e2e32026246d68f1e99859f43" SDKVersion = "3.4.11" ) diff --git a/bindings/generated/latest/ccip/receiver/receiver.go b/bindings/generated/latest/ccip/receiver/receiver.go index f783a2d21..5005806dd 100644 --- a/bindings/generated/latest/ccip/receiver/receiver.go +++ b/bindings/generated/latest/ccip/receiver/receiver.go @@ -27,7 +27,7 @@ var ( const ( PackageName = "ccip-receiver" - PackageID = "3e02facd4c5b02dad1b4dd07f43339e2437bcce8b5e669660b3c8d72c9355d95" + PackageID = "57516604e0002b092f755933c6deaae0a0ffd2ee28d80b80cf83653a666bf33c" SDKVersion = "3.4.11" ) diff --git a/bindings/generated/latest/ccip/sender/sender.go b/bindings/generated/latest/ccip/sender/sender.go index d08a55612..48ead890b 100644 --- a/bindings/generated/latest/ccip/sender/sender.go +++ b/bindings/generated/latest/ccip/sender/sender.go @@ -26,7 +26,7 @@ var ( const ( PackageName = "ccip-sender" - PackageID = "5783dfc7c23e899cdc6446dfdf113815bb2e029dffba0055139757253068350b" + PackageID = "be81f5b4f88ebd6759b697855767dea802286f36239f94101e10742fc56e4624" SDKVersion = "3.4.11" ) diff --git a/ccip/devenv/env-canton-evm.toml b/ccip/devenv/env-canton-evm.toml index ab1b35b25..25c303579 100644 --- a/ccip/devenv/env-canton-evm.toml +++ b/ccip/devenv/env-canton-evm.toml @@ -160,8 +160,8 @@ execution_interval = 15_000_000_000 [verifier.opaque_configs.canton.reader_configs.8706591216959472610] ccip_owner_party = "participant1-localparty-1" [verifier.opaque_configs.canton.reader_configs.8706591216959472610.ccip_message_sent_template_id] - package_id = "#ccip-core" - module_name = "CCIP.Events" + package_id = "#ccip-runtime" + module_name = "CCIP.OnRamp" entity_name = "CCIPMessageSent" [verifier.opaque_configs.canton.reader_configs.8706591216959472610.rmn_remote_template_id] package_id = "#ccip-core" @@ -194,8 +194,8 @@ execution_interval = 15_000_000_000 [verifier.opaque_configs.canton.reader_configs.8706591216959472610] ccip_owner_party = "participant1-localparty-1" [verifier.opaque_configs.canton.reader_configs.8706591216959472610.ccip_message_sent_template_id] - package_id = "#ccip-core" - module_name = "CCIP.Events" + package_id = "#ccip-runtime" + module_name = "CCIP.OnRamp" entity_name = "CCIPMessageSent" [verifier.opaque_configs.canton.reader_configs.8706591216959472610.rmn_remote_template_id] package_id = "#ccip-core" diff --git a/ccip/devenv/impl.go b/ccip/devenv/impl.go index 863cb43b6..39d5b4063 100644 --- a/ccip/devenv/impl.go +++ b/ccip/devenv/impl.go @@ -1287,7 +1287,7 @@ func (c *Chain) SendMessage(ctx context.Context, dest uint64, fields cciptestint { IdentifierFilter: &apiv2.CumulativeFilter_TemplateFilter{ TemplateFilter: &apiv2.TemplateFilter{ - TemplateId: contracts.TemplateIDFromBinding(core.CCIPMessageSent{}).ToLedgerIdentifier(), + TemplateId: contracts.TemplateIDFromBinding(ccipruntime.CCIPMessageSent{}).ToLedgerIdentifier(), IncludeCreatedEventBlob: true, }, }, @@ -1353,7 +1353,7 @@ type ccipMessageSentFromSendUpdate struct { // before this send; returned seqNo is either previousSeq+1 or the sequence from the encoded payload // when that path is present. func parseFirstCCIPMessageSentFromLedgerEvents(events []*apiv2.Event, previousSeq uint64) (ccipMessageSentFromSendUpdate, error) { - messageSentTemplateID := contracts.TemplateIDFromBinding(core.CCIPMessageSent{}) + messageSentTemplateID := contracts.TemplateIDFromBinding(ccipruntime.CCIPMessageSent{}) // Find CCIPMessageSent event in the events var created *apiv2.CreatedEvent @@ -1374,7 +1374,7 @@ func parseFirstCCIPMessageSentFromLedgerEvents(events []*apiv2.Event, previousSe return ccipMessageSentFromSendUpdate{}, fmt.Errorf("no CCIPMessageSent event found in sender transaction") } - parsed, err := bindings.UnmarshalCreatedEvent[core.CCIPMessageSent](created) + parsed, err := bindings.UnmarshalCreatedEvent[ccipruntime.CCIPMessageSent](created) if err != nil { return ccipMessageSentFromSendUpdate{}, fmt.Errorf("unmarshal CCIPMessageSent created event: %w", err) } diff --git a/ccip/sourcereader/source_reader.go b/ccip/sourcereader/source_reader.go index 1062c9408..321c7dc73 100644 --- a/ccip/sourcereader/source_reader.go +++ b/ccip/sourcereader/source_reader.go @@ -15,12 +15,15 @@ import ( ledgerv2 "github.com/digital-asset/dazl-client/v8/go/api/com/daml/ledger/api/v2" "google.golang.org/grpc" + "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/ccipapi" + "github.com/smartcontractkit/chainlink-canton/bindings/generated/v1_0_0/ccip/core" + "github.com/smartcontractkit/chainlink-ccv/pkg/chainaccess" "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-canton/bindings" - "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/core" + "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/ccipruntime" "github.com/smartcontractkit/chainlink-canton/contracts" "github.com/smartcontractkit/chainlink-canton/deployment/utils/operations/contract" ) @@ -265,7 +268,7 @@ func processCreatedEvent( return nil, errMetadataMismatch } - parsed, err := bindings.UnmarshalCreatedEvent[core.CCIPMessageSent](created) + parsed, err := bindings.UnmarshalCreatedEvent[ccipruntime.CCIPMessageSent](created) if err != nil { return nil, fmt.Errorf("failed to unmarshal CCIPMessageSent created event: %w", err) } @@ -291,7 +294,7 @@ func processCreatedEvent( // ccipMessageSentEventToProtocol converts the binding type common.CCIPMessageSentEvent // to protocol.MessageSentEvent (hex decoding, message decode, receipt mapping, validations). -func ccipMessageSentEventToProtocol(evt *core.CCIPMessageSentEvent) (*protocol.MessageSentEvent, error) { +func ccipMessageSentEventToProtocol(evt *ccipruntime.CCIPMessageSentEvent) (*protocol.MessageSentEvent, error) { messageSentEvent := &protocol.MessageSentEvent{} messageID, err := hex.DecodeString(string(evt.MessageId)) @@ -349,7 +352,7 @@ func ccipMessageSentEventToProtocol(evt *core.CCIPMessageSentEvent) (*protocol.M } // receiptsBindingToProtocol converts binding []common.Receipt to []protocol.ReceiptWithBlob. -func receiptsBindingToProtocol(receipts []core.Receipt) ([]protocol.ReceiptWithBlob, error) { +func receiptsBindingToProtocol(receipts []ccipapi.Receipt) ([]protocol.ReceiptWithBlob, error) { protoReceipts := make([]protocol.ReceiptWithBlob, 0, len(receipts)) for i, r := range receipts { decoded, err := protocol.NewUnknownAddressFromHex(string(r.IssuerAddress)) diff --git a/ccip/sourcereader/source_reader_test.go b/ccip/sourcereader/source_reader_test.go index 04725ed52..179115be7 100644 --- a/ccip/sourcereader/source_reader_test.go +++ b/ccip/sourcereader/source_reader_test.go @@ -16,6 +16,8 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/metadata" + "github.com/smartcontractkit/chainlink-canton/bindings/generated/latest/ccip/ccipapi" + "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/go-daml/pkg/types" @@ -209,7 +211,7 @@ func TestSourceReader_GetBlocksHeaders(t *testing.T) { func TestReceiptsBindingToProtocol_numericBounds(t *testing.T) { t.Parallel() issuer := protocol.Keccak256([]byte("issuer")) - base := core.Receipt{ + base := ccipapi.Receipt{ IssuerAddress: types.TEXT(hex.EncodeToString(issuer[:])), DestGasLimit: 1, DestBytesOverhead: 1, @@ -221,7 +223,7 @@ func TestReceiptsBindingToProtocol_numericBounds(t *testing.T) { t.Parallel() r := base r.DestGasLimit = -1 - _, err := receiptsBindingToProtocol([]core.Receipt{r}) + _, err := receiptsBindingToProtocol([]ccipapi.Receipt{r}) require.Error(t, err) require.ErrorContains(t, err, "receipts[0]: dest gas limit must be non-negative") }) @@ -230,7 +232,7 @@ func TestReceiptsBindingToProtocol_numericBounds(t *testing.T) { t.Parallel() r := base r.DestBytesOverhead = -1 - _, err := receiptsBindingToProtocol([]core.Receipt{r}) + _, err := receiptsBindingToProtocol([]ccipapi.Receipt{r}) require.Error(t, err) require.ErrorContains(t, err, "receipts[0]: dest bytes overhead must be non-negative") }) @@ -239,7 +241,7 @@ func TestReceiptsBindingToProtocol_numericBounds(t *testing.T) { t.Parallel() r := base r.DestBytesOverhead = math.MaxUint32 + 1 - _, err := receiptsBindingToProtocol([]core.Receipt{r}) + _, err := receiptsBindingToProtocol([]ccipapi.Receipt{r}) require.Error(t, err) require.ErrorContains(t, err, "receipts[0]: dest bytes overhead overflows uint32") }) @@ -248,7 +250,7 @@ func TestReceiptsBindingToProtocol_numericBounds(t *testing.T) { t.Parallel() r := base r.DestBytesOverhead = math.MaxUint32 - got, err := receiptsBindingToProtocol([]core.Receipt{r}) + got, err := receiptsBindingToProtocol([]ccipapi.Receipt{r}) require.NoError(t, err) require.Len(t, got, 1) require.Equal(t, uint32(math.MaxUint32), got[0].DestBytesOverhead) @@ -896,7 +898,7 @@ func TestSourceReader_FetchMessageSentEvents(t *testing.T) { execIssuer := protocol.Keccak256([]byte("executor")) networkIssuer := protocol.Keccak256([]byte("network")) - bindingReceipts := []core.Receipt{ + bindingReceipts := []ccipapi.Receipt{ {IssuerAddress: types.TEXT(hex.EncodeToString(ccvIssuer[:])), DestGasLimit: 100000, DestBytesOverhead: 500, FeeTokenAmount: types.NUMERIC("1000000."), ExtraArgs: types.TEXT(extraArgsHex)}, {IssuerAddress: types.TEXT(hex.EncodeToString(execIssuer[:])), DestGasLimit: 0, DestBytesOverhead: 0, FeeTokenAmount: types.NUMERIC("500000."), ExtraArgs: types.TEXT("")}, {IssuerAddress: types.TEXT(hex.EncodeToString(networkIssuer[:])), DestGasLimit: 0, DestBytesOverhead: 0, FeeTokenAmount: types.NUMERIC("500000."), ExtraArgs: types.TEXT("")}, diff --git a/contracts/ccip/api/daml.yaml b/contracts/ccip/api/daml.yaml new file mode 100644 index 000000000..c8d3d9417 --- /dev/null +++ b/contracts/ccip/api/daml.yaml @@ -0,0 +1,15 @@ +sdk-version: 3.4.11 +name: ccip-api +source: daml +version: 2.0.0 +build-options: + - "-Wno-crypto-text-is-alpha" + - "-Werror=unused-dependency" +data-dependencies: + - ../../dependencies/splice/splice-api-token-metadata-v1-1.0.0.dar + - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar + #- ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar +dependencies: + - daml-prim + - daml-stdlib + #- ../../chainlink/api/.daml/dist/chainlink-api-2.0.0.dar diff --git a/contracts/ccip/api/daml/CCIP/API/EventEmitterV1.daml b/contracts/ccip/api/daml/CCIP/API/EventEmitterV1.daml new file mode 100644 index 000000000..00269e13d --- /dev/null +++ b/contracts/ccip/api/daml/CCIP/API/EventEmitterV1.daml @@ -0,0 +1,54 @@ +module CCIP.API.EventEmitterV1 where + +import DA.Crypto.Text (BytesHex) + +import qualified Splice.Api.Token.HoldingV1 +import qualified Splice.Api.Token.MetadataV1 + +interface EventEmitter where + viewtype EventEmitterView + + eventEmitter_emitCCIPMessageSentEventImpl : ContractId EventEmitter -> EventEmitter_EmitCCIPMessageSentEvent -> Update (ContractId ()) + + nonconsuming choice EventEmitter_EmitCCIPMessageSentEvent : ContractId () + with + destChainSelector : Numeric 0 + sequenceNumber : Numeric 0 + sender : Party + encodedMessage : BytesHex + feeToken : Splice.Api.Token.HoldingV1.InstrumentId + tokenAmountBeforeTokenPoolFees : Decimal + receipts : [Receipt] + ccvOwners : [Party] + verifierBlobs : [BytesHex] + observers : [Party] + extraActors : [Party] + context : Splice.Api.Token.MetadataV1.ChoiceContext + controller (view this).ccipOwner :: (ccvOwners ++ extraActors) + do eventEmitter_emitCCIPMessageSentEventImpl this self arg + + +data EventEmitterView = EventEmitterView + with + ccipOwner : Party + instanceId : Text + +-- | Issuer type for receipts. +data IssuerType + = IssuerType_CCV -- Cross-chain verifier + | IssuerType_Pool -- Token pool + | IssuerType_Executor -- Executor + | IssuerType_Network -- Network/protocol fee + deriving (Eq, Show) + +-- | Fee/gas accounting for a single entity (CCV, pool, executor, or network). +data Receipt = Receipt + with + issuerType : IssuerType -- Type of issuer + issuerAddress : BytesHex -- 32-byte instance address + versionTag : Optional BytesHex -- 4-byte version tag for CCVs, None for pools/network + destGasLimit : Int -- Gas allocated for dest chain execution + destBytesOverhead : Int -- Data availability overhead in bytes + feeTokenAmount : Numeric 0 -- Fee amount in fee token units + extraArgs : BytesHex -- Entity-specific arguments + deriving (Eq, Show) \ No newline at end of file diff --git a/contracts/ccip/committee-verifier/daml.yaml b/contracts/ccip/committee-verifier/daml.yaml index 014bd79bc..8df7d538c 100644 --- a/contracts/ccip/committee-verifier/daml.yaml +++ b/contracts/ccip/committee-verifier/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/committee-verifier/daml/CCIP/CommitteeVerifier.daml b/contracts/ccip/committee-verifier/daml/CCIP/CommitteeVerifier.daml index 2aefcb366..f7b9c12c1 100644 --- a/contracts/ccip/committee-verifier/daml/CCIP/CommitteeVerifier.daml +++ b/contracts/ccip/committee-verifier/daml/CCIP/CommitteeVerifier.daml @@ -112,18 +112,18 @@ template CommitteeVerifier storageLocations = storageLocations crossChainVerifier_verifyMessageImpl self arg = do - exercise (fromInterfaceContractId @CommitteeVerifier self) VerifyMessage + coerceContractId <$> exercise (fromInterfaceContractId @CommitteeVerifier self) VerifyMessage with - rmnRemoteCid = arg.rmnRemoteCid + rmnRemoteCid = coerceContractId arg.rmnRemoteCid extraContext = arg.extraContext - executingMessageCid = arg.executingMessageCid + executingMessageCid = coerceContractId arg.executingMessageCid verifierResults = arg.verifierResults caller = arg.caller crossChainVerifier_calculateFeeImpl self arg = do - exercise (fromInterfaceContractId @CommitteeVerifier self) CalculateFee + coerceContractId <$> exercise (fromInterfaceContractId @CommitteeVerifier self) CalculateFee with - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid extraContext = arg.extraContext caller = arg.caller @@ -134,11 +134,11 @@ template CommitteeVerifier caller = arg.caller crossChainVerifier_forwardToVerifierImpl self arg = do - exercise (fromInterfaceContractId @CommitteeVerifier self) ForwardToVerifier + coerceContractId <$> exercise (fromInterfaceContractId @CommitteeVerifier self) ForwardToVerifier with - rmnRemoteCid = arg.rmnRemoteCid + rmnRemoteCid = coerceContractId arg.rmnRemoteCid extraContext = arg.extraContext - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid verifierArgs = arg.verifierArgs caller = arg.caller diff --git a/contracts/ccip/core/daml.yaml b/contracts/ccip/core/daml.yaml index 0e2afad75..bfc84273c 100644 --- a/contracts/ccip/core/daml.yaml +++ b/contracts/ccip/core/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/core/daml/CCIP/Events.daml b/contracts/ccip/core/daml/CCIP/Events.daml index 53560ebaf..e7689241d 100644 --- a/contracts/ccip/core/daml/CCIP/Events.daml +++ b/contracts/ccip/core/daml/CCIP/Events.daml @@ -10,27 +10,6 @@ import qualified Splice.Api.Token.HoldingV1 import qualified Splice.Api.Token.TransferInstructionV1 import qualified Chainlink.InstanceAddress -template CCIPMessageSent - with - ccipOwner : Party - ccvOwners : [Party] - sender : Party - observers : [Party] - event : CCIPMessageSentEvent - where - signatory dedup (ccipOwner :: ccvOwners) - observer sender, observers - -data CCIPMessageSentEvent = CCIPMessageSentEvent - with - destChainSelector : Numeric 0 - sequenceNumber : Numeric 0 - messageId : BytesHex - encodedMessage : BytesHex - verifierBlobs : [BytesHex] - receipts : [CCIP.Tickets.Receipt] - deriving (Eq, Show) - template ExecutionStateChanged with ccipOwner : Party diff --git a/contracts/ccip/core/daml/CCIP/SendingMessageV1.daml b/contracts/ccip/core/daml/CCIP/SendingMessageV1.daml index a5344173f..3bc17a56d 100644 --- a/contracts/ccip/core/daml/CCIP/SendingMessageV1.daml +++ b/contracts/ccip/core/daml/CCIP/SendingMessageV1.daml @@ -11,7 +11,8 @@ import DA.List (dedup, unique) import DA.Optional (isNone, isSome, fromSome, fromOptional) import DA.Text qualified as Text -import qualified CCIP.Events +import qualified CCIP.API.EventEmitterV1 + import qualified CCIP.FinalityConfig import qualified CCIP.Internal import qualified CCIP.Math @@ -22,6 +23,7 @@ import qualified CCIP.Tickets import MCMS.Crypto (isValidHex) import qualified Splice.Api.Token.HoldingV1 +import qualified Splice.Api.Token.MetadataV1 data CCVFee = CCVFee with @@ -551,28 +553,31 @@ template SendingMessageV1 choice FinalizeSend : FinalizeSendResult with + eventEmitter : ContractId CCIP.API.EventEmitterV1.EventEmitter messageSender : Party messageSentObservers : [Party] verifierBlobs : [BytesHex] - receipts : [CCIP.Tickets.Receipt] + receipts : [CCIP.API.EventEmitterV1.Receipt] controller ccipOwner do assertMsg "finalizeSend: only allowed after fee finalization" (state == SendingMessageState_FeeFinalized) assertMsg "finalizeSend: message not yet constructed" (isSome message) assertMsg "finalizeSend: sender mismatch" (messageSender == sender) - eventCid <- create CCIP.Events.CCIPMessageSent with - ccipOwner = ccipOwner - ccvOwners = ccvOwners + eventCid <- exercise eventEmitter CCIP.API.EventEmitterV1.EventEmitter_EmitCCIPMessageSentEvent with + destChainSelector = destChainSelector + sequenceNumber = sequenceNumber sender = messageSender + encodedMessage = encodedMessage + feeToken = feeToken + tokenAmountBeforeTokenPoolFees = 0.0 + receipts = receipts + ccvOwners = ccvOwners + verifierBlobs = verifierBlobs observers = messageSentObservers - event = CCIP.Events.CCIPMessageSentEvent with - destChainSelector = destChainSelector - sequenceNumber = sequenceNumber - messageId = messageId - encodedMessage = encodedMessage - verifierBlobs = verifierBlobs - receipts = receipts + extraActors = [] + context = Splice.Api.Token.MetadataV1.emptyChoiceContext + pure FinalizeSendResult with ccipMessageSent = eventCid @@ -593,5 +598,5 @@ template SendingMessageV1 data FinalizeSendResult = FinalizeSendResult with - ccipMessageSent : ContractId CCIP.Events.CCIPMessageSent + ccipMessageSent : ContractId () deriving (Eq, Show) diff --git a/contracts/ccip/core/daml/CCIP/Tickets.daml b/contracts/ccip/core/daml/CCIP/Tickets.daml index 51fb2160e..7eef2c195 100644 --- a/contracts/ccip/core/daml/CCIP/Tickets.daml +++ b/contracts/ccip/core/daml/CCIP/Tickets.daml @@ -8,26 +8,6 @@ import qualified CCIP.FinalityConfig import Chainlink.InstanceAddress (RawInstanceAddress) import qualified Splice.Api.Token.HoldingV1 --- | Issuer type for receipts. -data IssuerType - = IssuerType_CCV -- Cross-chain verifier - | IssuerType_Pool -- Token pool - | IssuerType_Executor -- Executor - | IssuerType_Network -- Network/protocol fee - deriving (Eq, Show) - --- | Fee/gas accounting for a single entity (CCV, pool, executor, or network). -data Receipt = Receipt - with - issuerType : IssuerType -- Type of issuer - issuerAddress : BytesHex -- 32-byte instance address - versionTag : Optional BytesHex -- 4-byte version tag for CCVs, None for pools/network - destGasLimit : Int -- Gas allocated for dest chain execution - destBytesOverhead : Int -- Data availability overhead in bytes - feeTokenAmount : Numeric 0 -- Fee amount in fee token units - extraArgs : BytesHex -- Entity-specific arguments - deriving (Eq, Show) - -- | Ticket issued by consuming ExecutingMessageV1 after successful message verification. -- The signatory set includes CCV-owner parties accumulated during inbound verification, -- giving third-party pools an independent trust check beyond ccipOwner alone. diff --git a/contracts/ccip/executor/daml.yaml b/contracts/ccip/executor/daml.yaml index a41402576..e63ca8a10 100644 --- a/contracts/ccip/executor/daml.yaml +++ b/contracts/ccip/executor/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/executor/daml/CCIP/Executor.daml b/contracts/ccip/executor/daml/CCIP/Executor.daml index 7ad054037..37cf9d269 100644 --- a/contracts/ccip/executor/daml/CCIP/Executor.daml +++ b/contracts/ccip/executor/daml/CCIP/Executor.daml @@ -41,9 +41,9 @@ template Executor owner = owner executor_calculateFeeImpl self arg = do - exercise (fromInterfaceContractId @Executor self) CalculateFee with + coerceContractId <$> exercise (fromInterfaceContractId @Executor self) CalculateFee with expectedExecutor = arg.expectedExecutor - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid executorArgs = arg.executorArgs extraContext = arg.extraContext caller = arg.caller diff --git a/contracts/ccip/extension-api/daml.yaml b/contracts/ccip/extension-api/daml.yaml index 23bf6d039..969dce0ea 100644 --- a/contracts/ccip/extension-api/daml.yaml +++ b/contracts/ccip/extension-api/daml.yaml @@ -8,11 +8,8 @@ build-options: data-dependencies: - ../../dependencies/splice/splice-api-token-metadata-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar dependencies: - daml-prim - daml-stdlib - ../../chainlink/api/.daml/dist/chainlink-api-2.0.0.dar - - ../../mcms/api/.daml/dist/mcms-api-1.0.0.dar - - ../core/.daml/dist/ccip-core-2.0.0.dar diff --git a/contracts/ccip/extension-api/daml/CCIP/Interfaces/CrossChainVerifier.daml b/contracts/ccip/extension-api/daml/CCIP/Interfaces/CrossChainVerifier.daml index 20869cd10..f3ff612d9 100644 --- a/contracts/ccip/extension-api/daml/CCIP/Interfaces/CrossChainVerifier.daml +++ b/contracts/ccip/extension-api/daml/CCIP/Interfaces/CrossChainVerifier.daml @@ -4,27 +4,20 @@ import DA.Crypto.Text (BytesHex) import Splice.Api.Token.MetadataV1 (ChoiceContext) -import qualified CCIP.ExecutingMessageV1 -import qualified CCIP.Internal -import qualified CCIP.RMNRemote -import qualified CCIP.SendingMessageV1 - -useDefaultCCVs = CCIP.Internal.useDefaultCCVs - interface ICrossChainVerifier where viewtype CrossChainVerifierView - crossChainVerifier_verifyMessageImpl : ContractId ICrossChainVerifier -> CrossChainVerifier_VerifyMessage -> Update (ContractId CCIP.ExecutingMessageV1.ExecutingMessageV1) - crossChainVerifier_calculateFeeImpl : ContractId ICrossChainVerifier -> CrossChainVerifier_CalculateFee -> Update (ContractId CCIP.SendingMessageV1.SendingMessageV1) + crossChainVerifier_verifyMessageImpl : ContractId ICrossChainVerifier -> CrossChainVerifier_VerifyMessage -> Update (ContractId ()) + crossChainVerifier_calculateFeeImpl : ContractId ICrossChainVerifier -> CrossChainVerifier_CalculateFee -> Update (ContractId ()) crossChainVerifier_getFeeImpl : ContractId ICrossChainVerifier -> CrossChainVerifier_GetFee -> Update CrossChainVerifierFeeQuote - crossChainVerifier_forwardToVerifierImpl : ContractId ICrossChainVerifier -> CrossChainVerifier_ForwardToVerifier -> Update (ContractId CCIP.SendingMessageV1.SendingMessageV1) + crossChainVerifier_forwardToVerifierImpl : ContractId ICrossChainVerifier -> CrossChainVerifier_ForwardToVerifier -> Update (ContractId ()) -- Verify an inbound message and append a CCV verification to ExecutingMessageV1. - nonconsuming choice CrossChainVerifier_VerifyMessage : ContractId CCIP.ExecutingMessageV1.ExecutingMessageV1 + nonconsuming choice CrossChainVerifier_VerifyMessage : ContractId () with - rmnRemoteCid : ContractId CCIP.RMNRemote.RMNRemote + rmnRemoteCid : ContractId () extraContext : ChoiceContext - executingMessageCid : ContractId CCIP.ExecutingMessageV1.ExecutingMessageV1 + executingMessageCid : ContractId () verifierResults : BytesHex caller : Party controller caller @@ -32,9 +25,9 @@ interface ICrossChainVerifier where -- Calculate fee for outbound message (USD cents only). nonconsuming choice CrossChainVerifier_CalculateFee - : ContractId CCIP.SendingMessageV1.SendingMessageV1 + : ContractId () with - sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 + sendingMessageCid : ContractId () extraContext : ChoiceContext caller : Party controller caller @@ -51,11 +44,11 @@ interface ICrossChainVerifier where -- Forward message for verification and append verifier data to -- SendingMessageV1. nonconsuming choice CrossChainVerifier_ForwardToVerifier - : ContractId CCIP.SendingMessageV1.SendingMessageV1 + : ContractId () with - rmnRemoteCid : ContractId CCIP.RMNRemote.RMNRemote + rmnRemoteCid : ContractId () extraContext : ChoiceContext - sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 + sendingMessageCid : ContractId () verifierArgs : BytesHex caller : Party controller caller diff --git a/contracts/ccip/extension-api/daml/CCIP/Interfaces/Executor.daml b/contracts/ccip/extension-api/daml/CCIP/Interfaces/Executor.daml index 2c5e24be1..9b5ed9eb8 100644 --- a/contracts/ccip/extension-api/daml/CCIP/Interfaces/Executor.daml +++ b/contracts/ccip/extension-api/daml/CCIP/Interfaces/Executor.daml @@ -4,7 +4,6 @@ import DA.Crypto.Text (BytesHex) import Splice.Api.Token.MetadataV1 (ChoiceContext) -import qualified CCIP.SendingMessageV1 import Chainlink.InstanceAddress (RawInstanceAddress) import Chainlink.InstanceAddress qualified as RawInstanceAddress @@ -14,16 +13,16 @@ interface IExecutor where executor_calculateFeeImpl : ContractId IExecutor -> Executor_CalculateFee -> - Update (ContractId CCIP.SendingMessageV1.SendingMessageV1) + Update (ContractId ()) executor_getFeeImpl : ContractId IExecutor -> Executor_GetFee -> Update ExecutorFeeQuote - nonconsuming choice Executor_CalculateFee : ContractId CCIP.SendingMessageV1.SendingMessageV1 + nonconsuming choice Executor_CalculateFee : ContractId () with expectedExecutor : RawInstanceAddress - sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 + sendingMessageCid : ContractId () executorArgs : BytesHex extraContext : ChoiceContext caller : Party diff --git a/contracts/ccip/extension-api/daml/CCIP/Interfaces/TokenPool.daml b/contracts/ccip/extension-api/daml/CCIP/Interfaces/TokenPool.daml index ea918965b..afc12ba5a 100644 --- a/contracts/ccip/extension-api/daml/CCIP/Interfaces/TokenPool.daml +++ b/contracts/ccip/extension-api/daml/CCIP/Interfaces/TokenPool.daml @@ -6,15 +6,7 @@ import qualified Splice.Api.Token.HoldingV1 import qualified Splice.Api.Token.MetadataV1 import qualified Splice.Api.Token.TransferInstructionV1 -import qualified CCIP.ExecutingMessageV1 -import qualified CCIP.FeeQuoter -import qualified CCIP.FinalityConfig import Chainlink.InstanceAddress (RawInstanceAddress) -import qualified CCIP.RMNRemote -import qualified CCIP.SendingMessageV1 -import qualified CCIP.Tickets -import qualified CCIP.Events -import qualified CCIP.TokenAdminRegistry -- | Direction of token transfer for CCV requirement lookup. data TransferDirection = Outbound | Inbound @@ -24,11 +16,11 @@ interface ITokenPool where viewtype TokenPoolView tokenPool_getRequiredCCVsImpl : ContractId ITokenPool -> TokenPool_GetRequiredCCVs -> Update [RawInstanceAddress] - tokenPool_verifyInboundMessageImpl : ContractId ITokenPool -> TokenPool_VerifyInboundMessage -> Update (ContractId CCIP.ExecutingMessageV1.ExecutingMessageV1) - tokenPool_verifyOutboundCCVsImpl : ContractId ITokenPool -> TokenPool_VerifyOutboundCCVs -> Update (ContractId CCIP.SendingMessageV1.SendingMessageV1) + tokenPool_verifyInboundMessageImpl : ContractId ITokenPool -> TokenPool_VerifyInboundMessage -> Update (ContractId ()) + tokenPool_verifyOutboundCCVsImpl : ContractId ITokenPool -> TokenPool_VerifyOutboundCCVs -> Update (ContractId ()) tokenPool_releaseFromTicketImpl : ContractId ITokenPool -> TokenPool_ReleaseFromTicket -> Update ReleaseOrMintResult tokenPool_lockOrBurnImpl : ContractId ITokenPool -> TokenPool_LockOrBurn -> Update LockOrBurnResult - tokenPool_calculateFeeImpl : ContractId ITokenPool -> TokenPool_CalculateFee -> Update (ContractId CCIP.SendingMessageV1.SendingMessageV1) + tokenPool_calculateFeeImpl : ContractId ITokenPool -> TokenPool_CalculateFee -> Update (ContractId ()) tokenPool_getFeeImpl : ContractId ITokenPool -> TokenPool_GetFee -> Update TokenPoolFeeQuote -- Get required CCV raw instance addresses for a transfer based on direction, amount, finality, etc. @@ -36,7 +28,7 @@ interface ITokenPool where with remoteChainSelector : Numeric 0 sourceAmount : BytesHex - finality : CCIP.FinalityConfig.FinalityConfig + finality : BytesHex extraData : BytesHex direction : TransferDirection caller : Party @@ -45,23 +37,23 @@ interface ITokenPool where -- Validate inbound token transfer message and record pool CCV requirements on ExecutingMessageV1 via TAR. -- Validates source pool address against allowed remote pools and records inbound CCVs. - nonconsuming choice TokenPool_VerifyInboundMessage : ContractId CCIP.ExecutingMessageV1.ExecutingMessageV1 + nonconsuming choice TokenPool_VerifyInboundMessage : ContractId () with - tokenAdminRegistryCid : ContractId CCIP.TokenAdminRegistry.TokenAdminRegistry - tokenConfigCid : ContractId CCIP.TokenAdminRegistry.TokenConfig + tokenAdminRegistryCid : ContractId () + tokenConfigCid : ContractId () extraContext : Splice.Api.Token.MetadataV1.ChoiceContext - executingMessageCid : ContractId CCIP.ExecutingMessageV1.ExecutingMessageV1 + executingMessageCid : ContractId () caller : Party controller caller do tokenPool_verifyInboundMessageImpl this self arg -- Verify outbound CCVs and record pool-required CCVs on SendingMessageV1 via TAR. - nonconsuming choice TokenPool_VerifyOutboundCCVs : ContractId CCIP.SendingMessageV1.SendingMessageV1 + nonconsuming choice TokenPool_VerifyOutboundCCVs : ContractId () with - tokenAdminRegistryCid : ContractId CCIP.TokenAdminRegistry.TokenAdminRegistry - tokenConfigCid : ContractId CCIP.TokenAdminRegistry.TokenConfig + tokenAdminRegistryCid : ContractId () + tokenConfigCid : ContractId () extraContext : Splice.Api.Token.MetadataV1.ChoiceContext - sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 + sendingMessageCid : ContractId () amount : Decimal caller : Party controller caller @@ -71,11 +63,11 @@ interface ITokenPool where -- The pool should consume the ticket via ConsumeReceiveTicket. nonconsuming choice TokenPool_ReleaseFromTicket : ReleaseOrMintResult with - tokenAdminRegistryCid : ContractId CCIP.TokenAdminRegistry.TokenAdminRegistry - tokenConfigCid : ContractId CCIP.TokenAdminRegistry.TokenConfig - rmnRemoteCid : ContractId CCIP.RMNRemote.RMNRemote + tokenAdminRegistryCid : ContractId () + tokenConfigCid : ContractId () + rmnRemoteCid : ContractId () extraContext : Splice.Api.Token.MetadataV1.ChoiceContext - tokenReceiveTicketCid : ContractId CCIP.Tickets.TokenReceiveTicket + tokenReceiveTicketCid : ContractId () caller : Party controller caller do tokenPool_releaseFromTicketImpl this self arg @@ -85,11 +77,11 @@ interface ITokenPool where -- through TAR after pool-registration validation. nonconsuming choice TokenPool_LockOrBurn : LockOrBurnResult with - tokenAdminRegistryCid : ContractId CCIP.TokenAdminRegistry.TokenAdminRegistry - tokenConfigCid : ContractId CCIP.TokenAdminRegistry.TokenConfig - rmnRemoteCid : ContractId CCIP.RMNRemote.RMNRemote + tokenAdminRegistryCid : ContractId () + tokenConfigCid : ContractId () + rmnRemoteCid : ContractId () extraContext : Splice.Api.Token.MetadataV1.ChoiceContext - sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 + sendingMessageCid : ContractId () senderInputCids : [ContractId Splice.Api.Token.HoldingV1.Holding] amount : Decimal caller : Party @@ -98,14 +90,13 @@ interface ITokenPool where -- Calculate fee for outbound token transfer, which it records on -- SendingMessageV1 through TAR after pool-registration validation. - nonconsuming choice TokenPool_CalculateFee - : ContractId CCIP.SendingMessageV1.SendingMessageV1 + nonconsuming choice TokenPool_CalculateFee : ContractId () with - tokenAdminRegistryCid : ContractId CCIP.TokenAdminRegistry.TokenAdminRegistry - tokenConfigCid : ContractId CCIP.TokenAdminRegistry.TokenConfig + tokenAdminRegistryCid : ContractId () + tokenConfigCid : ContractId () extraContext : Splice.Api.Token.MetadataV1.ChoiceContext - sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 - feeQuoterCid : ContractId CCIP.FeeQuoter.FeeQuoter + sendingMessageCid : ContractId () + feeQuoterCid : ContractId () tokenInstrumentId : Splice.Api.Token.HoldingV1.InstrumentId caller : Party controller caller @@ -114,7 +105,7 @@ interface ITokenPool where -- Quote-only fee path for outbound token transfers. nonconsuming choice TokenPool_GetFee : TokenPoolFeeQuote with - feeQuoterCid : ContractId CCIP.FeeQuoter.FeeQuoter + feeQuoterCid : ContractId () destChainSelector : Numeric 0 tokenInstrumentId : Splice.Api.Token.HoldingV1.InstrumentId caller : Party @@ -133,7 +124,7 @@ data ReleaseOrMintResult = ReleaseOrMintResult with output : ReleaseOrMintResult_Output poolChangeCids : [ContractId Splice.Api.Token.HoldingV1.Holding] - claimedEventCid : ContractId CCIP.Events.TokenReceiveTicketClaimed + claimedEventCid : ContractId () deriving (Eq, Show) data ReleaseOrMintResult_Output @@ -147,7 +138,7 @@ data LockOrBurnResult = LockOrBurnResult with poolChangeCids : [ContractId Splice.Api.Token.HoldingV1.Holding] senderChangeCids : [ContractId Splice.Api.Token.HoldingV1.Holding] - sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 + sendingMessageCid : ContractId () deriving (Eq, Show) data TokenPoolFeeQuote = TokenPoolFeeQuote diff --git a/contracts/ccip/factory/daml.yaml b/contracts/ccip/factory/daml.yaml index 722e994cb..6a6272706 100644 --- a/contracts/ccip/factory/daml.yaml +++ b/contracts/ccip/factory/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/pools/burn-mint-token-pool/daml.yaml b/contracts/ccip/pools/burn-mint-token-pool/daml.yaml index d67696198..2f1b2ab63 100644 --- a/contracts/ccip/pools/burn-mint-token-pool/daml.yaml +++ b/contracts/ccip/pools/burn-mint-token-pool/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/pools/burn-mint-token-pool/daml/CCIP/BurnMintTokenPool.daml b/contracts/ccip/pools/burn-mint-token-pool/daml/CCIP/BurnMintTokenPool.daml index 751ff81f8..58f88aee1 100644 --- a/contracts/ccip/pools/burn-mint-token-pool/daml/CCIP/BurnMintTokenPool.daml +++ b/contracts/ccip/pools/burn-mint-token-pool/daml/CCIP/BurnMintTokenPool.daml @@ -325,71 +325,72 @@ template BurnMintTokenPool instrumentId = instrumentId tokenPool_getRequiredCCVsImpl self arg = do + let finality = fromSomeNote "Invalid finality" (CCIP.FinalityConfig.decodeRequestedFinality arg.finality) exercise (fromInterfaceContractId @BurnMintTokenPool self) GetRequiredCCVs with remoteChainSelector = arg.remoteChainSelector sourceAmount = arg.sourceAmount - finality = arg.finality + finality = finality.requested extraData = arg.extraData direction = arg.direction caller = arg.caller tokenPool_verifyInboundMessageImpl self arg = do - exercise (fromInterfaceContractId @BurnMintTokenPool self) VerifyInboundMessage + coerceContractId <$>exercise (fromInterfaceContractId @BurnMintTokenPool self) VerifyInboundMessage with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid extraContext = arg.extraContext - executingMessageCid = arg.executingMessageCid + executingMessageCid = coerceContractId arg.executingMessageCid caller = arg.caller tokenPool_verifyOutboundCCVsImpl self arg = do - exercise (fromInterfaceContractId @BurnMintTokenPool self) VerifyOutboundCCVs + coerceContractId <$> exercise (fromInterfaceContractId @BurnMintTokenPool self) VerifyOutboundCCVs with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid extraContext = arg.extraContext - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid amount = arg.amount caller = arg.caller tokenPool_releaseFromTicketImpl self arg = do exercise (fromInterfaceContractId @BurnMintTokenPool self) ReleaseFromTicket with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid - rmnRemoteCid = arg.rmnRemoteCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid + rmnRemoteCid = coerceContractId arg.rmnRemoteCid extraContext = arg.extraContext - tokenReceiveTicketCid = arg.tokenReceiveTicketCid + tokenReceiveTicketCid = coerceContractId arg.tokenReceiveTicketCid caller = arg.caller tokenPool_lockOrBurnImpl self arg = do exercise (fromInterfaceContractId @BurnMintTokenPool self) LockOrBurn with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid - rmnRemoteCid = arg.rmnRemoteCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid + rmnRemoteCid = coerceContractId arg.rmnRemoteCid extraContext = arg.extraContext - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid senderInputCids = arg.senderInputCids amount = arg.amount caller = arg.caller tokenPool_calculateFeeImpl self arg = do - exercise (fromInterfaceContractId @BurnMintTokenPool self) CalculateFee + coerceContractId <$> exercise (fromInterfaceContractId @BurnMintTokenPool self) CalculateFee with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid extraContext = arg.extraContext - sendingMessageCid = arg.sendingMessageCid - feeQuoterCid = arg.feeQuoterCid + sendingMessageCid = coerceContractId arg.sendingMessageCid + feeQuoterCid = coerceContractId arg.feeQuoterCid tokenInstrumentId = arg.tokenInstrumentId caller = arg.caller tokenPool_getFeeImpl self arg = do exercise (fromInterfaceContractId @BurnMintTokenPool self) GetFee with - feeQuoterCid = arg.feeQuoterCid + feeQuoterCid = coerceContractId arg.feeQuoterCid destChainSelector = arg.destChainSelector tokenInstrumentId = arg.tokenInstrumentId caller = arg.caller @@ -892,7 +893,7 @@ template BurnMintTokenPool pure CCIP.Interfaces.TokenPool.ReleaseOrMintResult with output poolChangeCids = [] - claimedEventCid + claimedEventCid = coerceContractId claimedEventCid -- Calculate fee for outbound token transfer (USD cents only). -- Reads destChainSelector from SendingMessageV1, looks up per-chain @@ -1130,7 +1131,7 @@ template BurnMintTokenPool pure CCIP.Interfaces.TokenPool.LockOrBurnResult with poolChangeCids = poolChangeCids senderChangeCids = senderChangeCids - sendingMessageCid = newSendingMessageCid + sendingMessageCid = coerceContractId newSendingMessageCid interface instance MCMSReceiver for BurnMintTokenPool where view = MCMSReceiverView with diff --git a/contracts/ccip/pools/lock-release-token-pool/daml.yaml b/contracts/ccip/pools/lock-release-token-pool/daml.yaml index dabf92f13..a86d45818 100644 --- a/contracts/ccip/pools/lock-release-token-pool/daml.yaml +++ b/contracts/ccip/pools/lock-release-token-pool/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/pools/lock-release-token-pool/daml/CCIP/LockReleaseTokenPool.daml b/contracts/ccip/pools/lock-release-token-pool/daml/CCIP/LockReleaseTokenPool.daml index e2f9ce35d..48503aa0f 100644 --- a/contracts/ccip/pools/lock-release-token-pool/daml/CCIP/LockReleaseTokenPool.daml +++ b/contracts/ccip/pools/lock-release-token-pool/daml/CCIP/LockReleaseTokenPool.daml @@ -300,71 +300,72 @@ template LockReleaseTokenPool instrumentId = instrumentId tokenPool_getRequiredCCVsImpl self arg = do + let finality = fromSomeNote "Invalid finality" (CCIP.FinalityConfig.decodeRequestedFinality arg.finality) exercise (fromInterfaceContractId @LockReleaseTokenPool self) GetRequiredCCVs with remoteChainSelector = arg.remoteChainSelector sourceAmount = arg.sourceAmount - finality = arg.finality + finality = finality.requested extraData = arg.extraData direction = arg.direction caller = arg.caller tokenPool_verifyInboundMessageImpl self arg = do - exercise (fromInterfaceContractId @LockReleaseTokenPool self) VerifyInboundMessage + coerceContractId <$> exercise (fromInterfaceContractId @LockReleaseTokenPool self) VerifyInboundMessage with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid extraContext = arg.extraContext - executingMessageCid = arg.executingMessageCid + executingMessageCid = coerceContractId arg.executingMessageCid caller = arg.caller tokenPool_verifyOutboundCCVsImpl self arg = do - exercise (fromInterfaceContractId @LockReleaseTokenPool self) VerifyOutboundCCVs + coerceContractId <$> exercise (fromInterfaceContractId @LockReleaseTokenPool self) VerifyOutboundCCVs with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid extraContext = arg.extraContext - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid amount = arg.amount caller = arg.caller tokenPool_releaseFromTicketImpl self arg = do exercise (fromInterfaceContractId @LockReleaseTokenPool self) ReleaseFromTicket with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid - rmnRemoteCid = arg.rmnRemoteCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid + rmnRemoteCid = coerceContractId arg.rmnRemoteCid extraContext = arg.extraContext - tokenReceiveTicketCid = arg.tokenReceiveTicketCid + tokenReceiveTicketCid = coerceContractId arg.tokenReceiveTicketCid caller = arg.caller tokenPool_lockOrBurnImpl self arg = do exercise (fromInterfaceContractId @LockReleaseTokenPool self) LockOrBurn with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid - rmnRemoteCid = arg.rmnRemoteCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid + rmnRemoteCid = coerceContractId arg.rmnRemoteCid extraContext = arg.extraContext - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid senderInputCids = arg.senderInputCids amount = arg.amount caller = arg.caller tokenPool_calculateFeeImpl self arg = do - exercise (fromInterfaceContractId @LockReleaseTokenPool self) CalculateFee + coerceContractId <$> exercise (fromInterfaceContractId @LockReleaseTokenPool self) CalculateFee with - tokenAdminRegistryCid = arg.tokenAdminRegistryCid - tokenConfigCid = arg.tokenConfigCid + tokenAdminRegistryCid = coerceContractId arg.tokenAdminRegistryCid + tokenConfigCid = coerceContractId arg.tokenConfigCid extraContext = arg.extraContext - sendingMessageCid = arg.sendingMessageCid - feeQuoterCid = arg.feeQuoterCid + sendingMessageCid = coerceContractId arg.sendingMessageCid + feeQuoterCid = coerceContractId arg.feeQuoterCid tokenInstrumentId = arg.tokenInstrumentId caller = arg.caller tokenPool_getFeeImpl self arg = do exercise (fromInterfaceContractId @LockReleaseTokenPool self) GetFee with - feeQuoterCid = arg.feeQuoterCid + feeQuoterCid = coerceContractId arg.feeQuoterCid destChainSelector = arg.destChainSelector tokenInstrumentId = arg.tokenInstrumentId caller = arg.caller @@ -885,7 +886,7 @@ template LockReleaseTokenPool pure CCIP.Interfaces.TokenPool.ReleaseOrMintResult with output poolChangeCids = transferResult.senderChangeCids - claimedEventCid + claimedEventCid = coerceContractId claimedEventCid Splice.Api.Token.TransferInstructionV1.TransferInstructionResult_Pending instrCid -> do assertTransferInstructionMatches "ReleaseFromTicket" @@ -920,7 +921,7 @@ template LockReleaseTokenPool pure CCIP.Interfaces.TokenPool.ReleaseOrMintResult with output poolChangeCids = transferResult.senderChangeCids - claimedEventCid + claimedEventCid = coerceContractId claimedEventCid _ -> abort "ReleaseFromTicket: unexpected failed transfer" -- Calculate fee for outbound token transfer (USD cents only). @@ -1165,7 +1166,7 @@ template LockReleaseTokenPool pure CCIP.Interfaces.TokenPool.LockOrBurnResult with poolChangeCids = receiverCids ++ tokenPoolHoldings senderChangeCids = transferResult.senderChangeCids - sendingMessageCid = newSendingMessageCid + sendingMessageCid = coerceContractId newSendingMessageCid interface instance MCMSReceiver for LockReleaseTokenPool where view = MCMSReceiverView with diff --git a/contracts/ccip/receiver/daml.yaml b/contracts/ccip/receiver/daml.yaml index ebfb988d7..19c413b07 100644 --- a/contracts/ccip/receiver/daml.yaml +++ b/contracts/ccip/receiver/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/receiver/daml/CCIP/CCIPReceiver.daml b/contracts/ccip/receiver/daml/CCIP/CCIPReceiver.daml index 4cd53ccfa..0f9c2c53b 100644 --- a/contracts/ccip/receiver/daml/CCIP/CCIPReceiver.daml +++ b/contracts/ccip/receiver/daml/CCIP/CCIPReceiver.daml @@ -87,7 +87,7 @@ template CCIPReceiver CCIP.Interfaces.TokenPool.TokenPool_GetRequiredCCVs with remoteChainSelector = message.sourceChainSelector sourceAmount = tt.amount - finality = message.finality.requested + finality = message.finality.raw extraData = tokenExtraData direction = CCIP.Interfaces.TokenPool.Inbound caller = owner @@ -135,7 +135,7 @@ template CCIPReceiver tokenAdminRegistryCid <- CCIP.TokenAdminRegistry.lookupTokenAdminRegistryCid context -- PrepareExecute: decode, validate, create ExecutingMessageV1 - emCid <- exercise routerCid CCIP.PerPartyRouter.PrepareExecute with + emCid <- coerceContractId <$> exercise routerCid CCIP.PerPartyRouter.PrepareExecute with context = context encodedMessage = encodedMessage receiverParty = owner @@ -151,21 +151,21 @@ template CCIPReceiver None -> pure emCid Some tt -> do tokenConfigCid <- CCIP.TokenAdminRegistry.lookupTokenConfigCid context - exercise tt.tokenPoolCid + coerceContractId <$> exercise tt.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_VerifyInboundMessage with - tokenAdminRegistryCid = tokenAdminRegistryCid - tokenConfigCid = tokenConfigCid + tokenAdminRegistryCid = coerceContractId tokenAdminRegistryCid + tokenConfigCid = coerceContractId tokenConfigCid extraContext = tt.poolExtraContext - executingMessageCid = emCid + executingMessageCid = coerceContractId emCid caller = owner -- CCV verification: thread executingMessageCid through each CCV emCid <- foldlA (\cid input -> - exercise input.ccvCid + coerceContractId <$> exercise input.ccvCid CCIP.Interfaces.CrossChainVerifier.CrossChainVerifier_VerifyMessage with - rmnRemoteCid = rmnRemoteCid + rmnRemoteCid = coerceContractId rmnRemoteCid extraContext = input.ccvExtraContext - executingMessageCid = cid + executingMessageCid = coerceContractId cid verifierResults = input.verifierResults caller = owner ) emCid ccvInputs @@ -176,13 +176,13 @@ template CCIPReceiver executingMessageCid = emCid -- Token release - tokenReleaseResult <- case (tokenTransfer, result.tokenReceiveTicket) of + tokenReleaseResult <- case (tokenTransfer, coerceContractId <$> result.tokenReceiveTicket) of (Some tt, Some ticketCid) -> do tokenConfigCid <- CCIP.TokenAdminRegistry.lookupTokenConfigCid context releaseResult <- exercise tt.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_ReleaseFromTicket with - tokenAdminRegistryCid = tokenAdminRegistryCid - tokenConfigCid = tokenConfigCid - rmnRemoteCid = rmnRemoteCid + tokenAdminRegistryCid = coerceContractId tokenAdminRegistryCid + tokenConfigCid = coerceContractId tokenConfigCid + rmnRemoteCid = coerceContractId rmnRemoteCid extraContext = tt.poolExtraContext tokenReceiveTicketCid = ticketCid caller = owner diff --git a/contracts/ccip/runtime/daml.yaml b/contracts/ccip/runtime/daml.yaml index 730f058b7..2a231725b 100644 --- a/contracts/ccip/runtime/daml.yaml +++ b/contracts/ccip/runtime/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/runtime/daml/CCIP/OnRamp.daml b/contracts/ccip/runtime/daml/CCIP/OnRamp.daml index 5a4f71d9c..290a9f60d 100644 --- a/contracts/ccip/runtime/daml/CCIP/OnRamp.daml +++ b/contracts/ccip/runtime/daml/CCIP/OnRamp.daml @@ -1,7 +1,7 @@ -- | OnRamp for CCIP message sending, called by PerPartyRouter. module CCIP.OnRamp where -import DA.Crypto.Text (BytesHex, byteCount) +import DA.Crypto.Text (BytesHex, byteCount, keccak256) import DA.Foldable qualified as Foldable import DA.List (dedup, unique) import DA.Map qualified as Map @@ -10,6 +10,8 @@ import DA.Text qualified as Text import Splice.Api.Token.MetadataV1 (ChoiceContext) +import qualified CCIP.API.EventEmitterV1 + import qualified CCIP.Client import qualified CCIP.Events import qualified CCIP.FeeQuoter @@ -245,6 +247,27 @@ calculateFeeResult ccipOwner maxUSDCentsPerMsg feeQuoterCid destChainSelector de premiumMultiplier = quote.premiumMultiplier feeTokenPrice = quote.feeTokenPrice +template CCIPMessageSent + with + ccipOwner : Party + ccvOwners : [Party] + sender : Party + observers : [Party] + event : CCIPMessageSentEvent + where + signatory dedup (ccipOwner :: ccvOwners) + observer sender, observers + +data CCIPMessageSentEvent = CCIPMessageSentEvent + with + destChainSelector : Numeric 0 + sequenceNumber : Numeric 0 + messageId : BytesHex + encodedMessage : BytesHex + verifierBlobs : [BytesHex] + receipts : [CCIP.API.EventEmitterV1.Receipt] + deriving (Eq, Show) + template OnRamp with instanceId : Text @@ -831,19 +854,39 @@ template OnRamp let receipts = assembleReceipts sendingMsg let finalVerifierData = orderedVerifierData sendingMsg finalizeResult <- exercise sendingMessageCid CCIP.SendingMessageV1.FinalizeSend with + eventEmitter = toInterfaceContractId @CCIP.API.EventEmitterV1.EventEmitter self messageSender = routerPartyOwner messageSentObservers = concatMap (.messageSentObservers) finalVerifierData verifierBlobs = map (.verifierBlob) finalVerifierData receipts = receipts pure CCIPSendFromRouterResult with - ccipMessageSent = finalizeResult.ccipMessageSent + ccipMessageSent = coerceContractId finalizeResult.ccipMessageSent verifierBlobs = map (.verifierBlob) finalVerifierData messageSentObservers = concatMap (.messageSentObservers) finalVerifierData receipts + interface instance CCIP.API.EventEmitterV1.EventEmitter for OnRamp where + view = CCIP.API.EventEmitterV1.EventEmitterView with + ccipOwner = ccipOwner + instanceId + + eventEmitter_emitCCIPMessageSentEventImpl self arg = do + coerceContractId <$> create CCIPMessageSent with + ccipOwner = ccipOwner + ccvOwners = arg.ccvOwners + sender = arg.sender + observers = arg.observers + event = CCIPMessageSentEvent with + destChainSelector = arg.destChainSelector + sequenceNumber = arg.sequenceNumber + messageId = keccak256 arg.encodedMessage + encodedMessage = arg.encodedMessage + verifierBlobs = arg.verifierBlobs + receipts = arg.receipts + interface instance MCMSReceiver for OnRamp where view = MCMSReceiverView with mcmsController = ccipOwner @@ -869,10 +912,10 @@ template OnRamp data CCIPSendFromRouterResult = CCIPSendFromRouterResult with - ccipMessageSent : ContractId CCIP.Events.CCIPMessageSent + ccipMessageSent : ContractId CCIPMessageSent verifierBlobs : [BytesHex] messageSentObservers : [Party] - receipts : [CCIP.Tickets.Receipt] + receipts : [CCIP.API.EventEmitterV1.Receipt] deriving (Eq, Show) orderedVerifierDataByCCVs @@ -902,7 +945,7 @@ orderedVerifierData sendingMsg = -- | Assemble final receipts from the separated fee fields, verifier data, -- token send data, executor fee, and the network fee. Receipt order matches -- EVM: CCV receipts, pool receipt, executor receipt, network fee receipt. -assembleReceipts : CCIP.SendingMessageV1.SendingMessageV1 -> [CCIP.Tickets.Receipt] +assembleReceipts : CCIP.SendingMessageV1.SendingMessageV1 -> [CCIP.API.EventEmitterV1.Receipt] assembleReceipts sendingMsg = let finalVerifierData = orderedVerifierData sendingMsg @@ -915,8 +958,8 @@ assembleReceipts sendingMsg = (Some tsd, Some fee) -> let poolAddr = CCIP.MessageCodecV1.encodeInstanceAddress tsd.poolInstanceId tsd.poolOwner - in [CCIP.Tickets.Receipt with - issuerType = CCIP.Tickets.IssuerType_Pool + in [CCIP.API.EventEmitterV1.Receipt with + issuerType = CCIP.API.EventEmitterV1.IssuerType_Pool issuerAddress = poolAddr versionTag = None destGasLimit = fee.destGasOverhead @@ -936,8 +979,8 @@ assembleReceipts sendingMsg = None -> error "missing executor fee" CCIP.SendingMessageV1.ExecutionMode_NoExecutor -> noExecutionAddressBytes - in [CCIP.Tickets.Receipt with - issuerType = CCIP.Tickets.IssuerType_Executor + in [CCIP.API.EventEmitterV1.Receipt with + issuerType = CCIP.API.EventEmitterV1.IssuerType_Executor issuerAddress = execAddr versionTag = None destGasLimit = sendingMsg.executorDestGasLimit @@ -945,8 +988,8 @@ assembleReceipts sendingMsg = feeTokenAmount = CCIP.Math.decimalToNumeric0 sendingMsg.executorFeeTokenAmount extraArgs = sendingMsg.executorArgs] - networkReceipt = CCIP.Tickets.Receipt with - issuerType = CCIP.Tickets.IssuerType_Network + networkReceipt = CCIP.API.EventEmitterV1.Receipt with + issuerType = CCIP.API.EventEmitterV1.IssuerType_Network issuerAddress = "" versionTag = None destGasLimit = 0 @@ -958,14 +1001,14 @@ assembleReceipts sendingMsg = -- | Finds the matching ccvFee by (ccvInstanceId, ccvOwner) and looks up -- the corresponding feeTokenAmount from the parallel ccvFeeTokenAmounts list. -assembleCCVReceipt : [CCIP.SendingMessageV1.CCVFee] -> [Decimal] -> CCIP.SendingMessageV1.VerifierData -> CCIP.Tickets.Receipt +assembleCCVReceipt : [CCIP.SendingMessageV1.CCVFee] -> [Decimal] -> CCIP.SendingMessageV1.VerifierData -> CCIP.API.EventEmitterV1.Receipt assembleCCVReceipt ccvFees ccvFeeTokenAmounts vd = let ccvAddr = CCIP.MessageCodecV1.encodeInstanceAddress vd.ccvInstanceId vd.ccvOwner (fee, feeTokenAmt) = findFeeWithAmount ccvFees ccvFeeTokenAmounts (\q -> q.ccvInstanceId == vd.ccvInstanceId && q.ccvOwner == vd.ccvOwner) - in CCIP.Tickets.Receipt with - issuerType = CCIP.Tickets.IssuerType_CCV + in CCIP.API.EventEmitterV1.Receipt with + issuerType = CCIP.API.EventEmitterV1.IssuerType_CCV issuerAddress = ccvAddr versionTag = Some vd.versionTag destGasLimit = fee.destGasLimit diff --git a/contracts/ccip/runtime/daml/CCIP/PerPartyRouter.daml b/contracts/ccip/runtime/daml/CCIP/PerPartyRouter.daml index 7ace556c0..d65417906 100644 --- a/contracts/ccip/runtime/daml/CCIP/PerPartyRouter.daml +++ b/contracts/ccip/runtime/daml/CCIP/PerPartyRouter.daml @@ -923,7 +923,7 @@ template PerPartyRouter data CCIPSendResult = CCIPSendResult with router : ContractId PerPartyRouter - ccipMessageSent : ContractId CCIP.Events.CCIPMessageSent + ccipMessageSent : ContractId CCIP.OnRamp.CCIPMessageSent messageId : BytesHex feeChangeCids : [ContractId Splice.Api.Token.HoldingV1.Holding] pendingFeeInstructions : [ContractId Splice.Api.Token.TransferInstructionV1.TransferInstruction] diff --git a/contracts/ccip/sender/daml.yaml b/contracts/ccip/sender/daml.yaml index 39523303c..21e6104d9 100644 --- a/contracts/ccip/sender/daml.yaml +++ b/contracts/ccip/sender/daml.yaml @@ -10,6 +10,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/sender/daml/CCIP/CCIPSender.daml b/contracts/ccip/sender/daml/CCIP/CCIPSender.daml index 4213f150a..a9d905aca 100644 --- a/contracts/ccip/sender/daml/CCIP/CCIPSender.daml +++ b/contracts/ccip/sender/daml/CCIP/CCIPSender.daml @@ -22,6 +22,7 @@ import CCIP.Interfaces.CrossChainVerifier qualified as ICCV import qualified CCIP.Interfaces.Executor import qualified CCIP.Interfaces.TokenPool import qualified CCIP.PerPartyRouter +import qualified CCIP.SendingMessageV1 import qualified CCIP.TokenAdminRegistry import qualified CCIP.Uint256 @@ -135,7 +136,7 @@ template CCIPSender CCIP.Interfaces.TokenPool.TokenPool_GetRequiredCCVs with remoteChainSelector = destinationChainSelector sourceAmount = sourceAmount - finality = CCIP.FinalityConfig.WaitForFinality + finality = CCIP.FinalityConfig.waitForFinalityFlag extraData = extraArgs.tokenArgs direction = CCIP.Interfaces.TokenPool.Outbound caller = owner @@ -196,7 +197,7 @@ template CCIPSender abort "sender: tokenTransferInput required for token transfer" (Some tt, Some tokenTransferInput) -> do q <- exercise tokenTransferInput.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_GetFee with - feeQuoterCid = feeQuoterCid + feeQuoterCid = coerceContractId feeQuoterCid destChainSelector = destinationChainSelector tokenInstrumentId = tt.token caller = owner @@ -282,10 +283,11 @@ template CCIPSender None -> abort "sender: unknown destination chain" Some cfg -> pure cfg - smCid <- exercise routerCid CCIP.PerPartyRouter.PrepareSend with - destinationChainSelector = destinationChainSelector - message = message - context + smCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 <- + exercise routerCid CCIP.PerPartyRouter.PrepareSend with + destinationChainSelector = destinationChainSelector + message = message + context smCid <- case message.tokenTransfer of None -> do @@ -296,20 +298,22 @@ template CCIPSender None -> abort "sender: tokenTransferInput required for token transfer" Some tokenTransferInput -> do tokenConfigCid <- CCIP.TokenAdminRegistry.lookupTokenConfigCid context - exercise tokenTransferInput.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_VerifyOutboundCCVs with - tokenAdminRegistryCid = tokenAdminRegistryCid - tokenConfigCid = tokenConfigCid + newCid <- exercise tokenTransferInput.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_VerifyOutboundCCVs with + tokenAdminRegistryCid = coerceContractId tokenAdminRegistryCid + tokenConfigCid = coerceContractId tokenConfigCid extraContext = tokenTransferInput.poolExtraContext - sendingMessageCid = smCid + sendingMessageCid = coerceContractId smCid amount = tt.amount caller = owner + pure (coerceContractId newCid: ContractId CCIP.SendingMessageV1.SendingMessageV1) - smCid <- foldlA (\cid input -> - exercise input.ccvCid + smCid <- foldlA (\cid input -> do + newCid <- exercise input.ccvCid ICCV.CrossChainVerifier_CalculateFee with - sendingMessageCid = cid + sendingMessageCid = coerceContractId cid extraContext = input.ccvExtraContext caller = owner + pure (coerceContractId newCid : ContractId CCIP.SendingMessageV1.SendingMessageV1) ) smCid ccvSendInputs smCid <- case (message.tokenTransfer, tokenTransferInput) of @@ -320,14 +324,15 @@ template CCIPSender abort "sender: tokenTransferInput required for token transfer" (Some tt, Some tokenTransferInput) -> do tokenConfigCid <- CCIP.TokenAdminRegistry.lookupTokenConfigCid context - exercise tokenTransferInput.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_CalculateFee with - tokenAdminRegistryCid = tokenAdminRegistryCid - tokenConfigCid = tokenConfigCid + newCid <- exercise tokenTransferInput.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_CalculateFee with + tokenAdminRegistryCid = coerceContractId tokenAdminRegistryCid + tokenConfigCid = coerceContractId tokenConfigCid extraContext = tokenTransferInput.poolExtraContext - sendingMessageCid = smCid - feeQuoterCid = feeQuoterCid + sendingMessageCid = coerceContractId smCid + feeQuoterCid = coerceContractId feeQuoterCid tokenInstrumentId = tt.token caller = owner + pure (coerceContractId newCid : ContractId CCIP.SendingMessageV1.SendingMessageV1) smCid <- case extraArgs.executor of CCIP.Client.Executor_NoExecutor -> do @@ -343,29 +348,31 @@ template CCIPSender Some expectedExecutor -> case executorInput of None -> abort "sender: executorInput required for default executor mode" - Some executorInput -> - exercise executorInput.executorCid + Some executorInput -> do + newCid <- exercise executorInput.executorCid CCIP.Interfaces.Executor.Executor_CalculateFee with expectedExecutor = expectedExecutor - sendingMessageCid = smCid + sendingMessageCid = coerceContractId smCid executorArgs = executorArgs extraContext = executorInput.executorExtraContext caller = owner + pure (coerceContractId newCid : ContractId CCIP.SendingMessageV1.SendingMessageV1) CCIP.Client.Executor_WithAddress expectedExecutor executorArgs -> case executorInput of None -> abort "sender: executorInput required for explicit executor mode" - Some executorInput -> - exercise executorInput.executorCid + Some executorInput -> do + newCid <- exercise executorInput.executorCid CCIP.Interfaces.Executor.Executor_CalculateFee with expectedExecutor = expectedExecutor - sendingMessageCid = smCid + sendingMessageCid = coerceContractId smCid executorArgs = executorArgs extraContext = executorInput.executorExtraContext caller = owner + pure (coerceContractId newCid : ContractId CCIP.SendingMessageV1.SendingMessageV1) - smCid <- exercise routerCid CCIP.PerPartyRouter.FinalizeFee with + smCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 <- coerceContractId <$> exercise routerCid CCIP.PerPartyRouter.FinalizeFee with context - sendingMessageCid = smCid + sendingMessageCid = coerceContractId smCid smCid <- case (message.tokenTransfer, tokenTransferInput) of (None, None) -> pure smCid @@ -376,30 +383,31 @@ template CCIPSender (Some tt, Some tokenTransferInput) -> do tokenConfigCid <- CCIP.TokenAdminRegistry.lookupTokenConfigCid context lockResult <- exercise tokenTransferInput.tokenPoolCid CCIP.Interfaces.TokenPool.TokenPool_LockOrBurn with - tokenAdminRegistryCid = tokenAdminRegistryCid - tokenConfigCid = tokenConfigCid - rmnRemoteCid = rmnRemoteCid + tokenAdminRegistryCid = coerceContractId tokenAdminRegistryCid + tokenConfigCid = coerceContractId tokenConfigCid + rmnRemoteCid = coerceContractId rmnRemoteCid extraContext = tokenTransferInput.poolExtraContext - sendingMessageCid = smCid + sendingMessageCid = coerceContractId smCid senderInputCids = tokenTransferInput.senderInputCids amount = tt.amount caller = owner - pure lockResult.sendingMessageCid - - smCid <- foldlA (\cid input -> do - verifierArgs <- lookupVerifierArgs extraArgs.ccvs input.ccvAddress - exercise input.ccvCid - ICCV.CrossChainVerifier_ForwardToVerifier with - rmnRemoteCid = rmnRemoteCid - extraContext = input.ccvExtraContext - sendingMessageCid = cid - verifierArgs = verifierArgs - caller = owner - ) smCid ccvSendInputs + pure (coerceContractId lockResult.sendingMessageCid) + + smCid : ContractId CCIP.SendingMessageV1.SendingMessageV1 <- foldlA (\cid input -> do + verifierArgs <- lookupVerifierArgs extraArgs.ccvs input.ccvAddress + newCid <- exercise input.ccvCid + ICCV.CrossChainVerifier_ForwardToVerifier with + rmnRemoteCid = coerceContractId rmnRemoteCid + extraContext = input.ccvExtraContext + sendingMessageCid = coerceContractId cid + verifierArgs = verifierArgs + caller = owner + pure (coerceContractId newCid) + ) (smCid) ccvSendInputs exercise routerCid CCIP.PerPartyRouter.CCIPSend with context - sendingMessageCid = smCid + sendingMessageCid = coerceContractId smCid feeTokenHoldingCids = feeTokenInput.senderInputCids feeTokenConfigCid = feeTokenInput.feeTokenConfigCid feeTokenTransferFactory = feeTokenInput.feeTokenTransferFactory diff --git a/contracts/ccip/test/daml.yaml b/contracts/ccip/test/daml.yaml index 46cc6c25c..58d112ccb 100644 --- a/contracts/ccip/test/daml.yaml +++ b/contracts/ccip/test/daml.yaml @@ -11,6 +11,7 @@ data-dependencies: - ../../dependencies/splice/splice-api-token-holding-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-burn-mint-v1-1.0.0.dar - ../../dependencies/splice/splice-api-token-transfer-instruction-v1-1.0.0.dar + - ../api/.daml/dist/ccip-api-2.0.0.dar dependencies: - daml-prim - daml-stdlib diff --git a/contracts/ccip/test/daml/BurnMintTokenPoolTest.daml b/contracts/ccip/test/daml/BurnMintTokenPoolTest.daml index f95f376cf..fc6c572d3 100644 --- a/contracts/ccip/test/daml/BurnMintTokenPoolTest.daml +++ b/contracts/ccip/test/daml/BurnMintTokenPoolTest.daml @@ -8,6 +8,7 @@ import DA.Optional (fromSome, fromSomeNote, isSome) import DA.TextMap qualified as TextMap import qualified CCIP.Context +import qualified CCIP.Events import CCIP.BurnMintTokenPool qualified as BurnMintTokenPool import CCIP.ExecutingMessageV1 qualified as ExecutingMessageV1 import CCIP.FinalityConfig qualified as FinalityConfig @@ -346,11 +347,11 @@ testBurnMintPoolLockOrBurnBurnsAndMintsOutputs = script do result <- submit (actAs sender <> actAs poolOwner <> disclose disclosedPool <> disclose disclosedTar <> disclose disclosedRmn <> disclose disclosedRateLimiter <> disclose disclosedRegistry) do exerciseCmd tokenPoolCid BurnMintTokenPool.LockOrBurn with - tokenAdminRegistryCid = tokenAdminRegistryCid - tokenConfigCid = tokenConfigCid - rmnRemoteCid = rmnRemoteCid + tokenAdminRegistryCid = coerceContractId tokenAdminRegistryCid + tokenConfigCid = coerceContractId tokenConfigCid + rmnRemoteCid = coerceContractId rmnRemoteCid extraContext = mkPoolContext outboundRateLimiterCid (toInterfaceContractId registryCid) - sendingMessageCid = sendingMessageCid + sendingMessageCid = coerceContractId sendingMessageCid senderInputCids = [senderHoldingCid] amount = 7.0 caller = sender @@ -361,7 +362,7 @@ testBurnMintPoolLockOrBurnBurnsAndMintsOutputs = script do Some senderChangeHolding <- queryContractId sender (fromInterfaceContractId @Link.LinkHolding senderChangeCid) Some poolFeeHolding <- queryContractId poolOwner (fromInterfaceContractId @Link.LinkHolding poolFeeCid) None <- queryContractId sender (fromInterfaceContractId @Link.LinkHolding senderHoldingCid) - Some updatedSendingMessage <- queryContractId ccipOwner result.sendingMessageCid + Some updatedSendingMessage <- queryContractId ccipOwner (coerceContractId result.sendingMessageCid : ContractId SendingMessageV1.SendingMessageV1) senderChangeHolding.holdingAmount === 3.0 poolFeeHolding.holdingAmount === 0.35 @@ -883,7 +884,7 @@ testBurnMintPoolReleaseFromTicketRawUint256AmountAboveNumeric0Downscales = scrip receiverHolding.holdingAmount === 1.0 _ -> abort "expected completed release result" - Some claimedEvent <- queryContractId receiver result.claimedEventCid + Some claimedEvent <- queryContractId receiver (coerceContractId result.claimedEventCid : ContractId CCIP.Events.TokenReceiveTicketClaimed) claimedEvent.event.sourceAmount === sourceAmount claimedEvent.event.localAmount === 10000000000.0 diff --git a/contracts/ccip/test/daml/CommitteeVerifier/DummyCommitteeVerifier.daml b/contracts/ccip/test/daml/CommitteeVerifier/DummyCommitteeVerifier.daml index 48db3cfda..5668f742b 100644 --- a/contracts/ccip/test/daml/CommitteeVerifier/DummyCommitteeVerifier.daml +++ b/contracts/ccip/test/daml/CommitteeVerifier/DummyCommitteeVerifier.daml @@ -36,13 +36,13 @@ template DummyCommitteeVerifier "01" -> error "DummyCommitteeVerifier: Simulated verification failure" _ -> do debug "DummyCommitteeVerifier: Simulated successful verification" - exercise arg.executingMessageCid CCIP.ExecutingMessageV1.AddCCVVerification with + coerceContractId <$> exercise (coerceContractId arg.executingMessageCid : ContractId CCIP.ExecutingMessageV1.ExecutingMessageV1) CCIP.ExecutingMessageV1.AddCCVVerification with ccvInstanceId = instanceId versionTag = versionTag caller = owner crossChainVerifier_calculateFeeImpl _self arg = do - exercise arg.sendingMessageCid CCIP.SendingMessageV1.AddCCVFee with + coerceContractId <$>exercise (coerceContractId arg.sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1) CCIP.SendingMessageV1.AddCCVFee with ccvInstanceId = instanceId feeUSDCents = feeUSDCents destGasLimit = destGasLimit @@ -58,9 +58,9 @@ template DummyCommitteeVerifier payloadSizeBytes = destBytesOverhead crossChainVerifier_forwardToVerifierImpl self arg = do - exercise (fromInterfaceContractId @DummyCommitteeVerifier self) + coerceContractId <$> exercise (fromInterfaceContractId @DummyCommitteeVerifier self) ForwardToVerifier with - sendingMessageCid = arg.sendingMessageCid + sendingMessageCid = coerceContractId arg.sendingMessageCid caller = arg.caller nonconsuming choice ForwardToVerifier diff --git a/contracts/ccip/test/daml/FeeQuoter.daml b/contracts/ccip/test/daml/FeeQuoter.daml index 03d31a8e1..39f5c31b1 100644 --- a/contracts/ccip/test/daml/FeeQuoter.daml +++ b/contracts/ccip/test/daml/FeeQuoter.daml @@ -10,6 +10,8 @@ import DA.Optional (fromSome) import DA.Set qualified as Set import DA.Time (time) +import qualified CCIP.API.EventEmitterV1 + import CCIP.Client qualified as Client import CCIP.FeeQuoter import CCIP.FinalityConfig qualified as FinalityCodec @@ -18,7 +20,6 @@ import CCIP.Interfaces.CrossChainVerifier qualified as ICCV import CCIP.MessageCodecV1 qualified as MessageCodecV1 import CCIP.OnRamp qualified as OnRamp import CCIP.OnRampTypes qualified as OnRampTypes -import CCIP.Tickets qualified as Tickets import Chainlink.InstanceAddress qualified as RawInstanceAddress import CCIP.SendingMessageV1 qualified as SendingMessageV1 @@ -108,29 +109,29 @@ sumQuoteCalldataSize sm = None -> 0) + sm.executorDestBytesOverhead -sumReceiptNonNetworkGas : [Tickets.Receipt] -> Int +sumReceiptNonNetworkGas : [CCIP.API.EventEmitterV1.Receipt] -> Int sumReceiptNonNetworkGas receipts = foldl (\acc r -> case r.issuerType of - Tickets.IssuerType_Network -> acc + CCIP.API.EventEmitterV1.IssuerType_Network -> acc _ -> acc + r.destGasLimit) 0 receipts -sumReceiptNonNetworkBytes : [Tickets.Receipt] -> Int +sumReceiptNonNetworkBytes : [CCIP.API.EventEmitterV1.Receipt] -> Int sumReceiptNonNetworkBytes receipts = foldl (\acc r -> case r.issuerType of - Tickets.IssuerType_Network -> acc + CCIP.API.EventEmitterV1.IssuerType_Network -> acc _ -> acc + r.destBytesOverhead) 0 receipts assertReceiptSumsMatchQuoteInputs : SendingMessageV1.SendingMessageV1 - -> [Tickets.Receipt] + -> [CCIP.API.EventEmitterV1.Receipt] -> Script () assertReceiptSumsMatchQuoteInputs sm receipts = do sumQuoteNonCalldataGas sm === sumReceiptNonNetworkGas receipts @@ -1425,10 +1426,10 @@ testFinalizeFee_ReceiptSumsMatchQuoteInputs_MixedFees = script do assertReceiptSumsMatchQuoteInputs sm receipts map (.issuerType) receipts === - [ Tickets.IssuerType_CCV - , Tickets.IssuerType_Pool - , Tickets.IssuerType_Executor - , Tickets.IssuerType_Network + [ CCIP.API.EventEmitterV1.IssuerType_CCV + , CCIP.API.EventEmitterV1.IssuerType_Pool + , CCIP.API.EventEmitterV1.IssuerType_Executor + , CCIP.API.EventEmitterV1.IssuerType_Network ] debug "testFinalizeFee_ReceiptSumsMatchQuoteInputs_MixedFees: PASSED" @@ -1544,9 +1545,9 @@ testFinalizeFee_ReceiptSumsMatchQuoteInputs_CCVAndExecutor = script do assertReceiptSumsMatchQuoteInputs sm receipts map (.issuerType) receipts === - [ Tickets.IssuerType_CCV - , Tickets.IssuerType_Executor - , Tickets.IssuerType_Network + [ CCIP.API.EventEmitterV1.IssuerType_CCV + , CCIP.API.EventEmitterV1.IssuerType_Executor + , CCIP.API.EventEmitterV1.IssuerType_Network ] debug "testFinalizeFee_ReceiptSumsMatchQuoteInputs_CCVAndExecutor: PASSED" @@ -1674,8 +1675,8 @@ testFinalizeFee_PayloadBytesCountedOnce = script do let receipts = OnRamp.assembleReceipts sm assertReceiptSumsMatchQuoteInputs sm receipts map (.issuerType) receipts === - [ Tickets.IssuerType_Executor - , Tickets.IssuerType_Network + [ CCIP.API.EventEmitterV1.IssuerType_Executor + , CCIP.API.EventEmitterV1.IssuerType_Network ] case receipts of [executorReceipt, networkReceipt] -> do diff --git a/contracts/ccip/test/daml/LockReleaseTokenPoolTest.daml b/contracts/ccip/test/daml/LockReleaseTokenPoolTest.daml index 632b1bb4f..3b9895315 100644 --- a/contracts/ccip/test/daml/LockReleaseTokenPoolTest.daml +++ b/contracts/ccip/test/daml/LockReleaseTokenPoolTest.daml @@ -451,7 +451,7 @@ testLockOrBurn = script do senderC.amount === 5.0 senderC.owner === sender - Some updatedSendingMessage <- queryContractId ccipOwner result.sendingMessageCid + Some updatedSendingMessage <- queryContractId ccipOwner (coerceContractId result.sendingMessageCid : ContractId SendingMessageV1.SendingMessageV1) let tokenSendData = fromSome updatedSendingMessage.tokenSendData tokenSendData.amount === fromSome (MessageCodecV1.encodeUint256 50000000000.0) @@ -648,7 +648,7 @@ testLockOrBurnValidatesExistingPoolHoldingsAndPreservesThem = script do let existingPoolH = fromSome existingPoolHoldingFetched existingPoolH.amount === 3.0 - Some updatedSendingMessage <- queryContractId ccipOwner result.sendingMessageCid + Some updatedSendingMessage <- queryContractId ccipOwner (coerceContractId result.sendingMessageCid : ContractId SendingMessageV1.SendingMessageV1) let tokenSendData = fromSome updatedSendingMessage.tokenSendData tokenSendData.amount === fromSome (MessageCodecV1.encodeUint256 50000000000.0) @@ -825,7 +825,7 @@ testLockOrBurnDeductsFeeBps = script do extraContext = mkPoolContext outboundRateLimiter (toInterfaceContractId transferFactory) [] [(poolOwner, poolPreapproval)] caller = sender - Some sm <- queryContractId ccipOwner result.sendingMessageCid + Some sm <- queryContractId ccipOwner (coerceContractId result.sendingMessageCid : ContractId SendingMessageV1.SendingMessageV1) let tokenSendData = fromSome sm.tokenSendData -- 5% feeBps deducted from bridged amount. tokenSendData.amount === fromSome (MessageCodecV1.encodeUint256 47500000000.0) @@ -974,7 +974,7 @@ testReleaseFromTicket = script do receiverH.owner === receiver _ -> abort "Expected completed result" - claimedEvent <- queryContractId receiver result.claimedEventCid + claimedEvent <- queryContractId receiver (coerceContractId result.claimedEventCid : ContractId Events.TokenReceiveTicketClaimed) assertMsg "Claimed event should exist" (isSome claimedEvent) let claimed = fromSome claimedEvent claimed.tokenReceiveTicketCid === tokenReceiveTicket @@ -1631,7 +1631,7 @@ testReleaseFromTicketDecimalConversion = script do receiverH.amount === 1.2345678901 _ -> abort "Expected completed result" - claimedEvent <- queryContractId receiver result.claimedEventCid + claimedEvent <- queryContractId receiver (coerceContractId result.claimedEventCid : ContractId Events.TokenReceiveTicketClaimed) let claimed = fromSome claimedEvent claimed.event.messageId === "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" case claimed.event.output of @@ -1775,7 +1775,7 @@ testReleaseFromTicketRawUint256AmountAboveNumeric0Downscales = script do receiverH.amount === 1.0 _ -> abort "Expected completed result" - claimedEvent <- queryContractId receiver result.claimedEventCid + claimedEvent <- queryContractId receiver (coerceContractId result.claimedEventCid : ContractId Events.TokenReceiveTicketClaimed) let claimed = fromSome claimedEvent claimed.event.sourceAmount === sourceAmount claimed.event.localAmount === 10000000000.0 @@ -3484,15 +3484,15 @@ testCalculateFeeFallsBackToFeeQuoter = script do sendingMessageCid <- submit (actAs sender <> disclose disclosedPool <> disclose disclosedTar <> disclose disclosedTokenConfig <> disclose disclosedFq) do exerciseCmd (toInterfaceContractId @ITokenPool.ITokenPool tokenPool) ITokenPool.TokenPool_CalculateFee with - tokenAdminRegistryCid = tokenAdminRegistry - tokenConfigCid = tokenConfigCid + tokenAdminRegistryCid = coerceContractId tokenAdminRegistry + tokenConfigCid = coerceContractId tokenConfigCid extraContext = MetadataV1.emptyChoiceContext - sendingMessageCid = sendingMessageCid - feeQuoterCid = feeQuoter + sendingMessageCid = coerceContractId sendingMessageCid + feeQuoterCid = coerceContractId feeQuoter tokenInstrumentId = testInstrumentId caller = sender - Some sm <- queryContractId ccipOwner sendingMessageCid + Some sm <- queryContractId ccipOwner (coerceContractId sendingMessageCid : ContractId SendingMessageV1.SendingMessageV1) let tokenSendFee = fromSome sm.tokenSendFee tokenSendFee.feeUSDCents === usdToCents 3.0 tokenSendFee.destGasOverhead === 70000 @@ -3638,15 +3638,15 @@ testCalculateFeePrefersPoolOverride = script do sendingMessageCid <- submit (actAs sender <> disclose disclosedPool <> disclose disclosedTar <> disclose disclosedTokenConfig <> disclose disclosedFq <> disclose disclosedSm) do exerciseCmd (toInterfaceContractId @ITokenPool.ITokenPool tokenPool) ITokenPool.TokenPool_CalculateFee with - tokenAdminRegistryCid = tokenAdminRegistry - tokenConfigCid = tokenConfigCid + tokenAdminRegistryCid = coerceContractId tokenAdminRegistry + tokenConfigCid = coerceContractId tokenConfigCid extraContext = MetadataV1.emptyChoiceContext - sendingMessageCid = sendingMessageCid - feeQuoterCid = feeQuoter + sendingMessageCid = coerceContractId sendingMessageCid + feeQuoterCid = coerceContractId feeQuoter tokenInstrumentId = testInstrumentId caller = sender - Some sm <- queryContractId ccipOwner sendingMessageCid + Some sm <- queryContractId ccipOwner (coerceContractId sendingMessageCid : ContractId SendingMessageV1.SendingMessageV1) let tokenSendFee = fromSome sm.tokenSendFee tokenSendFee.feeUSDCents === cents 2.0 tokenSendFee.destGasOverhead === 50000 @@ -3791,15 +3791,15 @@ testCalculateFeeFallsBackWhenPoolFeeDisabled = script do sendingMessageCid <- submit (actAs sender <> disclose disclosedPool <> disclose disclosedTar <> disclose disclosedTokenConfig <> disclose disclosedFq <> disclose disclosedSm) do exerciseCmd (toInterfaceContractId @ITokenPool.ITokenPool tokenPool) ITokenPool.TokenPool_CalculateFee with - tokenAdminRegistryCid = tokenAdminRegistry - tokenConfigCid = tokenConfigCid + tokenAdminRegistryCid = coerceContractId tokenAdminRegistry + tokenConfigCid = coerceContractId tokenConfigCid extraContext = MetadataV1.emptyChoiceContext - sendingMessageCid = sendingMessageCid - feeQuoterCid = feeQuoter + sendingMessageCid = coerceContractId sendingMessageCid + feeQuoterCid = coerceContractId feeQuoter tokenInstrumentId = testInstrumentId caller = sender - Some sm <- queryContractId ccipOwner sendingMessageCid + Some sm <- queryContractId ccipOwner (coerceContractId sendingMessageCid : ContractId SendingMessageV1.SendingMessageV1) let tokenSendFee = fromSome sm.tokenSendFee tokenSendFee.feeUSDCents === usdToCents 4.0 tokenSendFee.destGasOverhead === 71000 diff --git a/contracts/ccip/test/daml/OffRampExecute.daml b/contracts/ccip/test/daml/OffRampExecute.daml index baee4e33c..9a3f50170 100644 --- a/contracts/ccip/test/daml/OffRampExecute.daml +++ b/contracts/ccip/test/daml/OffRampExecute.daml @@ -836,7 +836,7 @@ testExecuteWithDefaultCCVs_SentinelUseDefaultCCVs = script do encodedMessage = encodedMessage receiverParty = receiver tokenReceiverParty = None - receiverRequiredCCVs = [ccv1RawAddress, CrossChainVerifier.useDefaultCCVs, ccv3RawAddress] + receiverRequiredCCVs = [ccv1RawAddress, Internal.useDefaultCCVs, ccv3RawAddress] receiverOptionalCCVs = [] receiverOptionalThreshold = 0 receiverFinalityConfig = finalityConfig 2000 diff --git a/contracts/ccip/test/daml/PerPartyRouter.daml b/contracts/ccip/test/daml/PerPartyRouter.daml index 713ce161c..4e676f4a3 100644 --- a/contracts/ccip/test/daml/PerPartyRouter.daml +++ b/contracts/ccip/test/daml/PerPartyRouter.daml @@ -387,7 +387,7 @@ testCCIPSendAllFeePayouts = script do -- ccvOwner is not yet a stakeholder; use disclosure from ccipOwner (signatory). disclosedSm <- fromSome <$> queryDisclosure ccipOwner sendingMessageCid sendingMessageCid <- submit (actAs ccvOwner <> disclose disclosedSm) do - exerciseCmd sendingMessageCid CCIP.SendingMessageV1.AddCCVFee with + coerceContractId <$> exerciseCmd sendingMessageCid CCIP.SendingMessageV1.AddCCVFee with ccvInstanceId = ccvInstanceId feeUSDCents = cents 100.0 destGasLimit = 0 @@ -395,11 +395,11 @@ testCCIPSendAllFeePayouts = script do caller = ccvOwner -- AddCCVFee made ccvOwner a signatory; refresh disclosure for the updated SM. - disclosedSm <- fromSome <$> queryDisclosure ccipOwner sendingMessageCid + disclosedSm <- fromSome <$> queryDisclosure ccipOwner (coerceContractId sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1) -- caller must be a stakeholder of SendingMessageV1 (ccipOwner is signatory). -- executorOwner stays in actAs so the nested AddExecutorFee (controller = executorOwner) succeeds. sendingMessageCid <- submit (actAs ccipOwner <> actAs executorOwner <> disclose disclosedSm) do - exerciseCmd (toInterfaceContractId @CCIP.Interfaces.Executor.IExecutor executor) + coerceContractId <$> exerciseCmd (toInterfaceContractId @CCIP.Interfaces.Executor.IExecutor executor) CCIP.Interfaces.Executor.Executor_CalculateFee with expectedExecutor = executorInstanceAddress sendingMessageCid = sendingMessageCid @@ -686,7 +686,7 @@ testCCIPSend = script do -- PrepareSend: create SendingMessageV1 (message deferred to executor) sendingMessageCid <- submit (actAs user <> actAs ccipOwner <> disclose disclosedOnRamp <> disclose disclosedGlobalConfig <> disclose disclosedTokenAdminRegistry <> disclose disclosedFeeQuoter <> disclose disclosedRmnRemote) do - exerciseCmd router CCIP.PerPartyRouter.PrepareSend with + coerceContractId <$> exerciseCmd router CCIP.PerPartyRouter.PrepareSend with context = Splice.Api.Token.MetadataV1.ChoiceContext with values = TextMap.fromList [(CCIP.Context.rmnRemoteKey, Splice.Api.Token.MetadataV1.AV_ContractId $ coerceContractId rmnRemote), (CCIP.TokenAdminRegistry.tokenAdminRegistryKey, Splice.Api.Token.MetadataV1.AV_ContractId $ coerceContractId tokenAdminRegistry), @@ -705,9 +705,9 @@ testCCIPSend = script do "" -- Executor fee calculation (must happen before FinalizeFee) - disclosedSm <- fromSome <$> queryDisclosure ccipOwner sendingMessageCid + disclosedSm <- fromSome <$> queryDisclosure ccipOwner (coerceContractId sendingMessageCid : ContractId CCIP.SendingMessageV1.SendingMessageV1) sendingMessageCid <- submit (actAs ccipOwner <> disclose disclosedSm) do - exerciseCmd (toInterfaceContractId @CCIP.Interfaces.Executor.IExecutor executor) + coerceContractId <$> exerciseCmd (toInterfaceContractId @CCIP.Interfaces.Executor.IExecutor executor) CCIP.Interfaces.Executor.Executor_CalculateFee with expectedExecutor = executorInstanceAddress sendingMessageCid = sendingMessageCid @@ -756,7 +756,7 @@ testCCIPSend = script do -- Send another message, sequence number should be 2 sendingMessageCid2 <- submit (actAs user <> actAs ccipOwner <> disclose disclosedOnRamp <> disclose disclosedGlobalConfig <> disclose disclosedTokenAdminRegistry <> disclose disclosedFeeQuoter <> disclose disclosedRmnRemote) do - exerciseCmd newRouter CCIP.PerPartyRouter.PrepareSend with + coerceContractId <$> exerciseCmd newRouter CCIP.PerPartyRouter.PrepareSend with context = Splice.Api.Token.MetadataV1.ChoiceContext with values = TextMap.fromList [(CCIP.Context.rmnRemoteKey, Splice.Api.Token.MetadataV1.AV_ContractId $ coerceContractId rmnRemote), (CCIP.TokenAdminRegistry.tokenAdminRegistryKey, Splice.Api.Token.MetadataV1.AV_ContractId $ coerceContractId tokenAdminRegistry), @@ -775,9 +775,9 @@ testCCIPSend = script do "" -- Executor fee for second message (must happen before FinalizeFee) - disclosedSm2 <- fromSome <$> queryDisclosure ccipOwner sendingMessageCid2 + disclosedSm2 <- fromSome <$> queryDisclosure ccipOwner (coerceContractId sendingMessageCid2 : ContractId CCIP.SendingMessageV1.SendingMessageV1) sendingMessageCid2 <- submit (actAs ccipOwner <> disclose disclosedSm2) do - exerciseCmd (toInterfaceContractId @CCIP.Interfaces.Executor.IExecutor executor) + coerceContractId <$> exerciseCmd (toInterfaceContractId @CCIP.Interfaces.Executor.IExecutor executor) CCIP.Interfaces.Executor.Executor_CalculateFee with expectedExecutor = executorInstanceAddress sendingMessageCid = sendingMessageCid2 diff --git a/contracts/contracts.go b/contracts/contracts.go index 350169e66..989fdac5d 100644 --- a/contracts/contracts.go +++ b/contracts/contracts.go @@ -27,6 +27,7 @@ const ( MCMSTest = Package("mcms-test") GlobalConfig = Package("globalconfig") + CCIPAPI = Package("ccip-api") CCIPCore = Package("ccip-core") CCIPExtensionAPI = Package("ccip-extension-api") CCIPRuntime = Package("ccip-runtime") @@ -73,6 +74,7 @@ var Versions map[Package][]string = map[Package][]string{ MCMSTest: []string{CurrentVersion}, GlobalConfig: []string{"1.0.0", "2.0.0", CurrentVersion}, + CCIPAPI: []string{CurrentVersion}, CCIPCore: []string{"2.0.0", CurrentVersion}, CCIPExtensionAPI: []string{"2.0.0", CurrentVersion}, CCIPRuntime: []string{"2.0.0", CurrentVersion}, @@ -136,6 +138,7 @@ var OutputDirs = map[Package][]string{ MCMSCore: []string{"mcms", "core"}, MCMSTest: []string{"mcms", "mcmstest"}, + CCIPAPI: []string{"ccip", "ccipapi"}, CCIPCore: []string{"ccip", "core"}, CCIPExtensionAPI: []string{"ccip", "extensionapi"}, CCIPRuntime: []string{"ccip", "ccipruntime"}, diff --git a/contracts/dars/current/ccip-api-current.dar b/contracts/dars/current/ccip-api-current.dar new file mode 100644 index 000000000..b643e2c4b Binary files /dev/null and b/contracts/dars/current/ccip-api-current.dar differ diff --git a/contracts/dars/current/ccip-burn-mint-token-pool-current.dar b/contracts/dars/current/ccip-burn-mint-token-pool-current.dar index e5b672d4a..748b6115e 100644 Binary files a/contracts/dars/current/ccip-burn-mint-token-pool-current.dar and b/contracts/dars/current/ccip-burn-mint-token-pool-current.dar differ diff --git a/contracts/dars/current/ccip-committee-verifier-current.dar b/contracts/dars/current/ccip-committee-verifier-current.dar index 3c71b364f..fb084f0f2 100644 Binary files a/contracts/dars/current/ccip-committee-verifier-current.dar and b/contracts/dars/current/ccip-committee-verifier-current.dar differ diff --git a/contracts/dars/current/ccip-core-current.dar b/contracts/dars/current/ccip-core-current.dar index 31f1bd458..2bf209730 100644 Binary files a/contracts/dars/current/ccip-core-current.dar and b/contracts/dars/current/ccip-core-current.dar differ diff --git a/contracts/dars/current/ccip-executor-current.dar b/contracts/dars/current/ccip-executor-current.dar index 8b18f776c..43aa39e45 100644 Binary files a/contracts/dars/current/ccip-executor-current.dar and b/contracts/dars/current/ccip-executor-current.dar differ diff --git a/contracts/dars/current/ccip-extension-api-current.dar b/contracts/dars/current/ccip-extension-api-current.dar index fb6c55d03..6b30cca8b 100644 Binary files a/contracts/dars/current/ccip-extension-api-current.dar and b/contracts/dars/current/ccip-extension-api-current.dar differ diff --git a/contracts/dars/current/ccip-factory-current.dar b/contracts/dars/current/ccip-factory-current.dar index b7108985f..e32e98e56 100644 Binary files a/contracts/dars/current/ccip-factory-current.dar and b/contracts/dars/current/ccip-factory-current.dar differ diff --git a/contracts/dars/current/ccip-lock-release-token-pool-current.dar b/contracts/dars/current/ccip-lock-release-token-pool-current.dar index 0086c1dee..36a94f9de 100644 Binary files a/contracts/dars/current/ccip-lock-release-token-pool-current.dar and b/contracts/dars/current/ccip-lock-release-token-pool-current.dar differ diff --git a/contracts/dars/current/ccip-receiver-current.dar b/contracts/dars/current/ccip-receiver-current.dar index 806e7ddea..96d860186 100644 Binary files a/contracts/dars/current/ccip-receiver-current.dar and b/contracts/dars/current/ccip-receiver-current.dar differ diff --git a/contracts/dars/current/ccip-runtime-current.dar b/contracts/dars/current/ccip-runtime-current.dar index c77204a09..3f3f89ab3 100644 Binary files a/contracts/dars/current/ccip-runtime-current.dar and b/contracts/dars/current/ccip-runtime-current.dar differ diff --git a/contracts/dars/current/ccip-sender-current.dar b/contracts/dars/current/ccip-sender-current.dar index 8ad004359..3f62a7da8 100644 Binary files a/contracts/dars/current/ccip-sender-current.dar and b/contracts/dars/current/ccip-sender-current.dar differ diff --git a/contracts/dars/current/ccip-test-current.dar b/contracts/dars/current/ccip-test-current.dar index 3c46ac418..60c1f729a 100644 Binary files a/contracts/dars/current/ccip-test-current.dar and b/contracts/dars/current/ccip-test-current.dar differ diff --git a/contracts/multi-package.yaml b/contracts/multi-package.yaml index 9390d3006..284882baf 100644 --- a/contracts/multi-package.yaml +++ b/contracts/multi-package.yaml @@ -11,6 +11,7 @@ packages: - mcms/test/globalconfig-v1 - mcms/test/globalconfig-v1-upgraded + - ccip/api - ccip/core - ccip/extension-api - ccip/runtime