Skip to content

Commit

Permalink
chore: migrate "RemoveDONs" changesets to new mcms library
Browse files Browse the repository at this point in the history
  • Loading branch information
gustavogama-cll committed Feb 11, 2025
1 parent 1572051 commit 00d5c39
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 4 deletions.
69 changes: 68 additions & 1 deletion deployment/ccip/changeset/cs_home_chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
mcmslib "github.com/smartcontractkit/mcms"
mcmssdk "github.com/smartcontractkit/mcms/sdk"
mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm"
mcmstypes "github.com/smartcontractkit/mcms/types"
"golang.org/x/exp/maps"

"github.com/smartcontractkit/chainlink-common/pkg/logger"
Expand All @@ -23,7 +27,7 @@ import (
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)

Expand Down Expand Up @@ -470,6 +474,7 @@ func (c RemoveDONsConfig) Validate(homeChain CCIPChainState) error {
// RemoveDONs removes DONs from the CapabilitiesRegistry contract.
// TODO: Could likely be moved to common, but needs
// a common state struct first.
// Deprecated: use RemoveDONsV2 instead
func RemoveDONs(e deployment.Environment, cfg RemoveDONsConfig) (deployment.ChangesetOutput, error) {
state, err := LoadOnchainState(e)
if err != nil {
Expand Down Expand Up @@ -530,3 +535,65 @@ func RemoveDONs(e deployment.Environment, cfg RemoveDONsConfig) (deployment.Chan
*p,
}}, nil
}

// RemoveDONs removes DONs from the CapabilitiesRegistry contract.
// TODO: Could likely be moved to common, but needs
// a common state struct first.
func RemoveDONsV2(e deployment.Environment, cfg RemoveDONsConfig) (deployment.ChangesetOutput, error) {
state, err := LoadOnchainState(e)
if err != nil {
return deployment.ChangesetOutput{}, err
}
homeChain, ok := e.Chains[cfg.HomeChainSel]
if !ok {
return deployment.ChangesetOutput{}, fmt.Errorf("home chain %d not found", cfg.HomeChainSel)
}
homeChainState := state.Chains[cfg.HomeChainSel]
if err := cfg.Validate(homeChainState); err != nil {
return deployment.ChangesetOutput{}, err
}
txOpts := homeChain.DeployerKey
if cfg.MCMS != nil {
txOpts = deployment.SimTransactOpts()
}

tx, err := homeChainState.CapabilityRegistry.RemoveDONs(txOpts, cfg.DonIDs)
if err != nil {
return deployment.ChangesetOutput{}, err
}
if cfg.MCMS == nil {
_, err = homeChain.Confirm(tx)
if err != nil {
return deployment.ChangesetOutput{}, err
}
e.Logger.Infof("Removed dons using deployer key tx %s", tx.Hash().String())
return deployment.ChangesetOutput{}, nil
}

batchOperation, err := proposalutils.BatchOperationForChain(cfg.HomeChainSel,
homeChainState.CapabilityRegistry.Address().Hex(), tx.Data(), big.NewInt(0),
string(CapabilitiesRegistry), []string{})
if err != nil {
return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for home chain: %w", err)
}

timelocks := map[uint64]string{cfg.HomeChainSel: homeChainState.Timelock.Address().Hex()}
proposerMcms := map[uint64]string{cfg.HomeChainSel: homeChainState.ProposerMcm.Address().Hex()}
inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSel: mcmsevmsdk.NewInspector(homeChain.Client)}

proposal, err := proposalutils.BuildProposalFromBatchesV2(
e.GetContext(),
timelocks,
proposerMcms,
inspectors,
[]mcmstypes.BatchOperation{batchOperation},
"Remove DONs",
cfg.MCMS.MinDelay,
)
if err != nil {
return deployment.ChangesetOutput{}, err
}

e.Logger.Infof("Created proposal to remove dons")
return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil
}
56 changes: 56 additions & 0 deletions deployment/ccip/changeset/cs_home_chain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,59 @@ func TestRemoveDons(t *testing.T) {
require.NoError(t, err)
require.Len(t, donsAfter, len(donsBefore)-1)
}

func TestRemoveDonsV2(t *testing.T) {
e, _ := testhelpers.NewMemoryEnvironment(t)
s, err := changeset.LoadOnchainState(e.Env)
require.NoError(t, err)
homeChain := s.Chains[e.HomeChainSel]

// Remove a don w/o MCMS
donsBefore, err := homeChain.CapabilityRegistry.GetDONs(nil)
require.NoError(t, err)
e.Env, err = commoncs.ApplyChangesets(t, e.Env, nil, []commoncs.ChangesetApplication{
{
Changeset: commoncs.WrapChangeSet(changeset.RemoveDONsV2),
Config: changeset.RemoveDONsConfig{
HomeChainSel: e.HomeChainSel,
DonIDs: []uint32{donsBefore[0].Id},
},
},
})
require.NoError(t, err)
donsAfter, err := homeChain.CapabilityRegistry.GetDONs(nil)
require.NoError(t, err)
require.Len(t, donsAfter, len(donsBefore)-1)

// Remove a don w/ MCMS
donsBefore, err = homeChain.CapabilityRegistry.GetDONs(nil)
require.NoError(t, err)
e.Env, err = commoncs.ApplyChangesets(t, e.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
e.HomeChainSel: {
Timelock: s.Chains[e.HomeChainSel].Timelock,
CallProxy: s.Chains[e.HomeChainSel].CallProxy,
},
}, []commoncs.ChangesetApplication{
{
Changeset: commoncs.WrapChangeSet(commoncs.TransferToMCMSWithTimelock),
Config: commoncs.TransferToMCMSWithTimelockConfig{
ContractsByChain: map[uint64][]common.Address{
e.HomeChainSel: {homeChain.CapabilityRegistry.Address()},
},
MinDelay: 0,
},
},
{
Changeset: commoncs.WrapChangeSet(changeset.RemoveDONsV2),
Config: changeset.RemoveDONsConfig{
HomeChainSel: e.HomeChainSel,
DonIDs: []uint32{donsBefore[0].Id},
MCMS: &changeset.MCMSConfig{MinDelay: 0},
},
},
})
require.NoError(t, err)
donsAfter, err = homeChain.CapabilityRegistry.GetDONs(nil)
require.NoError(t, err)
require.Len(t, donsAfter, len(donsBefore)-1)
}
9 changes: 6 additions & 3 deletions deployment/ccip/changeset/cs_jobspec.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/pelletier/go-toml/v2"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes"
mcmslib "github.com/smartcontractkit/mcms"

jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job"

Expand Down Expand Up @@ -130,9 +131,11 @@ func CCIPCapabilityJobspecChangeset(env deployment.Environment, _ any) (deployme
}
}
return deployment.ChangesetOutput{
Proposals: []timelock.MCMSWithTimelockProposal{},
AddressBook: nil,
Jobs: Jobs,
MCMSProposals: []mcmslib.Proposal{},
MCMSTimelockProposals: []mcmslib.TimelockProposal{},
Proposals: []timelock.MCMSWithTimelockProposal{},
AddressBook: nil,
Jobs: Jobs,
}, nil
}

Expand Down

0 comments on commit 00d5c39

Please sign in to comment.