From b60faa075298048eda2d799b8ded2f90e0256cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= Date: Fri, 18 Oct 2024 15:26:30 +0900 Subject: [PATCH] keystone: Start migration from CLO to JD --- .../deployment/clo/don_nodeset.go | 67 - .../deployment/clo/don_nodeset_test.go | 104 - integration-tests/deployment/clo/env.go | 136 - .../deployment/clo/models/models.go | 28 - .../deployment/clo/models/models_gen.go | 3653 ----------------- .../deployment/clo/offchain_client_impl.go | 213 - .../clo/offchain_client_impl_test.go | 582 --- .../clo/testdata/keystone_nops.json | 3162 -------------- .../deployment/keystone/deploy.go | 77 +- .../deployment/keystone/deploy_test.go | 124 +- .../keystone/testdata/asset_nodes.json | 978 ----- .../keystone/testdata/chain_writer_nodes.json | 1446 ------- .../keystone/testdata/workflow_nodes.json | 1106 ----- .../deployment/keystone/types.go | 136 +- .../deployment/keystone/types_test.go | 523 ++- integration-tests/deployment/memory/chain.go | 2 +- .../deployment/memory/environment.go | 29 +- .../deployment/memory/job_client.go | 106 +- integration-tests/deployment/memory/node.go | 83 +- .../deployment/memory/node_test.go | 2 +- .../web/sdk/internal/genqlient.graphql | 2 +- 21 files changed, 614 insertions(+), 11945 deletions(-) delete mode 100644 integration-tests/deployment/clo/don_nodeset.go delete mode 100644 integration-tests/deployment/clo/don_nodeset_test.go delete mode 100644 integration-tests/deployment/clo/env.go delete mode 100644 integration-tests/deployment/clo/models/models.go delete mode 100644 integration-tests/deployment/clo/models/models_gen.go delete mode 100644 integration-tests/deployment/clo/offchain_client_impl.go delete mode 100644 integration-tests/deployment/clo/offchain_client_impl_test.go delete mode 100644 integration-tests/deployment/clo/testdata/keystone_nops.json delete mode 100644 integration-tests/deployment/keystone/testdata/asset_nodes.json delete mode 100644 integration-tests/deployment/keystone/testdata/chain_writer_nodes.json delete mode 100644 integration-tests/deployment/keystone/testdata/workflow_nodes.json diff --git a/integration-tests/deployment/clo/don_nodeset.go b/integration-tests/deployment/clo/don_nodeset.go deleted file mode 100644 index 5962b6f4ba8..00000000000 --- a/integration-tests/deployment/clo/don_nodeset.go +++ /dev/null @@ -1,67 +0,0 @@ -package clo - -import ( - "strings" - - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" -) - -// CapabilityNodeSets groups nodes by a given filter function, resulting in a map of don name to nodes. -func CapabilityNodeSets(nops []*models.NodeOperator, donFilters map[string]FilterFuncT[*models.Node]) map[string][]*models.NodeOperator { - // first drop bootstraps if they exist because they do not serve capabilities - nonBootstrapNops := FilterNopNodes(nops, func(n *models.Node) bool { - for _, chain := range n.ChainConfigs { - if chain.Ocr2Config.IsBootstrap { - return false - } - } - return true - }) - // apply given filters to non-bootstrap nodes - out := make(map[string][]*models.NodeOperator) - for name, f := range donFilters { - out[name] = FilterNopNodes(nonBootstrapNops, f) - } - return out -} - -// FilterNopNodes filters the nodes of each nop by the provided filter function. -// if a nop has no nodes after filtering, it is not included in the output. -func FilterNopNodes(nops []*models.NodeOperator, f FilterFuncT[*models.Node]) []*models.NodeOperator { - var out []*models.NodeOperator - for _, nop := range nops { - var res []*models.Node - for _, n := range nop.Nodes { - node := n - if f(n) { - res = append(res, node) - } - } - if len(res) > 0 { - filterNop := *nop - filterNop.Nodes = res - out = append(out, &filterNop) - } - } - return out -} - -type FilterFuncT[T any] func(n T) bool - -func ProductFilterGenerator(p models.ProductType) FilterFuncT[*models.Node] { - return func(n *models.Node) bool { - for _, prod := range n.SupportedProducts { - if prod == p { - return true - } - } - return false - } -} - -// this could be generalized to a regex filter -func NodeNameFilterGenerator(contains string) FilterFuncT[*models.Node] { - return func(n *models.Node) bool { - return strings.Contains(n.Name, contains) - } -} diff --git a/integration-tests/deployment/clo/don_nodeset_test.go b/integration-tests/deployment/clo/don_nodeset_test.go deleted file mode 100644 index 6e8c64060df..00000000000 --- a/integration-tests/deployment/clo/don_nodeset_test.go +++ /dev/null @@ -1,104 +0,0 @@ -package clo_test - -import ( - "encoding/json" - "os" - "path/filepath" - "sort" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/test-go/testify/require" - - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" -) - -// this is hacky, but there is no first class concept of a chain writer node in CLO -// in prod, probably better to make an explicit list of pubkeys if we can't add a category or product type -// sufficient for testing -var ( - writerFilter = func(n *models.Node) bool { - return strings.Contains(n.Name, "Prod Keystone Cap One") && !strings.Contains(n.Name, "Boot") - } - - assetFilter = func(n *models.Node) bool { - return strings.Contains(n.Name, "Prod Keystone Asset") && !strings.Contains(n.Name, "Bootstrap") - } - - wfFilter = func(n *models.Node) bool { - return strings.Contains(n.Name, "Prod Keystone One") && !strings.Contains(n.Name, "Boot") - } -) - -func TestGenerateNopNodesData(t *testing.T) { - t.Skipf("this test is for generating test data only") - // use for generating keystone deployment test data - // `./bin/fmscli --config ~/.fmsclient/prod.yaml login` - // `./bin/fmscli --config ~/.fmsclient/prod.yaml get nodeOperators > /tmp/all-clo-nops.json` - - regenerateFromCLO := false - if regenerateFromCLO { - path := "/tmp/all-clo-nops.json" - f, err := os.ReadFile(path) - require.NoError(t, err) - type cloData struct { - Nops []*models.NodeOperator `json:"nodeOperators"` - } - var d cloData - require.NoError(t, json.Unmarshal(f, &d)) - require.NotEmpty(t, d.Nops) - allNops := d.Nops - sort.Slice(allNops, func(i, j int) bool { - return allNops[i].ID < allNops[j].ID - }) - - ksFilter := func(n *models.Node) bool { - return writerFilter(n) || assetFilter(n) || wfFilter(n) - } - ksNops := clo.FilterNopNodes(allNops, ksFilter) - require.NotEmpty(t, ksNops) - b, err := json.MarshalIndent(ksNops, "", " ") - require.NoError(t, err) - require.NoError(t, os.WriteFile("testdata/keystone_nops.json", b, 0644)) // nolint: gosec - } - keystoneNops := loadTestNops(t, "testdata/keystone_nops.json") - - m := clo.CapabilityNodeSets(keystoneNops, map[string]clo.FilterFuncT[*models.Node]{ - "workflow": wfFilter, - "chainWriter": writerFilter, - "asset": assetFilter, - }) - assert.Len(t, m, 3) - assert.Len(t, m["workflow"], 10) - assert.Len(t, m["chainWriter"], 10) - assert.Len(t, m["asset"], 16) - - // can be used to derive the test data for the keystone deployment - updateTestData := true - if updateTestData { - d := "/tmp" // change this to the path where you want to write the test, "../deployment/keystone/testdata" - b, err := json.MarshalIndent(m["workflow"], "", " ") - require.NoError(t, err) - require.NoError(t, os.WriteFile(filepath.Join(d, "workflow_nodes.json"), b, 0600)) - - b, err = json.MarshalIndent(m["chainWriter"], "", " ") - require.NoError(t, err) - require.NoError(t, os.WriteFile(filepath.Join(d, "chain_writer_nodes.json"), b, 0600)) - b, err = json.MarshalIndent(m["asset"], "", " ") - require.NoError(t, err) - require.NoError(t, os.WriteFile(filepath.Join(d, "asset_nodes.json"), b, 0600)) - } -} - -func loadTestNops(t *testing.T, path string) []*models.NodeOperator { - f, err := os.ReadFile(path) - require.NoError(t, err) - var nodes []*models.NodeOperator - require.NoError(t, json.Unmarshal(f, &nodes)) - sort.Slice(nodes, func(i, j int) bool { - return nodes[i].ID < nodes[j].ID - }) - return nodes -} diff --git a/integration-tests/deployment/clo/env.go b/integration-tests/deployment/clo/env.go deleted file mode 100644 index 302f9794eaf..00000000000 --- a/integration-tests/deployment/clo/env.go +++ /dev/null @@ -1,136 +0,0 @@ -package clo - -import ( - "strconv" - "testing" - - "github.com/test-go/testify/require" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink/integration-tests/deployment" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/memory" -) - -type DonEnvConfig struct { - DonName string - Chains map[uint64]deployment.Chain - Logger logger.Logger - Nops []*models.NodeOperator -} - -func NewDonEnv(t *testing.T, cfg DonEnvConfig) *deployment.Environment { - // no bootstraps in the don as far as capabilities registry is concerned - for _, nop := range cfg.Nops { - for _, node := range nop.Nodes { - for _, chain := range node.ChainConfigs { - if chain.Ocr2Config.IsBootstrap { - t.Fatalf("Don nodes should not be bootstraps nop %s node %s chain %s", nop.ID, node.ID, chain.Network.ChainID) - } - } - } - } - out := deployment.Environment{ - Name: cfg.DonName, - Offchain: NewJobClient(cfg.Logger, cfg.Nops), - NodeIDs: make([]string, 0), - Chains: cfg.Chains, - Logger: cfg.Logger, - } - // assume that all the nodes in the provided input nops are part of the don - for _, nop := range cfg.Nops { - for _, node := range nop.Nodes { - out.NodeIDs = append(out.NodeIDs, node.ID) - } - } - - return &out -} - -func NewDonEnvWithMemoryChains(t *testing.T, cfg DonEnvConfig, ignore func(*models.NodeChainConfig) bool) *deployment.Environment { - e := NewDonEnv(t, cfg) - // overwrite the chains with memory chains - chains := make(map[uint64]struct{}) - for _, nop := range cfg.Nops { - for _, node := range nop.Nodes { - for _, chain := range node.ChainConfigs { - if ignore(chain) { - continue - } - id, err := strconv.ParseUint(chain.Network.ChainID, 10, 64) - require.NoError(t, err, "failed to parse chain id to uint64") - chains[id] = struct{}{} - } - } - } - var cs []uint64 - for c := range chains { - cs = append(cs, c) - } - memoryChains := memory.NewMemoryChainsWithChainIDs(t, cs) - e.Chains = memoryChains - return e -} - -// MultiDonEnvironment is a single logical deployment environment (like dev, testnet, prod,...). -// It represents the idea that different nodesets host different capabilities. -// Each element in the DonEnv is a logical set of nodes that host the same capabilities. -// This model allows us to reuse the existing Environment abstraction while supporting multiple nodesets at -// expense of slightly abusing the original abstraction. Specifically, the abuse is that -// each Environment in the DonToEnv map is a subset of the target deployment environment. -// One element cannot represent dev and other testnet for example. -type MultiDonEnvironment struct { - donToEnv map[string]*deployment.Environment - Logger logger.Logger - // hacky but temporary to transition to Environment abstraction. set by New - Chains map[uint64]deployment.Chain -} - -func (mde MultiDonEnvironment) Flatten(name string) *deployment.Environment { - return &deployment.Environment{ - Name: name, - Chains: mde.Chains, - Logger: mde.Logger, - - // TODO: KS-460 integrate with the clo offchain client impl - // may need to extend the Environment abstraction use maps rather than slices for Nodes - // somehow we need to capture the fact that each nodes belong to nodesets which have different capabilities - // purposely nil to catch misuse until we do that work - Offchain: nil, - NodeIDs: nil, - } -} - -func newMultiDonEnvironment(logger logger.Logger, donToEnv map[string]*deployment.Environment) *MultiDonEnvironment { - chains := make(map[uint64]deployment.Chain) - for _, env := range donToEnv { - for sel, chain := range env.Chains { - if _, exists := chains[sel]; !exists { - chains[sel] = chain - } - } - } - return &MultiDonEnvironment{ - donToEnv: donToEnv, - Logger: logger, - Chains: chains, - } -} - -func NewTestEnv(t *testing.T, lggr logger.Logger, dons map[string]*deployment.Environment) *MultiDonEnvironment { - for _, don := range dons { - //don := don - seen := make(map[uint64]deployment.Chain) - // ensure that generated chains are the same for all environments. this ensures that he in memory representation - // points to a common object for all dons given the same selector. - for sel, chain := range don.Chains { - c, exists := seen[sel] - if exists { - don.Chains[sel] = c - } else { - seen[sel] = chain - } - } - } - return newMultiDonEnvironment(lggr, dons) -} diff --git a/integration-tests/deployment/clo/models/models.go b/integration-tests/deployment/clo/models/models.go deleted file mode 100644 index 1d33cff84d5..00000000000 --- a/integration-tests/deployment/clo/models/models.go +++ /dev/null @@ -1,28 +0,0 @@ -// TODO: KS-455: Refactor this package to use chainlink-common -// Fork from: https://github.com/smartcontractkit/feeds-manager/tree/develop/api/models -// until it can be refactored in cahinlink-common. - -// Package models provides generated go types that reflect the GraphQL types -// defined in the API schemas. -// -// To maintain compatibility with the default JSON interfaces, any necessary model -// overrides can be defined this package. -package models - -import "go/types" - -// Generic Error model to override existing GQL Error types and allow unmarshaling of GQL Error unions -type Error struct { - Typename string `json:"__typename,omitempty"` - Message string `json:"message,omitempty"` - Path *[]string `json:"path,omitempty"` -} - -func (e *Error) Underlying() types.Type { return e } -func (e *Error) String() string { return "Error" } - -// Unmarshal GQL Time fields into go strings because by default, time.Time results in zero-value -// timestamps being present in the CLI output, e.g. "createdAt": "0001-01-01T00:00:00Z". -// This is because the default JSON interfaces don't recognize it as an empty value for Time.time -// and fail to omit it when using `json:"omitempty"` tags. -type Time string diff --git a/integration-tests/deployment/clo/models/models_gen.go b/integration-tests/deployment/clo/models/models_gen.go deleted file mode 100644 index baea1dbcbed..00000000000 --- a/integration-tests/deployment/clo/models/models_gen.go +++ /dev/null @@ -1,3653 +0,0 @@ -// Forked from https://github.com/smartcontractkit/feeds-manager/blob/afc24439ee1dffd3781b53c9419ccd1eb44f4163/api/models/models_gen.go#L1 -// TODO: KS-455: Refactor this package to use chainlink-common -// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. - -package models - -import ( - "fmt" - "io" - "strconv" -) - -type AggregatorConfig interface { - IsAggregatorConfig() -} - -type AggregatorSpecConfig interface { - IsAggregatorSpecConfig() -} - -type JobConfig interface { - IsJobConfig() -} - -type Action struct { - Name string `json:"name,omitempty"` - ActionType ActionType `json:"actionType,omitempty"` - Run *ActionRun `json:"run,omitempty"` - Tasks []*Task `json:"tasks,omitempty"` -} - -type ActionRun struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - ActionType ActionType `json:"actionType,omitempty"` - Status ActionRunStatus `json:"status,omitempty"` - Tasks []*Task `json:"tasks,omitempty"` - TaskRuns []*TaskRun `json:"taskRuns,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type ActivateBootstrapNodeInput struct { - ID string `json:"id,omitempty"` - ContractType ContractType `json:"contractType,omitempty"` -} - -type ActivateBootstrapNodePayload struct { - Node *Node `json:"node,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddAggregatorInput struct { - Name string `json:"name,omitempty"` - Template string `json:"template,omitempty"` - CategoryID string `json:"categoryID,omitempty"` -} - -type AddChainInput struct { - NetworkID string `json:"networkID,omitempty"` - Template string `json:"template,omitempty"` - // The Display Name lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only. - DisplayName *string `json:"displayName,omitempty"` -} - -type AddChainPayload struct { - Errors []Error `json:"errors,omitempty"` - Chain *CCIPChain `json:"chain,omitempty"` -} - -type AddChainTestContractsInput struct { - ChainID string `json:"chainID,omitempty"` -} - -type AddChainTestContractsPayload struct { - Chain *CCIPChain `json:"chain,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddFeedAggregatorInput struct { - FeedID string `json:"feedID,omitempty"` - Aggregator *AddAggregatorInput `json:"aggregator,omitempty"` -} - -type AddFeedAggregatorPayload struct { - Aggregator *Aggregator `json:"aggregator,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddFeedInput struct { - Name string `json:"name,omitempty"` - NetworkID string `json:"networkID,omitempty"` - Proxy *AddProxyInput `json:"proxy,omitempty"` - Aggregator *AddAggregatorInput `json:"aggregator,omitempty"` -} - -type AddFeedPayload struct { - Feed *Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddLaneInput struct { - ChainAid string `json:"chainAID,omitempty"` - ChainBid string `json:"chainBID,omitempty"` - Template string `json:"template,omitempty"` - // The Display Name lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only. - DisplayName *string `json:"displayName,omitempty"` -} - -type AddLanePayload struct { - Errors []Error `json:"errors,omitempty"` - Lane *CCIPLane `json:"lane,omitempty"` -} - -type AddLaneUpgradeInput struct { - LaneID string `json:"laneID,omitempty"` - Template string `json:"template,omitempty"` -} - -type AddLaneUpgradePayload struct { - Lane *CCIPLane `json:"lane,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddMercuryV03NetworkStackInput struct { - NetworkID string `json:"networkID,omitempty"` - MercuryServerURL string `json:"mercuryServerURL,omitempty"` - MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"` - ReadAccessController *ReadAccessController `json:"readAccessController,omitempty"` - NativeSurcharge *string `json:"nativeSurcharge,omitempty"` - Servers *string `json:"servers,omitempty"` -} - -type AddMercuryV03NetworkStackPayload struct { - NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddProxyInput struct { - AccessControllerAddress *string `json:"accessControllerAddress,omitempty"` -} - -type AddStorageContractInput struct { - NetworkID string `json:"networkID,omitempty"` - Template string `json:"template,omitempty"` - DisplayName *string `json:"displayName,omitempty"` -} - -type AddStorageContractPayload struct { - StorageContract *StorageContract `json:"storageContract,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddTokenInput struct { - Template string `json:"template,omitempty"` -} - -type AddTokenPayload struct { - Token *CCIPToken `json:"token,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AddTokenPoolInput struct { - ID string `json:"id,omitempty"` - Template string `json:"template,omitempty"` -} - -type AddTokenPoolPayload struct { - Errors []Error `json:"errors,omitempty"` - Chain *CCIPChain `json:"chain,omitempty"` -} - -type AddVerificationProviderInput struct { - FeedID string `json:"feedID,omitempty"` - NetworkStackID string `json:"networkStackID,omitempty"` -} - -type AddVerificationProviderPayload struct { - Feed *MercuryV03Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Aggregator struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - ContractAddress *string `json:"contractAddress,omitempty"` - ContractType ContractType `json:"contractType,omitempty"` - DeploymentStatus DeploymentStatus `json:"deploymentStatus,omitempty"` - OwnerAddress *string `json:"ownerAddress,omitempty"` - OwnerAddressType *ContractOwnerType `json:"ownerAddressType,omitempty"` - PendingOwnerAddress *string `json:"pendingOwnerAddress,omitempty"` - PendingOwnerType *ContractOwnerType `json:"pendingOwnerType,omitempty"` - TransferOwnershipStatus TransferOwnershipStatus `json:"transferOwnershipStatus,omitempty"` - Don *Don `json:"don,omitempty"` - BootstrapMultiaddrs []string `json:"bootstrapMultiaddrs,omitempty"` - SpecConfig AggregatorSpecConfig `json:"specConfig,omitempty"` - Config AggregatorConfig `json:"config,omitempty"` - Feed *Feed `json:"feed,omitempty"` - Network *Network `json:"network,omitempty"` - Category *Category `json:"category,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type AggregatorBilling struct { - MaximumGasPrice string `json:"maximumGasPrice,omitempty"` - ReasonableGasPrice string `json:"reasonableGasPrice,omitempty"` - MicroLinkPerEth string `json:"microLinkPerEth,omitempty"` - LinkGweiPerObservation string `json:"linkGweiPerObservation,omitempty"` - LinkGewiPerTransmission string `json:"linkGewiPerTransmission,omitempty"` -} - -type AggregatorConfigOcr1 struct { - Description string `json:"description,omitempty"` - ReasonableGasPrice string `json:"reasonableGasPrice,omitempty"` - MaximumGasPrice string `json:"maximumGasPrice,omitempty"` - MicroLinkPerEth string `json:"microLinkPerEth,omitempty"` - LinkGweiPerObservation string `json:"linkGweiPerObservation,omitempty"` - LinkGweiPerTransmission string `json:"linkGweiPerTransmission,omitempty"` - MinimumAnswer string `json:"minimumAnswer,omitempty"` - MaximumAnswer string `json:"maximumAnswer,omitempty"` - Decimals string `json:"decimals,omitempty"` - DeltaProgress string `json:"deltaProgress,omitempty"` - DeltaResend string `json:"deltaResend,omitempty"` - DeltaRound string `json:"deltaRound,omitempty"` - DeltaGrace string `json:"deltaGrace,omitempty"` - DeltaC string `json:"deltaC,omitempty"` - AlphaPpb string `json:"alphaPPB,omitempty"` - DeltaStage string `json:"deltaStage,omitempty"` - RMax string `json:"rMax,omitempty"` - S []int `json:"s,omitempty"` - F string `json:"f,omitempty"` -} - -func (AggregatorConfigOcr1) IsAggregatorConfig() {} - -type AggregatorConfigOcr2 struct { - MinimumAnswer string `json:"minimumAnswer,omitempty"` - MaximumAnswer string `json:"maximumAnswer,omitempty"` - Description string `json:"description,omitempty"` - Decimals string `json:"decimals,omitempty"` - DeltaGrace string `json:"deltaGrace,omitempty"` - DeltaProgress string `json:"deltaProgress,omitempty"` - DeltaResend string `json:"deltaResend,omitempty"` - DeltaRound string `json:"deltaRound,omitempty"` - DeltaStage string `json:"deltaStage,omitempty"` - F string `json:"f,omitempty"` - MaxDurationObservation string `json:"maxDurationObservation,omitempty"` - MaxDurationQuery string `json:"maxDurationQuery,omitempty"` - MaxDurationReport string `json:"maxDurationReport,omitempty"` - MaxDurationShouldAcceptFinalizedReport string `json:"maxDurationShouldAcceptFinalizedReport,omitempty"` - MaxDurationShouldTransmitAcceptedReport string `json:"maxDurationShouldTransmitAcceptedReport,omitempty"` - RMax string `json:"rMax,omitempty"` - S []int `json:"s,omitempty"` - AlphaAcceptInfinite bool `json:"alphaAcceptInfinite,omitempty"` - AlphaAcceptPpb string `json:"alphaAcceptPPB,omitempty"` - AlphaReportInfinite bool `json:"alphaReportInfinite,omitempty"` - AlphaReportPpb string `json:"alphaReportPPB,omitempty"` - DeltaC string `json:"deltaC,omitempty"` - ObservationPaymentGjuels string `json:"observationPaymentGjuels,omitempty"` - TransmissionPaymentGjuels string `json:"transmissionPaymentGjuels,omitempty"` - MaximumGasPriceGwei *string `json:"maximumGasPriceGwei,omitempty"` - ReasonableGasPriceGwei *string `json:"reasonableGasPriceGwei,omitempty"` - AccountingGas *string `json:"accountingGas,omitempty"` -} - -func (AggregatorConfigOcr2) IsAggregatorConfig() {} - -type AggregatorOnChainConfig struct { - ConfigCount string `json:"configCount,omitempty"` - BlockNumber string `json:"blockNumber,omitempty"` - ConfigDigest []string `json:"configDigest,omitempty"` -} - -type AggregatorOnChainState struct { - Billing *AggregatorBilling `json:"billing,omitempty"` - Config *AggregatorOnChainConfig `json:"config,omitempty"` - OwnerAddress string `json:"ownerAddress,omitempty"` -} - -type AggregatorProxy struct { - ID string `json:"id,omitempty"` - ContractAddress *string `json:"contractAddress,omitempty"` - TransferOwnershipStatus TransferOwnershipStatus `json:"transferOwnershipStatus,omitempty"` - OwnerAddress *string `json:"ownerAddress,omitempty"` - OwnerAddressType *ContractOwnerType `json:"ownerAddressType,omitempty"` - PendingOwnerAddress *string `json:"pendingOwnerAddress,omitempty"` - PendingOwnerType *ContractOwnerType `json:"pendingOwnerType,omitempty"` - Aggregator *Aggregator `json:"aggregator,omitempty"` - AccessControllerAddress *string `json:"accessControllerAddress,omitempty"` - Feed *Feed `json:"feed,omitempty"` - Network *Network `json:"network,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type ArchiveChainPayload struct { - Chain *CCIPChain `json:"chain,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ArchiveContractInput struct { - ChainID string `json:"chainID,omitempty"` - ContractID string `json:"contractID,omitempty"` -} - -type ArchiveContractPayload struct { - Contract *Contract `json:"contract,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ArchiveFeedPayload struct { - Feed *MercuryV03Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ArchiveLanePayload struct { - Lane *CCIPLane `json:"lane,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ArchiveNetworkInput struct { - ID string `json:"id,omitempty"` -} - -type ArchiveNetworkPayload struct { - Network *Network `json:"network,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ArchiveNetworkStackPayload struct { - NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type AssignNodeToJobInput struct { - JobID string `json:"jobID,omitempty"` - NodeID string `json:"nodeID,omitempty"` -} - -type AssignNodeToJobPayload struct { - Job *Job `json:"job,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type BuildInfo struct { - Version string `json:"version,omitempty"` -} - -type CCIPChain struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - Contracts []*Contract `json:"contracts,omitempty"` - WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"` - SupportedTokens []*EVMBridgedToken `json:"supportedTokens,omitempty"` - FeeTokens []string `json:"feeTokens,omitempty"` - WrappedNativeToken string `json:"wrappedNativeToken,omitempty"` - ArchivedAt *Time `json:"archivedAt,omitempty"` - // The Display Name lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only. - DisplayName *string `json:"displayName,omitempty"` - DeployedTemplate map[string]interface{} `json:"deployedTemplate,omitempty"` - Labels map[string]interface{} `json:"labels,omitempty"` -} - -type CCIPChainBasic struct { - ID string `json:"id,omitempty"` - ChainID string `json:"chainID,omitempty"` - Contracts []*ContractBasic `json:"contracts,omitempty"` -} - -type CCIPChainFilter struct { - IsArchived *bool `json:"isArchived,omitempty"` - Selectors []*CCIPChainSelector `json:"selectors,omitempty"` -} - -type CCIPChainSelector struct { - Key string `json:"key,omitempty"` - Op SelectorOp `json:"op,omitempty"` - Value *string `json:"value,omitempty"` -} - -type CCIPEndpoint struct { - Chain *CCIPChain `json:"chain,omitempty"` - Contracts []*Contract `json:"contracts,omitempty"` -} - -type CCIPEndpointBasic struct { - Chain *CCIPChainBasic `json:"chain,omitempty"` - Contracts []*ContractBasic `json:"contracts,omitempty"` -} - -type CCIPLane struct { - ID string `json:"id,omitempty"` - ChainA *CCIPChain `json:"chainA,omitempty"` - ChainB *CCIPChain `json:"chainB,omitempty"` - LegA *CCIPLaneLeg `json:"legA,omitempty"` - LegB *CCIPLaneLeg `json:"legB,omitempty"` - LegAProvisional *CCIPLaneLeg `json:"legAProvisional,omitempty"` - LegBProvisional *CCIPLaneLeg `json:"legBProvisional,omitempty"` - Dons []*Don `json:"dons,omitempty"` - WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"` - Status CCIPLaneLegStatus `json:"status,omitempty"` - ArchivedAt *Time `json:"archivedAt,omitempty"` - DisplayName *string `json:"displayName,omitempty"` - DeployedTemplate map[string]interface{} `json:"deployedTemplate,omitempty"` - DeployedProvisionalTemplate map[string]interface{} `json:"deployedProvisionalTemplate,omitempty"` -} - -type CCIPLaneChainUpdateInput struct { - ID string `json:"id,omitempty"` -} - -type CCIPLaneLeg struct { - ID string `json:"id,omitempty"` - Tag CCIPLaneLegTag `json:"tag,omitempty"` - Source *CCIPEndpoint `json:"source,omitempty"` - Destination *CCIPEndpoint `json:"destination,omitempty"` - WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"` - Dons []*Don `json:"dons,omitempty"` - Status CCIPLaneLegStatus `json:"status,omitempty"` - ArchivedAt *Time `json:"archivedAt,omitempty"` - SupportedTokens []string `json:"supportedTokens,omitempty"` -} - -type CCIPLaneLegBasic struct { - ID string `json:"id,omitempty"` - Source *CCIPEndpointBasic `json:"source,omitempty"` - Destination *CCIPEndpointBasic `json:"destination,omitempty"` - Dons []*DONBasic `json:"dons,omitempty"` - Status CCIPLaneLegStatus `json:"status,omitempty"` - SupportedTokens []string `json:"supportedTokens,omitempty"` -} - -type CCIPLaneLegsFilter struct { - ContractAddress string `json:"contractAddress,omitempty"` - NetworkNameKey string `json:"networkNameKey,omitempty"` -} - -type CCIPLanesFilter struct { - IsArchived *bool `json:"isArchived,omitempty"` -} - -type CCIPMutations struct { - AddChain *AddChainPayload `json:"addChain,omitempty"` - ImportChain *ImportChainPayload `json:"importChain,omitempty"` - AddChainTestContracts *AddChainTestContractsPayload `json:"addChainTestContracts,omitempty"` - AddTokenPool *AddTokenPoolPayload `json:"addTokenPool,omitempty"` - ImportTokenPool *ImportTokenPoolPayload `json:"importTokenPool,omitempty"` - AddToken *AddTokenPayload `json:"addToken,omitempty"` - DeployContract *DeployContractPayload `json:"deployContract,omitempty"` - DeleteContract *DeleteContractPayload `json:"deleteContract,omitempty"` - ArchiveContract *ArchiveContractPayload `json:"archiveContract,omitempty"` - // Deploys the contracts for a chain - DeployChain *CcipDeployChainPayload `json:"deployChain,omitempty"` - DeployChainTestContracts *CcipDeployChainTestContractsPayload `json:"deployChainTestContracts,omitempty"` - DeployToken *DeployTokenPayload `json:"deployToken,omitempty"` - DeregisterTestToken *DeregisterTestTokenPayload `json:"deregisterTestToken,omitempty"` - AddLane *AddLanePayload `json:"addLane,omitempty"` - ImportLane *ImportLanePayload `json:"importLane,omitempty"` - AddLaneUpgrade *AddLaneUpgradePayload `json:"addLaneUpgrade,omitempty"` - UpdateLane *UpdateLanePayload `json:"updateLane,omitempty"` - ArchiveLane *ArchiveLanePayload `json:"archiveLane,omitempty"` - ArchiveChain *ArchiveChainPayload `json:"archiveChain,omitempty"` - CancelLaneUpgrade *CancelLaneUpgradePayload `json:"cancelLaneUpgrade,omitempty"` - ConfirmLaneUpgrade *ConfirmLaneUpgradePayload `json:"confirmLaneUpgrade,omitempty"` - DeployLaneLeg *CcipDeployLaneLegPayload `json:"deployLaneLeg,omitempty"` - SetAllowListTokenPool *SetAllowListTokenPoolPayload `json:"setAllowListTokenPool,omitempty"` - // SetConfigLaneLeg sets the on chain configuration for the Commit Store and Off Ramp contracts of the lane leg. - // - // The configuration values passed as arguments to the contract call are provided by the most recently inserted - // RDD template. - SetConfigLaneLeg *CcipSetConfigLaneLegPayload `json:"setConfigLaneLeg,omitempty"` - TransferOwnership *TransferOwnershipPayload `json:"transferOwnership,omitempty"` - TransferAdminRole *TransferAdminRolePayload `json:"transferAdminRole,omitempty"` - UpdateChain *UpdateCCIPChainPayload `json:"updateChain,omitempty"` - RemoveLiquidity *RemoveLiquidityPayload `json:"removeLiquidity,omitempty"` - SyncChain *SyncChainPayload `json:"syncChain,omitempty"` - SyncLane *SyncLanePayload `json:"syncLane,omitempty"` - SyncContracts *SyncContractsPayload `json:"syncContracts,omitempty"` -} - -type CCIPQueries struct { - Chains []*CCIPChain `json:"chains,omitempty"` - Lanes []*CCIPLane `json:"lanes,omitempty"` - LaneLegs []*CCIPLaneLegBasic `json:"laneLegs,omitempty"` - Chain *CCIPChain `json:"chain,omitempty"` - Lane *CCIPLane `json:"lane,omitempty"` - Tokens []*CCIPToken `json:"tokens,omitempty"` - Token *CCIPToken `json:"token,omitempty"` -} - -type CCIPToken struct { - ID string `json:"id,omitempty"` - Symbol string `json:"symbol,omitempty"` - TokenPools []*CCIPTokenPool `json:"tokenPools,omitempty"` -} - -type CCIPTokenPool struct { - ID string `json:"id,omitempty"` - Contract *Contract `json:"contract,omitempty"` - Address *string `json:"address,omitempty"` - TokenAddress string `json:"tokenAddress,omitempty"` - TokenSymbol string `json:"tokenSymbol,omitempty"` - Chain *CCIPChain `json:"chain,omitempty"` - WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"` -} - -type CcipDeployChainInput struct { - ChainID string `json:"chainID,omitempty"` -} - -type CcipDeployChainPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CcipDeployChainTestContractsInput struct { - ChainID string `json:"chainID,omitempty"` -} - -type CcipDeployChainTestContractsPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CcipDeployLaneLegInput struct { - LegID string `json:"legID,omitempty"` -} - -type CcipDeployLaneLegPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CcipSetConfigLaneLegInput struct { - LegID string `json:"legID,omitempty"` -} - -type CcipSetConfigLaneLegPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CSAKeypair struct { - ID string `json:"id,omitempty"` - PublicKey string `json:"publicKey,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type CancelLaneUpgradeInput struct { - LaneID string `json:"laneID,omitempty"` -} - -type CancelLaneUpgradePayload struct { - Errors []Error `json:"errors,omitempty"` - Lane *CCIPLane `json:"lane,omitempty"` -} - -type Category struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Color string `json:"color,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type ConfirmLaneUpgradeInput struct { - LaneID string `json:"laneID,omitempty"` -} - -type ConfirmLaneUpgradePayload struct { - Errors []Error `json:"errors,omitempty"` - Lane *CCIPLane `json:"lane,omitempty"` -} - -type Contract struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - Name string `json:"name,omitempty"` - Version int `json:"version,omitempty"` - Semver *string `json:"semver,omitempty"` - Tag ContractTag `json:"tag,omitempty"` - Address *string `json:"address,omitempty"` - Metadata map[string]interface{} `json:"metadata,omitempty"` - OwnerAddress *string `json:"ownerAddress,omitempty"` - OwnerType ContractOwnerType `json:"ownerType,omitempty"` - PendingOwnerAddress *string `json:"pendingOwnerAddress,omitempty"` - PendingOwnerType *ContractOwnerType `json:"pendingOwnerType,omitempty"` - TransferOwnershipStatus TransferOwnershipStatus `json:"transferOwnershipStatus,omitempty"` - VerificationStatus VerificationStatus `json:"verificationStatus,omitempty"` - SourceCodeHash string `json:"sourceCodeHash,omitempty"` - DeployedAt *Time `json:"deployedAt,omitempty"` - Imported bool `json:"imported,omitempty"` - ArchivedAt *Time `json:"archivedAt,omitempty"` -} - -type ContractBasic struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Version int `json:"version,omitempty"` - Semver *string `json:"semver,omitempty"` - Address *string `json:"address,omitempty"` - Metadata map[string]interface{} `json:"metadata,omitempty"` -} - -type CreateBootstrapJobInput struct { - DonID string `json:"donID,omitempty"` - NodeID string `json:"nodeID,omitempty"` -} - -type CreateBootstrapJobPayload struct { - Job *Job `json:"job,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateCSAKeypairPayload struct { - CsaKeypair *CSAKeypair `json:"csaKeypair,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateCategoryInput struct { - Name string `json:"name,omitempty"` - Color *string `json:"color,omitempty"` -} - -type CreateCategoryPayload struct { - Category *Category `json:"category,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateJobInput struct { - Type JobType `json:"type,omitempty"` - Ocr2PluginType *OCR2PluginType `json:"ocr2PluginType,omitempty"` - Config *JobConfigInput `json:"config,omitempty"` - DonID string `json:"donID,omitempty"` - NodeOperatorID string `json:"nodeOperatorID,omitempty"` -} - -type CreateJobPayload struct { - Job *Job `json:"job,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateMercuryNetworkStackInput struct { - NetworkID string `json:"networkID,omitempty"` - VerifierAddress string `json:"verifierAddress,omitempty"` - VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"` - ServerURL string `json:"serverURL,omitempty"` - ServerPublicKey string `json:"serverPublicKey,omitempty"` - Servers *string `json:"servers,omitempty"` -} - -type CreateMercuryNetworkStackPayload struct { - NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateNetworkInput struct { - ChainID string `json:"chainID,omitempty"` - ChainType ChainType `json:"chainType,omitempty"` - Name string `json:"name,omitempty"` - NativeToken string `json:"nativeToken,omitempty"` - NativeTokenContractAddress *string `json:"nativeTokenContractAddress,omitempty"` - ConfigContractAddress *string `json:"configContractAddress,omitempty"` - LinkUSDProxyAddress *string `json:"linkUSDProxyAddress,omitempty"` - NativeUSDProxyAddress *string `json:"nativeUSDProxyAddress,omitempty"` - LinkContractAddress *string `json:"linkContractAddress,omitempty"` - FlagsContractAddress *string `json:"flagsContractAddress,omitempty"` - LinkFunding *string `json:"linkFunding,omitempty"` - BillingAdminAccessControllerAddress *string `json:"billingAdminAccessControllerAddress,omitempty"` - RequesterAdminAccessControllerAddress *string `json:"requesterAdminAccessControllerAddress,omitempty"` - ExplorerAPIKey *string `json:"explorerAPIKey,omitempty"` - ExplorerAPIURL *string `json:"explorerAPIURL,omitempty"` -} - -type CreateNetworkPayload struct { - Network *Network `json:"network,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateNodeInput struct { - Name string `json:"name,omitempty"` - PublicKey string `json:"publicKey,omitempty"` - NodeOperatorID string `json:"nodeOperatorID,omitempty"` - SupportedCategoryIDs []string `json:"supportedCategoryIDs,omitempty"` - SupportedProducts []ProductType `json:"supportedProducts,omitempty"` -} - -type CreateNodeOperatorInput struct { - Keys []string `json:"keys,omitempty"` - Name string `json:"name,omitempty"` - Email *string `json:"email,omitempty"` - Website *string `json:"website,omitempty"` -} - -type CreateNodeOperatorPayload struct { - NodeOperator *NodeOperator `json:"nodeOperator,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateNodePayload struct { - Node *Node `json:"node,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateRelayerAccountInput struct { - RelayerID string `json:"relayerID,omitempty"` -} - -type CreateRelayerAccountPayload struct { - RelayerAccount *RelayerAccount `json:"relayerAccount,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateRelayerInput struct { - Name string `json:"name,omitempty"` - NetworkID string `json:"networkID,omitempty"` - Config string `json:"config,omitempty"` - URL *RelayerURL `json:"url,omitempty"` -} - -type CreateRelayerPayload struct { - Relayer *Relayer `json:"relayer,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateUserInput struct { - Email string `json:"email,omitempty"` - Name string `json:"name,omitempty"` - Password string `json:"password,omitempty"` - Role UserRole `json:"role,omitempty"` -} - -type CreateUserPayload struct { - User *User `json:"user,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateVaultInput struct { - Name string `json:"name,omitempty"` - Address string `json:"address,omitempty"` - VaultType VaultType `json:"vaultType,omitempty"` - SupportedProducts []ProductType `json:"supportedProducts,omitempty"` - NetworkID string `json:"networkID,omitempty"` -} - -type CreateVaultPayload struct { - Vault *Vault `json:"vault,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type CreateWebhookInput struct { - Name string `json:"name,omitempty"` - EndpointURL string `json:"endpointURL,omitempty"` -} - -type CreateWebhookPayload struct { - Webhook *Webhook `json:"webhook,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Don struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - ExecutionType DONExecutionType `json:"executionType,omitempty"` - Jobs []*Job `json:"jobs,omitempty"` -} - -type DONBasic struct { - ID string `json:"id,omitempty"` - ExecutionType DONExecutionType `json:"executionType,omitempty"` - Jobs []*JobBasic `json:"jobs,omitempty"` -} - -type DeactivateBootstrapNodeInput struct { - ID string `json:"id,omitempty"` - ContractType ContractType `json:"contractType,omitempty"` -} - -type DeactivateBootstrapNodePayload struct { - Node *Node `json:"node,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeleteContractInput struct { - ChainID string `json:"chainID,omitempty"` - ContractID string `json:"contractID,omitempty"` -} - -type DeleteContractPayload struct { - Errors []Error `json:"errors,omitempty"` -} - -type DeleteFeedInput struct { - ID string `json:"id,omitempty"` -} - -type DeleteFeedPayload struct { - Feed *Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeleteJobInput struct { - ID string `json:"id,omitempty"` -} - -type DeleteJobPayload struct { - Job *Job `json:"job,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeleteNodeInput struct { - ID string `json:"id,omitempty"` -} - -type DeleteNodePayload struct { - Node *Node `json:"node,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeleteVaultInput struct { - ID string `json:"id,omitempty"` -} - -type DeleteVaultPayload struct { - Vault *Vault `json:"vault,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeleteWebhookInput struct { - ID string `json:"id,omitempty"` -} - -type DeleteWebhookPayload struct { - Webhook *Webhook `json:"webhook,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeleteWorkflowRunInput struct { - WorkflowRunID string `json:"workflowRunID,omitempty"` -} - -type DeleteWorkflowRunPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeployContractInput struct { - ChainID string `json:"chainID,omitempty"` - ContractID string `json:"contractID,omitempty"` -} - -type DeployContractPayload struct { - Errors []Error `json:"errors,omitempty"` - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` -} - -type DeployMercuryV03NetworkStackInput struct { - NetworkStackID string `json:"networkStackID,omitempty"` -} - -type DeployMercuryV03NetworkStackPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeploySetStorageContractInput struct { - StorageID string `json:"storageID,omitempty"` -} - -type DeploySetStorageContractPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeployTokenInput struct { - Symbol string `json:"symbol,omitempty"` -} - -type DeployTokenPayload struct { - WorkflowRunsAndContracts []*WorkflowRunAndContract `json:"workflowRunsAndContracts,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DeregisterTestTokenInput struct { - LaneLegID string `json:"laneLegID,omitempty"` -} - -type DeregisterTestTokenPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DisableNodeInput struct { - ID string `json:"id,omitempty"` -} - -type DisableNodePayload struct { - Node *Node `json:"node,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DisableRelayerInput struct { - ID string `json:"id,omitempty"` -} - -type DisableRelayerPayload struct { - Relayer *Relayer `json:"relayer,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type DisableUserInput struct { - ID string `json:"id,omitempty"` -} - -type DisableUserPayload struct { - User *User `json:"user,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type EVMBridgedToken struct { - Token string `json:"token,omitempty"` - Address string `json:"address,omitempty"` - TokenPoolType TokenPoolType `json:"tokenPoolType,omitempty"` - PriceType TokenPriceType `json:"priceType,omitempty"` - Price *string `json:"price,omitempty"` - PriceFeed *PriceFeed `json:"priceFeed,omitempty"` -} - -type EnableNodeInput struct { - ID string `json:"id,omitempty"` -} - -type EnableNodePayload struct { - Node *Node `json:"node,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type EnableRelayerInput struct { - ID string `json:"id,omitempty"` -} - -type EnableRelayerPayload struct { - Relayer *Relayer `json:"relayer,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Feed struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Status FeedStatus `json:"status,omitempty"` - Network *Network `json:"network,omitempty"` - Proxy *AggregatorProxy `json:"proxy,omitempty"` - Aggregators []*Aggregator `json:"aggregators,omitempty"` - WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type FeedsFilters struct { - ChainID *string `json:"chainID,omitempty"` - ChainType *ChainType `json:"chainType,omitempty"` - Name *string `json:"name,omitempty"` - NetworkID *string `json:"networkID,omitempty"` - ProxyAddress *string `json:"proxyAddress,omitempty"` - Limit *string `json:"limit,omitempty"` - Offset *string `json:"offset,omitempty"` -} - -type FeedsInput struct { - Filter *FeedsFilters `json:"filter,omitempty"` -} - -type GauntletReport struct { - ID string `json:"id,omitempty"` - TraceID string `json:"traceID,omitempty"` - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - TransactionHash *string `json:"transactionHash,omitempty"` - ReportID string `json:"reportID,omitempty"` - Timestamp Time `json:"timestamp,omitempty"` - Op string `json:"op,omitempty"` - Input string `json:"input,omitempty"` - Output *string `json:"output,omitempty"` - Requirements *string `json:"requirements,omitempty"` - Config string `json:"config,omitempty"` - Subops *string `json:"subops,omitempty"` - Events *string `json:"events,omitempty"` - Snapshot *string `json:"snapshot,omitempty"` - Error *string `json:"error,omitempty"` - TraceExtra *string `json:"traceExtra,omitempty"` -} - -type GauntletReportsInput struct { - TraceID *string `json:"traceID,omitempty"` - WorkflowRunID *int `json:"workflowRunID,omitempty"` - TransactionHash *string `json:"transactionHash,omitempty"` -} - -type ImportAggregatorInput struct { - Name string `json:"name,omitempty"` - ContractAddress string `json:"contractAddress,omitempty"` - Template string `json:"template,omitempty"` - CategoryID string `json:"categoryID,omitempty"` -} - -type ImportChainInput struct { - NetworkID string `json:"networkID,omitempty"` - Template string `json:"template,omitempty"` - // The Display Name lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only. - DisplayName *string `json:"displayName,omitempty"` -} - -type ImportChainPayload struct { - Errors []Error `json:"errors,omitempty"` - Chain *CCIPChain `json:"chain,omitempty"` -} - -type ImportFeedAggregatorInput struct { - FeedID string `json:"feedID,omitempty"` - Aggregator *ImportAggregatorInput `json:"aggregator,omitempty"` -} - -type ImportFeedAggregatorPayload struct { - Aggregator *Aggregator `json:"aggregator,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ImportFeedInput struct { - Name string `json:"name,omitempty"` - NetworkID string `json:"networkID,omitempty"` - Proxy *ImportProxyInput `json:"proxy,omitempty"` - Aggregators []*ImportAggregatorInput `json:"aggregators,omitempty"` -} - -type ImportFeedPayload struct { - Feed *Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ImportKeystoneWorkflowInput struct { - CategoryID string `json:"categoryID,omitempty"` - NetworkID string `json:"networkID,omitempty"` - Template string `json:"template,omitempty"` -} - -type ImportKeystoneWorkflowPayload struct { - Workflow *KeystoneWorkflow `json:"workflow,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ImportLaneInput struct { - ChainAid string `json:"chainAID,omitempty"` - ChainBid string `json:"chainBID,omitempty"` - Template string `json:"template,omitempty"` - // The Display Name lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only. - DisplayName *string `json:"displayName,omitempty"` -} - -type ImportLanePayload struct { - Errors []Error `json:"errors,omitempty"` - Lane *CCIPLane `json:"lane,omitempty"` -} - -type ImportMercuryFeedInput struct { - Name string `json:"name,omitempty"` - ExternalFeedID string `json:"externalFeedID,omitempty"` - NetworkStackID string `json:"networkStackID,omitempty"` - FromBlock string `json:"fromBlock,omitempty"` - Template string `json:"template,omitempty"` -} - -type ImportMercuryFeedPayload struct { - Feed *MercuryFeed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ImportMercuryV03FeedInput struct { - Name string `json:"name,omitempty"` - ExternalFeedID string `json:"externalFeedID,omitempty"` - Template string `json:"template,omitempty"` - CategoryID string `json:"categoryID,omitempty"` -} - -type ImportMercuryV03FeedPayload struct { - Feed *MercuryV03Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ImportMercuryV03NetworkStackInput struct { - NetworkID string `json:"networkID,omitempty"` - VerifierAddress string `json:"verifierAddress,omitempty"` - VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"` - RewardBankAddress string `json:"rewardBankAddress,omitempty"` - FeeManagerAddress string `json:"feeManagerAddress,omitempty"` - MercuryServerURL string `json:"mercuryServerURL,omitempty"` - MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"` - Servers *string `json:"servers,omitempty"` -} - -type ImportMercuryV03NetworkStackPayload struct { - NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ImportOCR3CapabilityInput struct { - CategoryID string `json:"categoryID,omitempty"` - NetworkID string `json:"networkID,omitempty"` - Template string `json:"template,omitempty"` -} - -type ImportOCR3CapabilityPayload struct { - Ocr3Capability *OCR3Capability `json:"ocr3Capability,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type ImportProxyInput struct { - ContractAddress string `json:"contractAddress,omitempty"` - AccessControllerAddress *string `json:"accessControllerAddress,omitempty"` - AggregatorAddress string `json:"aggregatorAddress,omitempty"` -} - -type ImportTokenPoolInput struct { - ID string `json:"id,omitempty"` - Template string `json:"template,omitempty"` -} - -type ImportTokenPoolPayload struct { - Errors []Error `json:"errors,omitempty"` - Chain *CCIPChain `json:"chain,omitempty"` -} - -type Job struct { - ID string `json:"id,omitempty"` - UUID string `json:"uuid,omitempty"` - Type JobType `json:"type,omitempty"` - Ocr2PluginType *OCR2PluginType `json:"ocr2PluginType,omitempty"` - Status JobStatus `json:"status,omitempty"` - NodeOperator *NodeOperator `json:"nodeOperator,omitempty"` - Node *Node `json:"node,omitempty"` - IsBootstrap bool `json:"isBootstrap,omitempty"` - Config JobConfig `json:"config,omitempty"` - Spec *string `json:"spec,omitempty"` - ProposalChanged bool `json:"proposalChanged,omitempty"` - AssignableNodes []*Node `json:"assignableNodes,omitempty"` - CanPropose bool `json:"canPropose,omitempty"` - CanRevoke bool `json:"canRevoke,omitempty"` - Proposals []*JobProposal `json:"proposals,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type JobBasic struct { - ID string `json:"id,omitempty"` - UUID string `json:"uuid,omitempty"` - Type JobType `json:"type,omitempty"` - Ocr2PluginType *OCR2PluginType `json:"ocr2PluginType,omitempty"` - Status JobStatus `json:"status,omitempty"` - IsBootstrap bool `json:"isBootstrap,omitempty"` -} - -type JobConfigEmpty struct { - Empty bool `json:"_empty,omitempty"` -} - -func (JobConfigEmpty) IsJobConfig() {} - -type JobConfigEmptyInput struct { - Empty *bool `json:"_empty,omitempty"` -} - -type JobConfigInput struct { - Ocr1 *JobConfigOCR1Input `json:"ocr1,omitempty"` - Ocr2Median *JobConfigOCR2MedianInput `json:"ocr2Median,omitempty"` - Ocr2Mercury *JobConfigOCR2MercuryInput `json:"ocr2Mercury,omitempty"` - Ocr2CCIPCommit *JobConfigEmptyInput `json:"ocr2CCIPCommit,omitempty"` - Ocr2CCIPExecution *JobConfigEmptyInput `json:"ocr2CCIPExecution,omitempty"` - Ocr2CCIPRebalancer *JobConfigEmptyInput `json:"ocr2CCIPRebalancer,omitempty"` -} - -type JobConfigOcr1 struct { - Apis []string `json:"apis,omitempty"` -} - -func (JobConfigOcr1) IsJobConfig() {} - -type JobConfigOCR1Input struct { - Apis []string `json:"apis,omitempty"` -} - -type JobConfigOCR2Median struct { - Apis []string `json:"apis,omitempty"` -} - -func (JobConfigOCR2Median) IsJobConfig() {} - -type JobConfigOCR2MedianInput struct { - Apis []string `json:"apis,omitempty"` -} - -type JobConfigOCR2Mercury struct { - Apis []string `json:"apis,omitempty"` -} - -func (JobConfigOCR2Mercury) IsJobConfig() {} - -type JobConfigOCR2MercuryInput struct { - Apis []string `json:"apis,omitempty"` - CrossApis []string `json:"crossApis,omitempty"` -} - -type JobProposal struct { - ID string `json:"id,omitempty"` - Version string `json:"version,omitempty"` - Status JobProposalStatus `json:"status,omitempty"` - Spec string `json:"spec,omitempty"` - Job *Job `json:"job,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - UpdatedAt Time `json:"updatedAt,omitempty"` - ProposedAt *Time `json:"proposedAt,omitempty"` - ResponseReceivedAt *Time `json:"responseReceivedAt,omitempty"` -} - -type KeystoneWorkflow struct { - ID string `json:"id,omitempty"` - WorkflowSpec string `json:"workflowSpec,omitempty"` - WorkflowOwner string `json:"workflowOwner,omitempty"` - ExternalWorkflowID string `json:"externalWorkflowID,omitempty"` - Don *Don `json:"don,omitempty"` - Name string `json:"name,omitempty"` - Category *Category `json:"category,omitempty"` -} - -type KeystoneWorkflowMutations struct { - ImportWorkflow *ImportKeystoneWorkflowPayload `json:"importWorkflow,omitempty"` - UpdateWorkflow *UpdateKeystoneWorkflowPayload `json:"updateWorkflow,omitempty"` -} - -type KeystoneWorkflowQueries struct { - Workflow *KeystoneWorkflow `json:"workflow,omitempty"` - Workflows []*KeystoneWorkflow `json:"workflows,omitempty"` -} - -type ListAggregatorsFilter struct { - NetworkID *string `json:"networkID,omitempty"` - ContractAddress *string `json:"contractAddress,omitempty"` -} - -type ListRelayersFilter struct { - Enabled *bool `json:"enabled,omitempty"` -} - -type ListWebhookCallsFilter struct { - State *WebhookCallState `json:"state,omitempty"` -} - -type LoginInput struct { - Email string `json:"email,omitempty"` - Password string `json:"password,omitempty"` -} - -type LoginPayload struct { - Session *Session `json:"session,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type LogoutPayload struct { - Session *Session `json:"session,omitempty"` -} - -type MarkStaleJobsInput struct { - Ids []string `json:"ids,omitempty"` -} - -type MarkStaleJobsPayload struct { - Jobs []*Job `json:"jobs,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type MercuryFeed struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - ExternalFeedID string `json:"externalFeedID,omitempty"` - NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"` - FromBlock string `json:"fromBlock,omitempty"` - Template string `json:"template,omitempty"` - Don *Don `json:"don,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - UpdatedAt Time `json:"updatedAt,omitempty"` -} - -type MercuryFeedsFilters struct { - Name *string `json:"name,omitempty"` - NetworkID *string `json:"networkID,omitempty"` - VerifierProxyAddress *string `json:"verifierProxyAddress,omitempty"` - Limit *string `json:"limit,omitempty"` - Offset *string `json:"offset,omitempty"` -} - -type MercuryFeedsInput struct { - Filter *MercuryFeedsFilters `json:"filter,omitempty"` -} - -type MercuryMutations struct { - CreateNetworkStack *CreateMercuryNetworkStackPayload `json:"createNetworkStack,omitempty"` - ImportFeed *ImportMercuryFeedPayload `json:"importFeed,omitempty"` - UpdateFeed *UpdateMercuryFeedPayload `json:"updateFeed,omitempty"` - UpdateNetworkStack *UpdateMercuryNetworkStackPayload `json:"updateNetworkStack,omitempty"` -} - -type MercuryNetworkStack struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - VerifierAddress string `json:"verifierAddress,omitempty"` - VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"` - ServerURL string `json:"serverURL,omitempty"` - ServerPublicKey string `json:"serverPublicKey,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - UpdatedAt Time `json:"updatedAt,omitempty"` - Servers []*MercuryServer `json:"servers,omitempty"` -} - -type MercuryQueries struct { - NetworkStacks []*MercuryNetworkStack `json:"networkStacks,omitempty"` - NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"` - Feed *MercuryFeed `json:"feed,omitempty"` - Feeds []*MercuryFeed `json:"feeds,omitempty"` -} - -type MercuryServer struct { - URL string `json:"url,omitempty"` - PublicKey string `json:"publicKey,omitempty"` -} - -type MercuryV03Feed struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - ExternalFeedID string `json:"externalFeedID,omitempty"` - Verifiers []*MercuryV03Verifier `json:"verifiers,omitempty"` - ReportSchemaVersion ReportSchemaVersion `json:"reportSchemaVersion,omitempty"` - Template string `json:"template,omitempty"` - Don *Don `json:"don,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - UpdatedAt Time `json:"updatedAt,omitempty"` - ArchivedAt *Time `json:"archivedAt,omitempty"` - Category *Category `json:"category,omitempty"` -} - -type MercuryV03FeedFilter struct { - IsArchived *bool `json:"isArchived,omitempty"` - TransmitToServer *bool `json:"transmitToServer,omitempty"` -} - -type MercuryV03Mutations struct { - ArchiveFeed *ArchiveFeedPayload `json:"archiveFeed,omitempty"` - ArchiveNetworkStack *ArchiveNetworkStackPayload `json:"archiveNetworkStack,omitempty"` - AddVerificationProvider *AddVerificationProviderPayload `json:"addVerificationProvider,omitempty"` - RemoveVerificationProvider *RemoveVerificationProviderPayload `json:"removeVerificationProvider,omitempty"` - AddNetworkStack *AddMercuryV03NetworkStackPayload `json:"addNetworkStack,omitempty"` - DeployNetworkStack *DeployMercuryV03NetworkStackPayload `json:"deployNetworkStack,omitempty"` - ImportFeed *ImportMercuryV03FeedPayload `json:"importFeed,omitempty"` - ImportNetworkStack *ImportMercuryV03NetworkStackPayload `json:"importNetworkStack,omitempty"` - TransferOwnership *TransferOwnershipPayload `json:"transferOwnership,omitempty"` - UpdateNetworkStack *UpdateMercuryV03NetworkStackPayload `json:"updateNetworkStack,omitempty"` - UpdateFeed *UpdateMercuryV03FeedPayload `json:"updateFeed,omitempty"` - VerifyContract *VerifyMercuryV03ContractPayload `json:"verifyContract,omitempty"` -} - -type MercuryV03NetworkStack struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - Status NetworkStackStatus `json:"status,omitempty"` - VerifierAddress *string `json:"verifierAddress,omitempty"` - VerifierProxyAddress *string `json:"verifierProxyAddress,omitempty"` - RewardBankAddress *string `json:"rewardBankAddress,omitempty"` - FeeManagerAddress *string `json:"feeManagerAddress,omitempty"` - MercuryServerURL string `json:"mercuryServerURL,omitempty"` - MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"` - Contracts []*Contract `json:"contracts,omitempty"` - WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - UpdatedAt Time `json:"updatedAt,omitempty"` - ArchivedAt *Time `json:"archivedAt,omitempty"` - Servers []*MercuryServer `json:"servers,omitempty"` -} - -type MercuryV03NetworkStackFilter struct { - IsArchived *bool `json:"isArchived,omitempty"` -} - -type MercuryV03Queries struct { - NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"` - NetworkStacks []*MercuryV03NetworkStack `json:"networkStacks,omitempty"` - Feed *MercuryV03Feed `json:"feed,omitempty"` - Feeds []*MercuryV03Feed `json:"feeds,omitempty"` -} - -type MercuryV03Verifier struct { - ID string `json:"id,omitempty"` - NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"` - NetworkStackType NetworkStackType `json:"networkStackType,omitempty"` -} - -type Mutation struct { -} - -type Network struct { - ID string `json:"id,omitempty"` - ChainID string `json:"chainID,omitempty"` - ChainType ChainType `json:"chainType,omitempty"` - Name string `json:"name,omitempty"` - NativeToken string `json:"nativeToken,omitempty"` - Archived bool `json:"archived,omitempty"` - NativeTokenContractAddress *string `json:"nativeTokenContractAddress,omitempty"` - ConfigContractAddress *string `json:"configContractAddress,omitempty"` - LinkUSDProxyAddress *string `json:"linkUSDProxyAddress,omitempty"` - NativeUSDProxyAddress *string `json:"nativeUSDProxyAddress,omitempty"` - LinkContractAddress *string `json:"linkContractAddress,omitempty"` - FlagsContractAddress *string `json:"flagsContractAddress,omitempty"` - LinkFunding string `json:"linkFunding,omitempty"` - BillingAdminAccessControllerAddress *string `json:"billingAdminAccessControllerAddress,omitempty"` - RequesterAdminAccessControllerAddress *string `json:"requesterAdminAccessControllerAddress,omitempty"` - IconName *string `json:"iconName,omitempty"` - ExplorerURL *string `json:"explorerURL,omitempty"` - Relayers []*Relayer `json:"relayers,omitempty"` - Vaults []*Vault `json:"vaults,omitempty"` - ExplorerAPIKey *string `json:"explorerAPIKey,omitempty"` - ExplorerAPIURL *string `json:"explorerAPIURL,omitempty"` -} - -type NetworksFilters struct { - Archived *bool `json:"archived,omitempty"` - ChainID *string `json:"chainID,omitempty"` - ChainType *ChainType `json:"chainType,omitempty"` - Name *string `json:"name,omitempty"` -} - -type NetworksInput struct { - Filter *NetworksFilters `json:"filter,omitempty"` -} - -type Node struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - PublicKey *string `json:"publicKey,omitempty"` - ChainConfigs []*NodeChainConfig `json:"chainConfigs,omitempty"` - Connected bool `json:"connected,omitempty"` - Enabled bool `json:"enabled,omitempty"` - Metadata *NodeMetadata `json:"metadata,omitempty"` - NodeOperator *NodeOperator `json:"nodeOperator,omitempty"` - Version *string `json:"version,omitempty"` - SupportedProducts []ProductType `json:"supportedProducts,omitempty"` - Categories []*Category `json:"categories,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type NodeChainConfig struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - AccountAddress string `json:"accountAddress,omitempty"` - AdminAddress string `json:"adminAddress,omitempty"` - Ocr1Config *NodeOCR1Config `json:"ocr1Config,omitempty"` - Ocr1BootstrapVerified bool `json:"ocr1BootstrapVerified,omitempty"` - Ocr2Config *NodeOCR2Config `json:"ocr2Config,omitempty"` - Ocr2BootstrapVerified bool `json:"ocr2BootstrapVerified,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type NodeConnectionInfo struct { - PublicKey string `json:"publicKey,omitempty"` - RPCURL string `json:"rpcURL,omitempty"` -} - -type NodeMetadata struct { - JobCount int `json:"jobCount,omitempty"` -} - -type NodeOCR1Config struct { - Enabled bool `json:"enabled,omitempty"` - IsBootstrap bool `json:"isBootstrap,omitempty"` - Multiaddr *string `json:"multiaddr,omitempty"` - P2pKeyBundle *NodeOCR1ConfigP2PKeyBundle `json:"p2pKeyBundle,omitempty"` - OcrKeyBundle *NodeOCR1ConfigOCRKeyBundle `json:"ocrKeyBundle,omitempty"` -} - -type NodeOCR1ConfigOCRKeyBundle struct { - BundleID string `json:"bundleID,omitempty"` - ConfigPublicKey string `json:"configPublicKey,omitempty"` - OffchainPublicKey string `json:"offchainPublicKey,omitempty"` - OnchainSigningAddress string `json:"onchainSigningAddress,omitempty"` -} - -type NodeOCR1ConfigP2PKeyBundle struct { - PeerID string `json:"peerID,omitempty"` - PublicKey string `json:"publicKey,omitempty"` -} - -type NodeOCR2Config struct { - Enabled bool `json:"enabled,omitempty"` - IsBootstrap bool `json:"isBootstrap,omitempty"` - Multiaddr *string `json:"multiaddr,omitempty"` - ForwarderAddress *string `json:"forwarderAddress,omitempty"` - P2pKeyBundle *NodeOCR2ConfigP2PKeyBundle `json:"p2pKeyBundle,omitempty"` - OcrKeyBundle *NodeOCR2ConfigOCRKeyBundle `json:"ocrKeyBundle,omitempty"` - Plugins *NodeOCR2ConfigPlugins `json:"plugins,omitempty"` -} - -type NodeOCR2ConfigOCRKeyBundle struct { - BundleID string `json:"bundleID,omitempty"` - ConfigPublicKey string `json:"configPublicKey,omitempty"` - OffchainPublicKey string `json:"offchainPublicKey,omitempty"` - OnchainSigningAddress string `json:"onchainSigningAddress,omitempty"` -} - -type NodeOCR2ConfigP2PKeyBundle struct { - PeerID string `json:"peerID,omitempty"` - PublicKey string `json:"publicKey,omitempty"` -} - -type NodeOCR2ConfigPlugins struct { - CcipCommit bool `json:"ccipCommit,omitempty"` - CcipExecution bool `json:"ccipExecution,omitempty"` - CcipRebalancer bool `json:"ccipRebalancer,omitempty"` - Median bool `json:"median,omitempty"` - Mercury bool `json:"mercury,omitempty"` -} - -type NodeOperator struct { - ID string `json:"id,omitempty"` - Keys []string `json:"keys,omitempty"` - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - Website string `json:"website,omitempty"` - Metadata *NodeOperatorMetadata `json:"metadata,omitempty"` - Nodes []*Node `json:"nodes,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type NodeOperatorMetadata struct { - NodeCount int `json:"nodeCount,omitempty"` - JobCount int `json:"jobCount,omitempty"` -} - -type NodesFilters struct { - NetworkID *string `json:"networkID,omitempty"` -} - -type NodesInput struct { - Filter *NodesFilters `json:"filter,omitempty"` -} - -type OCR3Capability struct { - ID string `json:"id,omitempty"` - ContractAddress string `json:"contractAddress,omitempty"` - Name string `json:"name,omitempty"` - BootstrapMultiaddrs []string `json:"bootstrapMultiaddrs,omitempty"` - Template string `json:"template,omitempty"` - Category *Category `json:"category,omitempty"` - Don *Don `json:"don,omitempty"` -} - -type OCR3CapabilityMutations struct { - ImportOCR3Capability *ImportOCR3CapabilityPayload `json:"importOCR3Capability,omitempty"` - UpdateOCR3Capability *UpdateOCR3CapabilityPayload `json:"updateOCR3Capability,omitempty"` -} - -type OCR3CapabilityQueries struct { - Ocr3Capability *OCR3Capability `json:"ocr3Capability,omitempty"` - Ocr3Capabilities []*OCR3Capability `json:"ocr3Capabilities,omitempty"` -} - -type PriceFeed struct { - AggregatorAddress string `json:"aggregatorAddress,omitempty"` - Multiplier string `json:"multiplier,omitempty"` -} - -type Profile struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - Role UserRole `json:"role,omitempty"` - Permits []string `json:"permits,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type ProposeJobInput struct { - ID string `json:"id,omitempty"` -} - -type ProposeJobPayload struct { - Job *Job `json:"job,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Query struct { -} - -type ReadAccessController struct { - Address string `json:"address,omitempty"` -} - -type Relayer struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - URL *URL `json:"url,omitempty"` - Config string `json:"config,omitempty"` - IsEnabled bool `json:"isEnabled,omitempty"` - Network *Network `json:"network,omitempty"` - Accounts []*RelayerAccount `json:"accounts,omitempty"` -} - -type RelayerAccount struct { - ID string `json:"id,omitempty"` - Relayer *Relayer `json:"relayer,omitempty"` - Address string `json:"address,omitempty"` - NativeBalance string `json:"nativeBalance,omitempty"` - LinkBalance string `json:"linkBalance,omitempty"` -} - -type RelayerURL struct { - Websocket string `json:"websocket,omitempty"` - HTTP string `json:"http,omitempty"` -} - -type RemoveLiquidityInput struct { - ChainID string `json:"chainID,omitempty"` - TokenPoolContractID string `json:"tokenPoolContractID,omitempty"` - Amount string `json:"amount,omitempty"` -} - -type RemoveLiquidityPayload struct { - Errors []Error `json:"errors,omitempty"` - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` -} - -type RemoveVerificationProviderInput struct { - FeedID string `json:"feedID,omitempty"` - NetworkStackID string `json:"networkStackID,omitempty"` -} - -type RemoveVerificationProviderPayload struct { - Feed *MercuryV03Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type RetryActionRunInput struct { - ActionRunID string `json:"actionRunID,omitempty"` -} - -type RetryActionRunPayload struct { - Status ActionRunStatus `json:"status,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type RetryWebhookCallInput struct { - WebhookCallID string `json:"webhookCallID,omitempty"` -} - -type RetryWebhookCallPayload struct { - WebhookCall *WebhookCall `json:"webhookCall,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type RevokeJobInput struct { - ID string `json:"id,omitempty"` -} - -type RevokeJobPayload struct { - Job *Job `json:"job,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Role struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Permits []string `json:"permits,omitempty"` -} - -type RunCCIPCommandInput struct { - Command CCIPCommand `json:"command,omitempty"` - LaneLegID string `json:"laneLegID,omitempty"` - Upgrade *bool `json:"upgrade,omitempty"` -} - -type RunCCIPCommandPayload struct { - Errors []Error `json:"errors,omitempty"` - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` -} - -type SendTestWebhookEventInput struct { - WebhookID string `json:"webhookID,omitempty"` -} - -type SendTestWebhookEventPayload struct { - WebhookCall *WebhookCall `json:"webhookCall,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Session struct { - ID string `json:"id,omitempty"` - Token string `json:"token,omitempty"` - ExpiresAt Time `json:"expiresAt,omitempty"` - Revoked bool `json:"revoked,omitempty"` - Permits []string `json:"permits,omitempty"` -} - -type SetAllowListTokenPoolInput struct { - ChainID string `json:"chainID,omitempty"` - TokenPoolContractID string `json:"tokenPoolContractID,omitempty"` - AllowList []string `json:"allowList,omitempty"` -} - -type SetAllowListTokenPoolPayload struct { - Errors []Error `json:"errors,omitempty"` - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` -} - -type SetPasswordInput struct { - UserID string `json:"userID,omitempty"` - Password string `json:"password,omitempty"` -} - -type SetPasswordPayload struct { - Errors []Error `json:"errors,omitempty"` -} - -type SetupAppInput struct { - Token string `json:"token,omitempty"` - Email string `json:"email,omitempty"` - Name string `json:"name,omitempty"` - Password string `json:"password,omitempty"` -} - -type SetupAppPayload struct { - Errors []Error `json:"errors,omitempty"` -} - -type SpecConfigOffChainReporting1 struct { - Decimals int `json:"decimals,omitempty"` -} - -func (SpecConfigOffChainReporting1) IsAggregatorSpecConfig() {} - -type SpecConfigOffChainReporting2 struct { - Decimals int `json:"decimals,omitempty"` -} - -func (SpecConfigOffChainReporting2) IsAggregatorSpecConfig() {} - -type StorageContract struct { - ID string `json:"id,omitempty"` - Network *Network `json:"network,omitempty"` - DisplayName *string `json:"displayName,omitempty"` - Template string `json:"template,omitempty"` - Contract *Contract `json:"contract,omitempty"` - WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"` -} - -type StorageContractFilter struct { - NetworkID *string `json:"networkID,omitempty"` -} - -// Grouping of all mutations related to the Storage contract resource. -type StorageMutations struct { - // addStorageContract adds a new storage contract to the database and creates - // a single new resource. - AddStorageContract *AddStorageContractPayload `json:"addStorageContract,omitempty"` - // deploySetStorageContract deploys a new storage contract to the network and - // sets the value on chain to the value provided from the template of the storage. - DeploySetStorageContract *DeploySetStorageContractPayload `json:"deploySetStorageContract,omitempty"` -} - -// Grouping of all queries related to the Storage contract resource. -type StorageQueries struct { - StorageContracts []*StorageContract `json:"storageContracts,omitempty"` - StorageContract *StorageContract `json:"storageContract,omitempty"` -} - -type SyncAggregatorInput struct { - ID string `json:"id,omitempty"` -} - -type SyncAggregatorPayload struct { - Aggregator *Aggregator `json:"aggregator,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type SyncAggregatorProxyInput struct { - ID string `json:"id,omitempty"` -} - -type SyncAggregatorProxyPayload struct { - AggregatorProxy *AggregatorProxy `json:"aggregatorProxy,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type SyncChainInput struct { - ChainID string `json:"chainID,omitempty"` -} - -type SyncChainPayload struct { - Chain *CCIPChain `json:"chain,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type SyncContractsInput struct { - ContractIDs []string `json:"contractIDs,omitempty"` -} - -type SyncContractsPayload struct { - Contracts []*Contract `json:"contracts,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type SyncLaneInput struct { - LaneID string `json:"laneID,omitempty"` -} - -type SyncLanePayload struct { - Lane *CCIPLane `json:"lane,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Task struct { - Name string `json:"name,omitempty"` - Run *TaskRun `json:"run,omitempty"` -} - -type TaskRun struct { - ID string `json:"id,omitempty"` - Input string `json:"input,omitempty"` - Output string `json:"output,omitempty"` - Status TaskRunStatus `json:"status,omitempty"` - Error *string `json:"error,omitempty"` - TxHash *string `json:"txHash,omitempty"` -} - -type Token struct { - Symbol string `json:"symbol,omitempty"` - Address string `json:"address,omitempty"` -} - -type TransferAdminRoleInput struct { - TokenAdminRegistryID string `json:"tokenAdminRegistryID,omitempty"` - TokenPoolID string `json:"tokenPoolID,omitempty"` - VaultID string `json:"vaultID,omitempty"` -} - -type TransferAdminRolePayload struct { - Errors []Error `json:"errors,omitempty"` - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` -} - -type TransferOwnershipInput struct { - ContractIDs []string `json:"contractIDs,omitempty"` - VaultID string `json:"vaultID,omitempty"` -} - -type TransferOwnershipPayload struct { - Errors []Error `json:"errors,omitempty"` - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` -} - -type URL struct { - Websocket string `json:"websocket,omitempty"` - HTTP *string `json:"http,omitempty"` -} - -type UnarchiveNetworkInput struct { - ID string `json:"id,omitempty"` -} - -type UnarchiveNetworkPayload struct { - Network *Network `json:"network,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateAggregatorDetailsInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - CategoryID string `json:"categoryID,omitempty"` -} - -type UpdateAggregatorDetailsPayload struct { - Aggregator *Aggregator `json:"aggregator,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateAggregatorInput struct { - ID string `json:"id,omitempty"` - AggregatorTemplate *string `json:"aggregatorTemplate,omitempty"` -} - -type UpdateAggregatorPayload struct { - Aggregator *Aggregator `json:"aggregator,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateAggregatorProxyInput struct { - ID string `json:"id,omitempty"` - ContractAddress string `json:"contractAddress,omitempty"` -} - -type UpdateAggregatorProxyPayload struct { - ID string `json:"id,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateCCIPChainInput struct { - ID string `json:"id,omitempty"` - Template string `json:"template,omitempty"` -} - -type UpdateCCIPChainPayload struct { - Chain *CCIPChain `json:"chain,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateCategoryInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Color *string `json:"color,omitempty"` -} - -type UpdateCategoryPayload struct { - Category *Category `json:"category,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateFeedInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` -} - -type UpdateFeedPayload struct { - Feed *Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateKeystoneWorkflowInput struct { - ID string `json:"id,omitempty"` - Template string `json:"template,omitempty"` - CategoryID string `json:"categoryID,omitempty"` -} - -type UpdateKeystoneWorkflowPayload struct { - Workflow *KeystoneWorkflow `json:"workflow,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateLaneInput struct { - Template *string `json:"template,omitempty"` - UpdateStartBlocks *bool `json:"updateStartBlocks,omitempty"` - LegA *CCIPLaneChainUpdateInput `json:"legA,omitempty"` - LegB *CCIPLaneChainUpdateInput `json:"legB,omitempty"` -} - -type UpdateLanePayload struct { - Errors []Error `json:"errors,omitempty"` - Lane *CCIPLane `json:"lane,omitempty"` -} - -type UpdateMercuryFeedInput struct { - ID string `json:"id,omitempty"` - FromBlock string `json:"fromBlock,omitempty"` - Template *string `json:"template,omitempty"` -} - -type UpdateMercuryFeedPayload struct { - Feed *MercuryFeed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateMercuryNetworkStackInput struct { - ID string `json:"id,omitempty"` - VerifierAddress string `json:"verifierAddress,omitempty"` - VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"` - ServerURL string `json:"serverURL,omitempty"` - ServerPublicKey string `json:"serverPublicKey,omitempty"` - Servers *string `json:"servers,omitempty"` -} - -type UpdateMercuryNetworkStackPayload struct { - NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateMercuryV03FeedInput struct { - ID string `json:"id,omitempty"` - Template string `json:"template,omitempty"` - CategoryID string `json:"categoryID,omitempty"` -} - -type UpdateMercuryV03FeedPayload struct { - Feed *MercuryV03Feed `json:"feed,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateMercuryV03NetworkStackInput struct { - ID string `json:"id,omitempty"` - VerifierAddress string `json:"verifierAddress,omitempty"` - VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"` - RewardBankAddress string `json:"rewardBankAddress,omitempty"` - FeeManagerAddress string `json:"feeManagerAddress,omitempty"` - MercuryServerURL string `json:"mercuryServerURL,omitempty"` - MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"` - Servers *string `json:"servers,omitempty"` -} - -type UpdateMercuryV03NetworkStackPayload struct { - NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateNetworkInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - NativeToken string `json:"nativeToken,omitempty"` - NativeTokenContractAddress *string `json:"nativeTokenContractAddress,omitempty"` - ConfigContractAddress *string `json:"configContractAddress,omitempty"` - LinkUSDProxyAddress *string `json:"linkUSDProxyAddress,omitempty"` - NativeUSDProxyAddress *string `json:"nativeUSDProxyAddress,omitempty"` - LinkContractAddress *string `json:"linkContractAddress,omitempty"` - FlagsContractAddress *string `json:"flagsContractAddress,omitempty"` - LinkFunding *string `json:"linkFunding,omitempty"` - BillingAdminAccessControllerAddress *string `json:"billingAdminAccessControllerAddress,omitempty"` - RequesterAdminAccessControllerAddress *string `json:"requesterAdminAccessControllerAddress,omitempty"` - ExplorerAPIKey *string `json:"explorerAPIKey,omitempty"` - ExplorerAPIURL *string `json:"explorerAPIURL,omitempty"` -} - -type UpdateNetworkPayload struct { - Network *Network `json:"network,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateNodeInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - PublicKey string `json:"publicKey,omitempty"` - SupportedCategoryIDs []string `json:"supportedCategoryIDs,omitempty"` - SupportedProducts []ProductType `json:"supportedProducts,omitempty"` -} - -type UpdateNodeOperatorInput struct { - ID string `json:"id,omitempty"` - Keys []string `json:"keys,omitempty"` - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - Website string `json:"website,omitempty"` -} - -type UpdateNodeOperatorPayload struct { - NodeOperator *NodeOperator `json:"nodeOperator,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateNodePayload struct { - Node *Node `json:"node,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateOCR3CapabilityInput struct { - ID string `json:"id,omitempty"` - Template string `json:"template,omitempty"` - CategoryID string `json:"categoryID,omitempty"` -} - -type UpdateOCR3CapabilityPayload struct { - Ocr3Capability *OCR3Capability `json:"ocr3Capability,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdatePasswordInput struct { - OldPassword string `json:"oldPassword,omitempty"` - NewPassword string `json:"newPassword,omitempty"` -} - -type UpdatePasswordPayload struct { - Errors []Error `json:"errors,omitempty"` -} - -type UpdateProfileInput struct { - Name string `json:"name,omitempty"` -} - -type UpdateProfilePayload struct { - Profile *Profile `json:"profile,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateRelayerInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - URL *RelayerURL `json:"url,omitempty"` - Config string `json:"config,omitempty"` -} - -type UpdateRelayerPayload struct { - Relayer *Relayer `json:"relayer,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateUserInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - Role UserRole `json:"role,omitempty"` -} - -type UpdateUserPayload struct { - User *User `json:"user,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateVaultInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Address string `json:"address,omitempty"` - SupportedProducts []ProductType `json:"supportedProducts,omitempty"` -} - -type UpdateVaultPayload struct { - Vault *Vault `json:"vault,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type UpdateWebhookInput struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - EndpointURL string `json:"endpointURL,omitempty"` - Enabled bool `json:"enabled,omitempty"` -} - -type UpdateWebhookPayload struct { - Webhook *Webhook `json:"webhook,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type User struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - Role UserRole `json:"role,omitempty"` - Disabled bool `json:"disabled,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` -} - -type Vault struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - Address string `json:"address,omitempty"` - Type VaultType `json:"type,omitempty"` - SupportedProducts []ProductType `json:"supportedProducts,omitempty"` - Network *Network `json:"network,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - UpdatedAt Time `json:"updatedAt,omitempty"` -} - -type VaultsFilters struct { - Type *VaultType `json:"type,omitempty"` -} - -type VaultsInput struct { - Filter *VaultsFilters `json:"filter,omitempty"` -} - -type VerifyMercuryV03ContractInput struct { - ContractIDs []string `json:"contractIDs,omitempty"` -} - -type VerifyMercuryV03ContractPayload struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Errors []Error `json:"errors,omitempty"` -} - -type Webhook struct { - ID string `json:"id,omitempty"` - Name string `json:"name,omitempty"` - EndpointURL string `json:"endpointURL,omitempty"` - SecretKey string `json:"secretKey,omitempty"` - Enabled bool `json:"enabled,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - UpdatedAt Time `json:"updatedAt,omitempty"` -} - -type WebhookCall struct { - ID string `json:"id,omitempty"` - UUID string `json:"uuid,omitempty"` - Type string `json:"type,omitempty"` - State string `json:"state,omitempty"` - Payload string `json:"payload,omitempty"` - Attempts []*WebhookCallAttempt `json:"attempts,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - DeliveredAt *Time `json:"deliveredAt,omitempty"` -} - -type WebhookCallAttempt struct { - ID string `json:"id,omitempty"` - StatusCode int `json:"statusCode,omitempty"` - Timestamp Time `json:"timestamp,omitempty"` -} - -type WorkflowRun struct { - ID string `json:"id,omitempty"` - WorkflowType WorkflowType `json:"workflowType,omitempty"` - Status WorkflowRunStatus `json:"status,omitempty"` - User *User `json:"user,omitempty"` - AccountAddress *string `json:"accountAddress,omitempty"` - Actions []*Action `json:"actions,omitempty"` - CreatedAt Time `json:"createdAt,omitempty"` - Name *string `json:"name,omitempty"` - DeletedAt *Time `json:"deletedAt,omitempty"` -} - -type WorkflowRunAndContract struct { - WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"` - Contract *Contract `json:"contract,omitempty"` -} - -type WorkflowRunsFilters struct { - UserID *string `json:"userID,omitempty"` -} - -type WorkflowRunsInput struct { - Filter *WorkflowRunsFilters `json:"filter,omitempty"` -} - -type ActionRunStatus string - -const ( - ActionRunStatusPending ActionRunStatus = "PENDING" - ActionRunStatusInProgress ActionRunStatus = "IN_PROGRESS" - ActionRunStatusCompleted ActionRunStatus = "COMPLETED" - ActionRunStatusErrored ActionRunStatus = "ERRORED" -) - -var AllActionRunStatus = []ActionRunStatus{ - ActionRunStatusPending, - ActionRunStatusInProgress, - ActionRunStatusCompleted, - ActionRunStatusErrored, -} - -func (e ActionRunStatus) IsValid() bool { - switch e { - case ActionRunStatusPending, ActionRunStatusInProgress, ActionRunStatusCompleted, ActionRunStatusErrored: - return true - } - return false -} - -func (e ActionRunStatus) String() string { - return string(e) -} - -func (e *ActionRunStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ActionRunStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ActionRunStatus", str) - } - return nil -} - -func (e ActionRunStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type ActionType string - -const ( - ActionTypeGeneric ActionType = "GENERIC" -) - -var AllActionType = []ActionType{ - ActionTypeGeneric, -} - -func (e ActionType) IsValid() bool { - switch e { - case ActionTypeGeneric: - return true - } - return false -} - -func (e ActionType) String() string { - return string(e) -} - -func (e *ActionType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ActionType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ActionType", str) - } - return nil -} - -func (e ActionType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type CCIPCommand string - -const ( - CCIPCommandSetConfig CCIPCommand = "SET_CONFIG" -) - -var AllCCIPCommand = []CCIPCommand{ - CCIPCommandSetConfig, -} - -func (e CCIPCommand) IsValid() bool { - switch e { - case CCIPCommandSetConfig: - return true - } - return false -} - -func (e CCIPCommand) String() string { - return string(e) -} - -func (e *CCIPCommand) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = CCIPCommand(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid CCIPCommand", str) - } - return nil -} - -func (e CCIPCommand) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type CCIPJobType string - -const ( - CCIPJobTypeCommit CCIPJobType = "COMMIT" - CCIPJobTypeExecute CCIPJobType = "EXECUTE" - CCIPJobTypeBootstrap CCIPJobType = "BOOTSTRAP" -) - -var AllCCIPJobType = []CCIPJobType{ - CCIPJobTypeCommit, - CCIPJobTypeExecute, - CCIPJobTypeBootstrap, -} - -func (e CCIPJobType) IsValid() bool { - switch e { - case CCIPJobTypeCommit, CCIPJobTypeExecute, CCIPJobTypeBootstrap: - return true - } - return false -} - -func (e CCIPJobType) String() string { - return string(e) -} - -func (e *CCIPJobType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = CCIPJobType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid CCIPJobType", str) - } - return nil -} - -func (e CCIPJobType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type CCIPLaneLegStatus string - -const ( - CCIPLaneLegStatusDraft CCIPLaneLegStatus = "DRAFT" - CCIPLaneLegStatusReady CCIPLaneLegStatus = "READY" -) - -var AllCCIPLaneLegStatus = []CCIPLaneLegStatus{ - CCIPLaneLegStatusDraft, - CCIPLaneLegStatusReady, -} - -func (e CCIPLaneLegStatus) IsValid() bool { - switch e { - case CCIPLaneLegStatusDraft, CCIPLaneLegStatusReady: - return true - } - return false -} - -func (e CCIPLaneLegStatus) String() string { - return string(e) -} - -func (e *CCIPLaneLegStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = CCIPLaneLegStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid CCIPLaneLegStatus", str) - } - return nil -} - -func (e CCIPLaneLegStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type CCIPLaneLegTag string - -const ( - CCIPLaneLegTagMain CCIPLaneLegTag = "MAIN" - CCIPLaneLegTagProvisional CCIPLaneLegTag = "PROVISIONAL" - CCIPLaneLegTagDead CCIPLaneLegTag = "DEAD" -) - -var AllCCIPLaneLegTag = []CCIPLaneLegTag{ - CCIPLaneLegTagMain, - CCIPLaneLegTagProvisional, - CCIPLaneLegTagDead, -} - -func (e CCIPLaneLegTag) IsValid() bool { - switch e { - case CCIPLaneLegTagMain, CCIPLaneLegTagProvisional, CCIPLaneLegTagDead: - return true - } - return false -} - -func (e CCIPLaneLegTag) String() string { - return string(e) -} - -func (e *CCIPLaneLegTag) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = CCIPLaneLegTag(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid CCIPLaneLegTag", str) - } - return nil -} - -func (e CCIPLaneLegTag) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type ChainType string - -const ( - ChainTypeEvm ChainType = "EVM" - ChainTypeSolana ChainType = "SOLANA" - ChainTypeStarknet ChainType = "STARKNET" - ChainTypeAptos ChainType = "APTOS" - -) - -var AllChainType = []ChainType{ - ChainTypeEvm, - ChainTypeSolana, - ChainTypeStarknet, - ChainTypeAptos, -} - -func (e ChainType) IsValid() bool { - switch e { - case ChainTypeEvm, ChainTypeSolana, ChainTypeStarknet, ChainTypeAptos: - return true - } - return false -} - -func (e ChainType) String() string { - return string(e) -} - -func (e *ChainType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ChainType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ChainType", str) - } - return nil -} - -func (e ChainType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type ContractOwnerType string - -const ( - ContractOwnerTypeSystem ContractOwnerType = "SYSTEM" - ContractOwnerTypeExternal ContractOwnerType = "EXTERNAL" - ContractOwnerTypeVault ContractOwnerType = "VAULT" - ContractOwnerTypeNotOwnable ContractOwnerType = "NOT_OWNABLE" -) - -var AllContractOwnerType = []ContractOwnerType{ - ContractOwnerTypeSystem, - ContractOwnerTypeExternal, - ContractOwnerTypeVault, - ContractOwnerTypeNotOwnable, -} - -func (e ContractOwnerType) IsValid() bool { - switch e { - case ContractOwnerTypeSystem, ContractOwnerTypeExternal, ContractOwnerTypeVault, ContractOwnerTypeNotOwnable: - return true - } - return false -} - -func (e ContractOwnerType) String() string { - return string(e) -} - -func (e *ContractOwnerType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ContractOwnerType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ContractOwnerType", str) - } - return nil -} - -func (e ContractOwnerType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type ContractTag string - -const ( - ContractTagMain ContractTag = "MAIN" - ContractTagTest ContractTag = "TEST" - ContractTagUpgrade ContractTag = "UPGRADE" - ContractTagDead ContractTag = "DEAD" -) - -var AllContractTag = []ContractTag{ - ContractTagMain, - ContractTagTest, - ContractTagUpgrade, - ContractTagDead, -} - -func (e ContractTag) IsValid() bool { - switch e { - case ContractTagMain, ContractTagTest, ContractTagUpgrade, ContractTagDead: - return true - } - return false -} - -func (e ContractTag) String() string { - return string(e) -} - -func (e *ContractTag) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ContractTag(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ContractTag", str) - } - return nil -} - -func (e ContractTag) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type ContractType string - -const ( - ContractTypeOcr1 ContractType = "OCR1" - ContractTypeOcr2 ContractType = "OCR2" -) - -var AllContractType = []ContractType{ - ContractTypeOcr1, - ContractTypeOcr2, -} - -func (e ContractType) IsValid() bool { - switch e { - case ContractTypeOcr1, ContractTypeOcr2: - return true - } - return false -} - -func (e ContractType) String() string { - return string(e) -} - -func (e *ContractType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ContractType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ContractType", str) - } - return nil -} - -func (e ContractType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type DONExecutionType string - -const ( - DONExecutionTypeMercury DONExecutionType = "MERCURY" - DONExecutionTypeMercuryV03 DONExecutionType = "MERCURY_V03" - DONExecutionTypeAggregator DONExecutionType = "AGGREGATOR" - DONExecutionTypeCcipCommit DONExecutionType = "CCIP_COMMIT" - DONExecutionTypeCcipExecute DONExecutionType = "CCIP_EXECUTE" - DONExecutionTypeKeystoneWorkflow DONExecutionType = "KEYSTONE_WORKFLOW" -) - -var AllDONExecutionType = []DONExecutionType{ - DONExecutionTypeMercury, - DONExecutionTypeMercuryV03, - DONExecutionTypeAggregator, - DONExecutionTypeCcipCommit, - DONExecutionTypeCcipExecute, - DONExecutionTypeKeystoneWorkflow, -} - -func (e DONExecutionType) IsValid() bool { - switch e { - case DONExecutionTypeMercury, DONExecutionTypeMercuryV03, DONExecutionTypeAggregator, DONExecutionTypeCcipCommit, DONExecutionTypeCcipExecute, DONExecutionTypeKeystoneWorkflow: - return true - } - return false -} - -func (e DONExecutionType) String() string { - return string(e) -} - -func (e *DONExecutionType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = DONExecutionType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid DONExecutionType", str) - } - return nil -} - -func (e DONExecutionType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type DeploymentStatus string - -const ( - DeploymentStatusPending DeploymentStatus = "PENDING" - DeploymentStatusQueued DeploymentStatus = "QUEUED" - DeploymentStatusInProgress DeploymentStatus = "IN_PROGRESS" - DeploymentStatusCompleted DeploymentStatus = "COMPLETED" - DeploymentStatusErrored DeploymentStatus = "ERRORED" -) - -var AllDeploymentStatus = []DeploymentStatus{ - DeploymentStatusPending, - DeploymentStatusQueued, - DeploymentStatusInProgress, - DeploymentStatusCompleted, - DeploymentStatusErrored, -} - -func (e DeploymentStatus) IsValid() bool { - switch e { - case DeploymentStatusPending, DeploymentStatusQueued, DeploymentStatusInProgress, DeploymentStatusCompleted, DeploymentStatusErrored: - return true - } - return false -} - -func (e DeploymentStatus) String() string { - return string(e) -} - -func (e *DeploymentStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = DeploymentStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid DeploymentStatus", str) - } - return nil -} - -func (e DeploymentStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type FeedStatus string - -const ( - FeedStatusDraft FeedStatus = "DRAFT" - FeedStatusReady FeedStatus = "READY" -) - -var AllFeedStatus = []FeedStatus{ - FeedStatusDraft, - FeedStatusReady, -} - -func (e FeedStatus) IsValid() bool { - switch e { - case FeedStatusDraft, FeedStatusReady: - return true - } - return false -} - -func (e FeedStatus) String() string { - return string(e) -} - -func (e *FeedStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = FeedStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid FeedStatus", str) - } - return nil -} - -func (e FeedStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type JobProposalStatus string - -const ( - JobProposalStatusProposed JobProposalStatus = "PROPOSED" - JobProposalStatusApproved JobProposalStatus = "APPROVED" - JobProposalStatusRejected JobProposalStatus = "REJECTED" - JobProposalStatusAccepted JobProposalStatus = "ACCEPTED" - JobProposalStatusPending JobProposalStatus = "PENDING" -) - -var AllJobProposalStatus = []JobProposalStatus{ - JobProposalStatusProposed, - JobProposalStatusApproved, - JobProposalStatusRejected, - JobProposalStatusAccepted, - JobProposalStatusPending, -} - -func (e JobProposalStatus) IsValid() bool { - switch e { - case JobProposalStatusProposed, JobProposalStatusApproved, JobProposalStatusRejected, JobProposalStatusAccepted, JobProposalStatusPending: - return true - } - return false -} - -func (e JobProposalStatus) String() string { - return string(e) -} - -func (e *JobProposalStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = JobProposalStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid JobProposalStatus", str) - } - return nil -} - -func (e JobProposalStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type JobStatus string - -const ( - JobStatusDraft JobStatus = "DRAFT" - JobStatusProposed JobStatus = "PROPOSED" - JobStatusApproved JobStatus = "APPROVED" - JobStatusRejected JobStatus = "REJECTED" - JobStatusCancelled JobStatus = "CANCELLED" - JobStatusDisabled JobStatus = "DISABLED" - JobStatusDeleted JobStatus = "DELETED" - JobStatusRevoked JobStatus = "REVOKED" -) - -var AllJobStatus = []JobStatus{ - JobStatusDraft, - JobStatusProposed, - JobStatusApproved, - JobStatusRejected, - JobStatusCancelled, - JobStatusDisabled, - JobStatusDeleted, - JobStatusRevoked, -} - -func (e JobStatus) IsValid() bool { - switch e { - case JobStatusDraft, JobStatusProposed, JobStatusApproved, JobStatusRejected, JobStatusCancelled, JobStatusDisabled, JobStatusDeleted, JobStatusRevoked: - return true - } - return false -} - -func (e JobStatus) String() string { - return string(e) -} - -func (e *JobStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = JobStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid JobStatus", str) - } - return nil -} - -func (e JobStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type JobType string - -const ( - JobTypeOffchainreporting JobType = "OFFCHAINREPORTING" - JobTypeOffchainreporting2 JobType = "OFFCHAINREPORTING2" - JobTypeBootstrap JobType = "BOOTSTRAP" - JobTypeWorkflow JobType = "WORKFLOW" -) - -var AllJobType = []JobType{ - JobTypeOffchainreporting, - JobTypeOffchainreporting2, - JobTypeBootstrap, - JobTypeWorkflow, -} - -func (e JobType) IsValid() bool { - switch e { - case JobTypeOffchainreporting, JobTypeOffchainreporting2, JobTypeBootstrap, JobTypeWorkflow: - return true - } - return false -} - -func (e JobType) String() string { - return string(e) -} - -func (e *JobType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = JobType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid JobType", str) - } - return nil -} - -func (e JobType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type NetworkStackStatus string - -const ( - NetworkStackStatusReady NetworkStackStatus = "READY" - NetworkStackStatusInProgress NetworkStackStatus = "IN_PROGRESS" -) - -var AllNetworkStackStatus = []NetworkStackStatus{ - NetworkStackStatusReady, - NetworkStackStatusInProgress, -} - -func (e NetworkStackStatus) IsValid() bool { - switch e { - case NetworkStackStatusReady, NetworkStackStatusInProgress: - return true - } - return false -} - -func (e NetworkStackStatus) String() string { - return string(e) -} - -func (e *NetworkStackStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = NetworkStackStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid NetworkStackStatus", str) - } - return nil -} - -func (e NetworkStackStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type NetworkStackType string - -const ( - NetworkStackTypeMain NetworkStackType = "MAIN" - NetworkStackTypeAdditional NetworkStackType = "ADDITIONAL" -) - -var AllNetworkStackType = []NetworkStackType{ - NetworkStackTypeMain, - NetworkStackTypeAdditional, -} - -func (e NetworkStackType) IsValid() bool { - switch e { - case NetworkStackTypeMain, NetworkStackTypeAdditional: - return true - } - return false -} - -func (e NetworkStackType) String() string { - return string(e) -} - -func (e *NetworkStackType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = NetworkStackType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid NetworkStackType", str) - } - return nil -} - -func (e NetworkStackType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type OCR2PluginType string - -const ( - OCR2PluginTypeMedian OCR2PluginType = "MEDIAN" - OCR2PluginTypeCcipCommit OCR2PluginType = "CCIP_COMMIT" - OCR2PluginTypeCcipExecute OCR2PluginType = "CCIP_EXECUTE" - OCR2PluginTypeCcipRebalancer OCR2PluginType = "CCIP_REBALANCER" - OCR2PluginTypeMercury OCR2PluginType = "MERCURY" -) - -var AllOCR2PluginType = []OCR2PluginType{ - OCR2PluginTypeMedian, - OCR2PluginTypeCcipCommit, - OCR2PluginTypeCcipExecute, - OCR2PluginTypeCcipRebalancer, - OCR2PluginTypeMercury, -} - -func (e OCR2PluginType) IsValid() bool { - switch e { - case OCR2PluginTypeMedian, OCR2PluginTypeCcipCommit, OCR2PluginTypeCcipExecute, OCR2PluginTypeCcipRebalancer, OCR2PluginTypeMercury: - return true - } - return false -} - -func (e OCR2PluginType) String() string { - return string(e) -} - -func (e *OCR2PluginType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = OCR2PluginType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid OCR2PluginType", str) - } - return nil -} - -func (e OCR2PluginType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type ProductType string - -const ( - ProductTypeDataFeeds ProductType = "DATA_FEEDS" - ProductTypeDataStreamsV02 ProductType = "DATA_STREAMS_V02" - ProductTypeDataStreamsV03 ProductType = "DATA_STREAMS_V03" - ProductTypeCcip ProductType = "CCIP" - ProductTypeWorkflow ProductType = "WORKFLOW" - ProductTypeOcr3Capability ProductType = "OCR3_CAPABILITY" -) - -var AllProductType = []ProductType{ - ProductTypeDataFeeds, - ProductTypeDataStreamsV02, - ProductTypeDataStreamsV03, - ProductTypeCcip, - ProductTypeWorkflow, - ProductTypeOcr3Capability, -} - -func (e ProductType) IsValid() bool { - switch e { - case ProductTypeDataFeeds, ProductTypeDataStreamsV02, ProductTypeDataStreamsV03, ProductTypeCcip, ProductTypeWorkflow, ProductTypeOcr3Capability: - return true - } - return false -} - -func (e ProductType) String() string { - return string(e) -} - -func (e *ProductType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ProductType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ProductType", str) - } - return nil -} - -func (e ProductType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type ReportSchemaVersion string - -const ( - ReportSchemaVersionBasic ReportSchemaVersion = "BASIC" - ReportSchemaVersionPremium ReportSchemaVersion = "PREMIUM" - ReportSchemaVersionBlockBased ReportSchemaVersion = "BLOCK_BASED" -) - -var AllReportSchemaVersion = []ReportSchemaVersion{ - ReportSchemaVersionBasic, - ReportSchemaVersionPremium, - ReportSchemaVersionBlockBased, -} - -func (e ReportSchemaVersion) IsValid() bool { - switch e { - case ReportSchemaVersionBasic, ReportSchemaVersionPremium, ReportSchemaVersionBlockBased: - return true - } - return false -} - -func (e ReportSchemaVersion) String() string { - return string(e) -} - -func (e *ReportSchemaVersion) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = ReportSchemaVersion(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ReportSchemaVersion", str) - } - return nil -} - -func (e ReportSchemaVersion) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type SelectorOp string - -const ( - SelectorOpEq SelectorOp = "EQ" - SelectorOpNotEq SelectorOp = "NOT_EQ" - SelectorOpIn SelectorOp = "IN" - SelectorOpNotIn SelectorOp = "NOT_IN" - SelectorOpExist SelectorOp = "EXIST" - SelectorOpNotExist SelectorOp = "NOT_EXIST" -) - -var AllSelectorOp = []SelectorOp{ - SelectorOpEq, - SelectorOpNotEq, - SelectorOpIn, - SelectorOpNotIn, - SelectorOpExist, - SelectorOpNotExist, -} - -func (e SelectorOp) IsValid() bool { - switch e { - case SelectorOpEq, SelectorOpNotEq, SelectorOpIn, SelectorOpNotIn, SelectorOpExist, SelectorOpNotExist: - return true - } - return false -} - -func (e SelectorOp) String() string { - return string(e) -} - -func (e *SelectorOp) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = SelectorOp(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid SelectorOp", str) - } - return nil -} - -func (e SelectorOp) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type TaskRunStatus string - -const ( - TaskRunStatusInProgress TaskRunStatus = "IN_PROGRESS" - TaskRunStatusCompleted TaskRunStatus = "COMPLETED" - TaskRunStatusErrored TaskRunStatus = "ERRORED" -) - -var AllTaskRunStatus = []TaskRunStatus{ - TaskRunStatusInProgress, - TaskRunStatusCompleted, - TaskRunStatusErrored, -} - -func (e TaskRunStatus) IsValid() bool { - switch e { - case TaskRunStatusInProgress, TaskRunStatusCompleted, TaskRunStatusErrored: - return true - } - return false -} - -func (e TaskRunStatus) String() string { - return string(e) -} - -func (e *TaskRunStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = TaskRunStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid TaskRunStatus", str) - } - return nil -} - -func (e TaskRunStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type TokenPoolType string - -const ( - TokenPoolTypeLockRelease TokenPoolType = "LOCK_RELEASE" - TokenPoolTypeLockReleaseAndProxy TokenPoolType = "LOCK_RELEASE_AND_PROXY" - TokenPoolTypeBurnMint TokenPoolType = "BURN_MINT" - TokenPoolTypeBurnMintAndProxy TokenPoolType = "BURN_MINT_AND_PROXY" - TokenPoolTypeBurnFromMint TokenPoolType = "BURN_FROM_MINT" - TokenPoolTypeBurnWithFromMint TokenPoolType = "BURN_WITH_FROM_MINT" - TokenPoolTypeBurnWithFromMintAndProxy TokenPoolType = "BURN_WITH_FROM_MINT_AND_PROXY" - TokenPoolTypeUsdc TokenPoolType = "USDC" - TokenPoolTypeFeeTokenOnly TokenPoolType = "FEE_TOKEN_ONLY" -) - -var AllTokenPoolType = []TokenPoolType{ - TokenPoolTypeLockRelease, - TokenPoolTypeLockReleaseAndProxy, - TokenPoolTypeBurnMint, - TokenPoolTypeBurnMintAndProxy, - TokenPoolTypeBurnFromMint, - TokenPoolTypeBurnWithFromMint, - TokenPoolTypeBurnWithFromMintAndProxy, - TokenPoolTypeUsdc, - TokenPoolTypeFeeTokenOnly, -} - -func (e TokenPoolType) IsValid() bool { - switch e { - case TokenPoolTypeLockRelease, TokenPoolTypeLockReleaseAndProxy, TokenPoolTypeBurnMint, TokenPoolTypeBurnMintAndProxy, TokenPoolTypeBurnFromMint, TokenPoolTypeBurnWithFromMint, TokenPoolTypeBurnWithFromMintAndProxy, TokenPoolTypeUsdc, TokenPoolTypeFeeTokenOnly: - return true - } - return false -} - -func (e TokenPoolType) String() string { - return string(e) -} - -func (e *TokenPoolType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = TokenPoolType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid TokenPoolType", str) - } - return nil -} - -func (e TokenPoolType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type TokenPriceType string - -const ( - TokenPriceTypeFixed TokenPriceType = "FIXED" - TokenPriceTypeFeed TokenPriceType = "FEED" -) - -var AllTokenPriceType = []TokenPriceType{ - TokenPriceTypeFixed, - TokenPriceTypeFeed, -} - -func (e TokenPriceType) IsValid() bool { - switch e { - case TokenPriceTypeFixed, TokenPriceTypeFeed: - return true - } - return false -} - -func (e TokenPriceType) String() string { - return string(e) -} - -func (e *TokenPriceType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = TokenPriceType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid TokenPriceType", str) - } - return nil -} - -func (e TokenPriceType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type TransferOwnershipStatus string - -const ( - TransferOwnershipStatusNone TransferOwnershipStatus = "NONE" - TransferOwnershipStatusProcessingTransaction TransferOwnershipStatus = "PROCESSING_TRANSACTION" - TransferOwnershipStatusAwaitingConfirmation TransferOwnershipStatus = "AWAITING_CONFIRMATION" - TransferOwnershipStatusError TransferOwnershipStatus = "ERROR" -) - -var AllTransferOwnershipStatus = []TransferOwnershipStatus{ - TransferOwnershipStatusNone, - TransferOwnershipStatusProcessingTransaction, - TransferOwnershipStatusAwaitingConfirmation, - TransferOwnershipStatusError, -} - -func (e TransferOwnershipStatus) IsValid() bool { - switch e { - case TransferOwnershipStatusNone, TransferOwnershipStatusProcessingTransaction, TransferOwnershipStatusAwaitingConfirmation, TransferOwnershipStatusError: - return true - } - return false -} - -func (e TransferOwnershipStatus) String() string { - return string(e) -} - -func (e *TransferOwnershipStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = TransferOwnershipStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid TransferOwnershipStatus", str) - } - return nil -} - -func (e TransferOwnershipStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type UserRole string - -const ( - UserRoleViewer UserRole = "VIEWER" - UserRoleOps UserRole = "OPS" - UserRoleMaintainer UserRole = "MAINTAINER" - UserRoleAdmin UserRole = "ADMIN" - UserRoleFoundation UserRole = "FOUNDATION" - UserRoleDataProvider UserRole = "DATA_PROVIDER" - UserRoleCcipValidator UserRole = "CCIP_VALIDATOR" - UserRoleDataStreamsOps UserRole = "DATA_STREAMS_OPS" -) - -var AllUserRole = []UserRole{ - UserRoleViewer, - UserRoleOps, - UserRoleMaintainer, - UserRoleAdmin, - UserRoleFoundation, - UserRoleDataProvider, - UserRoleCcipValidator, - UserRoleDataStreamsOps, -} - -func (e UserRole) IsValid() bool { - switch e { - case UserRoleViewer, UserRoleOps, UserRoleMaintainer, UserRoleAdmin, UserRoleFoundation, UserRoleDataProvider, UserRoleCcipValidator, UserRoleDataStreamsOps: - return true - } - return false -} - -func (e UserRole) String() string { - return string(e) -} - -func (e *UserRole) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = UserRole(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid UserRole", str) - } - return nil -} - -func (e UserRole) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type VaultType string - -const ( - VaultTypeEoa VaultType = "EOA" - VaultTypeSafe VaultType = "SAFE" - VaultTypeTimelock VaultType = "TIMELOCK" -) - -var AllVaultType = []VaultType{ - VaultTypeEoa, - VaultTypeSafe, - VaultTypeTimelock, -} - -func (e VaultType) IsValid() bool { - switch e { - case VaultTypeEoa, VaultTypeSafe, VaultTypeTimelock: - return true - } - return false -} - -func (e VaultType) String() string { - return string(e) -} - -func (e *VaultType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = VaultType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid VaultType", str) - } - return nil -} - -func (e VaultType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type VerificationStatus string - -const ( - VerificationStatusUnknown VerificationStatus = "UNKNOWN" - VerificationStatusSuccess VerificationStatus = "SUCCESS" - VerificationStatusPending VerificationStatus = "PENDING" - VerificationStatusError VerificationStatus = "ERROR" -) - -var AllVerificationStatus = []VerificationStatus{ - VerificationStatusUnknown, - VerificationStatusSuccess, - VerificationStatusPending, - VerificationStatusError, -} - -func (e VerificationStatus) IsValid() bool { - switch e { - case VerificationStatusUnknown, VerificationStatusSuccess, VerificationStatusPending, VerificationStatusError: - return true - } - return false -} - -func (e VerificationStatus) String() string { - return string(e) -} - -func (e *VerificationStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = VerificationStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid VerificationStatus", str) - } - return nil -} - -func (e VerificationStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type WebhookCallState string - -const ( - WebhookCallStatePending WebhookCallState = "PENDING" - WebhookCallStateSuccess WebhookCallState = "SUCCESS" - WebhookCallStateError WebhookCallState = "ERROR" - WebhookCallStateFailed WebhookCallState = "FAILED" -) - -var AllWebhookCallState = []WebhookCallState{ - WebhookCallStatePending, - WebhookCallStateSuccess, - WebhookCallStateError, - WebhookCallStateFailed, -} - -func (e WebhookCallState) IsValid() bool { - switch e { - case WebhookCallStatePending, WebhookCallStateSuccess, WebhookCallStateError, WebhookCallStateFailed: - return true - } - return false -} - -func (e WebhookCallState) String() string { - return string(e) -} - -func (e *WebhookCallState) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = WebhookCallState(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid WebhookCallState", str) - } - return nil -} - -func (e WebhookCallState) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type WorkflowRunStatus string - -const ( - WorkflowRunStatusPending WorkflowRunStatus = "PENDING" - WorkflowRunStatusInProgress WorkflowRunStatus = "IN_PROGRESS" - WorkflowRunStatusCompleted WorkflowRunStatus = "COMPLETED" - WorkflowRunStatusErrored WorkflowRunStatus = "ERRORED" -) - -var AllWorkflowRunStatus = []WorkflowRunStatus{ - WorkflowRunStatusPending, - WorkflowRunStatusInProgress, - WorkflowRunStatusCompleted, - WorkflowRunStatusErrored, -} - -func (e WorkflowRunStatus) IsValid() bool { - switch e { - case WorkflowRunStatusPending, WorkflowRunStatusInProgress, WorkflowRunStatusCompleted, WorkflowRunStatusErrored: - return true - } - return false -} - -func (e WorkflowRunStatus) String() string { - return string(e) -} - -func (e *WorkflowRunStatus) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = WorkflowRunStatus(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid WorkflowRunStatus", str) - } - return nil -} - -func (e WorkflowRunStatus) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -type WorkflowType string - -const ( - WorkflowTypeGeneric WorkflowType = "GENERIC" -) - -var AllWorkflowType = []WorkflowType{ - WorkflowTypeGeneric, -} - -func (e WorkflowType) IsValid() bool { - switch e { - case WorkflowTypeGeneric: - return true - } - return false -} - -func (e WorkflowType) String() string { - return string(e) -} - -func (e *WorkflowType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return fmt.Errorf("enums must be strings") - } - - *e = WorkflowType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid WorkflowType", str) - } - return nil -} - -func (e WorkflowType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} diff --git a/integration-tests/deployment/clo/offchain_client_impl.go b/integration-tests/deployment/clo/offchain_client_impl.go deleted file mode 100644 index f59a918a41a..00000000000 --- a/integration-tests/deployment/clo/offchain_client_impl.go +++ /dev/null @@ -1,213 +0,0 @@ -package clo - -import ( - "context" - - "go.uber.org/zap" - "google.golang.org/grpc" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - csav1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa" - jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" - nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" -) - -type JobClient struct { - NodeOperators []*models.NodeOperator `json:"nodeOperators"` - nodesByID map[string]*models.Node - lggr logger.Logger -} - -func (j JobClient) UpdateJob(ctx context.Context, in *jobv1.UpdateJobRequest, opts ...grpc.CallOption) (*jobv1.UpdateJobResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) DisableNode(ctx context.Context, in *nodev1.DisableNodeRequest, opts ...grpc.CallOption) (*nodev1.DisableNodeResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) EnableNode(ctx context.Context, in *nodev1.EnableNodeRequest, opts ...grpc.CallOption) (*nodev1.EnableNodeResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) RegisterNode(ctx context.Context, in *nodev1.RegisterNodeRequest, opts ...grpc.CallOption) (*nodev1.RegisterNodeResponse, error) { - //TODO implement me - panic("implement me") -} - -func (j JobClient) UpdateNode(ctx context.Context, in *nodev1.UpdateNodeRequest, opts ...grpc.CallOption) (*nodev1.UpdateNodeResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) GetKeypair(ctx context.Context, in *csav1.GetKeypairRequest, opts ...grpc.CallOption) (*csav1.GetKeypairResponse, error) { - //TODO implement me - panic("implement me") -} - -func (j JobClient) ListKeypairs(ctx context.Context, in *csav1.ListKeypairsRequest, opts ...grpc.CallOption) (*csav1.ListKeypairsResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) GetNode(ctx context.Context, in *nodev1.GetNodeRequest, opts ...grpc.CallOption) (*nodev1.GetNodeResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) ListNodes(ctx context.Context, in *nodev1.ListNodesRequest, opts ...grpc.CallOption) (*nodev1.ListNodesResponse, error) { - //TODO CCIP-3108 - var fiterIds map[string]struct{} - include := func(id string) bool { - if in.Filter == nil || len(in.Filter.Ids) == 0 { - return true - } - // lazy init - if len(fiterIds) == 0 { - for _, id := range in.Filter.Ids { - fiterIds[id] = struct{}{} - } - } - _, ok := fiterIds[id] - return ok - } - var nodes []*nodev1.Node - for _, nop := range j.NodeOperators { - for _, n := range nop.Nodes { - if include(n.ID) { - nodes = append(nodes, &nodev1.Node{ - Id: n.ID, - Name: n.Name, - PublicKey: *n.PublicKey, // is this the correct val? - IsEnabled: n.Enabled, - IsConnected: n.Connected, - }) - } - } - } - return &nodev1.ListNodesResponse{ - Nodes: nodes, - }, nil - -} - -func (j JobClient) ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNodeChainConfigsRequest, opts ...grpc.CallOption) (*nodev1.ListNodeChainConfigsResponse, error) { - - resp := &nodev1.ListNodeChainConfigsResponse{ - ChainConfigs: make([]*nodev1.ChainConfig, 0), - } - // no filter, return all - if in.Filter == nil || len(in.Filter.NodeIds) == 0 { - for _, n := range j.nodesByID { - ccfg := cloNodeToChainConfigs(n) - resp.ChainConfigs = append(resp.ChainConfigs, ccfg...) - } - } else { - for _, want := range in.Filter.NodeIds { - n, ok := j.nodesByID[want] - if !ok { - j.lggr.Warn("node not found", zap.String("node_id", want)) - continue - } - ccfg := cloNodeToChainConfigs(n) - resp.ChainConfigs = append(resp.ChainConfigs, ccfg...) - } - } - return resp, nil - -} - -func (j JobClient) GetJob(ctx context.Context, in *jobv1.GetJobRequest, opts ...grpc.CallOption) (*jobv1.GetJobResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) GetProposal(ctx context.Context, in *jobv1.GetProposalRequest, opts ...grpc.CallOption) (*jobv1.GetProposalResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) ListJobs(ctx context.Context, in *jobv1.ListJobsRequest, opts ...grpc.CallOption) (*jobv1.ListJobsResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) ListProposals(ctx context.Context, in *jobv1.ListProposalsRequest, opts ...grpc.CallOption) (*jobv1.ListProposalsResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) ProposeJob(ctx context.Context, in *jobv1.ProposeJobRequest, opts ...grpc.CallOption) (*jobv1.ProposeJobResponse, error) { - panic("implement me") - -} - -func (j JobClient) RevokeJob(ctx context.Context, in *jobv1.RevokeJobRequest, opts ...grpc.CallOption) (*jobv1.RevokeJobResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -func (j JobClient) DeleteJob(ctx context.Context, in *jobv1.DeleteJobRequest, opts ...grpc.CallOption) (*jobv1.DeleteJobResponse, error) { - //TODO CCIP-3108 implement me - panic("implement me") -} - -type GetNodeOperatorsResponse struct { - NodeOperators []*models.NodeOperator `json:"nodeOperators"` -} - -func NewJobClient(lggr logger.Logger, nops []*models.NodeOperator) *JobClient { - c := &JobClient{ - NodeOperators: nops, - nodesByID: make(map[string]*models.Node), - lggr: lggr, - } - for _, nop := range nops { - for _, n := range nop.Nodes { - node := n - c.nodesByID[n.ID] = node // maybe should use the public key instead? - } - } - return c -} - -func cloNodeToChainConfigs(n *models.Node) []*nodev1.ChainConfig { - out := make([]*nodev1.ChainConfig, 0) - for _, ccfg := range n.ChainConfigs { - out = append(out, cloChainCfgToJDChainCfg(ccfg)) - } - return out -} - -func cloChainCfgToJDChainCfg(ccfg *models.NodeChainConfig) *nodev1.ChainConfig { - return &nodev1.ChainConfig{ - Chain: &nodev1.Chain{ - Id: ccfg.Network.ChainID, - Type: nodev1.ChainType_CHAIN_TYPE_EVM, // TODO: write conversion func from clo to jd tyes - }, - AccountAddress: ccfg.AccountAddress, - AdminAddress: ccfg.AdminAddress, - // only care about ocr2 for now - Ocr2Config: &nodev1.OCR2Config{ - Enabled: ccfg.Ocr2Config.Enabled, - IsBootstrap: ccfg.Ocr2Config.IsBootstrap, - P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ - PeerId: ccfg.Ocr2Config.P2pKeyBundle.PeerID, - PublicKey: ccfg.Ocr2Config.P2pKeyBundle.PublicKey, - }, - OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ - BundleId: ccfg.Ocr2Config.OcrKeyBundle.BundleID, - ConfigPublicKey: ccfg.Ocr2Config.OcrKeyBundle.ConfigPublicKey, - OffchainPublicKey: ccfg.Ocr2Config.OcrKeyBundle.OffchainPublicKey, - OnchainSigningAddress: ccfg.Ocr2Config.OcrKeyBundle.OnchainSigningAddress, - }, - // TODO: the clo cli does not serialize this field, so it will always be nil - //Multiaddr: *ccfg.Ocr2Config.Multiaddr, - //ForwarderAddress: ccfg.Ocr2Config.ForwarderAddress, - }, - } -} diff --git a/integration-tests/deployment/clo/offchain_client_impl_test.go b/integration-tests/deployment/clo/offchain_client_impl_test.go deleted file mode 100644 index 640721bb486..00000000000 --- a/integration-tests/deployment/clo/offchain_client_impl_test.go +++ /dev/null @@ -1,582 +0,0 @@ -package clo_test - -import ( - "context" - "encoding/json" - "reflect" - "testing" - - "github.com/test-go/testify/require" - "google.golang.org/grpc" - - nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" - "github.com/smartcontractkit/chainlink/v2/core/logger" -) - -var testNops = ` -[ - { - "id": "67", - "name": "Chainlink Keystone Node Operator 9", - "nodes": [ - { - "id": "780", - "name": "Chainlink Sepolia Prod Keystone One 9", - "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431", - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ] - } - ], - "createdAt": "2024-08-14T19:00:07.113658Z" - }, - { - "id": "68", - "name": "Chainlink Keystone Node Operator 8", - "nodes": [ - { - "id": "781", - "name": "Chainlink Sepolia Prod Keystone One 8", - "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc", - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ] - } - ], - "createdAt": "2024-08-14T20:26:37.622463Z" - }, - { - "id": "999", - "name": "Chainlink Keystone Node Operator 100", - "nodes": [ - { - "id": "999", - "name": "Chainlink Sepolia Prod Keystone One 999", - "publicKey": "9991dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58999999", - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ] - }, - { - "id": "1000", - "name": "Chainlink Sepolia Prod Keystone One 1000", - "publicKey": "1000101e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58641000", - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ] - } - ], - "createdAt": "2024-08-14T20:26:37.622463Z" - } -] -` - -func parseTestNops(t *testing.T) []*models.NodeOperator { - t.Helper() - var out []*models.NodeOperator - err := json.Unmarshal([]byte(testNops), &out) - require.NoError(t, err) - require.Len(t, out, 3, "wrong number of nops") - return out -} -func TestJobClient_ListNodes(t *testing.T) { - lggr := logger.TestLogger(t) - nops := parseTestNops(t) - - type fields struct { - NodeOperators []*models.NodeOperator - } - type args struct { - ctx context.Context - in *nodev1.ListNodesRequest - opts []grpc.CallOption - } - tests := []struct { - name string - fields fields - args args - want *nodev1.ListNodesResponse - wantErr bool - }{ - { - name: "empty", - fields: fields{ - NodeOperators: make([]*models.NodeOperator, 0), - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodesRequest{}, - }, - want: &nodev1.ListNodesResponse{}, - }, - { - name: "one node from one nop", - fields: fields{ - NodeOperators: nops[0:1], - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodesRequest{}, - }, - want: &nodev1.ListNodesResponse{ - Nodes: []*nodev1.Node{ - { - Id: "780", - Name: "Chainlink Sepolia Prod Keystone One 9", - PublicKey: "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431", - IsConnected: true, - }, - }, - }, - }, - { - name: "two nops each with one node", - fields: fields{ - NodeOperators: nops[0:2], - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodesRequest{}, - }, - want: &nodev1.ListNodesResponse{ - Nodes: []*nodev1.Node{ - { - Id: "780", - Name: "Chainlink Sepolia Prod Keystone One 9", - PublicKey: "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431", - IsConnected: true, - }, - { - Id: "781", - Name: "Chainlink Sepolia Prod Keystone One 8", - PublicKey: "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc", - IsConnected: true, - }, - }, - }, - }, - { - name: "two nodes from one nop", - fields: fields{ - NodeOperators: nops[2:3], - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodesRequest{}, - }, - want: &nodev1.ListNodesResponse{ - Nodes: []*nodev1.Node{ - { - Id: "999", - Name: "Chainlink Sepolia Prod Keystone One 999", - PublicKey: "9991dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58999999", - IsConnected: true, - }, - { - Id: "1000", - Name: "Chainlink Sepolia Prod Keystone One 1000", - PublicKey: "1000101e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58641000", - IsConnected: true, - }, - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - j := clo.NewJobClient(lggr, tt.fields.NodeOperators) - - got, err := j.ListNodes(tt.args.ctx, tt.args.in, tt.args.opts...) - if (err != nil) != tt.wantErr { - t.Errorf("JobClient.ListNodes() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("JobClient.ListNodes() = %v, want %v", got, tt.want) - } - }) - } -} - -var testNopsWithChainConfigs = ` -[ - { - "id": "67", - "keys": [ - "keystone-09" - ], - "name": "Chainlink Keystone Node Operator 9", - "metadata": { - "nodeCount": 1, - "jobCount": 4 - }, - "nodes": [ - { - "id": "780", - "name": "Chainlink Sepolia Prod Keystone One 9", - "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9" - }, - "ocrKeyBundle": { - "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x0b04cE574E80Da73191Ec141c0016a54A6404056", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9" - }, - "ocrKeyBundle": { - "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T19:00:07.113658Z" - }, - { - "id": "68", - "keys": [ - "keystone-08" - ], - "name": "Chainlink Keystone Node Operator 8", - "metadata": { - "nodeCount": 1, - "jobCount": 4 - }, - "nodes": [ - { - "id": "781", - "name": "Chainlink Sepolia Prod Keystone One 8", - "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xEa4bC3638660D78Da56f39f6680dCDD0cEAaD2c6", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c", - "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829" - }, - "ocrKeyBundle": { - "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3", - "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264", - "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70", - "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x31B179dcF8f9036C30f04bE578793e51bF14A39E", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c", - "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829" - }, - "ocrKeyBundle": { - "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3", - "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264", - "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70", - "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:26:37.622463Z" - } -]` - -func TestJobClient_ListNodeChainConfigs(t *testing.T) { - nops := parseTestNopsWithChainConfigs(t) - lggr := logger.TestLogger(t) - type fields struct { - NodeOperators []*models.NodeOperator - } - type args struct { - ctx context.Context - in *nodev1.ListNodeChainConfigsRequest - opts []grpc.CallOption - } - tests := []struct { - name string - fields fields - args args - want *nodev1.ListNodeChainConfigsResponse - wantErr bool - }{ - { - name: "empty", - fields: fields{ - NodeOperators: make([]*models.NodeOperator, 0), - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodeChainConfigsRequest{}, - }, - want: &nodev1.ListNodeChainConfigsResponse{ - ChainConfigs: make([]*nodev1.ChainConfig, 0), - }, - }, - - { - name: "no matching nodes", - fields: fields{ - NodeOperators: nops, - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodeChainConfigsRequest{ - Filter: &nodev1.ListNodeChainConfigsRequest_Filter{ - NodeIds: []string{"not-a-node-id"}, - }, - }, - }, - want: &nodev1.ListNodeChainConfigsResponse{ - ChainConfigs: make([]*nodev1.ChainConfig, 0), - }, - }, - - { - name: "one nop with one node that has two chain configs", - fields: fields{ - NodeOperators: nops[0:1], - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodeChainConfigsRequest{}, - }, - want: &nodev1.ListNodeChainConfigsResponse{ - ChainConfigs: []*nodev1.ChainConfig{ - { - Chain: &nodev1.Chain{ - Id: "421614", - Type: nodev1.ChainType_CHAIN_TYPE_EVM, - }, - AccountAddress: "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB", - AdminAddress: "0x0000000000000000000000000000000000000000", - Ocr2Config: &nodev1.OCR2Config{ - Enabled: true, - P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ - PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9", - }, - OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ - BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c", - }, - }, - }, - { - Chain: &nodev1.Chain{ - Id: "11155111", - Type: nodev1.ChainType_CHAIN_TYPE_EVM, - }, - AccountAddress: "0x0b04cE574E80Da73191Ec141c0016a54A6404056", - AdminAddress: "0x0000000000000000000000000000000000000000", - Ocr2Config: &nodev1.OCR2Config{ - Enabled: true, - P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ - PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9", - }, - OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ - BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c", - }, - }, - }, - }, - }, - }, - - { - name: "one nop with one node that has two chain configs matching the filter", - fields: fields{ - NodeOperators: nops, - }, - args: args{ - ctx: context.Background(), - in: &nodev1.ListNodeChainConfigsRequest{ - Filter: &nodev1.ListNodeChainConfigsRequest_Filter{ - NodeIds: []string{"780"}, - }, - }, - }, - want: &nodev1.ListNodeChainConfigsResponse{ - ChainConfigs: []*nodev1.ChainConfig{ - { - Chain: &nodev1.Chain{ - Id: "421614", - Type: nodev1.ChainType_CHAIN_TYPE_EVM, - }, - AccountAddress: "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB", - AdminAddress: "0x0000000000000000000000000000000000000000", - Ocr2Config: &nodev1.OCR2Config{ - Enabled: true, - P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ - PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9", - }, - OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ - BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c", - }, - }, - }, - { - Chain: &nodev1.Chain{ - Id: "11155111", - Type: nodev1.ChainType_CHAIN_TYPE_EVM, - }, - AccountAddress: "0x0b04cE574E80Da73191Ec141c0016a54A6404056", - AdminAddress: "0x0000000000000000000000000000000000000000", - Ocr2Config: &nodev1.OCR2Config{ - Enabled: true, - P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ - PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9", - }, - OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ - BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c", - }, - }, - }, - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - j := clo.NewJobClient(lggr, tt.fields.NodeOperators) - - got, err := j.ListNodeChainConfigs(tt.args.ctx, tt.args.in, tt.args.opts...) - if (err != nil) != tt.wantErr { - t.Errorf("JobClient.ListNodeChainConfigs() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("JobClient.ListNodeChainConfigs() = %v, want %v", got, tt.want) - } - }) - } -} - -func parseTestNopsWithChainConfigs(t *testing.T) []*models.NodeOperator { - t.Helper() - var out []*models.NodeOperator - err := json.Unmarshal([]byte(testNopsWithChainConfigs), &out) - require.NoError(t, err) - require.Len(t, out, 2, "wrong number of nops") - return out -} diff --git a/integration-tests/deployment/clo/testdata/keystone_nops.json b/integration-tests/deployment/clo/testdata/keystone_nops.json deleted file mode 100644 index 679a85935a4..00000000000 --- a/integration-tests/deployment/clo/testdata/keystone_nops.json +++ /dev/null @@ -1,3162 +0,0 @@ -[ - { - "id": "67", - "keys": [ - "keystone-09" - ], - "name": "Chainlink Keystone Node Operator 9", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "780", - "name": "Chainlink Sepolia Prod Keystone One 9", - "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9" - }, - "ocrKeyBundle": { - "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x0b04cE574E80Da73191Ec141c0016a54A6404056", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9" - }, - "ocrKeyBundle": { - "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "818", - "name": "Chainlink Sepolia Prod Keystone Cap One 9", - "publicKey": "3f5bbcb4b0409e6ea39d824f1837787484475fffb12e5e4a70509756ef6c7f9a", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x9b74f08bD7269919C0597C0E00e70ef2A66829db", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x662B6B119f7fc9Dc2A526395A9EA88AE79A1192F", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x34431021e0E07c75816226697Af6Ef02725e36af", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xB5988d5d9ADd3d98CF45211bE37cf9b3372054C9", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T19:00:07.113658Z" - }, - { - "id": "68", - "keys": [ - "keystone-08" - ], - "name": "Chainlink Keystone Node Operator 8", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "781", - "name": "Chainlink Sepolia Prod Keystone One 8", - "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xEa4bC3638660D78Da56f39f6680dCDD0cEAaD2c6", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c", - "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829" - }, - "ocrKeyBundle": { - "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3", - "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264", - "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70", - "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x31B179dcF8f9036C30f04bE578793e51bF14A39E", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c", - "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829" - }, - "ocrKeyBundle": { - "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3", - "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264", - "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70", - "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "817", - "name": "Chainlink Sepolia Prod Keystone Cap One 8", - "publicKey": "2346da196a82c88fe6c315d2e4d0dddacf4590a172b20adb6f27a8601ca0540d", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xa5C7133aBD35F9d742bD2997D693A507c5eBf4Ac", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x9fd869f5baADb79F9b7C58c0855fcAc0384e1d4B", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xe477E4C2e335E9b839665d710dE77CFECa9C43A7", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x056A1275DD670205aba10D8fC9bB597777a65030", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:26:37.622463Z" - }, - { - "id": "69", - "keys": [ - "keystone-07" - ], - "name": "Chainlink Keystone Node Operator 7", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "782", - "name": "Chainlink Sepolia Prod Keystone One 7", - "publicKey": "b473091fe1d4dbbc26ad71c67b4432f8f4280e06bab5e2122a92f4ab8b6ff2f5", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x65bE4739E187a39b859766C143b569acd5BE234d", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC", - "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1" - }, - "ocrKeyBundle": { - "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213", - "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502", - "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3", - "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x9ad9f3AD49e5aB0F28bD694d211a90297bD90D7f", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC", - "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1" - }, - "ocrKeyBundle": { - "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213", - "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502", - "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3", - "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "816", - "name": "Chainlink Sepolia Prod Keystone Cap One 7", - "publicKey": "50d4e3393516d1998e5c39874d7c0da2291e4e3727f8baac4380e9f5573cc648", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x0ba7c1096B701A862bBCe7F13E9D33eED7e33c1D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0xcC44eD47023Bd88B82092A708c38609e8Fc2D197", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x0E8F4E699cd331022FaA2Ad75E500e70303C8767", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x49c36b3BEc6b6e0e77305273FAFC68f479630535", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:30:51.07624Z" - }, - { - "id": "70", - "keys": [ - "keystone-06" - ], - "name": "Chainlink Keystone Node Operator 6", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "783", - "name": "Chainlink Sepolia Prod Keystone One 6", - "publicKey": "75ac63fc97a31e31168084e0de8ccd2bea90059b609d962f3e43fc296cdba28d", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x8706E716fc1ee972F3E4D42D42711Aa175Aa654A", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn", - "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31" - }, - "ocrKeyBundle": { - "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525", - "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816", - "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d", - "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x19e10B063a62B1574AE19020A64fDe6419892dA6", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn", - "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31" - }, - "ocrKeyBundle": { - "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525", - "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816", - "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d", - "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "815", - "name": "Chainlink Sepolia Prod Keystone Cap One 6", - "publicKey": "2669981add3071fae5dfd760fe97e7d2b90157f86b40227f306f1f3906099fc3", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x405eE4ad3E79786f899810ff6de16a83A920Db5D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x58D39d629ae9f904b0Ae509179b9e7c9B0184cee", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x34bFe10F4f4e1101b019639ABd5E5eE5186B80E6", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x1741EB7468A490b4A9BA6f4CC7A47B82EcD65c4c", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:32:14.024795Z" - }, - { - "id": "71", - "keys": [ - "keystone-05" - ], - "name": "Chainlink Keystone Node Operator 5", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "784", - "name": "Chainlink Sepolia Prod Keystone One 5", - "publicKey": "4542f4fd2ed150c8c976b39802fe3d994aec3ac94fd11e7817f693b1c9a1dabb", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xcea9f5C042130dD35Eff5B5a6E2361A0276570e3", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ", - "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6" - }, - "ocrKeyBundle": { - "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc", - "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49", - "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8", - "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xdAd1F3F8ec690cf335D46c50EdA5547CeF875161", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ", - "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6" - }, - "ocrKeyBundle": { - "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc", - "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49", - "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8", - "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "814", - "name": "Chainlink Sepolia Prod Keystone Cap One 5", - "publicKey": "94e9ee398547f1564b8b5f72c6148e511919ed0e59b94ae848d63685108f2ab4", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xbd1ee3165178D3A3E38458a9Fb1d6BF7fb5C443e", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x9b6284B5775E46fB02C1a589596EF07c35b55377", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xD83DCED517E4df64e913B97b3d0A906e4CA63d43", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xFF1218066b4b5Cd9dE2A73639862082bcC98bf0D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:38:35.588611Z" - }, - { - "id": "72", - "keys": [ - "keystone-04" - ], - "name": "Chainlink Keystone Node Operator 4", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "785", - "name": "Chainlink Sepolia Prod Keystone One 4", - "publicKey": "07e0ffc57b6263604df517b94bd986169451a3c90600a855bb19212dc575de54", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x0be7Df958604166D9Bf0F727F0AC7A4Fb0f5B8a1", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg", - "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed" - }, - "ocrKeyBundle": { - "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd", - "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74", - "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde", - "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x6F5cAb24Fb7412bB516b3468b9F3a9c471d25fE5", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg", - "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed" - }, - "ocrKeyBundle": { - "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd", - "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74", - "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde", - "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "813", - "name": "Chainlink Sepolia Prod Keystone Cap One 4", - "publicKey": "a618fe2d3260151957d105d2dd593dddaad20c45dc6ae8eab265504e6585a02c", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xE73E4D047DA32De40C7008075aEb9F60C8AF3C90", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x7501ff3462fd2133f2E1F93DB7Ec514988B43E56", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xef080765890a3F697C4920609621fe301Dd34A70", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x860235D5Db42eF568665900BBD6bA3DB2fA4f33f", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:39:26.24249Z" - }, - { - "id": "73", - "keys": [ - "keystone-03", - "keystone-bt-03" - ], - "name": "Chainlink Keystone Node Operator 3", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "786", - "name": "\tChainlink Sepolia Prod Keystone One 3", - "publicKey": "487901e0c0a9d3c66e7cfc50f3a9e3cdbfdf1b0107273d73d94a91d278545516", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x3Be73A57a36E5ab00DcceD755B4bfF8bb99e52b2", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT", - "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6" - }, - "ocrKeyBundle": { - "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd", - "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b", - "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127", - "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xA9eFB53c513E413762b2Be5299D161d8E6e7278e", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT", - "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6" - }, - "ocrKeyBundle": { - "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd", - "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b", - "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127", - "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "812", - "name": "Chainlink Sepolia Prod Keystone Cap One 3", - "publicKey": "f4cf97438c3ad86003e5c0368ab52c70f7fbb7f39ae0d7bf6dacbe16807e8a36", - "chainConfigs": [ - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x646665317aF70313B3E83Ea1369A91de389DaCAe", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x3Ab2A4e4765A0374F727a9a9eCE893734e2928ec", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x9905E8C3A4f82037170a8c411CD8b11D4894066f", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x762354eC86ea2253F5da27FF8b952Cb7Dec52B6D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:40:30.499914Z" - }, - { - "id": "74", - "keys": [ - "keystone-02", - "keystone-bt-02" - ], - "name": "Chainlink Keystone Node Operator 2", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "787", - "name": "Chainlink Sepolia Prod Keystone One 2", - "publicKey": "7a166fbc816eb4a4dcb620d11c3ccac5c085d56b1972374100116f87619debb8", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x693bf95A3ef46E5dABe17d1A89dB1E83948aeD88", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo", - "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c" - }, - "ocrKeyBundle": { - "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34", - "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39", - "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3", - "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xCea84bC1881F3cE14BA13Dc3a00DC1Ff3D553fF0", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo", - "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c" - }, - "ocrKeyBundle": { - "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34", - "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39", - "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3", - "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "811", - "name": "Chainlink Sepolia Prod Keystone Cap One 2", - "publicKey": "a1f112923513f13ede1ca8f982ea0ab6221d584b40cd57f0c82307ab79c0e69f", - "chainConfigs": [ - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0xbF1Ad47D99A65e230235537b47C8D1Dddb22FD53", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xa8d4698f74a0A427c1b8ec4575d9dFdD17Be288c", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xf286c79b4a613a1fE480C8e4fB17B837E7D8ba03", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xfe85A25cE2CB58b280CC0316305fC678Bf570f5e", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:41:33.205484Z" - }, - { - "id": "75", - "keys": [ - "keystone-01", - "keystone-bt-01" - ], - "name": "Chainlink Keystone Node Operator 1", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "788", - "name": "Chainlink Sepolia Prod Keystone One 1", - "publicKey": "28b91143ec9111796a7d63e14c1cf6bb01b4ed59667ab54f5bc72ebe49c881be", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xe45a754B30FdE9852A826F58c6bd94Fa6554CE96", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v", - "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3" - }, - "ocrKeyBundle": { - "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0", - "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01", - "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8", - "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x415aa1E9a1bcB3929ed92bFa1F9735Dc0D45AD31", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v", - "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3" - }, - "ocrKeyBundle": { - "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0", - "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01", - "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8", - "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "810", - "name": "Chainlink Sepolia Prod Keystone Cap One 1", - "publicKey": "9ef27cd1855a0ed6932be33c80d7cd9c178307e5a240dbeb9055946359dc5d7f", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xBB465BCa1b289269F2a95a36f5B6fD006Af56ede", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x5e3618cFF8Ab337b3c73c2775d1a2EC65e5abEF0", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x1796BbC2AbbAd5660C8a7812b313E1f48A99f1D1", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xA2bfAc45e6878fbE04525C23dFbb11fFb224Ea60", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:42:05.709664Z" - }, - { - "id": "76", - "keys": [ - "keystone-00", - "keystone-bt-00" - ], - "name": "Chainlink Keystone Node Operator 0", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "789", - "name": "Chainlink Sepolia Prod Keystone One 0", - "publicKey": "403b72f0b1b3b5f5a91bcfedb7f28599767502a04b5b7e067fcf3782e23eeb9c", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x1a04C6b4b1A45D20356F93DcE7931F765955BAa7", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv", - "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b" - }, - "ocrKeyBundle": { - "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea", - "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f", - "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1", - "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x2877F08d9c5Cc9F401F730Fa418fAE563A9a2FF3", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv", - "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b" - }, - "ocrKeyBundle": { - "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea", - "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f", - "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1", - "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - }, - { - "id": "809", - "name": "Chainlink Sepolia Prod Keystone Cap One 0", - "publicKey": "545197637db59b96b22528ff90960b9e7cdcea81c8a5a9f06ae6b728bcba35cb", - "chainConfigs": [ - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x66a88b0a23D8351e8F5e228eEe8439e65F423842", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x36a46774A3743641D4C274b385608Cb455B5B6b8", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x868ab67c00fF7e21aFf470C066798e5bE4240305", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xa60bC482fCfcd12B752541a00555E4e448Bc1d16", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:42:49.446864Z" - }, - { - "id": "81", - "keys": [ - "cl-df-asset-don-testnet-0" - ], - "name": "Chainlink Keystone Asset DON Node Operator 0", - "metadata": { - "nodeCount": 2, - "jobCount": 18 - }, - "nodes": [ - { - "id": "831", - "name": "Chainlink Sepolia Prod Keystone Asset Node 0", - "publicKey": "d791dad33f1aeff811f3364088993053d5d08fa595ba48f73aecd4ee2d5035a1", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xe826b8D7f57b1c08E2d0C9477006244AECB280c3", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWDh47EiK5TzG4yApEEwLecgRkqZKQif3fcnsztfhQNzNh", - "publicKey": "398f42d12c7f3445341e42ce4ea555c87d84db68c808c76a0655e5d993d7a2a6" - }, - "ocrKeyBundle": { - "bundleID": "c8dee638c00194cf38bd0c30306fffd14b561601828085ceaaf0ab5fe451ec23", - "configPublicKey": "dbd5d1f5aa4921fd1e7b16f26dc75aff5cc08fee6e74324e947654ba78791e7e", - "offchainPublicKey": "66a599cda37e6fb5dc50e16d7c81e6967e010a25bbeaabf20752e228a26f5bc3", - "onchainSigningAddress": "9184c1c20da57f2f747a60909d0152c289e8518f" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:19:34.127102Z" - }, - { - "id": "82", - "keys": [ - "cl-df-asset-don-testnet-1" - ], - "name": "Chainlink Keystone Asset DON Node Operator 1", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "832", - "name": "Chainlink Sepolia Prod Keystone Asset Node 1", - "publicKey": "eb410038ba7847a729c4e40c1d4afdbcce9ad33cc71e459883cd98f0883a5366", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xCE154165b0d60D1efA9b3c7a172ED77712Cb82f9", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWG7WEsQjxXQdn5WAEQSDh77qxjMoWxz3rGYrRC9pPB7qx", - "publicKey": "5d8a1f11ecd0cd2cdd95fec35b8ea6386af567bc96aa2c2ea47e91d22b1f12bf" - }, - "ocrKeyBundle": { - "bundleID": "a6dda044db7fa1fa652ec9ff60a44fb31ee99d33db35599848b21e34ce33c343", - "configPublicKey": "586fb9935401e8907ead91e7a3423a0c0676d4669bac619f71c99913e14b362a", - "offchainPublicKey": "9557c0c4c6c8aeb41ecaa84f0aa7d0e1be7ffa9e4a08da27b23bd64b2d0c0fe9", - "onchainSigningAddress": "bd3e16dda612f543c0f79fafc03fa35f3f300e30" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:19:48.159926Z" - }, - { - "id": "83", - "keys": [ - "cl-df-asset-don-testnet-2" - ], - "name": "Chainlink Keystone Asset DON Node Operator 2", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "833", - "name": "Chainlink Sepolia Prod Keystone Asset Node 2", - "publicKey": "daf14b79caa585c3dacf550688aeed5371f8fd39cbfb6e33add2fb82538626b0", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xbb16a69A7bb8778dc52a2D081EE1B2Dde0237F3b", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBWms38viHaptUHTXXNdN4Qm2ZxDWtuaZviZtq1WzWWcq", - "publicKey": "1935b60309f79e7fd1bfd4736df5729b7532bcd435be2a707dd28519e9ae6e6a" - }, - "ocrKeyBundle": { - "bundleID": "9c63a332ff254cd2cda8bcf2c3f0e46ee95d4991595019619a0c60907437d98c", - "configPublicKey": "29b9b6f61db8e72df13e17e274bdf5450987953079b9dee2745f2d288dc7e86d", - "offchainPublicKey": "c3b08d0b68baf68da2c8446f6a9dc552af3ab2014b900d75ca9e2122b6fc9eb0", - "onchainSigningAddress": "cb66494d66922ad00708bce7c83ada133ddb8994" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:20:01.151494Z" - }, - { - "id": "84", - "keys": [ - "cl-df-asset-don-testnet-3" - ], - "name": "Chainlink Keystone Asset DON Node Operator 3", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "834", - "name": "Chainlink Sepolia Prod Keystone Asset Node 3", - "publicKey": "0e1f9462a8b326d746fde2d5016faa9f2e017f7e6e5969aaf3281519d2e31dbc", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xA64f65e0c12ab015792c34867BE5b80b4D4C551A", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMhHZTVHz23gCQAEzFyeBLxR9ghVqMQHk18VND4TbAc1U", - "publicKey": "b07bf77b2b1d8964915d4871b4cd0173e13bc1d0590731a8969393a6e80aef8f" - }, - "ocrKeyBundle": { - "bundleID": "87770ad41d54661a6dee424612f4338b49cd4fd20bdab1f11c308c76efeb56f8", - "configPublicKey": "dd0edc91d1476a0a4c554e8fe8050dadba679ba42f53973bf181d85eed1b6821", - "offchainPublicKey": "2ba2cc779c8e1460d9ff823d594708a344bb7a9d84aa3aa3833d539852511a88", - "onchainSigningAddress": "5e5b1a602c5a79ec6cdeb67e6f855d58061f785f" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:20:10.382565Z" - }, - { - "id": "85", - "keys": [ - "cl-df-asset-don-testnet-4" - ], - "name": "Chainlink Keystone Asset DON Node Operator 4", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "835", - "name": "Chainlink Sepolia Prod Keystone Asset Node 4", - "publicKey": "1d5f6ef3443e48bd471efdb47a5b9c6c900a14f35253c2b562908186f5b8b457", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x7284bBa5C8090Ac99d55b14db015a291C017275c", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMrkkbkFYJydLhcYKr8AnxNcNGmwfVXMQGdn8uoSpYoJs", - "publicKey": "b2e8f0b25c7334e8082cb82eee29bc4f48ae086b8fe4a2fd5eb4e08195a0e06c" - }, - "ocrKeyBundle": { - "bundleID": "1ceac31d893d21e95a62419d94b1a88805fa4f056b1636ccd79ab0ca8b4fe68c", - "configPublicKey": "4c94f49461fd0fd9d4da5cda4590a2cf80fba2ea27c422b92ee18a3aaaa51321", - "offchainPublicKey": "d1649b393614e01811979340d2726280f9ea57fd7a1ee28958adbbaf71b41bf5", - "onchainSigningAddress": "e47d17607054e9899d3fb7fa5b4b3e01b85b8fc9" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:20:21.050174Z" - }, - { - "id": "86", - "keys": [ - "cl-df-asset-don-testnet-5" - ], - "name": "Chainlink Keystone Asset DON Node Operator 5", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "837", - "name": "Chainlink Sepolia Prod Keystone Asset Node 5", - "publicKey": "d87dfbb7444036e0654578afdb11864e31a0de1824ca2780f24b16116a85463d", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x6c75DB65540ca889803a092d4C1497D3337cDE30", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWH8q69DtEqahJdwKfYXnkRHHH6E4jTqevZSAZzGsrnsTB", - "publicKey": "6cbcb3cc0a48ec9d94bb1424beea5e1b7cf57fda2dbfc519afd9221cbeac3b8e" - }, - "ocrKeyBundle": { - "bundleID": "6e088c00e61fea95a5a808a56e7e55c58ec0d61c3207383a2c63abc705bd120c", - "configPublicKey": "0728ce40c95155853ecd31bc213ed2b39d4ecf2e62dc95334f008181ad010848", - "offchainPublicKey": "521d4c291fe8ef245b2e497982b0a07127cd3c65439a10784d914e03ba24328d", - "onchainSigningAddress": "d32a6ed4be6656fd988a0e43e71ce43fab3faba4" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:21.831183Z" - }, - { - "id": "87", - "keys": [ - "cl-df-asset-don-testnet-6" - ], - "name": "Chainlink Keystone Asset DON Node Operator 6", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "838", - "name": "Chainlink Sepolia Prod Keystone Asset Node 6", - "publicKey": "294f58723d4049af0dcd63eedfcda957287401a10070db509ede7a799bb70654", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xa2788731913cc2deBC061F8594AEaa8e99B4FCCE", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWD7URmTzSeotMvEzkJTiFrwUHhcGMBeaS9GY8763Sqqnf", - "publicKey": "30f502f9fb19b54e8644f038f57f9a43582f76b86bace61759fff12886ccf1a8" - }, - "ocrKeyBundle": { - "bundleID": "57bc2a8a62ed96e6aa7b9bbe56f93abeef938a1766cb8a6d18e42ebf71101646", - "configPublicKey": "36c882b0cdcec84aa85f00ea43cd31254406cec84d31f6dded69b4fbb3f17449", - "offchainPublicKey": "46951e1e18cee25cd417b3fa7feb25fb53623a249e1c09491bb978dccc2ea76e", - "onchainSigningAddress": "abcd8be3952a84fb10947dbeb768a255ead58ca2" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:34.93501Z" - }, - { - "id": "88", - "keys": [ - "cl-df-asset-don-testnet-7" - ], - "name": "Chainlink Keystone Asset DON Node Operator 7", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "839", - "name": "Chainlink Sepolia Prod Keystone Asset Node 7", - "publicKey": "55b0ec5d90de973c00efce233334a9d3c5a94062ea010575bb248eb6804a9cfe", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x14dAF00DaD855089A6586690d5C1fD2779302736", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBbo44H5CLACV3yGyDWrtMuSWRdN5sQcDsnPC4WfLr6Jo", - "publicKey": "1a7ef5e7420434fcf06de3d15a0191f7499e00e15427679616ce800779ceb514" - }, - "ocrKeyBundle": { - "bundleID": "f87acde2c1c21e8859d84813034d84a3f3bb1d49596e13ac66731d50750b9436", - "configPublicKey": "e75f21bc1dc6eac12358277caf18a216ed54f8dc84285941ef1f5fb1047f8d5b", - "offchainPublicKey": "c7b86dfbdf31a3b13c44305cd6fc88c402653198201006083414223ffc36950d", - "onchainSigningAddress": "93fbb113f191959f8ab5e052395676e0038f2f1f" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:45.063449Z" - }, - { - "id": "89", - "keys": [ - "cl-df-asset-don-testnet-8" - ], - "name": "Chainlink Keystone Asset DON Node Operator 8", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "840", - "name": "Chainlink Sepolia Prod Keystone Asset Node 8", - "publicKey": "8f9f327ac7ad823a0f3297f3505591bcd40adc8fb1309f99874c26663cbd5914", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xb0C0168905C07F00A141494eaeFc0bD9F153fc16", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWGVroAehJh33SBns9MohmctNPZSDh89KRQM1J6TSCnT1v", - "publicKey": "63442493270891409900afd3bb868d03fd07c775bb38c56e56a624b674a68b35" - }, - "ocrKeyBundle": { - "bundleID": "4413e0a3080c3dfa7709b16c3ee68c04359e2dd66d107fd3be6ba7c615c4b3b6", - "configPublicKey": "8f3975b19fc6f02e241119b2132331ed9ed0d19221bd0cfd6f54b5859090a741", - "offchainPublicKey": "f4f182c889668d8951932c49e1ffb1252b8a33a9875d3f19aea7bb805b65c7a6", - "onchainSigningAddress": "b257e9efe637f38b5462a170737571ea0f0e2e05" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:55.09098Z" - }, - { - "id": "90", - "keys": [ - "cl-df-asset-don-testnet-9" - ], - "name": "Chainlink Keystone Asset DON Node Operator 9", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "841", - "name": "Chainlink Sepolia Prod Keystone Asset Node 9", - "publicKey": "1d79884071dfec1f39dc62f4868f4a143ae39cb03ad9d14142b184686c2b5a93", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x2F5E08a5b9D893e9dA2d68Ef605fBa6f8Ebfd0cB", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWEBn9tWmMWrSxRZe2VQ56RcSHRUPdcFoD3Ep88wqTT9zP", - "publicKey": "40eb109d9f28e8754dfff419a9175d6714405907413d2f77657355721c3b2bd0" - }, - "ocrKeyBundle": { - "bundleID": "6d4da72b1daad0b9ea47a7daa6cde81c1608b7bd199c05b18b989d10c5d7b99e", - "configPublicKey": "7e1c66bfa23c270770401d0dd739adad5a52827ecb40a0668f7e014d53f38059", - "offchainPublicKey": "712561a10b1f7dd96f0ae0f0d3e6cdf83fdd0837d333cf9bbae0090126ae7f39", - "onchainSigningAddress": "2ef8cea7dae7bd1e876a59a44ca59b89adf8abb4" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:09.476108Z" - }, - { - "id": "91", - "keys": [ - "cl-df-asset-don-testnet-10" - ], - "name": "Chainlink Keystone Asset DON Node Operator 10", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "842", - "name": "Chainlink Sepolia Prod Keystone Asset Node 10", - "publicKey": "cf6c47ad934518f5947ce8f1a48c2df8c93bd585788a3a82229fd4d723efa706", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x4794743bB8f159954Efa31642609ebfD4D2b9EdC", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNXZCbQe4Ao7KEciJGY6Ec4oZLZNGcMTPyZ7XpFhLPyLo", - "publicKey": "bcd987b3b2b20d9effe30598850ddfd33023339dab012c4aee4cdc4246111bfc" - }, - "ocrKeyBundle": { - "bundleID": "a8d9929327d89cfabd8c583d250dfddbc14e947e9253f7471191886ca5197786", - "configPublicKey": "a1a390e756bce818d1786dca6ba3e45013085087e5a3be6253d8bbbd6479255a", - "offchainPublicKey": "76522fec251ce6130c03a816025f2054eb3ac83b7d30347f42b73a77e7b9a511", - "onchainSigningAddress": "179d48901e5e9c3c11dd947c001f8a2ee887c8eb" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:30.732346Z" - }, - { - "id": "92", - "keys": [ - "cl-df-asset-don-testnet-11" - ], - "name": "Chainlink Keystone Asset DON Node Operator 11", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "843", - "name": "Chainlink Sepolia Prod Keystone Asset Node 11", - "publicKey": "c239c23670224558a64ea3165eae8d67a17b75b1874fbccf8a4dd98e953820ad", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x27AFd92F391dFD7BA1bbC89e3bd13ceC9A667c11", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWSSzLfwq7QSdJcpDLFiBznA1XR58dwg1xre4b88SbP7VF", - "publicKey": "f71ccc7f7b73f1499f72987679a94a11e8564f01415acdb958c008c5bfe21eae" - }, - "ocrKeyBundle": { - "bundleID": "3e691b13aa702631fba25f6e128a566bdff3982cc3438af29acc2a819b9d6e02", - "configPublicKey": "149d81dce137d0874b477ad6c19dc72801f335200622fa34f1c660623febed22", - "offchainPublicKey": "b0d0d8e3c62abc7236e6539413ef82e568dd24f0c39ff6e8e2babe513590a522", - "onchainSigningAddress": "a0f2feab4d03899eb2e830bd4abc3fd5babef3e1" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:42.314654Z" - }, - { - "id": "93", - "keys": [ - "cl-df-asset-don-testnet-12" - ], - "name": "Chainlink Keystone Asset DON Node Operator 12", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "844", - "name": "Chainlink Sepolia Prod Keystone Asset Node 12", - "publicKey": "71b29eb63daa6ac2e48b46669936eff5606879b102bae78afc929554c435dd0b", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x13d5b27d71B4C4697874177Ff43DEB1884Cff49e", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWT1LMqEW51UfxBynzjYjuybQzVkmf4rH9js9e16QAbU3X", - "publicKey": "ff66057a6c96779134a6527364cddcce43b69e3d1820f59dde5e6b38d1d32fde" - }, - "ocrKeyBundle": { - "bundleID": "4854ee3fc7ac4591eea33c5d0d1cefd4ad819d2c374a2f86267a9999228a967a", - "configPublicKey": "470225644f274147b5b80c862a3f3cd7a19fed4ff915e9c18ac80e06003ecc6a", - "offchainPublicKey": "e7d89e196f5f6d92f4c42ab34f9a2f21f3201314be65b819872c4609b87866c7", - "onchainSigningAddress": "c84f2f60ccb1d7e6c6e4ae4bc3cab8bb85db8977" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:52.838595Z" - }, - { - "id": "94", - "keys": [ - "cl-df-asset-don-testnet-13" - ], - "name": "Chainlink Keystone Asset DON Node Operator 13", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "845", - "name": "Chainlink Sepolia Prod Keystone Asset Node 13", - "publicKey": "c098264a552125355804b903de06400621f2d1de357c2bed94586727fe8a3502", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x5647A091F2a09915c1C0F6ac95630Be87114881F", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWRjg2KoP6jKVWU2BczeduWsdnfN69tHN2YGEAGtETvc9P", - "publicKey": "ec87467a512f8218bb63f7fcf46cf0b8fd8ebb14bd5f3b670908d505a5af801a" - }, - "ocrKeyBundle": { - "bundleID": "20626049a1e24912a14d186645ba70fea4860efcc987b3ec7c9ddc881b5057db", - "configPublicKey": "d84d4653db0caca062d4058e9937ae618a53bbd1b41a673c5f13bebc24e7aa3a", - "offchainPublicKey": "156c8ab52099386377fe27bbd50dafa368ff2790245f1407579f590b0bae7a1e", - "onchainSigningAddress": "4f4b7bff5d32d62326b575d8c951d34e54888e31" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:23:19.587619Z" - }, - { - "id": "95", - "keys": [ - "cl-df-asset-don-testnet-14" - ], - "name": "Chainlink Keystone Asset DON Node Operator 14", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "846", - "name": "Chainlink Sepolia Prod Keystone Asset Node 14", - "publicKey": "12681ec137cd2d25e7c71638f564404dd764061921c870bbcddf683d048eed21", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x0419E70d32c3972930c99aaaDF20dCB473c56d22", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCdEG68z5kwYuD1xp1aJsFBtpw2HYh1K3ffVM6keVrJnT", - "publicKey": "29b8bafebdef5e11ec3556fbcacdfb626d2f80cf178406e38664775e8b1ace78" - }, - "ocrKeyBundle": { - "bundleID": "80b1304898d5cea3c684790a0f01158468c7fa7770675edef33e4b137232ddc9", - "configPublicKey": "15552ecb6ff10103a534f02594a7b7cbab686d76d5e7b32a9c67059e8c856861", - "offchainPublicKey": "b561b7df3bdfe70f1af9395dbc00ef796774aa352c9a30d9c7e2f7e74d438073", - "onchainSigningAddress": "fb1ca65bf473b4443d7359becc0de67a2d96228d" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:23:44.73219Z" - }, - { - "id": "96", - "keys": [ - "cl-df-asset-don-testnet-15" - ], - "name": "Chainlink Keystone Asset DON Node Operator 15", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "847", - "name": "Chainlink Sepolia Prod Keystone Asset Node 15", - "publicKey": "a9a5d084f9cbbbd291eb43c33dd137cd6140e33c53cebb260463bf52795ec579", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x931900764a585D7a01e500976B630B4747216c8c", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQyZ9A9ScBpcoRww1gJVBNB2brNkjJhaqze6ehuv6bmfQ", - "publicKey": "e139f020ae4bc9efaa77da9cfd54339d36176479028f849b9e64ad2cf29acba3" - }, - "ocrKeyBundle": { - "bundleID": "5c1c69eb1d6619b2c9b93bdfdd9c1b87c28101d6fc88bf7979ad52ceda459908", - "configPublicKey": "33f2107ab22b3dd5c19d5de0c5b1e6e038f2275ba455eed7997485caec421925", - "offchainPublicKey": "bb91b077c135cbdd1f4422c6021cf56d78326710c8bb8c4a87b3e7415e48915f", - "onchainSigningAddress": "b94e3de607033d03e3f0cc3ef1f09edd2592b440" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:24:01.875231Z" - } -] \ No newline at end of file diff --git a/integration-tests/deployment/keystone/deploy.go b/integration-tests/deployment/keystone/deploy.go index 204247fd721..0e7c8737750 100644 --- a/integration-tests/deployment/keystone/deploy.go +++ b/integration-tests/deployment/keystone/deploy.go @@ -7,6 +7,7 @@ import ( "encoding/hex" "errors" "fmt" + "slices" "sort" "strings" "time" @@ -14,6 +15,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/rpc" + nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" "github.com/smartcontractkit/chainlink/integration-tests/deployment" "google.golang.org/protobuf/proto" @@ -93,8 +95,13 @@ func ConfigureContracts(ctx context.Context, lggr logger.Logger, req ConfigureCo return nil, fmt.Errorf("failed to configure registry: %w", err) } + donInfos, err := DonInfos(req.Dons, req.Env.Offchain) + if err != nil { + return nil, fmt.Errorf("failed to get don infos: %w", err) + } + // now we have the capability registry set up we need to configure the forwarder contracts and the OCR3 contract - dons, err := joinInfoAndNodes(cfgRegistryResp.DonInfos, req.Dons) + dons, err := joinInfoAndNodes(cfgRegistryResp.DonInfos, donInfos) if err != nil { return nil, fmt.Errorf("failed to assimilate registry to Dons: %w", err) } @@ -140,6 +147,63 @@ func DeployContracts(lggr logger.Logger, e *deployment.Environment, chainSel uin }, nil } +// DonInfo is DonCapabilities, but expanded to contain node information +type DonInfo struct { + Name string + Nodes []Node + Capabilities []kcr.CapabilitiesRegistryCapability // every capability is hosted on each node +} + +type Node struct { + ID string + Name string + PublicKey *string + ChainConfigs []*nodev1.ChainConfig +} + +func DonInfos(dons []DonCapabilities, jd deployment.OffchainClient) ([]DonInfo, error) { + var donInfos []DonInfo + for _, don := range dons { + var nodes []Node + nodesFromJD, err := jd.ListNodes(context.Background(), &nodev1.ListNodesRequest{ + Filter: &nodev1.ListNodesRequest_Filter{ + Enabled: 1, + Ids: don.Nodes, + }, + }) + if err != nil { + return nil, err + } + for _, nodeID := range don.Nodes { + // TODO: Filter should accept multiple nodes + nodeChainConfigs, err := jd.ListNodeChainConfigs(context.Background(), &nodev1.ListNodeChainConfigsRequest{Filter: &nodev1.ListNodeChainConfigsRequest_Filter{ + NodeIds: []string{nodeID}, + }}) + if err != nil { + return nil, err + } + idx := slices.IndexFunc(nodesFromJD.GetNodes(), func(node *nodev1.Node) bool { return node.Id == nodeID }) + if idx < 0 { + return nil, fmt.Errorf("node id not found") + } + + nodes = append(nodes, Node{ + ID: nodeID, + Name: don.Name, + PublicKey: &nodesFromJD.Nodes[idx].PublicKey, + // PublicKey TODO fetch via ListNodes + ChainConfigs: nodeChainConfigs.GetChainConfigs(), + }) + } + donInfos = append(donInfos, DonInfo{ + Name: don.Name, + Nodes: nodes, + Capabilities: don.Capabilities, + }) + } + return donInfos, nil +} + // ConfigureRegistry configures the registry contract with the given DONS and their capabilities // the address book is required to contain the addresses of the deployed registry contract func ConfigureRegistry(ctx context.Context, lggr logger.Logger, req ConfigureContractsRequest, addrBook deployment.AddressBook) (*ConfigureContractsResponse, error) { @@ -156,6 +220,11 @@ func ConfigureRegistry(ctx context.Context, lggr logger.Logger, req ConfigureCon return nil, fmt.Errorf("failed to get contract sets: %w", err) } + donInfos, err := DonInfos(req.Dons, req.Env.Offchain) + if err != nil { + return nil, fmt.Errorf("failed to get don infos: %w", err) + } + // ensure registry is deployed and get the registry contract and chain var registry *capabilities_registry.CapabilitiesRegistry registryChainContracts, ok := contractSetsResp.ContractSets[req.RegistryChainSel] @@ -170,15 +239,15 @@ func ConfigureRegistry(ctx context.Context, lggr logger.Logger, req ConfigureCon // all the subsequent calls to the registry are in terms of nodes // compute the mapping of dons to their nodes for reuse in various registry calls - donToOcr2Nodes, err := mapDonsToNodes(req.Dons, true) + donToOcr2Nodes, err := mapDonsToNodes(donInfos, true) if err != nil { return nil, fmt.Errorf("failed to map dons to nodes: %w", err) } // TODO: we can remove this abstractions and refactor the functions that accept them to accept []DonCapabilities // they are unnecessary indirection - donToCapabilities := mapDonsToCaps(req.Dons) - nodeIdToNop, err := nodesToNops(req.Dons, req.RegistryChainSel) + donToCapabilities := mapDonsToCaps(donInfos) + nodeIdToNop, err := nodesToNops(donInfos, req.RegistryChainSel) if err != nil { return nil, fmt.Errorf("failed to map nodes to nops: %w", err) } diff --git a/integration-tests/deployment/keystone/deploy_test.go b/integration-tests/deployment/keystone/deploy_test.go index b6f34969801..7404d590052 100644 --- a/integration-tests/deployment/keystone/deploy_test.go +++ b/integration-tests/deployment/keystone/deploy_test.go @@ -1,23 +1,22 @@ package keystone_test import ( - "encoding/json" "fmt" - "os" "testing" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/stretchr/testify/assert" "github.com/test-go/testify/require" + "go.uber.org/zap/zapcore" + "golang.org/x/exp/maps" chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink/integration-tests/deployment" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/memory" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -25,50 +24,76 @@ import ( func TestDeploy(t *testing.T) { lggr := logger.TestLogger(t) - wfNops := loadTestNops(t, "testdata/workflow_nodes.json") - cwNops := loadTestNops(t, "testdata/chain_writer_nodes.json") - assetNops := loadTestNops(t, "testdata/asset_nodes.json") - require.Len(t, wfNops, 10) - requireChains(t, wfNops, []models.ChainType{models.ChainTypeEvm, models.ChainTypeAptos}) - require.Len(t, cwNops, 10) - requireChains(t, cwNops, []models.ChainType{models.ChainTypeEvm, models.ChainTypeEvm}) - require.Len(t, assetNops, 16) - requireChains(t, assetNops, []models.ChainType{models.ChainTypeEvm}) + // sepolia; all nodes are on the this chain + sepoliaChainId := uint64(11155111) + sepoliaArbitrumChainId := uint64(421614) + + sepoliaChainSel, err := chainsel.SelectorFromChainId(sepoliaChainId) + require.NoError(t, err) + // sepoliaArbitrumChainSel, err := chainsel.SelectorFromChainId(sepoliaArbitrumChainId) + // require.NoError(t, err) + // aptosChainSel := uint64(999) // TODO: + + crConfig := deployment.CapabilityRegistryConfig{ + EVMChainID: sepoliaChainId, + Contract: [20]byte{}, + } + + evmChains := memory.NewMemoryChainsWithChainIDs(t, []uint64{sepoliaChainId, sepoliaArbitrumChainId}) + // aptosChain := memory.NewMemoryChain(t, aptosChainSel) + + // TODO: also need to tag these nodes + wfChains := map[uint64]deployment.Chain{} + wfChains[sepoliaChainSel] = evmChains[sepoliaChainSel] + // wfChains[aptosChainSel] = aptosChain + wfNodes := memory.NewNodes(t, zapcore.InfoLevel, wfChains, 4, 0, crConfig) + require.Len(t, wfNodes, 4) + + cwNodes := memory.NewNodes(t, zapcore.InfoLevel, evmChains, 4, 0, crConfig) + + assetChains := map[uint64]deployment.Chain{} + assetChains[sepoliaChainSel] = evmChains[sepoliaChainSel] + assetNodes := memory.NewNodes(t, zapcore.InfoLevel, assetChains, 4, 0, crConfig) + require.Len(t, assetNodes, 4) wfDon := keystone.DonCapabilities{ Name: keystone.WFDonName, - Nops: wfNops, + Nodes: maps.Keys(wfNodes), Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.OCR3Cap}, } cwDon := keystone.DonCapabilities{ Name: keystone.TargetDonName, - Nops: cwNops, + Nodes: maps.Keys(cwNodes), Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.WriteChainCap}, } assetDon := keystone.DonCapabilities{ Name: keystone.StreamDonName, - Nops: assetNops, + Nodes: maps.Keys(assetNodes), Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.StreamTriggerCap}, } - env := makeMultiDonTestEnv(t, lggr, []keystone.DonCapabilities{wfDon, cwDon, assetDon}) + allChains := make(map[uint64]deployment.Chain) + maps.Copy(allChains, evmChains) + // allChains[aptosChainSel] = aptosChain - // sepolia; all nodes are on the this chain - registryChainSel, err := chainsel.SelectorFromChainId(11155111) - require.NoError(t, err) + allNodes := make(map[string]memory.Node) + maps.Copy(allNodes, wfNodes) + maps.Copy(allNodes, cwNodes) + maps.Copy(allNodes, assetNodes) + env := memory.NewMemoryEnvironmentFromChainsNodes(t, lggr, allChains, allNodes) var ocr3Config = keystone.OracleConfigSource{ - MaxFaultyOracles: len(wfNops) / 3, + MaxFaultyOracles: len(wfNodes) / 3, } ctx := tests.Context(t) // explicitly deploy the contracts - cs, err := keystone.DeployContracts(lggr, env, registryChainSel) + cs, err := keystone.DeployContracts(lggr, &env, sepoliaChainSel) require.NoError(t, err) deployReq := keystone.ConfigureContractsRequest{ - RegistryChainSel: registryChainSel, - Env: env, + RegistryChainSel: sepoliaChainSel, + Env: &env, OCR3Config: &ocr3Config, Dons: []keystone.DonCapabilities{wfDon, cwDon, assetDon}, AddressBook: cs.AddressBook, @@ -82,14 +107,14 @@ func TestDeploy(t *testing.T) { lggr.Infow("Deployed Keystone contracts", "address book", addrs) // all contracts on home chain - homeChainAddrs, err := ad.AddressesForChain(registryChainSel) + homeChainAddrs, err := ad.AddressesForChain(sepoliaChainSel) require.NoError(t, err) require.Len(t, homeChainAddrs, 3) // only forwarder on non-home chain for sel := range env.Chains { chainAddrs, err := ad.AddressesForChain(sel) require.NoError(t, err) - if sel != registryChainSel { + if sel != sepoliaChainSel { require.Len(t, chainAddrs, 1) } else { require.Len(t, chainAddrs, 3) @@ -112,7 +137,7 @@ func TestDeploy(t *testing.T) { require.NoError(t, err) require.Len(t, contractSetsResp.ContractSets, len(env.Chains)) // check the registry - regChainContracts, ok := contractSetsResp.ContractSets[registryChainSel] + regChainContracts, ok := contractSetsResp.ContractSets[sepoliaChainSel] require.True(t, ok) gotRegistry := regChainContracts.CapabilitiesRegistry require.NotNil(t, gotRegistry) @@ -147,7 +172,7 @@ func TestDeploy(t *testing.T) { } // check the ocr3 contract for chainSel, cs := range contractSetsResp.ContractSets { - if chainSel != registryChainSel { + if chainSel != sepoliaChainSel { require.Nil(t, cs.OCR3) continue } @@ -157,46 +182,3 @@ func TestDeploy(t *testing.T) { require.NoError(t, err) } } - -func requireChains(t *testing.T, donNops []*models.NodeOperator, cs []models.ChainType) { - got := make(map[models.ChainType]struct{}) - want := make(map[models.ChainType]struct{}) - for _, c := range cs { - want[c] = struct{}{} - } - for _, nop := range donNops { - for _, node := range nop.Nodes { - for _, cc := range node.ChainConfigs { - got[cc.Network.ChainType] = struct{}{} - } - } - require.EqualValues(t, want, got, "did not find all chains in node %s", nop.Name) - } -} - -func makeMultiDonTestEnv(t *testing.T, lggr logger.Logger, dons []keystone.DonCapabilities) *deployment.Environment { - var donToEnv = make(map[string]*deployment.Environment) - // chain selector lib doesn't support chain id 2 and we don't use it in tests - // because it's not an evm chain - ignoreAptos := func(c *models.NodeChainConfig) bool { - return c.Network.ChainID == "2" // aptos chain - } - for _, don := range dons { - env := clo.NewDonEnvWithMemoryChains(t, clo.DonEnvConfig{ - DonName: don.Name, - Nops: don.Nops, - Logger: lggr, - }, ignoreAptos) - donToEnv[don.Name] = env - } - menv := clo.NewTestEnv(t, lggr, donToEnv) - return menv.Flatten("testing-env") -} - -func loadTestNops(t *testing.T, pth string) []*models.NodeOperator { - f, err := os.ReadFile(pth) - require.NoError(t, err) - var nops []*models.NodeOperator - require.NoError(t, json.Unmarshal(f, &nops)) - return nops -} diff --git a/integration-tests/deployment/keystone/testdata/asset_nodes.json b/integration-tests/deployment/keystone/testdata/asset_nodes.json deleted file mode 100644 index 9c8c4e0fd03..00000000000 --- a/integration-tests/deployment/keystone/testdata/asset_nodes.json +++ /dev/null @@ -1,978 +0,0 @@ -[ - { - "id": "81", - "keys": [ - "cl-df-asset-don-testnet-0" - ], - "name": "Chainlink Keystone Asset DON Node Operator 0", - "metadata": { - "nodeCount": 2, - "jobCount": 18 - }, - "nodes": [ - { - "id": "831", - "name": "Chainlink Sepolia Prod Keystone Asset Node 0", - "publicKey": "d791dad33f1aeff811f3364088993053d5d08fa595ba48f73aecd4ee2d5035a1", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xe826b8D7f57b1c08E2d0C9477006244AECB280c3", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWDh47EiK5TzG4yApEEwLecgRkqZKQif3fcnsztfhQNzNh", - "publicKey": "398f42d12c7f3445341e42ce4ea555c87d84db68c808c76a0655e5d993d7a2a6" - }, - "ocrKeyBundle": { - "bundleID": "c8dee638c00194cf38bd0c30306fffd14b561601828085ceaaf0ab5fe451ec23", - "configPublicKey": "dbd5d1f5aa4921fd1e7b16f26dc75aff5cc08fee6e74324e947654ba78791e7e", - "offchainPublicKey": "66a599cda37e6fb5dc50e16d7c81e6967e010a25bbeaabf20752e228a26f5bc3", - "onchainSigningAddress": "9184c1c20da57f2f747a60909d0152c289e8518f" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:19:34.127102Z" - }, - { - "id": "82", - "keys": [ - "cl-df-asset-don-testnet-1" - ], - "name": "Chainlink Keystone Asset DON Node Operator 1", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "832", - "name": "Chainlink Sepolia Prod Keystone Asset Node 1", - "publicKey": "eb410038ba7847a729c4e40c1d4afdbcce9ad33cc71e459883cd98f0883a5366", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xCE154165b0d60D1efA9b3c7a172ED77712Cb82f9", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWG7WEsQjxXQdn5WAEQSDh77qxjMoWxz3rGYrRC9pPB7qx", - "publicKey": "5d8a1f11ecd0cd2cdd95fec35b8ea6386af567bc96aa2c2ea47e91d22b1f12bf" - }, - "ocrKeyBundle": { - "bundleID": "a6dda044db7fa1fa652ec9ff60a44fb31ee99d33db35599848b21e34ce33c343", - "configPublicKey": "586fb9935401e8907ead91e7a3423a0c0676d4669bac619f71c99913e14b362a", - "offchainPublicKey": "9557c0c4c6c8aeb41ecaa84f0aa7d0e1be7ffa9e4a08da27b23bd64b2d0c0fe9", - "onchainSigningAddress": "bd3e16dda612f543c0f79fafc03fa35f3f300e30" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:19:48.159926Z" - }, - { - "id": "83", - "keys": [ - "cl-df-asset-don-testnet-2" - ], - "name": "Chainlink Keystone Asset DON Node Operator 2", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "833", - "name": "Chainlink Sepolia Prod Keystone Asset Node 2", - "publicKey": "daf14b79caa585c3dacf550688aeed5371f8fd39cbfb6e33add2fb82538626b0", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xbb16a69A7bb8778dc52a2D081EE1B2Dde0237F3b", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBWms38viHaptUHTXXNdN4Qm2ZxDWtuaZviZtq1WzWWcq", - "publicKey": "1935b60309f79e7fd1bfd4736df5729b7532bcd435be2a707dd28519e9ae6e6a" - }, - "ocrKeyBundle": { - "bundleID": "9c63a332ff254cd2cda8bcf2c3f0e46ee95d4991595019619a0c60907437d98c", - "configPublicKey": "29b9b6f61db8e72df13e17e274bdf5450987953079b9dee2745f2d288dc7e86d", - "offchainPublicKey": "c3b08d0b68baf68da2c8446f6a9dc552af3ab2014b900d75ca9e2122b6fc9eb0", - "onchainSigningAddress": "cb66494d66922ad00708bce7c83ada133ddb8994" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:20:01.151494Z" - }, - { - "id": "84", - "keys": [ - "cl-df-asset-don-testnet-3" - ], - "name": "Chainlink Keystone Asset DON Node Operator 3", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "834", - "name": "Chainlink Sepolia Prod Keystone Asset Node 3", - "publicKey": "0e1f9462a8b326d746fde2d5016faa9f2e017f7e6e5969aaf3281519d2e31dbc", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xA64f65e0c12ab015792c34867BE5b80b4D4C551A", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMhHZTVHz23gCQAEzFyeBLxR9ghVqMQHk18VND4TbAc1U", - "publicKey": "b07bf77b2b1d8964915d4871b4cd0173e13bc1d0590731a8969393a6e80aef8f" - }, - "ocrKeyBundle": { - "bundleID": "87770ad41d54661a6dee424612f4338b49cd4fd20bdab1f11c308c76efeb56f8", - "configPublicKey": "dd0edc91d1476a0a4c554e8fe8050dadba679ba42f53973bf181d85eed1b6821", - "offchainPublicKey": "2ba2cc779c8e1460d9ff823d594708a344bb7a9d84aa3aa3833d539852511a88", - "onchainSigningAddress": "5e5b1a602c5a79ec6cdeb67e6f855d58061f785f" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:20:10.382565Z" - }, - { - "id": "85", - "keys": [ - "cl-df-asset-don-testnet-4" - ], - "name": "Chainlink Keystone Asset DON Node Operator 4", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "835", - "name": "Chainlink Sepolia Prod Keystone Asset Node 4", - "publicKey": "1d5f6ef3443e48bd471efdb47a5b9c6c900a14f35253c2b562908186f5b8b457", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x7284bBa5C8090Ac99d55b14db015a291C017275c", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMrkkbkFYJydLhcYKr8AnxNcNGmwfVXMQGdn8uoSpYoJs", - "publicKey": "b2e8f0b25c7334e8082cb82eee29bc4f48ae086b8fe4a2fd5eb4e08195a0e06c" - }, - "ocrKeyBundle": { - "bundleID": "1ceac31d893d21e95a62419d94b1a88805fa4f056b1636ccd79ab0ca8b4fe68c", - "configPublicKey": "4c94f49461fd0fd9d4da5cda4590a2cf80fba2ea27c422b92ee18a3aaaa51321", - "offchainPublicKey": "d1649b393614e01811979340d2726280f9ea57fd7a1ee28958adbbaf71b41bf5", - "onchainSigningAddress": "e47d17607054e9899d3fb7fa5b4b3e01b85b8fc9" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:20:21.050174Z" - }, - { - "id": "86", - "keys": [ - "cl-df-asset-don-testnet-5" - ], - "name": "Chainlink Keystone Asset DON Node Operator 5", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "837", - "name": "Chainlink Sepolia Prod Keystone Asset Node 5", - "publicKey": "d87dfbb7444036e0654578afdb11864e31a0de1824ca2780f24b16116a85463d", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x6c75DB65540ca889803a092d4C1497D3337cDE30", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWH8q69DtEqahJdwKfYXnkRHHH6E4jTqevZSAZzGsrnsTB", - "publicKey": "6cbcb3cc0a48ec9d94bb1424beea5e1b7cf57fda2dbfc519afd9221cbeac3b8e" - }, - "ocrKeyBundle": { - "bundleID": "6e088c00e61fea95a5a808a56e7e55c58ec0d61c3207383a2c63abc705bd120c", - "configPublicKey": "0728ce40c95155853ecd31bc213ed2b39d4ecf2e62dc95334f008181ad010848", - "offchainPublicKey": "521d4c291fe8ef245b2e497982b0a07127cd3c65439a10784d914e03ba24328d", - "onchainSigningAddress": "d32a6ed4be6656fd988a0e43e71ce43fab3faba4" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:21.831183Z" - }, - { - "id": "87", - "keys": [ - "cl-df-asset-don-testnet-6" - ], - "name": "Chainlink Keystone Asset DON Node Operator 6", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "838", - "name": "Chainlink Sepolia Prod Keystone Asset Node 6", - "publicKey": "294f58723d4049af0dcd63eedfcda957287401a10070db509ede7a799bb70654", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xa2788731913cc2deBC061F8594AEaa8e99B4FCCE", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWD7URmTzSeotMvEzkJTiFrwUHhcGMBeaS9GY8763Sqqnf", - "publicKey": "30f502f9fb19b54e8644f038f57f9a43582f76b86bace61759fff12886ccf1a8" - }, - "ocrKeyBundle": { - "bundleID": "57bc2a8a62ed96e6aa7b9bbe56f93abeef938a1766cb8a6d18e42ebf71101646", - "configPublicKey": "36c882b0cdcec84aa85f00ea43cd31254406cec84d31f6dded69b4fbb3f17449", - "offchainPublicKey": "46951e1e18cee25cd417b3fa7feb25fb53623a249e1c09491bb978dccc2ea76e", - "onchainSigningAddress": "abcd8be3952a84fb10947dbeb768a255ead58ca2" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:34.93501Z" - }, - { - "id": "88", - "keys": [ - "cl-df-asset-don-testnet-7" - ], - "name": "Chainlink Keystone Asset DON Node Operator 7", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "839", - "name": "Chainlink Sepolia Prod Keystone Asset Node 7", - "publicKey": "55b0ec5d90de973c00efce233334a9d3c5a94062ea010575bb248eb6804a9cfe", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x14dAF00DaD855089A6586690d5C1fD2779302736", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBbo44H5CLACV3yGyDWrtMuSWRdN5sQcDsnPC4WfLr6Jo", - "publicKey": "1a7ef5e7420434fcf06de3d15a0191f7499e00e15427679616ce800779ceb514" - }, - "ocrKeyBundle": { - "bundleID": "f87acde2c1c21e8859d84813034d84a3f3bb1d49596e13ac66731d50750b9436", - "configPublicKey": "e75f21bc1dc6eac12358277caf18a216ed54f8dc84285941ef1f5fb1047f8d5b", - "offchainPublicKey": "c7b86dfbdf31a3b13c44305cd6fc88c402653198201006083414223ffc36950d", - "onchainSigningAddress": "93fbb113f191959f8ab5e052395676e0038f2f1f" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:45.063449Z" - }, - { - "id": "89", - "keys": [ - "cl-df-asset-don-testnet-8" - ], - "name": "Chainlink Keystone Asset DON Node Operator 8", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "840", - "name": "Chainlink Sepolia Prod Keystone Asset Node 8", - "publicKey": "8f9f327ac7ad823a0f3297f3505591bcd40adc8fb1309f99874c26663cbd5914", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xb0C0168905C07F00A141494eaeFc0bD9F153fc16", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWGVroAehJh33SBns9MohmctNPZSDh89KRQM1J6TSCnT1v", - "publicKey": "63442493270891409900afd3bb868d03fd07c775bb38c56e56a624b674a68b35" - }, - "ocrKeyBundle": { - "bundleID": "4413e0a3080c3dfa7709b16c3ee68c04359e2dd66d107fd3be6ba7c615c4b3b6", - "configPublicKey": "8f3975b19fc6f02e241119b2132331ed9ed0d19221bd0cfd6f54b5859090a741", - "offchainPublicKey": "f4f182c889668d8951932c49e1ffb1252b8a33a9875d3f19aea7bb805b65c7a6", - "onchainSigningAddress": "b257e9efe637f38b5462a170737571ea0f0e2e05" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:21:55.09098Z" - }, - { - "id": "90", - "keys": [ - "cl-df-asset-don-testnet-9" - ], - "name": "Chainlink Keystone Asset DON Node Operator 9", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "841", - "name": "Chainlink Sepolia Prod Keystone Asset Node 9", - "publicKey": "1d79884071dfec1f39dc62f4868f4a143ae39cb03ad9d14142b184686c2b5a93", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x2F5E08a5b9D893e9dA2d68Ef605fBa6f8Ebfd0cB", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWEBn9tWmMWrSxRZe2VQ56RcSHRUPdcFoD3Ep88wqTT9zP", - "publicKey": "40eb109d9f28e8754dfff419a9175d6714405907413d2f77657355721c3b2bd0" - }, - "ocrKeyBundle": { - "bundleID": "6d4da72b1daad0b9ea47a7daa6cde81c1608b7bd199c05b18b989d10c5d7b99e", - "configPublicKey": "7e1c66bfa23c270770401d0dd739adad5a52827ecb40a0668f7e014d53f38059", - "offchainPublicKey": "712561a10b1f7dd96f0ae0f0d3e6cdf83fdd0837d333cf9bbae0090126ae7f39", - "onchainSigningAddress": "2ef8cea7dae7bd1e876a59a44ca59b89adf8abb4" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:09.476108Z" - }, - { - "id": "91", - "keys": [ - "cl-df-asset-don-testnet-10" - ], - "name": "Chainlink Keystone Asset DON Node Operator 10", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "842", - "name": "Chainlink Sepolia Prod Keystone Asset Node 10", - "publicKey": "cf6c47ad934518f5947ce8f1a48c2df8c93bd585788a3a82229fd4d723efa706", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x4794743bB8f159954Efa31642609ebfD4D2b9EdC", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNXZCbQe4Ao7KEciJGY6Ec4oZLZNGcMTPyZ7XpFhLPyLo", - "publicKey": "bcd987b3b2b20d9effe30598850ddfd33023339dab012c4aee4cdc4246111bfc" - }, - "ocrKeyBundle": { - "bundleID": "a8d9929327d89cfabd8c583d250dfddbc14e947e9253f7471191886ca5197786", - "configPublicKey": "a1a390e756bce818d1786dca6ba3e45013085087e5a3be6253d8bbbd6479255a", - "offchainPublicKey": "76522fec251ce6130c03a816025f2054eb3ac83b7d30347f42b73a77e7b9a511", - "onchainSigningAddress": "179d48901e5e9c3c11dd947c001f8a2ee887c8eb" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:30.732346Z" - }, - { - "id": "92", - "keys": [ - "cl-df-asset-don-testnet-11" - ], - "name": "Chainlink Keystone Asset DON Node Operator 11", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "843", - "name": "Chainlink Sepolia Prod Keystone Asset Node 11", - "publicKey": "c239c23670224558a64ea3165eae8d67a17b75b1874fbccf8a4dd98e953820ad", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x27AFd92F391dFD7BA1bbC89e3bd13ceC9A667c11", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWSSzLfwq7QSdJcpDLFiBznA1XR58dwg1xre4b88SbP7VF", - "publicKey": "f71ccc7f7b73f1499f72987679a94a11e8564f01415acdb958c008c5bfe21eae" - }, - "ocrKeyBundle": { - "bundleID": "3e691b13aa702631fba25f6e128a566bdff3982cc3438af29acc2a819b9d6e02", - "configPublicKey": "149d81dce137d0874b477ad6c19dc72801f335200622fa34f1c660623febed22", - "offchainPublicKey": "b0d0d8e3c62abc7236e6539413ef82e568dd24f0c39ff6e8e2babe513590a522", - "onchainSigningAddress": "a0f2feab4d03899eb2e830bd4abc3fd5babef3e1" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:42.314654Z" - }, - { - "id": "93", - "keys": [ - "cl-df-asset-don-testnet-12" - ], - "name": "Chainlink Keystone Asset DON Node Operator 12", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "844", - "name": "Chainlink Sepolia Prod Keystone Asset Node 12", - "publicKey": "71b29eb63daa6ac2e48b46669936eff5606879b102bae78afc929554c435dd0b", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x13d5b27d71B4C4697874177Ff43DEB1884Cff49e", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWT1LMqEW51UfxBynzjYjuybQzVkmf4rH9js9e16QAbU3X", - "publicKey": "ff66057a6c96779134a6527364cddcce43b69e3d1820f59dde5e6b38d1d32fde" - }, - "ocrKeyBundle": { - "bundleID": "4854ee3fc7ac4591eea33c5d0d1cefd4ad819d2c374a2f86267a9999228a967a", - "configPublicKey": "470225644f274147b5b80c862a3f3cd7a19fed4ff915e9c18ac80e06003ecc6a", - "offchainPublicKey": "e7d89e196f5f6d92f4c42ab34f9a2f21f3201314be65b819872c4609b87866c7", - "onchainSigningAddress": "c84f2f60ccb1d7e6c6e4ae4bc3cab8bb85db8977" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:22:52.838595Z" - }, - { - "id": "94", - "keys": [ - "cl-df-asset-don-testnet-13" - ], - "name": "Chainlink Keystone Asset DON Node Operator 13", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "845", - "name": "Chainlink Sepolia Prod Keystone Asset Node 13", - "publicKey": "c098264a552125355804b903de06400621f2d1de357c2bed94586727fe8a3502", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x5647A091F2a09915c1C0F6ac95630Be87114881F", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWRjg2KoP6jKVWU2BczeduWsdnfN69tHN2YGEAGtETvc9P", - "publicKey": "ec87467a512f8218bb63f7fcf46cf0b8fd8ebb14bd5f3b670908d505a5af801a" - }, - "ocrKeyBundle": { - "bundleID": "20626049a1e24912a14d186645ba70fea4860efcc987b3ec7c9ddc881b5057db", - "configPublicKey": "d84d4653db0caca062d4058e9937ae618a53bbd1b41a673c5f13bebc24e7aa3a", - "offchainPublicKey": "156c8ab52099386377fe27bbd50dafa368ff2790245f1407579f590b0bae7a1e", - "onchainSigningAddress": "4f4b7bff5d32d62326b575d8c951d34e54888e31" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:23:19.587619Z" - }, - { - "id": "95", - "keys": [ - "cl-df-asset-don-testnet-14" - ], - "name": "Chainlink Keystone Asset DON Node Operator 14", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "846", - "name": "Chainlink Sepolia Prod Keystone Asset Node 14", - "publicKey": "12681ec137cd2d25e7c71638f564404dd764061921c870bbcddf683d048eed21", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x0419E70d32c3972930c99aaaDF20dCB473c56d22", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCdEG68z5kwYuD1xp1aJsFBtpw2HYh1K3ffVM6keVrJnT", - "publicKey": "29b8bafebdef5e11ec3556fbcacdfb626d2f80cf178406e38664775e8b1ace78" - }, - "ocrKeyBundle": { - "bundleID": "80b1304898d5cea3c684790a0f01158468c7fa7770675edef33e4b137232ddc9", - "configPublicKey": "15552ecb6ff10103a534f02594a7b7cbab686d76d5e7b32a9c67059e8c856861", - "offchainPublicKey": "b561b7df3bdfe70f1af9395dbc00ef796774aa352c9a30d9c7e2f7e74d438073", - "onchainSigningAddress": "fb1ca65bf473b4443d7359becc0de67a2d96228d" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:23:44.73219Z" - }, - { - "id": "96", - "keys": [ - "cl-df-asset-don-testnet-15" - ], - "name": "Chainlink Keystone Asset DON Node Operator 15", - "metadata": { - "nodeCount": 1, - "jobCount": 9 - }, - "nodes": [ - { - "id": "847", - "name": "Chainlink Sepolia Prod Keystone Asset Node 15", - "publicKey": "a9a5d084f9cbbbd291eb43c33dd137cd6140e33c53cebb260463bf52795ec579", - "chainConfigs": [ - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x931900764a585D7a01e500976B630B4747216c8c", - "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQyZ9A9ScBpcoRww1gJVBNB2brNkjJhaqze6ehuv6bmfQ", - "publicKey": "e139f020ae4bc9efaa77da9cfd54339d36176479028f849b9e64ad2cf29acba3" - }, - "ocrKeyBundle": { - "bundleID": "5c1c69eb1d6619b2c9b93bdfdd9c1b87c28101d6fc88bf7979ad52ceda459908", - "configPublicKey": "33f2107ab22b3dd5c19d5de0c5b1e6e038f2275ba455eed7997485caec421925", - "offchainPublicKey": "bb91b077c135cbdd1f4422c6021cf56d78326710c8bb8c4a87b3e7415e48915f", - "onchainSigningAddress": "b94e3de607033d03e3f0cc3ef1f09edd2592b440" - }, - "plugins": { - "mercury": true - } - } - } - ], - "connected": true, - "supportedProducts": [ - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-09-18T19:24:01.875231Z" - } -] \ No newline at end of file diff --git a/integration-tests/deployment/keystone/testdata/chain_writer_nodes.json b/integration-tests/deployment/keystone/testdata/chain_writer_nodes.json deleted file mode 100644 index b89a012cd41..00000000000 --- a/integration-tests/deployment/keystone/testdata/chain_writer_nodes.json +++ /dev/null @@ -1,1446 +0,0 @@ -[ - { - "id": "67", - "keys": [ - "keystone-09" - ], - "name": "Chainlink Keystone Node Operator 9", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "818", - "name": "Chainlink Sepolia Prod Keystone Cap One 9", - "publicKey": "3f5bbcb4b0409e6ea39d824f1837787484475fffb12e5e4a70509756ef6c7f9a", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x9b74f08bD7269919C0597C0E00e70ef2A66829db", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x662B6B119f7fc9Dc2A526395A9EA88AE79A1192F", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x34431021e0E07c75816226697Af6Ef02725e36af", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xB5988d5d9ADd3d98CF45211bE37cf9b3372054C9", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz", - "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f" - }, - "ocrKeyBundle": { - "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf", - "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44", - "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c", - "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T19:00:07.113658Z" - }, - { - "id": "68", - "keys": [ - "keystone-08" - ], - "name": "Chainlink Keystone Node Operator 8", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "817", - "name": "Chainlink Sepolia Prod Keystone Cap One 8", - "publicKey": "2346da196a82c88fe6c315d2e4d0dddacf4590a172b20adb6f27a8601ca0540d", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xa5C7133aBD35F9d742bD2997D693A507c5eBf4Ac", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x9fd869f5baADb79F9b7C58c0855fcAc0384e1d4B", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xe477E4C2e335E9b839665d710dE77CFECa9C43A7", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x056A1275DD670205aba10D8fC9bB597777a65030", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT", - "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690" - }, - "ocrKeyBundle": { - "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2", - "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713", - "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139", - "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:26:37.622463Z" - }, - { - "id": "69", - "keys": [ - "keystone-07" - ], - "name": "Chainlink Keystone Node Operator 7", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "816", - "name": "Chainlink Sepolia Prod Keystone Cap One 7", - "publicKey": "50d4e3393516d1998e5c39874d7c0da2291e4e3727f8baac4380e9f5573cc648", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x0ba7c1096B701A862bBCe7F13E9D33eED7e33c1D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0xcC44eD47023Bd88B82092A708c38609e8Fc2D197", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x0E8F4E699cd331022FaA2Ad75E500e70303C8767", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x49c36b3BEc6b6e0e77305273FAFC68f479630535", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb", - "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e" - }, - "ocrKeyBundle": { - "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd", - "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c", - "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f", - "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:30:51.07624Z" - }, - { - "id": "70", - "keys": [ - "keystone-06" - ], - "name": "Chainlink Keystone Node Operator 6", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "815", - "name": "Chainlink Sepolia Prod Keystone Cap One 6", - "publicKey": "2669981add3071fae5dfd760fe97e7d2b90157f86b40227f306f1f3906099fc3", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x405eE4ad3E79786f899810ff6de16a83A920Db5D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x58D39d629ae9f904b0Ae509179b9e7c9B0184cee", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x34bFe10F4f4e1101b019639ABd5E5eE5186B80E6", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x1741EB7468A490b4A9BA6f4CC7A47B82EcD65c4c", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu", - "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98" - }, - "ocrKeyBundle": { - "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b", - "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c", - "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3", - "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:32:14.024795Z" - }, - { - "id": "71", - "keys": [ - "keystone-05" - ], - "name": "Chainlink Keystone Node Operator 5", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "814", - "name": "Chainlink Sepolia Prod Keystone Cap One 5", - "publicKey": "94e9ee398547f1564b8b5f72c6148e511919ed0e59b94ae848d63685108f2ab4", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xbd1ee3165178D3A3E38458a9Fb1d6BF7fb5C443e", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x9b6284B5775E46fB02C1a589596EF07c35b55377", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xD83DCED517E4df64e913B97b3d0A906e4CA63d43", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xFF1218066b4b5Cd9dE2A73639862082bcC98bf0D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1", - "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0" - }, - "ocrKeyBundle": { - "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13", - "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a", - "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5", - "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:38:35.588611Z" - }, - { - "id": "72", - "keys": [ - "keystone-04" - ], - "name": "Chainlink Keystone Node Operator 4", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "813", - "name": "Chainlink Sepolia Prod Keystone Cap One 4", - "publicKey": "a618fe2d3260151957d105d2dd593dddaad20c45dc6ae8eab265504e6585a02c", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xE73E4D047DA32De40C7008075aEb9F60C8AF3C90", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x7501ff3462fd2133f2E1F93DB7Ec514988B43E56", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xef080765890a3F697C4920609621fe301Dd34A70", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x860235D5Db42eF568665900BBD6bA3DB2fA4f33f", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT", - "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2" - }, - "ocrKeyBundle": { - "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b", - "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878", - "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6", - "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:39:26.24249Z" - }, - { - "id": "73", - "keys": [ - "keystone-03", - "keystone-bt-03" - ], - "name": "Chainlink Keystone Node Operator 3", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "812", - "name": "Chainlink Sepolia Prod Keystone Cap One 3", - "publicKey": "f4cf97438c3ad86003e5c0368ab52c70f7fbb7f39ae0d7bf6dacbe16807e8a36", - "chainConfigs": [ - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x646665317aF70313B3E83Ea1369A91de389DaCAe", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x3Ab2A4e4765A0374F727a9a9eCE893734e2928ec", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x9905E8C3A4f82037170a8c411CD8b11D4894066f", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x762354eC86ea2253F5da27FF8b952Cb7Dec52B6D", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM", - "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600" - }, - "ocrKeyBundle": { - "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd", - "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e", - "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439", - "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:40:30.499914Z" - }, - { - "id": "74", - "keys": [ - "keystone-02", - "keystone-bt-02" - ], - "name": "Chainlink Keystone Node Operator 2", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "811", - "name": "Chainlink Sepolia Prod Keystone Cap One 2", - "publicKey": "a1f112923513f13ede1ca8f982ea0ab6221d584b40cd57f0c82307ab79c0e69f", - "chainConfigs": [ - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0xbF1Ad47D99A65e230235537b47C8D1Dddb22FD53", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0xa8d4698f74a0A427c1b8ec4575d9dFdD17Be288c", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xf286c79b4a613a1fE480C8e4fB17B837E7D8ba03", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xfe85A25cE2CB58b280CC0316305fC678Bf570f5e", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA", - "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed" - }, - "ocrKeyBundle": { - "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037", - "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700", - "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37", - "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:41:33.205484Z" - }, - { - "id": "75", - "keys": [ - "keystone-01", - "keystone-bt-01" - ], - "name": "Chainlink Keystone Node Operator 1", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "810", - "name": "Chainlink Sepolia Prod Keystone Cap One 1", - "publicKey": "9ef27cd1855a0ed6932be33c80d7cd9c178307e5a240dbeb9055946359dc5d7f", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xBB465BCa1b289269F2a95a36f5B6fD006Af56ede", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - }, - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x5e3618cFF8Ab337b3c73c2775d1a2EC65e5abEF0", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x1796BbC2AbbAd5660C8a7812b313E1f48A99f1D1", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xA2bfAc45e6878fbE04525C23dFbb11fFb224Ea60", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf", - "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c" - }, - "ocrKeyBundle": { - "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067", - "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c", - "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c", - "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:42:05.709664Z" - }, - { - "id": "76", - "keys": [ - "keystone-00", - "keystone-bt-00" - ], - "name": "Chainlink Keystone Node Operator 0", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "809", - "name": "Chainlink Sepolia Prod Keystone Cap One 0", - "publicKey": "545197637db59b96b22528ff90960b9e7cdcea81c8a5a9f06ae6b728bcba35cb", - "chainConfigs": [ - { - "network": { - "id": "10", - "chainID": "43113", - "chainType": "EVM", - "name": "Avalanche Testnet (Fuji)" - }, - "accountAddress": "0x66a88b0a23D8351e8F5e228eEe8439e65F423842", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x36a46774A3743641D4C274b385608Cb455B5B6b8", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - }, - { - "network": { - "id": "147", - "chainID": "84532", - "chainType": "EVM", - "name": "Base Testnet (Sepolia)" - }, - "accountAddress": "0x868ab67c00fF7e21aFf470C066798e5bE4240305", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xa60bC482fCfcd12B752541a00555E4e448Bc1d16", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH", - "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e" - }, - "ocrKeyBundle": { - "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef", - "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e", - "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e", - "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "OCR3_CAPABILITY", - "DATA_STREAMS_V03" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:42:49.446864Z" - } -] \ No newline at end of file diff --git a/integration-tests/deployment/keystone/testdata/workflow_nodes.json b/integration-tests/deployment/keystone/testdata/workflow_nodes.json deleted file mode 100644 index 78a8f706ae8..00000000000 --- a/integration-tests/deployment/keystone/testdata/workflow_nodes.json +++ /dev/null @@ -1,1106 +0,0 @@ -[ - { - "id": "67", - "keys": [ - "keystone-09" - ], - "name": "Chainlink Keystone Node Operator 9", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "780", - "name": "Chainlink Sepolia Prod Keystone One 9", - "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431", - "chainConfigs": [ - { - "network": { - "id": "1401", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9" - }, - "ocrKeyBundle": { - "bundleID": "d834cf7c830df7510228b33b138c018ff16b4eecf82273ed3bcd862bbbc046d4", - "configPublicKey": "6a1f37f06833c55ecf46233439ea6179a835bac6f2b2dee725b747c121813149", - "offchainPublicKey": "ff1144bbf648e6f76c58d0ce53a9a2cbe9a284d52db8691a714cac8e3a96b8b4", - "onchainSigningAddress": "4fa557850e4d5c21b3963c97414c1f37792700c4d3b8abdb904b765fd47e39bf" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9" - }, - "ocrKeyBundle": { - "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x0b04cE574E80Da73191Ec141c0016a54A6404056", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U", - "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9" - }, - "ocrKeyBundle": { - "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772", - "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e", - "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f", - "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T19:00:07.113658Z" - }, - { - "id": "68", - "keys": [ - "keystone-08" - ], - "name": "Chainlink Keystone Node Operator 8", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "781", - "name": "Chainlink Sepolia Prod Keystone One 8", - "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc", - "chainConfigs": [ - { - "network": { - "id": "1402", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c", - "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829" - }, - "ocrKeyBundle": { - "bundleID": "6726df46033038b724a4e6371807b6aa09efc829d0a3f7a5db4fd7df4b69fea7", - "configPublicKey": "0874e6cd5c8e651ab0ff564a474832ed9eaf2c5025b553f908d04921d9777d50", - "offchainPublicKey": "c791d2b9d3562f991af68ab7164a19734d551a9404d91c9571fdcdc5dcb237ca", - "onchainSigningAddress": "bddafb20cc50d89e0ae2f244908c27b1d639615d8186b28c357669de3359f208" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xEa4bC3638660D78Da56f39f6680dCDD0cEAaD2c6", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c", - "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829" - }, - "ocrKeyBundle": { - "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3", - "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264", - "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70", - "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x31B179dcF8f9036C30f04bE578793e51bF14A39E", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c", - "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829" - }, - "ocrKeyBundle": { - "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3", - "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264", - "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70", - "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:26:37.622463Z" - }, - { - "id": "69", - "keys": [ - "keystone-07" - ], - "name": "Chainlink Keystone Node Operator 7", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "782", - "name": "Chainlink Sepolia Prod Keystone One 7", - "publicKey": "b473091fe1d4dbbc26ad71c67b4432f8f4280e06bab5e2122a92f4ab8b6ff2f5", - "chainConfigs": [ - { - "network": { - "id": "1403", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC", - "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1" - }, - "ocrKeyBundle": { - "bundleID": "14082da0f33b4cec842bc1e1002e617a194ed4a81105603bd6c1edf784aa3743", - "configPublicKey": "209eea27e73b0ecc1c49b3ea274e4a18a1f5ed62fd79f443f0b5b9cc6019356e", - "offchainPublicKey": "cf0684a0e59399fe9b92cfc740d9696f925e78ee7d0273947e5f7b830070eaaa", - "onchainSigningAddress": "96dc85670c49caa986de4ad288e680e9afb0f5491160dcbb4868ca718e194fc8" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x65bE4739E187a39b859766C143b569acd5BE234d", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC", - "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1" - }, - "ocrKeyBundle": { - "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213", - "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502", - "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3", - "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x9ad9f3AD49e5aB0F28bD694d211a90297bD90D7f", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC", - "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1" - }, - "ocrKeyBundle": { - "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213", - "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502", - "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3", - "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:30:51.07624Z" - }, - { - "id": "70", - "keys": [ - "keystone-06" - ], - "name": "Chainlink Keystone Node Operator 6", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "783", - "name": "Chainlink Sepolia Prod Keystone One 6", - "publicKey": "75ac63fc97a31e31168084e0de8ccd2bea90059b609d962f3e43fc296cdba28d", - "chainConfigs": [ - { - "network": { - "id": "1404", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn", - "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31" - }, - "ocrKeyBundle": { - "bundleID": "b419e9e3f1256aa2907a1a396bdf27ba5002a30eee440ab96cb60369429ce277", - "configPublicKey": "3ae1a1c713e4ad63f67191fd93620c9eebe44e1d5f3264036ec0fbcd59cf9664", - "offchainPublicKey": "6fc8c3fb55b39577abbab20028bee93d1d6d8a888dd298354b95d4af3ccb6009", - "onchainSigningAddress": "4a94c75cb9fe8b1fba86fd4b71ad130943281fdefad10216c46eb2285d60950f" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x8706E716fc1ee972F3E4D42D42711Aa175Aa654A", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn", - "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31" - }, - "ocrKeyBundle": { - "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525", - "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816", - "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d", - "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x19e10B063a62B1574AE19020A64fDe6419892dA6", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn", - "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31" - }, - "ocrKeyBundle": { - "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525", - "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816", - "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d", - "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:32:14.024795Z" - }, - { - "id": "71", - "keys": [ - "keystone-05" - ], - "name": "Chainlink Keystone Node Operator 5", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "784", - "name": "Chainlink Sepolia Prod Keystone One 5", - "publicKey": "4542f4fd2ed150c8c976b39802fe3d994aec3ac94fd11e7817f693b1c9a1dabb", - "chainConfigs": [ - { - "network": { - "id": "14005", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ", - "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6" - }, - "ocrKeyBundle": { - "bundleID": "44b5f46bfbb04d0984469298ec43c350ec6b2cd4556b18265ebac1b6cc329c7c", - "configPublicKey": "263bee0d09d90e0e618c4cdd630d1437f7377f2d544df57f39ddd47984970555", - "offchainPublicKey": "11674b98849d8e070ac69d37c284b3091fcd374913f52b2b83ce2d9a4a4e0213", - "onchainSigningAddress": "425d1354a7b8180252a221040c718cac0ba0251c7efe31a2acefbba578dc2153" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xcea9f5C042130dD35Eff5B5a6E2361A0276570e3", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ", - "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6" - }, - "ocrKeyBundle": { - "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc", - "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49", - "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8", - "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xdAd1F3F8ec690cf335D46c50EdA5547CeF875161", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ", - "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6" - }, - "ocrKeyBundle": { - "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc", - "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49", - "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8", - "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:38:35.588611Z" - }, - { - "id": "72", - "keys": [ - "keystone-04" - ], - "name": "Chainlink Keystone Node Operator 4", - "metadata": { - "nodeCount": 2, - "jobCount": 4 - }, - "nodes": [ - { - "id": "785", - "name": "Chainlink Sepolia Prod Keystone One 4", - "publicKey": "07e0ffc57b6263604df517b94bd986169451a3c90600a855bb19212dc575de54", - "chainConfigs": [ - { - "network": { - "id": "1406", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg", - "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed" - }, - "ocrKeyBundle": { - "bundleID": "b1ab478c1322bc4f8227be50898a8044efc70cf0156ec53cf132119db7e94dea", - "configPublicKey": "96ae354418e50dcd5b3dae62e8f0bc911bbce7f761220837aacdaa6f82bd0f29", - "offchainPublicKey": "b34bb49788541de8b6cfb321799a41927a391a4eb135c74f6cb14eec0531ee6f", - "onchainSigningAddress": "1221e131ef21014a6a99ed22376eb869746a3b5e30fd202cf79e44efaeb8c5c2" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x0be7Df958604166D9Bf0F727F0AC7A4Fb0f5B8a1", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg", - "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed" - }, - "ocrKeyBundle": { - "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd", - "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74", - "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde", - "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x6F5cAb24Fb7412bB516b3468b9F3a9c471d25fE5", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg", - "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed" - }, - "ocrKeyBundle": { - "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd", - "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74", - "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde", - "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:39:26.24249Z" - }, - { - "id": "73", - "keys": [ - "keystone-03", - "keystone-bt-03" - ], - "name": "Chainlink Keystone Node Operator 3", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "786", - "name": "Chainlink Sepolia Prod Keystone One 3", - "publicKey": "487901e0c0a9d3c66e7cfc50f3a9e3cdbfdf1b0107273d73d94a91d278545516", - "chainConfigs": [ - { - "network": { - "id": "1417", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT", - "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6" - }, - "ocrKeyBundle": { - "bundleID": "5811a96a0c3b5f5b52973eee10e5771cf5953d37d5616ea71f7ae76f09f6e332", - "configPublicKey": "a7f3435bfbaabebd1572142ff1aec9ed98758d9bb098f1fcc77262fcae7f4171", - "offchainPublicKey": "886044b333af681ab4bf3be663122524ece9725e110ac2a64cda8526cad6983e", - "onchainSigningAddress": "046faf34ebfe42510251e6098bc34fa3dd5f2de38ac07e47f2d1b34ac770639f" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x3Be73A57a36E5ab00DcceD755B4bfF8bb99e52b2", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT", - "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6" - }, - "ocrKeyBundle": { - "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd", - "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b", - "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127", - "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xA9eFB53c513E413762b2Be5299D161d8E6e7278e", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT", - "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6" - }, - "ocrKeyBundle": { - "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd", - "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b", - "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127", - "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:40:30.499914Z" - }, - { - "id": "74", - "keys": [ - "keystone-02", - "keystone-bt-02" - ], - "name": "Chainlink Keystone Node Operator 2", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "787", - "name": "Chainlink Sepolia Prod Keystone One 2", - "publicKey": "7a166fbc816eb4a4dcb620d11c3ccac5c085d56b1972374100116f87619debb8", - "chainConfigs": [ - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x693bf95A3ef46E5dABe17d1A89dB1E83948aeD88", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo", - "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c" - }, - "ocrKeyBundle": { - "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34", - "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39", - "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3", - "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb" - }, - "plugins": {} - } - }, - { - "network": { - "id": "1408", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo", - "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c" - }, - "ocrKeyBundle": { - "bundleID": "e57c608a899d80e510913d2c7ef55758ee81e9eb73eb531003af1564307fd133", - "configPublicKey": "412a4bed6b064c17168871d28dbb965cc0a898f7b19eb3fa7cd01d3e3d10b66c", - "offchainPublicKey": "450aa794c87198a595761a8c18f0f1590046c8092960036638d002256af95254", - "onchainSigningAddress": "ba20d3da9b07663f1e8039081a514649fd61a48be2d241bc63537ee47d028fcd" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0xCea84bC1881F3cE14BA13Dc3a00DC1Ff3D553fF0", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo", - "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c" - }, - "ocrKeyBundle": { - "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34", - "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39", - "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3", - "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:41:33.205484Z" - }, - { - "id": "75", - "keys": [ - "keystone-01", - "keystone-bt-01" - ], - "name": "Chainlink Keystone Node Operator 1", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "788", - "name": "Chainlink Sepolia Prod Keystone One 1", - "publicKey": "28b91143ec9111796a7d63e14c1cf6bb01b4ed59667ab54f5bc72ebe49c881be", - "chainConfigs": [ - { - "network": { - "id": "1409", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v", - "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3" - }, - "ocrKeyBundle": { - "bundleID": "4b6418b8ab88ea1244c3c48eb5f4c86f9f0301aebffcac4fcfac5cdfb7cf6933", - "configPublicKey": "a38dbe521643479d78ab5477cae78161a5de0030c95098e3fbb09add6aca9508", - "offchainPublicKey": "7718dcbf40173dbd876720aa64028a6b18bf9a87543fc83a549515c4937962e3", - "onchainSigningAddress": "247d0189f65f58be83a4e7d87ff338aaf8956e9acb9fcc783f34f9edc29d1b40" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0xe45a754B30FdE9852A826F58c6bd94Fa6554CE96", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v", - "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3" - }, - "ocrKeyBundle": { - "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0", - "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01", - "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8", - "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x415aa1E9a1bcB3929ed92bFa1F9735Dc0D45AD31", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v", - "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3" - }, - "ocrKeyBundle": { - "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0", - "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01", - "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8", - "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:42:05.709664Z" - }, - { - "id": "76", - "keys": [ - "keystone-00", - "keystone-bt-00" - ], - "name": "Chainlink Keystone Node Operator 0", - "metadata": { - "nodeCount": 3, - "jobCount": 5 - }, - "nodes": [ - { - "id": "789", - "name": "Chainlink Sepolia Prod Keystone One 0", - "publicKey": "403b72f0b1b3b5f5a91bcfedb7f28599767502a04b5b7e067fcf3782e23eeb9c", - "chainConfigs": [ - { - "network": { - "id": "1411", - "chainID": "2", - "chainType": "APTOS", - "name": "APTOS TEST" - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv", - "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b" - }, - "ocrKeyBundle": { - "bundleID": "b4504e84ea307cc2afffca0206bd4bf8e98acc5a03c9bd47b2456e3845a5d1fa", - "configPublicKey": "559ea4ee5774a31d97914a4220d6a47094ae8e2cf0806e80e1eacd851f3e6757", - "offchainPublicKey": "4ec55bbe76a6b1fdc885c59da85a8fe44cf06afe1e4719f0824a731937526c52", - "onchainSigningAddress": "b8834eaa062f0df4ccfe7832253920071ec14dc4f78b13ecdda10b824e2dd3b6" - }, - "plugins": {} - } - }, - { - "network": { - "id": "140", - "chainID": "421614", - "chainType": "EVM", - "name": "Arbitrum Testnet (Sepolia)" - }, - "accountAddress": "0x1a04C6b4b1A45D20356F93DcE7931F765955BAa7", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv", - "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b" - }, - "ocrKeyBundle": { - "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea", - "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f", - "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1", - "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" - }, - "plugins": {} - } - }, - { - "network": { - "id": "129", - "chainID": "11155111", - "chainType": "EVM", - "name": "Ethereum Testnet (Sepolia)" - }, - "accountAddress": "0x2877F08d9c5Cc9F401F730Fa418fAE563A9a2FF3", - "adminAddress": "0x0000000000000000000000000000000000000000", - "ocr1Config": { - "p2pKeyBundle": {}, - "ocrKeyBundle": {} - }, - "ocr2Config": { - "enabled": true, - "p2pKeyBundle": { - "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv", - "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b" - }, - "ocrKeyBundle": { - "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea", - "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f", - "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1", - "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" - }, - "plugins": {} - } - } - ], - "connected": true, - "supportedProducts": [ - "WORKFLOW", - "OCR3_CAPABILITY" - ], - "categories": [ - { - "id": "11", - "name": "Keystone" - } - ] - } - ], - "createdAt": "2024-08-14T20:42:49.446864Z" - } -] \ No newline at end of file diff --git a/integration-tests/deployment/keystone/types.go b/integration-tests/deployment/keystone/types.go index 439fe4ed47d..aea3e28ffb7 100644 --- a/integration-tests/deployment/keystone/types.go +++ b/integration-tests/deployment/keystone/types.go @@ -13,7 +13,6 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink/integration-tests/deployment" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" v1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" @@ -164,33 +163,32 @@ func makeNodeKeysSlice(nodes []*ocr2Node) []NodeKeys { // in is in a convenient form to handle the CLO representation of the nop data type DonCapabilities struct { Name string - Nops []*models.NodeOperator // each nop is a node operator and may have multiple nodes + Nodes []string Capabilities []kcr.CapabilitiesRegistryCapability // every capability is hosted on each nop } // map the node id to the NOP -func (dc DonCapabilities) nodeIdToNop(cs uint64) (map[string]capabilities_registry.CapabilitiesRegistryNodeOperator, error) { +func (dc DonInfo) nodeIdToNop(cs uint64) (map[string]capabilities_registry.CapabilitiesRegistryNodeOperator, error) { cid, err := chainsel.ChainIdFromSelector(cs) if err != nil { return nil, fmt.Errorf("failed to get chain id from selector %d: %w", cs, err) } cidStr := strconv.FormatUint(cid, 10) out := make(map[string]capabilities_registry.CapabilitiesRegistryNodeOperator) - for _, nop := range dc.Nops { - for _, node := range nop.Nodes { - found := false - for _, chain := range node.ChainConfigs { - if chain.Network.ChainID == cidStr { - found = true - out[node.ID] = capabilities_registry.CapabilitiesRegistryNodeOperator{ - Name: nop.Name, - Admin: adminAddr(chain.AdminAddress), - } + for _, node := range dc.Nodes { + found := false + for _, chain := range node.ChainConfigs { + //TODO validate chainType field + if chain.Chain.Id == cidStr { + found = true + out[node.ID] = capabilities_registry.CapabilitiesRegistryNodeOperator{ + Name: node.Name, + Admin: adminAddr(chain.AdminAddress), } } - if !found { - return nil, fmt.Errorf("node '%s' %s does not support chain %d", node.Name, node.ID, cid) - } + } + if !found { + return nil, fmt.Errorf("node '%s' %s does not support chain %d", node.Name, node.ID, cid) } } return out, nil @@ -198,7 +196,7 @@ func (dc DonCapabilities) nodeIdToNop(cs uint64) (map[string]capabilities_regist // helpers to maintain compatibility with the existing registration functions // nodesToNops converts a list of DonCapabilities to a map of node id to NOP -func nodesToNops(dons []DonCapabilities, chainSel uint64) (map[string]capabilities_registry.CapabilitiesRegistryNodeOperator, error) { +func nodesToNops(dons []DonInfo, chainSel uint64) (map[string]capabilities_registry.CapabilitiesRegistryNodeOperator, error) { out := make(map[string]capabilities_registry.CapabilitiesRegistryNodeOperator) for _, don := range dons { nops, err := don.nodeIdToNop(chainSel) @@ -217,7 +215,7 @@ func nodesToNops(dons []DonCapabilities, chainSel uint64) (map[string]capabiliti } // mapDonsToCaps converts a list of DonCapabilities to a map of don name to capabilities -func mapDonsToCaps(dons []DonCapabilities) map[string][]kcr.CapabilitiesRegistryCapability { +func mapDonsToCaps(dons []DonInfo) map[string][]kcr.CapabilitiesRegistryCapability { out := make(map[string][]kcr.CapabilitiesRegistryCapability) for _, don := range dons { out[don.Name] = don.Capabilities @@ -227,58 +225,55 @@ func mapDonsToCaps(dons []DonCapabilities) map[string][]kcr.CapabilitiesRegistry // mapDonsToNodes returns a map of don name to simplified representation of their nodes // all nodes must have evm config and ocr3 capability nodes are must also have an aptos chain config -func mapDonsToNodes(dons []DonCapabilities, excludeBootstraps bool) (map[string][]*ocr2Node, error) { +func mapDonsToNodes(dons []DonInfo, excludeBootstraps bool) (map[string][]*ocr2Node, error) { donToOcr2Nodes := make(map[string][]*ocr2Node) // get the nodes for each don from the offchain client, get ocr2 config from one of the chain configs for the node b/c // they are equivalent, and transform to ocr2node representation for _, don := range dons { - for _, nop := range don.Nops { - for _, node := range nop.Nodes { - csaPubKey := node.PublicKey - if csaPubKey == nil { - return nil, fmt.Errorf("no public key for node %s", node.ID) - } - // the chain configs are equivalent as far as the ocr2 config is concerned so take the first one - if len(node.ChainConfigs) == 0 { - return nil, fmt.Errorf("no chain configs for node %s. cannot obtain keys", node.ID) - } - // all nodes should have an evm chain config, specifically the registry chain - evmCC, exists := firstChainConfigByType(node.ChainConfigs, chaintype.EVM) - if !exists { - return nil, fmt.Errorf("no evm chain config for node %s", node.ID) - } - cfgs := map[chaintype.ChainType]*v1.ChainConfig{ - chaintype.EVM: evmCC, - } - aptosCC, exists := firstChainConfigByType(node.ChainConfigs, chaintype.Aptos) - if exists { - cfgs[chaintype.Aptos] = aptosCC - } - ocr2n, err := newOcr2Node(node.ID, cfgs, *csaPubKey) - if err != nil { - return nil, fmt.Errorf("failed to create ocr2 node for node %s: %w", node.ID, err) - } - if excludeBootstraps && ocr2n.IsBoostrap { - continue - } - if _, ok := donToOcr2Nodes[don.Name]; !ok { - donToOcr2Nodes[don.Name] = make([]*ocr2Node, 0) - } - donToOcr2Nodes[don.Name] = append(donToOcr2Nodes[don.Name], ocr2n) - + for _, node := range don.Nodes { + csaPubKey := node.PublicKey + if csaPubKey == nil { + return nil, fmt.Errorf("no public key for node %s", node.ID) + } + // the chain configs are equivalent as far as the ocr2 config is concerned so take the first one + if len(node.ChainConfigs) == 0 { + return nil, fmt.Errorf("no chain configs for node %s. cannot obtain keys", node.ID) } + // all nodes should have an evm chain config, specifically the registry chain + evmCC, exists := firstChainConfigByType(node.ChainConfigs, v1.ChainType_CHAIN_TYPE_EVM) + if !exists { + return nil, fmt.Errorf("no evm chain config for node %s", node.ID) + } + cfgs := map[chaintype.ChainType]*v1.ChainConfig{ + chaintype.EVM: evmCC, + } + aptosCC, exists := firstChainConfigByType(node.ChainConfigs, v1.ChainType_CHAIN_TYPE_APTOS) + if exists { + cfgs[chaintype.Aptos] = aptosCC + } + ocr2n, err := newOcr2Node(node.ID, cfgs, *csaPubKey) + if err != nil { + return nil, fmt.Errorf("failed to create ocr2 node for node %s: %w", node.ID, err) + } + if excludeBootstraps && ocr2n.IsBoostrap { + continue + } + if _, ok := donToOcr2Nodes[don.Name]; !ok { + donToOcr2Nodes[don.Name] = make([]*ocr2Node, 0) + } + donToOcr2Nodes[don.Name] = append(donToOcr2Nodes[don.Name], ocr2n) + } } return donToOcr2Nodes, nil } -func firstChainConfigByType(ccfgs []*models.NodeChainConfig, t chaintype.ChainType) (*v1.ChainConfig, bool) { +func firstChainConfigByType(ccfgs []*v1.ChainConfig, t v1.ChainType) (*v1.ChainConfig, bool) { for _, c := range ccfgs { - //nolint:staticcheck //ignore EqualFold it broke ci for some reason (go version skew btw local and ci?) - if strings.ToLower(c.Network.ChainType.String()) == strings.ToLower(string(t)) { - return chainConfigFromClo(c), true + if c.Chain.Type == t { + return c, true } } return nil, false @@ -305,7 +300,7 @@ func (d RegisteredDon) signers() []common.Address { return out } -func joinInfoAndNodes(donInfos map[string]kcr.CapabilitiesRegistryDONInfo, dons []DonCapabilities) ([]RegisteredDon, error) { +func joinInfoAndNodes(donInfos map[string]kcr.CapabilitiesRegistryDONInfo, dons []DonInfo) ([]RegisteredDon, error) { // all maps should have the same keys nodes, err := mapDonsToNodes(dons, true) if err != nil { @@ -331,31 +326,6 @@ func joinInfoAndNodes(donInfos map[string]kcr.CapabilitiesRegistryDONInfo, dons return out, nil } -func chainConfigFromClo(chain *models.NodeChainConfig) *v1.ChainConfig { - return &v1.ChainConfig{ - Chain: &v1.Chain{ - Id: chain.Network.ChainID, - Type: v1.ChainType_CHAIN_TYPE_EVM, // TODO: support other chain types - }, - - AccountAddress: chain.AccountAddress, - AdminAddress: chain.AdminAddress, - Ocr2Config: &v1.OCR2Config{ - Enabled: chain.Ocr2Config.Enabled, - P2PKeyBundle: &v1.OCR2Config_P2PKeyBundle{ - PeerId: chain.Ocr2Config.P2pKeyBundle.PeerID, - PublicKey: chain.Ocr2Config.P2pKeyBundle.PublicKey, - }, - OcrKeyBundle: &v1.OCR2Config_OCRKeyBundle{ - BundleId: chain.Ocr2Config.OcrKeyBundle.BundleID, - OnchainSigningAddress: chain.Ocr2Config.OcrKeyBundle.OnchainSigningAddress, - OffchainPublicKey: chain.Ocr2Config.OcrKeyBundle.OffchainPublicKey, - ConfigPublicKey: chain.Ocr2Config.OcrKeyBundle.ConfigPublicKey, - }, - }, - } -} - var emptyAddr = "0x0000000000000000000000000000000000000000" // compute the admin address from the string. If the address is empty, replaces the 0s with fs diff --git a/integration-tests/deployment/keystone/types_test.go b/integration-tests/deployment/keystone/types_test.go index 612e98d3309..c4692fd5e7d 100644 --- a/integration-tests/deployment/keystone/types_test.go +++ b/integration-tests/deployment/keystone/types_test.go @@ -1,16 +1,11 @@ package keystone import ( - "encoding/json" - "os" "testing" "github.com/stretchr/testify/assert" - "github.com/test-go/testify/require" v1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" - "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" - kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" ) @@ -137,266 +132,258 @@ func Test_newOcr2Node(t *testing.T) { } } -func Test_mapDonsToNodes(t *testing.T) { - var ( - pubKey = "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1" - evmSig = "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" - aptosSig = "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" - peerID = "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv" - // todo: these should be defined in common - writerCap = 3 - ocr3Cap = 2 - ) - type args struct { - dons []DonCapabilities - excludeBootstraps bool - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "writer evm only", - args: args{ - dons: []DonCapabilities{ - { - Name: "ok writer", - Nops: []*models.NodeOperator{ - { - Nodes: []*models.Node{ - { - PublicKey: &pubKey, - ChainConfigs: []*models.NodeChainConfig{ - { - ID: "1", - Network: &models.Network{ - ChainType: models.ChainTypeEvm, - }, - Ocr2Config: &models.NodeOCR2Config{ - P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ - PeerID: peerID, - }, - OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ - ConfigPublicKey: pubKey, - OffchainPublicKey: pubKey, - OnchainSigningAddress: evmSig, - }, - }, - }, - }, - }, - }, - }, - }, - Capabilities: []kcr.CapabilitiesRegistryCapability{ - { - LabelledName: "writer", - Version: "1", - CapabilityType: uint8(writerCap), - }, - }, - }, - }, - }, - wantErr: false, - }, - { - name: "err if no evm chain", - args: args{ - dons: []DonCapabilities{ - { - Name: "bad chain", - Nops: []*models.NodeOperator{ - { - Nodes: []*models.Node{ - { - PublicKey: &pubKey, - ChainConfigs: []*models.NodeChainConfig{ - { - ID: "1", - Network: &models.Network{ - ChainType: models.ChainTypeSolana, - }, - Ocr2Config: &models.NodeOCR2Config{ - P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ - PeerID: peerID, - }, - OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ - ConfigPublicKey: pubKey, - OffchainPublicKey: pubKey, - OnchainSigningAddress: evmSig, - }, - }, - }, - }, - }, - }, - }, - }, - Capabilities: []kcr.CapabilitiesRegistryCapability{ - { - LabelledName: "writer", - Version: "1", - CapabilityType: uint8(writerCap), - }, - }, - }, - }, - }, - wantErr: true, - }, - { - name: "ocr3 cap evm only", - args: args{ - dons: []DonCapabilities{ - { - Name: "bad chain", - Nops: []*models.NodeOperator{ - { - Nodes: []*models.Node{ - { - PublicKey: &pubKey, - ChainConfigs: []*models.NodeChainConfig{ - { - ID: "1", - Network: &models.Network{ - ChainType: models.ChainTypeEvm, - }, - Ocr2Config: &models.NodeOCR2Config{ - P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ - PeerID: peerID, - }, - OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ - ConfigPublicKey: pubKey, - OffchainPublicKey: pubKey, - OnchainSigningAddress: evmSig, - }, - }, - }, - }, - }, - }, - }, - }, - Capabilities: []kcr.CapabilitiesRegistryCapability{ - { - LabelledName: "ocr3", - Version: "1", - CapabilityType: uint8(ocr3Cap), - }, - }, - }, - }, - }, - wantErr: false, - }, - { - name: "ocr3 cap evm & aptos", - args: args{ - dons: []DonCapabilities{ - { - Name: "bad chain", - Nops: []*models.NodeOperator{ - { - Nodes: []*models.Node{ - { - PublicKey: &pubKey, - ChainConfigs: []*models.NodeChainConfig{ - { - ID: "1", - Network: &models.Network{ - ChainType: models.ChainTypeEvm, - }, - Ocr2Config: &models.NodeOCR2Config{ - P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ - PeerID: peerID, - }, - OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ - ConfigPublicKey: pubKey, - OffchainPublicKey: pubKey, - OnchainSigningAddress: evmSig, - }, - }, - }, - { - ID: "2", - Network: &models.Network{ - ChainType: models.ChainTypeAptos, - }, - Ocr2Config: &models.NodeOCR2Config{ - P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ - PeerID: peerID, - }, - OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ - ConfigPublicKey: pubKey, - OffchainPublicKey: pubKey, - OnchainSigningAddress: aptosSig, - }, - }, - }, - }, - }, - }, - }, - }, - Capabilities: []kcr.CapabilitiesRegistryCapability{ - { - LabelledName: "ocr3", - Version: "1", - CapabilityType: uint8(ocr3Cap), - }, - }, - }, - }, - }, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _, err := mapDonsToNodes(tt.args.dons, tt.args.excludeBootstraps) - if (err != nil) != tt.wantErr { - t.Errorf("mapDonsToNodes() error = %v, wantErr %v", err, tt.wantErr) - return - } - }) - } - // make sure the clo test data is correct - wfNops := loadTestNops(t, "testdata/workflow_nodes.json") - cwNops := loadTestNops(t, "testdata/chain_writer_nodes.json") - assetNops := loadTestNops(t, "testdata/asset_nodes.json") - require.Len(t, wfNops, 10) - require.Len(t, cwNops, 10) - require.Len(t, assetNops, 16) - - wfDon := DonCapabilities{ - Name: WFDonName, - Nops: wfNops, - Capabilities: []kcr.CapabilitiesRegistryCapability{OCR3Cap}, - } - cwDon := DonCapabilities{ - Name: TargetDonName, - Nops: cwNops, - Capabilities: []kcr.CapabilitiesRegistryCapability{WriteChainCap}, - } - assetDon := DonCapabilities{ - Name: StreamDonName, - Nops: assetNops, - Capabilities: []kcr.CapabilitiesRegistryCapability{StreamTriggerCap}, - } - _, err := mapDonsToNodes([]DonCapabilities{wfDon}, false) - require.NoError(t, err, "failed to map wf don") - _, err = mapDonsToNodes([]DonCapabilities{cwDon}, false) - require.NoError(t, err, "failed to map cw don") - _, err = mapDonsToNodes([]DonCapabilities{assetDon}, false) - require.NoError(t, err, "failed to map asset don") -} - -func loadTestNops(t *testing.T, pth string) []*models.NodeOperator { - f, err := os.ReadFile(pth) - require.NoError(t, err) - var nops []*models.NodeOperator - require.NoError(t, json.Unmarshal(f, &nops)) - return nops -} +// func Test_mapDonsToNodes(t *testing.T) { +// var ( +// pubKey = "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1" +// evmSig = "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" +// aptosSig = "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442b35409a8d4f9a18da55c5b2bb08a3f5f68d44442" +// peerID = "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv" +// // todo: these should be defined in common +// writerCap = 3 +// ocr3Cap = 2 +// ) +// type args struct { +// dons []DonCapabilities +// excludeBootstraps bool +// } +// tests := []struct { +// name string +// args args +// wantErr bool +// }{ +// { +// name: "writer evm only", +// args: args{ +// dons: []DonCapabilities{ +// { +// Name: "ok writer", +// Nodes: []*models.NodeOperator{ +// { +// Nodes: []*models.Node{ +// { +// PublicKey: &pubKey, +// ChainConfigs: []*models.NodeChainConfig{ +// { +// ID: "1", +// Network: &models.Network{ +// ChainType: models.ChainTypeEvm, +// }, +// Ocr2Config: &models.NodeOCR2Config{ +// P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ +// PeerID: peerID, +// }, +// OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ +// ConfigPublicKey: pubKey, +// OffchainPublicKey: pubKey, +// OnchainSigningAddress: evmSig, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// Capabilities: []kcr.CapabilitiesRegistryCapability{ +// { +// LabelledName: "writer", +// Version: "1", +// CapabilityType: uint8(writerCap), +// }, +// }, +// }, +// }, +// }, +// wantErr: false, +// }, +// { +// name: "err if no evm chain", +// args: args{ +// dons: []DonCapabilities{ +// { +// Name: "bad chain", +// Nodes: []*models.NodeOperator{ +// { +// Nodes: []*models.Node{ +// { +// PublicKey: &pubKey, +// ChainConfigs: []*models.NodeChainConfig{ +// { +// ID: "1", +// Network: &models.Network{ +// ChainType: models.ChainTypeSolana, +// }, +// Ocr2Config: &models.NodeOCR2Config{ +// P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ +// PeerID: peerID, +// }, +// OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ +// ConfigPublicKey: pubKey, +// OffchainPublicKey: pubKey, +// OnchainSigningAddress: evmSig, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// Capabilities: []kcr.CapabilitiesRegistryCapability{ +// { +// LabelledName: "writer", +// Version: "1", +// CapabilityType: uint8(writerCap), +// }, +// }, +// }, +// }, +// }, +// wantErr: true, +// }, +// { +// name: "ocr3 cap evm only", +// args: args{ +// dons: []DonCapabilities{ +// { +// Name: "bad chain", +// Nodes: []*models.NodeOperator{ +// { +// Nodes: []*models.Node{ +// { +// PublicKey: &pubKey, +// ChainConfigs: []*models.NodeChainConfig{ +// { +// ID: "1", +// Network: &models.Network{ +// ChainType: models.ChainTypeEvm, +// }, +// Ocr2Config: &models.NodeOCR2Config{ +// P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ +// PeerID: peerID, +// }, +// OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ +// ConfigPublicKey: pubKey, +// OffchainPublicKey: pubKey, +// OnchainSigningAddress: evmSig, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// Capabilities: []kcr.CapabilitiesRegistryCapability{ +// { +// LabelledName: "ocr3", +// Version: "1", +// CapabilityType: uint8(ocr3Cap), +// }, +// }, +// }, +// }, +// }, +// wantErr: false, +// }, +// { +// name: "ocr3 cap evm & aptos", +// args: args{ +// dons: []DonCapabilities{ +// { +// Name: "bad chain", +// Nodes: []*models.NodeOperator{ +// { +// Nodes: []*models.Node{ +// { +// PublicKey: &pubKey, +// ChainConfigs: []*models.NodeChainConfig{ +// { +// ID: "1", +// Network: &models.Network{ +// ChainType: models.ChainTypeEvm, +// }, +// Ocr2Config: &models.NodeOCR2Config{ +// P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ +// PeerID: peerID, +// }, +// OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ +// ConfigPublicKey: pubKey, +// OffchainPublicKey: pubKey, +// OnchainSigningAddress: evmSig, +// }, +// }, +// }, +// { +// ID: "2", +// Network: &models.Network{ +// ChainType: models.ChainTypeAptos, +// }, +// Ocr2Config: &models.NodeOCR2Config{ +// P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{ +// PeerID: peerID, +// }, +// OcrKeyBundle: &models.NodeOCR2ConfigOCRKeyBundle{ +// ConfigPublicKey: pubKey, +// OffchainPublicKey: pubKey, +// OnchainSigningAddress: aptosSig, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// }, +// Capabilities: []kcr.CapabilitiesRegistryCapability{ +// { +// LabelledName: "ocr3", +// Version: "1", +// CapabilityType: uint8(ocr3Cap), +// }, +// }, +// }, +// }, +// }, +// wantErr: false, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// _, err := mapDonsToNodes(tt.args.dons, tt.args.excludeBootstraps) +// if (err != nil) != tt.wantErr { +// t.Errorf("mapDonsToNodes() error = %v, wantErr %v", err, tt.wantErr) +// return +// } +// }) +// } +// // make sure the clo test data is correct +// wfNops := loadTestNops(t, "testdata/workflow_nodes.json") +// cwNops := loadTestNops(t, "testdata/chain_writer_nodes.json") +// assetNops := loadTestNops(t, "testdata/asset_nodes.json") +// require.Len(t, wfNops, 10) +// require.Len(t, cwNops, 10) +// require.Len(t, assetNops, 16) +// +// wfDon := DonCapabilities{ +// Name: WFDonName, +// Nodes: wfNops, +// Capabilities: []kcr.CapabilitiesRegistryCapability{OCR3Cap}, +// } +// cwDon := DonCapabilities{ +// Name: TargetDonName, +// Nodes: cwNops, +// Capabilities: []kcr.CapabilitiesRegistryCapability{WriteChainCap}, +// } +// assetDon := DonCapabilities{ +// Name: StreamDonName, +// Nodes: assetNops, +// Capabilities: []kcr.CapabilitiesRegistryCapability{StreamTriggerCap}, +// } +// _, err := mapDonsToNodes([]DonCapabilities{wfDon}, false) +// require.NoError(t, err, "failed to map wf don") +// _, err = mapDonsToNodes([]DonCapabilities{cwDon}, false) +// require.NoError(t, err, "failed to map cw don") +// _, err = mapDonsToNodes([]DonCapabilities{assetDon}, false) +// require.NoError(t, err, "failed to map asset don") +// } diff --git a/integration-tests/deployment/memory/chain.go b/integration-tests/deployment/memory/chain.go index 0f3badc7dca..d66200685ea 100644 --- a/integration-tests/deployment/memory/chain.go +++ b/integration-tests/deployment/memory/chain.go @@ -85,7 +85,7 @@ func GenerateChainsWithIds(t *testing.T, chainIDs []uint64) map[uint64]EVMChain owner, err := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) require.NoError(t, err) backend := backends.NewSimulatedBackend(core.GenesisAlloc{ - owner.From: {Balance: big.NewInt(0).Mul(big.NewInt(100), big.NewInt(params.Ether))}}, 10000000) + owner.From: {Balance: big.NewInt(0).Mul(big.NewInt(700000), big.NewInt(params.Ether))}}, 50000000) tweakChainTimestamp(t, backend, time.Hour*8) chains[chainID] = EVMChain{ Backend: backend, diff --git a/integration-tests/deployment/memory/environment.go b/integration-tests/deployment/memory/environment.go index 641a88d72bb..8583cd8d038 100644 --- a/integration-tests/deployment/memory/environment.go +++ b/integration-tests/deployment/memory/environment.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" "github.com/hashicorp/consul/sdk/freeport" "github.com/stretchr/testify/require" @@ -29,6 +29,18 @@ type MemoryEnvironmentConfig struct { RegistryConfig deployment.CapabilityRegistryConfig } +// For placeholders like aptos +func NewMemoryChain(t *testing.T, selector uint64) deployment.Chain { + return deployment.Chain{ + Selector: selector, + Client: nil, + DeployerKey: &bind.TransactOpts{}, + Confirm: func(tx *types.Transaction) (uint64, error) { + return 0, nil + }, + } +} + // Needed for environment variables on the node which point to prexisitng addresses. // i.e. CapReg. func NewMemoryChains(t *testing.T, numChains int) map[uint64]deployment.Chain { @@ -77,30 +89,19 @@ func generateMemoryChain(t *testing.T, inputs map[uint64]EVMChain) map[uint64]de } func NewNodes(t *testing.T, logLevel zapcore.Level, chains map[uint64]deployment.Chain, numNodes, numBootstraps int, registryConfig deployment.CapabilityRegistryConfig) map[string]Node { - mchains := make(map[uint64]EVMChain) - for _, chain := range chains { - evmChainID, err := chainsel.ChainIdFromSelector(chain.Selector) - if err != nil { - t.Fatal(err) - } - mchains[evmChainID] = EVMChain{ - Backend: chain.Client.(*backends.SimulatedBackend), - DeployerKey: chain.DeployerKey, - } - } nodesByPeerID := make(map[string]Node) ports := freeport.GetN(t, numBootstraps+numNodes) // bootstrap nodes must be separate nodes from plugin nodes, // since we won't run a bootstrapper and a plugin oracle on the same // chainlink node in production. for i := 0; i < numBootstraps; i++ { - node := NewNode(t, ports[i], mchains, logLevel, true /* bootstrap */, registryConfig) + node := NewNode(t, ports[i], chains, logLevel, true /* bootstrap */, registryConfig) nodesByPeerID[node.Keys.PeerID.String()] = *node // Note in real env, this ID is allocated by JD. } for i := 0; i < numNodes; i++ { // grab port offset by numBootstraps, since above loop also takes some ports. - node := NewNode(t, ports[numBootstraps+i], mchains, logLevel, false /* bootstrap */, registryConfig) + node := NewNode(t, ports[numBootstraps+i], chains, logLevel, false /* bootstrap */, registryConfig) nodesByPeerID[node.Keys.PeerID.String()] = *node // Note in real env, this ID is allocated by JD. } diff --git a/integration-tests/deployment/memory/job_client.go b/integration-tests/deployment/memory/job_client.go index 0bd4035c78d..eb7c3874e02 100644 --- a/integration-tests/deployment/memory/job_client.go +++ b/integration-tests/deployment/memory/job_client.go @@ -9,10 +9,12 @@ import ( "github.com/ethereum/go-ethereum/common" "google.golang.org/grpc" + chainsel "github.com/smartcontractkit/chain-selectors" csav1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa" jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" ) type JobClient struct { @@ -61,7 +63,7 @@ func (j JobClient) GetNode(ctx context.Context, in *nodev1.GetNodeRequest, opts func (j JobClient) ListNodes(ctx context.Context, in *nodev1.ListNodesRequest, opts ...grpc.CallOption) (*nodev1.ListNodesResponse, error) { //TODO CCIP-3108 - var fiterIds map[string]struct{} + fiterIds := make(map[string]any) include := func(id string) bool { if in.Filter == nil || len(in.Filter.Ids) == 0 { return true @@ -80,7 +82,7 @@ func (j JobClient) ListNodes(ctx context.Context, in *nodev1.ListNodesRequest, o if include(id) { nodes = append(nodes, &nodev1.Node{ Id: id, - PublicKey: n.Keys.OCRKeyBundle.ID(), // is this the correct val? + PublicKey: n.Keys.CSA.ID(), IsEnabled: true, IsConnected: true, }) @@ -103,8 +105,17 @@ func (j JobClient) ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNode if !ok { return nil, fmt.Errorf("node id not found: %s", in.Filter.NodeIds[0]) } - offpk := n.Keys.OCRKeyBundle.OffchainPublicKey() - cpk := n.Keys.OCRKeyBundle.ConfigEncryptionPublicKey() + evmBundle := n.Keys.OCRKeyBundles[chaintype.EVM] + offpk := evmBundle.OffchainPublicKey() + cpk := evmBundle.ConfigEncryptionPublicKey() + + evmKeyBundle := &nodev1.OCR2Config_OCRKeyBundle{ + BundleId: evmBundle.ID(), + ConfigPublicKey: common.Bytes2Hex(cpk[:]), + OffchainPublicKey: common.Bytes2Hex(offpk[:]), + OnchainSigningAddress: evmBundle.OnChainPublicKey(), + } + var chainConfigs []*nodev1.ChainConfig for evmChainID, transmitter := range n.Keys.TransmittersByEVMChainID { chainConfigs = append(chainConfigs, &nodev1.ChainConfig{ @@ -113,7 +124,7 @@ func (j JobClient) ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNode Type: nodev1.ChainType_CHAIN_TYPE_EVM, }, AccountAddress: transmitter.String(), - AdminAddress: "", + AdminAddress: transmitter.String(), // TODO: custom address Ocr1Config: nil, Ocr2Config: &nodev1.OCR2Config{ Enabled: true, @@ -121,19 +132,92 @@ func (j JobClient) ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNode P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ PeerId: n.Keys.PeerID.String(), }, - OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ - BundleId: n.Keys.OCRKeyBundle.ID(), - ConfigPublicKey: common.Bytes2Hex(cpk[:]), - OffchainPublicKey: common.Bytes2Hex(offpk[:]), - OnchainSigningAddress: n.Keys.OCRKeyBundle.OnChainPublicKey(), - }, + OcrKeyBundle: evmKeyBundle, Multiaddr: n.Addr.String(), Plugins: nil, ForwarderAddress: ptr(""), }, }) } + for _, selector := range n.Chains { + family, err := chainsel.GetSelectorFamily(selector) + if err != nil { + return nil, err + } + chainID, err := chainsel.ChainIdFromSelector(selector) + if err != nil { + return nil, err + } + + if family == chainsel.FamilyEVM { + // already handled above + continue + } + + var ocrtype chaintype.ChainType + switch family { + case chainsel.FamilyEVM: + ocrtype = chaintype.EVM + case chainsel.FamilySolana: + ocrtype = chaintype.Solana + case chainsel.FamilyStarknet: + ocrtype = chaintype.StarkNet + case chainsel.FamilyCosmos: + ocrtype = chaintype.Cosmos + case chainsel.FamilyAptos: + ocrtype = chaintype.Aptos + default: + panic(fmt.Sprintf("Unsupported chain family %v", family)) + } + + bundle := n.Keys.OCRKeyBundles[ocrtype] + + offpk := bundle.OffchainPublicKey() + cpk := bundle.ConfigEncryptionPublicKey() + + keyBundle := &nodev1.OCR2Config_OCRKeyBundle{ + BundleId: bundle.ID(), + ConfigPublicKey: common.Bytes2Hex(cpk[:]), + OffchainPublicKey: common.Bytes2Hex(offpk[:]), + OnchainSigningAddress: bundle.OnChainPublicKey(), + } + // TODO: support AccountAddress + + var ctype nodev1.ChainType + switch family { + case chainsel.FamilyEVM: + ctype = nodev1.ChainType_CHAIN_TYPE_EVM + case chainsel.FamilySolana: + ctype = nodev1.ChainType_CHAIN_TYPE_SOLANA + case chainsel.FamilyStarknet: + ctype = nodev1.ChainType_CHAIN_TYPE_STARKNET + case chainsel.FamilyAptos: + ctype = nodev1.ChainType_CHAIN_TYPE_APTOS + default: + panic(fmt.Sprintf("Unsupported chain family %v", family)) + } + chainConfigs = append(chainConfigs, &nodev1.ChainConfig{ + Chain: &nodev1.Chain{ + Id: strconv.Itoa(int(chainID)), + Type: ctype, + }, + AccountAddress: "", // TODO: + AdminAddress: "", + Ocr1Config: nil, + Ocr2Config: &nodev1.OCR2Config{ + Enabled: true, + IsBootstrap: n.IsBoostrap, + P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ + PeerId: n.Keys.PeerID.String(), + }, + OcrKeyBundle: keyBundle, + Multiaddr: n.Addr.String(), + Plugins: nil, + ForwarderAddress: ptr(""), + }, + }) + } // TODO: I think we can pull it from the feeds manager. return &nodev1.ListNodeChainConfigsResponse{ ChainConfigs: chainConfigs, diff --git a/integration-tests/deployment/memory/node.go b/integration-tests/deployment/memory/node.go index d60e4258db0..0dd9e957a83 100644 --- a/integration-tests/deployment/memory/node.go +++ b/integration-tests/deployment/memory/node.go @@ -10,11 +10,13 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" gethtypes "github.com/ethereum/go-ethereum/core/types" chainsel "github.com/smartcontractkit/chain-selectors" "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/loop" @@ -35,6 +37,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/chainlink" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/csakey" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" "github.com/smartcontractkit/chainlink/v2/core/services/relay" @@ -46,6 +49,7 @@ import ( type Node struct { App chainlink.Application // Transmitter key/OCR keys for this node + Chains []uint64 // chain selectors Keys Keys Addr net.TCPAddr IsBoostrap bool @@ -68,11 +72,23 @@ func (n Node) ReplayLogs(chains map[uint64]uint64) error { func NewNode( t *testing.T, port int, // Port for the P2P V2 listener. - chains map[uint64]EVMChain, + chains map[uint64]deployment.Chain, logLevel zapcore.Level, bootstrap bool, registryConfig deployment.CapabilityRegistryConfig, ) *Node { + evmchains := make(map[uint64]EVMChain) + for _, chain := range chains { + evmChainID, err := chainsel.ChainIdFromSelector(chain.Selector) + if err != nil { + t.Fatal(err) + } + evmchains[evmChainID] = EVMChain{ + Backend: chain.Client.(*backends.SimulatedBackend), + DeployerKey: chain.DeployerKey, + } + } + // Do not want to load fixtures as they contain a dummy chainID. // Create database and initial configuration. cfg, db := heavyweight.FullTestDBNoFixturesV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { @@ -102,7 +118,7 @@ func NewNode( c.Log.Level = ptr(configv2.LogLevel(logLevel)) var chainConfigs v2toml.EVMConfigs - for chainID := range chains { + for chainID := range evmchains { chainConfigs = append(chainConfigs, createConfigV2Chain(chainID)) } c.EVM = chainConfigs @@ -114,7 +130,7 @@ func NewNode( // Create clients for the core node backed by sim. clients := make(map[uint64]client.Client) - for chainID, chain := range chains { + for chainID, chain := range evmchains { clients[chainID] = client.NewSimulatedBackendClient(t, chain.Backend, big.NewInt(int64(chainID))) } @@ -178,6 +194,7 @@ func NewNode( return &Node{ App: app, + Chains: maps.Keys(chains), Keys: keys, Addr: net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: port}, IsBoostrap: bootstrap, @@ -186,50 +203,84 @@ func NewNode( type Keys struct { PeerID p2pkey.PeerID + CSA csakey.KeyV2 TransmittersByEVMChainID map[uint64]common.Address - OCRKeyBundle ocr2key.KeyBundle + OCRKeyBundles map[chaintype.ChainType]ocr2key.KeyBundle } func CreateKeys(t *testing.T, - app chainlink.Application, chains map[uint64]EVMChain) Keys { + app chainlink.Application, chains map[uint64]deployment.Chain) Keys { ctx := tests.Context(t) require.NoError(t, app.GetKeyStore().Unlock(ctx, "password")) _, err := app.GetKeyStore().P2P().Create(ctx) require.NoError(t, err) + csaKey, err := app.GetKeyStore().CSA().Create(ctx) + require.NoError(t, err) + p2pIDs, err := app.GetKeyStore().P2P().GetAll() require.NoError(t, err) require.Len(t, p2pIDs, 1) peerID := p2pIDs[0].PeerID() // create a transmitter for each chain transmitters := make(map[uint64]common.Address) - for chainID, chain := range chains { - cid := big.NewInt(int64(chainID)) + keybundles := make(map[chaintype.ChainType]ocr2key.KeyBundle) + for _, chain := range chains { + family, err := chainsel.GetSelectorFamily(chain.Selector) + require.NoError(t, err) + + var ctype chaintype.ChainType + switch family { + case chainsel.FamilyEVM: + ctype = chaintype.EVM + case chainsel.FamilySolana: + ctype = chaintype.Solana + case chainsel.FamilyStarknet: + ctype = chaintype.StarkNet + case chainsel.FamilyCosmos: + ctype = chaintype.Cosmos + case chainsel.FamilyAptos: + ctype = chaintype.Aptos + default: + panic(fmt.Sprintf("Unsupported chain family %v", family)) + } + + keybundle, err := app.GetKeyStore().OCR2().Create(ctx, ctype) + require.NoError(t, err) + keybundles[ctype] = keybundle + + if family != chainsel.FamilyEVM { + // TODO: only support EVM transmission keys for now + continue + } + + evmChainID, err := chainsel.ChainIdFromSelector(chain.Selector) + require.NoError(t, err) + + cid := big.NewInt(int64(evmChainID)) addrs, err2 := app.GetKeyStore().Eth().EnabledAddressesForChain(ctx, cid) require.NoError(t, err2) if len(addrs) == 1 { // just fund the address - fundAddress(t, chain.DeployerKey, addrs[0], assets.Ether(10).ToInt(), chain.Backend) - transmitters[chainID] = addrs[0] + transmitters[evmChainID] = addrs[0] } else { // create key and fund it _, err3 := app.GetKeyStore().Eth().Create(ctx, cid) - require.NoError(t, err3, "failed to create key for chain", chainID) + require.NoError(t, err3, "failed to create key for chain", evmChainID) sendingKeys, err3 := app.GetKeyStore().Eth().EnabledAddressesForChain(ctx, cid) require.NoError(t, err3) require.Len(t, sendingKeys, 1) - fundAddress(t, chain.DeployerKey, sendingKeys[0], assets.Ether(10).ToInt(), chain.Backend) - transmitters[chainID] = sendingKeys[0] + transmitters[evmChainID] = sendingKeys[0] } + backend := chain.Client.(*backends.SimulatedBackend) + fundAddress(t, chain.DeployerKey, transmitters[evmChainID], assets.Ether(1000).ToInt(), backend) } - require.Len(t, transmitters, len(chains)) - keybundle, err := app.GetKeyStore().OCR2().Create(ctx, chaintype.EVM) - require.NoError(t, err) return Keys{ PeerID: peerID, + CSA: csaKey, TransmittersByEVMChainID: transmitters, - OCRKeyBundle: keybundle, + OCRKeyBundles: keybundles, } } diff --git a/integration-tests/deployment/memory/node_test.go b/integration-tests/deployment/memory/node_test.go index 035e6d03106..621f95644fb 100644 --- a/integration-tests/deployment/memory/node_test.go +++ b/integration-tests/deployment/memory/node_test.go @@ -12,7 +12,7 @@ import ( ) func TestNode(t *testing.T) { - chains := GenerateChains(t, 3) + chains := NewMemoryChains(t, 3) ports := freeport.GetN(t, 1) node := NewNode(t, ports[0], chains, zapcore.DebugLevel, false, deployment.CapabilityRegistryConfig{}) // We expect 3 transmitter keys diff --git a/integration-tests/web/sdk/internal/genqlient.graphql b/integration-tests/web/sdk/internal/genqlient.graphql index a513687381f..4c998a4f6a6 100644 --- a/integration-tests/web/sdk/internal/genqlient.graphql +++ b/integration-tests/web/sdk/internal/genqlient.graphql @@ -470,4 +470,4 @@ mutation UpdateJobProposalSpecDefinition( code } } -} \ No newline at end of file +}