Skip to content

Commit 0aae8ef

Browse files
committed
[Local CRE] Move Vault OCR config to CapRegistry
1 parent fab346f commit 0aae8ef

File tree

7 files changed

+227
-184
lines changed

7 files changed

+227
-184
lines changed

core/services/ocr/capregconfig/digest.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import (
1111
capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
1212
)
1313

14-
// Offchain digest specific to OCR configs stored in CRE's CapabilitiesRegistry contract.
15-
// Includes donID and capabilityID to ensure uniqueness across different protocol instances.
16-
func computeConfigDigest(
14+
// ComputeConfigDigest computes the offchain digest for OCR configs stored in CRE's
15+
// CapabilitiesRegistry contract. Includes donID and capabilityID to ensure uniqueness
16+
// across different protocol instances.
17+
func ComputeConfigDigest(
1718
chainID uint64,
1819
registryAddress string,
1920
capabilityID string,

core/services/ocr/capregconfig/ocrconfigservice.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ func (s *ocrConfigService) parseOCR3Config(
267267
transmitters[i] = ocrtypes.Account(gethCommon.BytesToAddress(transmitter).Hex())
268268
}
269269

270-
digest, err := computeConfigDigest(s.chainID, s.registryAddress, capabilityID, donID, ocrConfigKey, cfg)
270+
digest, err := ComputeConfigDigest(s.chainID, s.registryAddress, capabilityID, donID, ocrConfigKey, cfg)
271271
if err != nil {
272272
return ocrtypes.ContractConfig{}, fmt.Errorf("failed to compute config digest: %w", err)
273273
}

deployment/cre/jobs/propose_job_spec.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,15 @@ func (u ProposeJobSpec) Apply(e cldf.Environment, input ProposeJobSpecInput) (cl
166166

167167
dkgContractAddr := ""
168168
if jobInput.DKGContractQualifier != "" {
169-
dkgContractRefKey := pkg.GetOCR3CapabilityAddressRefKey(uint64(jobInput.ChainSelectorEVM), jobInput.DKGContractQualifier)
170-
addr, err := e.DataStore.Addresses().Get(dkgContractRefKey)
169+
var dkgAddrRefKey datastore.AddressRefKey
170+
if jobInput.CapRegVersion != "" {
171+
dkgAddrRefKey = pkg.GetCapRegAddressRefKey(uint64(jobInput.ChainSelectorEVM), jobInput.DKGContractQualifier, jobInput.CapRegVersion)
172+
} else {
173+
dkgAddrRefKey = pkg.GetOCR3CapabilityAddressRefKey(uint64(jobInput.ChainSelectorEVM), jobInput.DKGContractQualifier)
174+
}
175+
addr, err := e.DataStore.Addresses().Get(dkgAddrRefKey)
171176
if err != nil {
172-
return cldf.ChangesetOutput{}, fmt.Errorf("failed to get OCR3 contract address for chain selector %d and qualifier %s: %w", jobInput.ChainSelectorEVM, jobInput.ContractQualifier, err)
177+
return cldf.ChangesetOutput{}, fmt.Errorf("failed to get contract address for chain selector %d and qualifier %s: %w", jobInput.ChainSelectorEVM, jobInput.DKGContractQualifier, err)
173178
}
174179

175180
dkgContractAddr = addr.Address

system-tests/lib/cre/contracts/keystone.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/ethereum/go-ethereum/common"
1515
"github.com/pkg/errors"
1616
"github.com/rs/zerolog"
17+
chainselectors "github.com/smartcontractkit/chain-selectors"
1718
"google.golang.org/protobuf/proto"
1819

1920
"github.com/smartcontractkit/chainlink-common/keystore/corekeys/p2pkey"
@@ -30,6 +31,7 @@ import (
3031
cap_reg_v2_seq "github.com/smartcontractkit/chainlink/deployment/cre/capabilities_registry/v2/changeset/sequences"
3132
cre_contracts "github.com/smartcontractkit/chainlink/deployment/cre/contracts"
3233
"github.com/smartcontractkit/chainlink/deployment/cre/ocr3"
34+
"github.com/smartcontractkit/chainlink/deployment/cre/ocr3/ocr3_1"
3335
keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
3436
ks_contracts_op "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/operations/contracts"
3537
libc "github.com/smartcontractkit/chainlink/system-tests/lib/conversions"
@@ -178,6 +180,93 @@ func (d *dons) embedOCR3Config(capConfig *capabilitiespb.CapabilityConfig, don d
178180
return nil
179181
}
180182

183+
type embedOCR3_1Params struct {
184+
capRegAddress string
185+
chainID uint64
186+
donID uint32
187+
capabilityID string
188+
}
189+
190+
func (d *dons) embedOCR3_1Config(capConfig *capabilitiespb.CapabilityConfig, don donConfig, registryChainSelector uint64, configs map[string]*cre.OCR3_1ConfigEntry, params embedOCR3_1Params) error {
191+
var allNodeIDs []string
192+
for _, nop := range don.Nops {
193+
allNodeIDs = append(allNodeIDs, nop.Nodes...)
194+
}
195+
196+
nodes, err := deployment.NodeInfo(allNodeIDs, d.offChain)
197+
if err != nil {
198+
return fmt.Errorf("failed to get node info: %w", err)
199+
}
200+
201+
if capConfig.Ocr3Configs == nil {
202+
capConfig.Ocr3Configs = make(map[string]*capabilitiespb.OCR3Config)
203+
}
204+
205+
sortedKeys := make([]string, 0, len(configs))
206+
for k := range configs {
207+
sortedKeys = append(sortedKeys, k)
208+
}
209+
sort.Strings(sortedKeys)
210+
211+
generateConfig := func(ocrConfigKey string, entry *cre.OCR3_1ConfigEntry) error {
212+
entry.Config.TransmissionSchedule = []int{len(don.Nops[0].Nodes)}
213+
214+
ocrConfig, err := ocr3_1.GenerateOCR3_1ConfigFromNodes(*entry.Config, nodes, registryChainSelector, d.env.OCRSecrets, entry.ReportingPluginConfig)
215+
if err != nil {
216+
return fmt.Errorf("failed to generate OCR3_1 config for key %s: %w", ocrConfigKey, err)
217+
}
218+
219+
transmitterBytes := make([][]byte, len(ocrConfig.Transmitters))
220+
for i, t := range ocrConfig.Transmitters {
221+
transmitterBytes[i] = t.Bytes()
222+
}
223+
224+
capConfig.Ocr3Configs[ocrConfigKey] = &capabilitiespb.OCR3Config{
225+
Signers: ocrConfig.Signers,
226+
Transmitters: transmitterBytes,
227+
F: uint32(ocrConfig.F),
228+
OnchainConfig: ocrConfig.OnchainConfig,
229+
OffchainConfigVersion: ocrConfig.OffchainConfigVersion,
230+
OffchainConfig: ocrConfig.OffchainConfig,
231+
ConfigCount: 1,
232+
}
233+
return nil
234+
}
235+
236+
// Pass 1: generate configs with static ReportingPluginConfig
237+
for _, key := range sortedKeys {
238+
entry := configs[key]
239+
if entry.ReportingPluginConfig != nil {
240+
if err := generateConfig(key, entry); err != nil {
241+
return err
242+
}
243+
}
244+
}
245+
246+
// Pass 2: generate configs using ReportingPluginConfigFactory (may depend on pass 1 results)
247+
for _, key := range sortedKeys {
248+
entry := configs[key]
249+
if entry.ReportingPluginConfig != nil {
250+
continue
251+
}
252+
if entry.ReportingPluginConfigFactory == nil {
253+
return fmt.Errorf("OCR3_1 config entry for key %q has neither ReportingPluginConfig nor ReportingPluginConfigFactory", key)
254+
}
255+
256+
rpc, err := entry.ReportingPluginConfigFactory(params.capRegAddress, params.chainID, params.donID, params.capabilityID, capConfig.Ocr3Configs)
257+
if err != nil {
258+
return fmt.Errorf("ReportingPluginConfigFactory failed for key %q: %w", key, err)
259+
}
260+
entry.ReportingPluginConfig = rpc
261+
262+
if err := generateConfig(key, entry); err != nil {
263+
return err
264+
}
265+
}
266+
267+
return nil
268+
}
269+
181270
func (d *dons) mustToV2ConfigureInput(chainSelector uint64, contractAddress string, capabilityToOCR3Config map[string]*ocr3.OracleConfig) cap_reg_v2_seq.ConfigureCapabilitiesRegistryInput {
182271
nops := make([]capabilities_registry_v2.CapabilitiesRegistryNodeOperatorParams, 0)
183272
nodes := make([]contracts.NodesInput, 0)
@@ -451,6 +540,26 @@ func ConfigureCapabilityRegistry(input cre.ConfigureCapabilityRegistryInput) (Ca
451540
if !cap.UseCapRegOCRConfig || cap.Config == nil {
452541
continue
453542
}
543+
544+
// Check for OCR3_1 config first (multi-instance capabilities like vault)
545+
if ocr31Config := input.CapabilityToOCR3_1Config[cap.Capability.LabelledName]; ocr31Config != nil {
546+
chainID, cErr := chainselectors.ChainIdFromSelector(input.ChainSelector)
547+
if cErr != nil {
548+
return nil, fmt.Errorf("failed to get chain ID from selector %d: %w", input.ChainSelector, cErr)
549+
}
550+
capID := fmt.Sprintf("%s@%s", cap.Capability.LabelledName, cap.Capability.Version)
551+
params := embedOCR3_1Params{
552+
capRegAddress: input.CapabilitiesRegistryAddress.Hex(),
553+
chainID: chainID,
554+
donID: don.id,
555+
capabilityID: capID,
556+
}
557+
if err := dons.embedOCR3_1Config(don.Capabilities[i].Config, don, input.ChainSelector, ocr31Config.Configs, params); err != nil {
558+
return nil, fmt.Errorf("failed to embed OCR3_1 config for capability %s: %w", cap.Capability.LabelledName, err)
559+
}
560+
continue
561+
}
562+
454563
ocrConfig := input.CapabilityToOCR3Config[cap.Capability.LabelledName]
455564
if ocrConfig == nil {
456565
return nil, fmt.Errorf("no OCR3 config found for capability %s", cap.Capability.LabelledName)

system-tests/lib/cre/environment/environment.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ func SetupTestEnvironment(
190190
fmt.Print(libformat.PurpleText("%s", input.StageGen.Wrap("Applying Features before environment startup")))
191191
var donsCapabilities = make(map[uint64][]keystone_changeset.DONCapabilityWithConfig)
192192
var capabilityToOCR3Config = make(map[string]*ocr3.OracleConfig)
193+
var capabilityToOCR3_1Config = make(map[string]*cre.OCR3_1CapabilityConfig)
193194
for _, feature := range input.Features.List() {
194195
for _, donMetadata := range topology.DonsMetadataWithFlag(feature.Flag()) {
195196
testLogger.Info().Msgf("Executing PreEnvStartup for feature %s for don '%s'", feature.Flag(), donMetadata.Name)
@@ -209,6 +210,7 @@ func SetupTestEnvironment(
209210
}
210211
donsCapabilities[donMetadata.ID] = append(donsCapabilities[donMetadata.ID], output.DONCapabilityWithConfig...)
211212
maps.Copy(capabilityToOCR3Config, output.CapabilityToOCR3Config)
213+
maps.Copy(capabilityToOCR3_1Config, output.CapabilityToOCR3_1Config)
212214
}
213215
testLogger.Info().Msgf("PreEnvStartup for feature %s executed successfully", feature.Flag())
214216
}
@@ -383,6 +385,7 @@ func SetupTestEnvironment(
383385
WithV2Registries: input.WithV2Registries,
384386
DONCapabilityWithConfigs: make(map[uint64][]keystone_changeset.DONCapabilityWithConfig),
385387
CapabilityToOCR3Config: capabilityToOCR3Config,
388+
CapabilityToOCR3_1Config: capabilityToOCR3_1Config,
386389
}
387390

388391
for _, capability := range input.Capabilities {

0 commit comments

Comments
 (0)