Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ var RegisterCapabilities = operations.NewOperation[RegisterCapabilitiesInput, Re
semver.MustParse("1.0.0"),
"Register Capabilities in Capabilities Registry",
func(b operations.Bundle, deps RegisterCapabilitiesDeps, input RegisterCapabilitiesInput) (RegisterCapabilitiesOutput, error) {
if len(input.Capabilities) == 0 {
b.Logger.Info("no capabilities provided, skipping operation")
return RegisterCapabilitiesOutput{
Capabilities: []*capabilities_registry_v2.CapabilitiesRegistryCapabilityConfigured{},
}, nil
}

chain, ok := deps.Env.BlockChains.EVMChains()[input.ChainSelector]
if !ok {
return RegisterCapabilitiesOutput{}, fmt.Errorf("chain not found for selector %d", input.ChainSelector)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ func (c CapabilityConfig) MarshalProto() ([]byte, error) {
return nil, fmt.Errorf("failed to json marshal config: %w", err)
}

fmt.Println("JSON Encoded Config:", string(jsonEncodedCfg))

pbCfg := &pb.CapabilityConfig{}
ops := protojson.UnmarshalOptions{DiscardUnknown: true}
if err = ops.Unmarshal(jsonEncodedCfg, pbCfg); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ var AddCapabilities = operations.NewSequence[AddCapabilitiesInput, AddCapabiliti
return AddCapabilitiesOutput{}, fmt.Errorf("failed to create CapabilitiesRegistry: %w", err)
}

don, nodes, err := getDonNodes(input.DonName, capReg)
don, nodes, err := GetDonNodes(input.DonName, capReg)
if err != nil {
return AddCapabilitiesOutput{}, fmt.Errorf("failed to get DON %s nodes: %w", input.DonName, err)
}
Expand Down Expand Up @@ -180,7 +180,7 @@ var AddCapabilities = operations.NewSequence[AddCapabilitiesInput, AddCapabiliti
},
)

func getDonNodes(donName string, capReg *capabilities_registry_v2.CapabilitiesRegistry) (
func GetDonNodes(donName string, capReg *capabilities_registry_v2.CapabilitiesRegistry) (
*capabilities_registry_v2.CapabilitiesRegistryDONInfo,
[]capabilities_registry_v2.INodeInfoProviderNodeInfo,
error,
Expand Down
115 changes: 115 additions & 0 deletions deployment/cre/capabilities_registry/v2/changeset/update_don.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package changeset

import (
"errors"
"fmt"

"github.com/ethereum/go-ethereum/common"

cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
"github.com/smartcontractkit/chainlink-deployments-framework/operations"
capabilities_registry_v2 "github.com/smartcontractkit/chainlink-evm/gethwrappers/workflow/generated/capabilities_registry_wrapper_v2"

commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset/state"
"github.com/smartcontractkit/chainlink/deployment/cre/capabilities_registry/v2/changeset/operations/contracts"
"github.com/smartcontractkit/chainlink/deployment/cre/capabilities_registry/v2/changeset/pkg"
"github.com/smartcontractkit/chainlink/deployment/cre/capabilities_registry/v2/changeset/sequences"
"github.com/smartcontractkit/chainlink/deployment/cre/common/strategies"
"github.com/smartcontractkit/chainlink/deployment/cre/ocr3"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)

var _ cldf.ChangeSetV2[UpdateDONInput] = UpdateDON{}

type UpdateDONInput struct {
RegistryQualifier string `json:"registryQualifier" yaml:"registryQualifier"`
RegistryChainSel uint64 `json:"registryChainSel" yaml:"registryChainSel"`

// DONName to update, this is required
DONName string `json:"donName" yaml:"donName"`
CapabilityConfigs []contracts.CapabilityConfig `json:"capabilityConfigs" yaml:"capabilityConfigs"` // if Config subfield is nil, a default config is used

// Force indicates whether to force the update even if we cannot validate that all forwarder contracts are ready to accept the new configure version.
// This is very dangerous, and could break the whole platform if the forwarders are not ready. Be very careful with this option.
Force bool `json:"force" yaml:"force"`

MCMSConfig *ocr3.MCMSConfig `json:"mcmsConfig" yaml:"mcmsConfig"`
}

type UpdateDON struct{}

func (u UpdateDON) VerifyPreconditions(_ cldf.Environment, config UpdateDONInput) error {
if config.DONName == "" {
return errors.New("must provide a non-empty DONName")
}

return nil
}

func (u UpdateDON) Apply(e cldf.Environment, config UpdateDONInput) (cldf.ChangesetOutput, error) {
var mcmsContracts *commonchangeset.MCMSWithTimelockState
if config.MCMSConfig != nil {
var err error
mcmsContracts, err = strategies.GetMCMSContracts(e, config.RegistryChainSel, emptyQualifier)
if err != nil {
return cldf.ChangesetOutput{}, fmt.Errorf("failed to get MCMS contracts: %w", err)
}
}

registryRef := pkg.GetCapRegV2AddressRefKey(config.RegistryChainSel, config.RegistryQualifier)

chain, ok := e.BlockChains.EVMChains()[config.RegistryChainSel]
if !ok {
return cldf.ChangesetOutput{}, fmt.Errorf("chain not found for selector %d", config.RegistryChainSel)
}

registryAddressRef, err := e.DataStore.Addresses().Get(registryRef)
if err != nil {
return cldf.ChangesetOutput{}, fmt.Errorf("failed to get registry address: %w", err)
}

capReg, err := capabilities_registry_v2.NewCapabilitiesRegistry(
common.HexToAddress(registryAddressRef.Address), chain.Client,
)
if err != nil {
return cldf.ChangesetOutput{}, fmt.Errorf("failed to create CapabilitiesRegistry: %w", err)
}

don, nodes, err := sequences.GetDonNodes(config.DONName, capReg)
if err != nil {
return cldf.ChangesetOutput{}, fmt.Errorf("failed to get DON %s nodes: %w", config.DONName, err)
}

p2pIDs := make([]p2pkey.PeerID, 0)
for _, node := range nodes {
p2pIDs = append(p2pIDs, node.P2pId)
}

updateDonReport, err := operations.ExecuteOperation(
e.OperationsBundle,
contracts.UpdateDON,
contracts.UpdateDONDeps{
Env: &e,
CapabilitiesRegistry: capReg,
MCMSContracts: mcmsContracts,
},
contracts.UpdateDONInput{
ChainSelector: config.RegistryChainSel,
P2PIDs: p2pIDs,
CapabilityConfigs: config.CapabilityConfigs,
DonName: config.DONName,
F: don.F,
IsPrivate: !don.IsPublic,
Force: config.Force,
MCMSConfig: config.MCMSConfig,
},
)
if err != nil {
return cldf.ChangesetOutput{}, fmt.Errorf("failed to update DON %s: %w", config.DONName, err)
}

return cldf.ChangesetOutput{
Reports: []operations.Report[any, any]{updateDonReport.ToGenericReport()},
MCMSTimelockProposals: updateDonReport.Output.Proposals,
}, nil
}
Loading