Skip to content

Fix Keystone View test flake #17671

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 12, 2025
Merged
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
74 changes: 57 additions & 17 deletions deployment/keystone/changeset/view_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (

chain_selectors "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
"github.com/smartcontractkit/chainlink-deployments-framework/deployment"
capabilities_registry "github.com/smartcontractkit/chainlink-evm/gethwrappers/keystone/generated/capabilities_registry_1_1_0"

"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
Expand Down Expand Up @@ -53,16 +55,16 @@ func TestKeystoneView(t *testing.T) {
WriterDonConfig: test.DonConfig{N: 4, Name: "writerDon"},
NumChains: 1,
})
registryChain := env.Env.AllChainSelectors()[0]
originalAddressBook := env.Env.ExistingAddresses
oracleConfig.TransmissionSchedule = []int{len(env.Env.NodeIDs)}

addrs := env.Env.DataStore.Addresses().Filter(
datastore.AddressRefByChainSelector(registryChain),
datastore.AddressRefByChainSelector(env.RegistrySelector),
)

var newOCR3Addr, newForwarderAddr, newWorkflowRegistryAddr, newCapabilityRegistryAddr string
for _, addr := range addrs {
if newForwarderAddr != "" && newOCR3Addr != "" {
if newForwarderAddr != "" && newOCR3Addr != "" && newWorkflowRegistryAddr != "" && newCapabilityRegistryAddr != "" {
break
}
switch addr.Type {
Expand Down Expand Up @@ -108,7 +110,7 @@ func TestKeystoneView(t *testing.T) {
var outView changeset.KeystoneView
require.NoError(t, json.Unmarshal(b, &outView))

chainID, err := chain_selectors.ChainIdFromSelector(registryChain)
chainID, err := chain_selectors.ChainIdFromSelector(env.RegistrySelector)
require.NoError(t, err)
chainName, err := chain_selectors.NameFromChainId(chainID)
require.NoError(t, err)
Expand All @@ -131,48 +133,54 @@ func TestKeystoneView(t *testing.T) {
t.Run("successfully generates a view of the keystone state with multiple contracts of the same type per chain",
func(t *testing.T) {
oracleConfigCopy := oracleConfig
var localAddrsBook deployment.AddressBook

// Deploy a new forwarder contract
resp, err := changeset.DeployForwarderV2(env.Env, &changeset.DeployRequestV2{ChainSel: registryChain})
resp, err := changeset.DeployForwarderV2(env.Env, &changeset.DeployRequestV2{ChainSel: env.RegistrySelector})
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, resp.DataStore.Merge(env.Env.DataStore))
//nolint:staticcheck // Temporarily using deprecated AddressBook until migration is complete
require.NoError(t, env.Env.ExistingAddresses.Merge(resp.AddressBook))
localAddrsBook = resp.AddressBook
env.Env.DataStore = resp.DataStore.Seal()

// Deploy a new workflow registry contract
resp, err = workflowregistry.DeployV2(env.Env, &changeset.DeployRequestV2{ChainSel: registryChain})
resp, err = workflowregistry.DeployV2(env.Env, &changeset.DeployRequestV2{ChainSel: env.RegistrySelector})
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, resp.DataStore.Merge(env.Env.DataStore))
//nolint:staticcheck // Temporarily using deprecated AddressBook until migration is complete
require.NoError(t, env.Env.ExistingAddresses.Merge(resp.AddressBook))
require.NoError(t, localAddrsBook.Merge(resp.AddressBook))
env.Env.DataStore = resp.DataStore.Seal()

// Deploy a new OCR3 contract
resp, err = changeset.DeployOCR3V2(env.Env, &changeset.DeployRequestV2{ChainSel: registryChain})
resp, err = changeset.DeployOCR3V2(env.Env, &changeset.DeployRequestV2{ChainSel: env.RegistrySelector})
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, resp.DataStore.Merge(env.Env.DataStore))
//nolint:staticcheck // Temporarily using deprecated AddressBook until migration is complete
require.NoError(t, env.Env.ExistingAddresses.Merge(resp.AddressBook))
require.NoError(t, localAddrsBook.Merge(resp.AddressBook))
env.Env.DataStore = resp.DataStore.Seal()

// Deploy a new capability registry contract
resp, err = changeset.DeployCapabilityRegistryV2(env.Env, &changeset.DeployRequestV2{ChainSel: registryChain})
resp, err = changeset.DeployCapabilityRegistryV2(env.Env, &changeset.DeployRequestV2{ChainSel: env.RegistrySelector})
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, resp.DataStore.Merge(env.Env.DataStore))
//nolint:staticcheck // Temporarily using deprecated AddressBook until migration is complete
require.NoError(t, env.Env.ExistingAddresses.Merge(resp.AddressBook))
require.NoError(t, localAddrsBook.Merge(resp.AddressBook))

env.Env.DataStore = resp.DataStore.Seal()
env.Env.ExistingAddresses = localAddrsBook

var ocr3Addr, forwarderAddr, workflowRegistryAddr, capabilityRegistryAddr string
existingAddrs := env.Env.DataStore.Addresses().Filter(
datastore.AddressRefByChainSelector(registryChain),
datastore.AddressRefByChainSelector(env.RegistrySelector),
)
for _, addr := range existingAddrs {
if ocr3Addr != "" && forwarderAddr != "" && workflowRegistryAddr != "" && capabilityRegistryAddr != "" {
break
}
switch addr.Type {
case datastore.ContractType(internal.OCR3Capability):
if addr.Address != newOCR3Addr {
Expand Down Expand Up @@ -211,12 +219,43 @@ func TestKeystoneView(t *testing.T) {
_, err = changeset.ConfigureOCR3Contract(env.Env, cfg)
require.NoError(t, err)

ocr3CapCfg := test.GetDefaultCapConfig(t, internal.OCR3Cap)

var wfNodes []string
for _, id := range env.GetP2PIDs("wfDon") {
wfNodes = append(wfNodes, id.String())
}

wfDonCapabilities := internal.DonCapabilities{
Name: "wfDon",
Nops: []internal.NOP{
{
Name: "nop 1",
Nodes: wfNodes,
},
},
Capabilities: []internal.DONCapabilityWithConfig{
{Capability: internal.OCR3Cap, Config: ocr3CapCfg},
},
}
var allDons = []internal.DonCapabilities{wfDonCapabilities}
cr, err := changeset.GetOwnedContractV2[*capabilities_registry.CapabilitiesRegistry](
env.Env.DataStore.Addresses(), env.Env.Chains[env.RegistrySelector], capabilityRegistryAddr,
)
require.NoError(t, err)

_, err = internal.ConfigureRegistry(t.Context(), env.Env.Logger, &internal.ConfigureRegistryRequest{
ConfigureContractsRequest: internal.ConfigureContractsRequest{
RegistryChainSel: env.RegistrySelector,
Env: &env.Env,
Dons: allDons,
},
CapabilitiesRegistry: cr.Contract,
}, nil)
require.NoError(t, err)

_, err = changeset.ConfigureForwardContracts(env.Env, changeset.ConfigureForwardContractsRequest{
WFDonName: "test-wf-don",
WFDonName: "wfDon",
WFNodeIDs: wfNodes,
RegistryChainSel: env.RegistrySelector,
})
Expand All @@ -232,7 +271,7 @@ func TestKeystoneView(t *testing.T) {
var outView changeset.KeystoneView
require.NoError(t, json.Unmarshal(b, &outView))

chainID, err := chain_selectors.ChainIdFromSelector(registryChain)
chainID, err := chain_selectors.ChainIdFromSelector(env.RegistrySelector)
require.NoError(t, err)
chainName, err := chain_selectors.NameFromChainId(chainID)
require.NoError(t, err)
Expand Down Expand Up @@ -261,7 +300,7 @@ func TestKeystoneView(t *testing.T) {

t.Run("generates a partial view of the keystone state with OCR3 not configured", func(t *testing.T) {
// Deploy a new OCR3 contract
resp, err := changeset.DeployOCR3(env.Env, registryChain)
resp, err := changeset.DeployOCR3(env.Env, env.RegistrySelector)
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, env.Env.ExistingAddresses.Merge(resp.AddressBook))
Expand All @@ -275,7 +314,7 @@ func TestKeystoneView(t *testing.T) {

var outView changeset.KeystoneView
require.NoError(t, json.Unmarshal(b, &outView))
chainID, err := chain_selectors.ChainIdFromSelector(registryChain)
chainID, err := chain_selectors.ChainIdFromSelector(env.RegistrySelector)
require.NoError(t, err)
chainName, err := chain_selectors.NameFromChainId(chainID)
require.NoError(t, err)
Expand All @@ -290,6 +329,7 @@ func TestKeystoneView(t *testing.T) {
})

t.Run("fails to generate a view of the keystone state with a bad OracleConfig", func(t *testing.T) {
env.Env.ExistingAddresses = originalAddressBook
oracleConfigCopy := oracleConfig
oracleConfigCopy.DeltaRoundMillis = 0
oracleConfigCopy.DeltaProgressMillis = 0
Expand Down
Loading