From 0ad624673f6f1a8e155fc43c67a8ae6caddefa90 Mon Sep 17 00:00:00 2001 From: krehermann <16602512+krehermann@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:27:49 -0600 Subject: [PATCH] ks-444: integrate keystone contract deployment (#14334) * working * refactoring * use changeset * clean up * add onchain loading and checks in test * add ability to create an env from clo artifact * update tests; generate wf & target don * make clo env work with inmemory chains for testing * fix clo test to use the correct node->nop mapping * cleanup * linter * fix flaky contract addresses * doc update * add forwarder set config * ocr3 configuration working * clean up and fix flakey in memory test due to conflicting in memory chains * cleanup & comments * more cleanup; revert unneeded changes, add TODOs * linter * add readme * readme and simplification of translating clo data to don * refactor to make Deploy use regular env * update readme, add todos * fix merge conflict * simplify Deploy into composable funcs * use common logger * logging * seperate contract deployment from configuration to better support testnet changesets * add asset don to tests * merge with aptos support; dedup code * mv ocr3 config to integration test from scripts * mv code from scripts to integration-tests * add estimated gas debugging * support more granular deployments * go mod tidy * linter, tests * linter, changeset * address comment; reinstate addressbook merge semantics; add changesets and tests * fix tests; fix non-determinism in env.AllChainXXX listing * add todos; minor style fixes * linter --- .changeset/polite-tips-sneeze.md | 5 + core/scripts/go.mod | 58 +- core/scripts/go.sum | 657 ++- .../keystone/src/01_deploy_contracts_cmd.go | 3 +- core/scripts/keystone/src/88_gen_jobspecs.go | 3 +- .../keystone/src/88_gen_ocr3_config.go | 212 +- core/scripts/keystone/src/99_fetch_keys.go | 9 +- integration-tests/deployment/address_book.go | 4 +- .../deployment/clo/don_nodeset.go | 67 + .../deployment/clo/don_nodeset_test.go | 116 + integration-tests/deployment/clo/env.go | 133 + .../deployment/clo/models/models.go | 28 + .../deployment/clo/models/models_gen.go | 3650 +++++++++++++++++ .../deployment/clo/offchain_client_impl.go | 213 + .../clo/offchain_client_impl_test.go | 582 +++ .../deployment/clo/testdata/asset_nodes.json | 978 +++++ .../clo/testdata/chain_writer_nodes.json | 1446 +++++++ .../clo/testdata/keystone_nops.json | 3162 ++++++++++++++ .../clo/testdata/workflow_nodes.json | 886 ++++ integration-tests/deployment/environment.go | 15 +- .../deployment/keystone/README.md | 106 + .../keystone/capability_definitions.go | 34 + .../keystone/capability_registry_deployer.go | 66 + .../changeset/0001_deploy_registry.go | 22 + .../changeset/0001_deploy_registry_test.go | 40 + .../keystone/changeset/0002_deploy_ocr3.go | 40 + .../changeset/0002_deploy_ocr3_test.go | 48 + .../changeset/0003_deploy_forwarder.go | 30 + .../changeset/0003_deploy_forwarder_test.go | 76 + .../changeset/0004_configure_contracts.go | 62 + .../deployment/keystone/contract_set.go | 93 + .../deployment/keystone/deploy.go | 799 ++++ .../deployment/keystone/deploy_test.go | 178 + .../deployment/keystone/forwarder_deployer.go | 46 + .../deployment/keystone/ocr3_deployer.go | 46 + .../deployment/keystone/ocr3config.go | 227 + .../deployment/keystone/state.go | 79 + .../keystone/testdata/ocr3config.json | 27 + .../deployment/keystone/types.go | 307 ++ integration-tests/deployment/memory/chain.go | 19 + .../deployment/memory/environment.go | 11 +- .../deployment/memory/job_client.go | 45 +- integration-tests/deployment/memory/node.go | 6 +- integration-tests/deployment/multiclient.go | 62 +- .../deployment/multiclient_test.go | 9 +- integration-tests/go.mod | 3 +- integration-tests/go.sum | 46 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 7 +- 49 files changed, 14392 insertions(+), 371 deletions(-) create mode 100644 .changeset/polite-tips-sneeze.md create mode 100644 integration-tests/deployment/clo/don_nodeset.go create mode 100644 integration-tests/deployment/clo/don_nodeset_test.go create mode 100644 integration-tests/deployment/clo/env.go create mode 100644 integration-tests/deployment/clo/models/models.go create mode 100644 integration-tests/deployment/clo/models/models_gen.go create mode 100644 integration-tests/deployment/clo/offchain_client_impl.go create mode 100644 integration-tests/deployment/clo/offchain_client_impl_test.go create mode 100644 integration-tests/deployment/clo/testdata/asset_nodes.json create mode 100644 integration-tests/deployment/clo/testdata/chain_writer_nodes.json create mode 100644 integration-tests/deployment/clo/testdata/keystone_nops.json create mode 100644 integration-tests/deployment/clo/testdata/workflow_nodes.json create mode 100644 integration-tests/deployment/keystone/README.md create mode 100644 integration-tests/deployment/keystone/capability_definitions.go create mode 100644 integration-tests/deployment/keystone/capability_registry_deployer.go create mode 100644 integration-tests/deployment/keystone/changeset/0001_deploy_registry.go create mode 100644 integration-tests/deployment/keystone/changeset/0001_deploy_registry_test.go create mode 100644 integration-tests/deployment/keystone/changeset/0002_deploy_ocr3.go create mode 100644 integration-tests/deployment/keystone/changeset/0002_deploy_ocr3_test.go create mode 100644 integration-tests/deployment/keystone/changeset/0003_deploy_forwarder.go create mode 100644 integration-tests/deployment/keystone/changeset/0003_deploy_forwarder_test.go create mode 100644 integration-tests/deployment/keystone/changeset/0004_configure_contracts.go create mode 100644 integration-tests/deployment/keystone/contract_set.go create mode 100644 integration-tests/deployment/keystone/deploy.go create mode 100644 integration-tests/deployment/keystone/deploy_test.go create mode 100644 integration-tests/deployment/keystone/forwarder_deployer.go create mode 100644 integration-tests/deployment/keystone/ocr3_deployer.go create mode 100644 integration-tests/deployment/keystone/ocr3config.go create mode 100644 integration-tests/deployment/keystone/state.go create mode 100644 integration-tests/deployment/keystone/testdata/ocr3config.json create mode 100644 integration-tests/deployment/keystone/types.go diff --git a/.changeset/polite-tips-sneeze.md b/.changeset/polite-tips-sneeze.md new file mode 100644 index 00000000000..4dc0e000046 --- /dev/null +++ b/.changeset/polite-tips-sneeze.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#added keystone contract deployment diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 5c9043111da..fd395f132b6 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -5,8 +5,10 @@ go 1.22.7 // Make sure we're working with the latest chainlink libs replace github.com/smartcontractkit/chainlink/v2 => ../../ +replace github.com/smartcontractkit/chainlink/integration-tests => ../../integration-tests + require ( - github.com/docker/docker v24.0.7+incompatible + github.com/docker/docker v25.0.2+incompatible github.com/docker/go-connections v0.5.0 github.com/ethereum/go-ethereum v1.13.8 github.com/gkampitakis/go-snaps v0.5.4 @@ -23,18 +25,19 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v1.0.4 github.com/smartcontractkit/chainlink-common v0.2.3-0.20241008170407-8bfcea33a98d + github.com/smartcontractkit/chainlink/integration-tests v0.0.0-00010101000000-000000000000 github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000 github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 github.com/spf13/cobra v1.8.1 - github.com/spf13/viper v1.18.2 + github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.9.0 github.com/umbracle/ethgo v0.1.3 github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 github.com/urfave/cli v1.22.14 google.golang.org/protobuf v1.34.2 - k8s.io/api v0.30.0 - k8s.io/apimachinery v0.30.0 - k8s.io/client-go v0.30.0 + k8s.io/api v0.31.0 + k8s.io/apimachinery v0.31.0 + k8s.io/client-go v0.31.0 ) require ( @@ -54,7 +57,7 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Depado/ginprom v1.8.0 // indirect github.com/Masterminds/semver/v3 v3.2.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NethermindEth/juno v0.3.1 // indirect github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect @@ -63,6 +66,7 @@ require ( github.com/armon/go-metrics v0.4.1 // indirect github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect github.com/avast/retry-go/v4 v4.6.0 // indirect + github.com/aws/aws-sdk-go v1.45.25 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -70,7 +74,6 @@ require ( github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/blendle/zapdriver v1.3.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/btcutil v1.1.3 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect github.com/bytedance/sonic v1.10.1 // indirect @@ -86,18 +89,19 @@ require ( github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cometbft/cometbft v0.37.5 // indirect - github.com/cometbft/cometbft-db v0.7.0 // indirect + github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/containerd/continuity v0.4.2 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect github.com/cosmos/cosmos-sdk v0.47.11 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogoproto v1.4.11 // indirect github.com/cosmos/iavl v0.20.1 // indirect - github.com/cosmos/ibc-go/v7 v7.0.1 // indirect - github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab // indirect + github.com/cosmos/ibc-go/v7 v7.5.1 // indirect + github.com/cosmos/ics23/go v0.10.0 // indirect github.com/cosmos/ledger-cosmos-go v0.12.4 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect @@ -111,15 +115,17 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/distribution/reference v0.6.0 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dominikbraun/graph v0.23.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.7.0 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/esote/minmaxheap v1.0.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/fatih/color v1.17.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect @@ -146,10 +152,10 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.20.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.22.0 // indirect @@ -167,15 +173,15 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-tpm v0.9.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect + github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/sessions v1.2.2 // indirect github.com/gorilla/websocket v1.5.1 // indirect - github.com/grafana/pyroscope-go v1.1.1 // indirect + github.com/grafana/pyroscope-go v1.1.2 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/graph-gophers/dataloader v5.0.0+incompatible // indirect github.com/graph-gophers/graphql-go v1.5.0 // indirect @@ -215,6 +221,7 @@ require ( github.com/jackc/pgtype v1.14.0 // indirect github.com/jackc/pgx/v4 v4.18.2 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect @@ -228,6 +235,7 @@ require ( github.com/leodido/go-urn v1.4.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/linxGnu/grocksdb v1.7.16 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -250,7 +258,7 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oklog/run v1.1.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pelletier/go-toml v1.9.5 // indirect @@ -262,7 +270,7 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.59.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/prometheus/prometheus v0.48.1 // indirect + github.com/prometheus/prometheus v1.8.2-0.20200727090838-6f296594a852 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect @@ -277,6 +285,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shirou/gopsutil/v3 v3.24.3 // indirect + github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 // indirect github.com/smartcontractkit/chain-selectors v1.0.23 // indirect github.com/smartcontractkit/chainlink-ccip v0.0.0-20241009125450-4290917273fb // indirect github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240911175228-daf2600bb7b7 // indirect @@ -298,7 +307,6 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect - github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 // indirect github.com/test-go/testify v1.1.4 // indirect @@ -323,16 +331,18 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v3 v3.1.0 // indirect - go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/bbolt v1.3.9 // indirect go.mongodb.org/mongo-driver v1.15.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect @@ -370,8 +380,8 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index edb7d16b965..96394ececab 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -7,6 +7,7 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= @@ -19,6 +20,7 @@ cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/compute v1.27.2 h1:5cE5hdrwJV/92ravlwIFRGnyH9CpLGhh4N0ZDVTU+BA= cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= @@ -35,6 +37,7 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo= @@ -63,8 +66,26 @@ github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo8 github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= +github.com/Azure/azure-sdk-for-go v44.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.11.2/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -76,6 +97,7 @@ github.com/CosmWasm/wasmd v0.40.1 h1:LxbO78t/6S8TkeQlUrJ0m5O87HtAwLx4RGHq3rdrOEU github.com/CosmWasm/wasmd v0.40.1/go.mod h1:6EOwnv7MpuFaEqxcUOdFV9i4yvrdOciaY6VQ1o7A3yg= github.com/CosmWasm/wasmvm v1.2.4 h1:6OfeZuEcEH/9iqwrg2pkeVtDCkMoj9U6PpKtcrCyVrQ= github.com/CosmWasm/wasmvm v1.2.4/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= @@ -83,11 +105,14 @@ github.com/Depado/ginprom v1.8.0 h1:zaaibRLNI1dMiiuj1MKzatm8qrcHzikMlCc1anqOdyo= github.com/Depado/ginprom v1.8.0/go.mod h1:XBaKzeNBqPF4vxJpNLincSQZeMDnZp1tIbU0FU0UKgg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= github.com/NethermindEth/juno v0.3.1/go.mod h1:SGbTpgGaCsxhFsKOid7Ylnz//WZ8swtILk+NbHGsk/Q= github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb h1:Mv8SscePPyw2ju4igIJAjFgcq5zCQfjgbz53DwYu5mc= @@ -97,43 +122,66 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/XSAM/otelsql v0.27.0 h1:i9xtxtdcqXV768a5C6SoT/RkG+ue3JTOgkYInzlTOqs= github.com/XSAM/otelsql v0.27.0/go.mod h1:0mFB3TvLa7NCuhm/2nU7/b2wEtsczkj8Rey8ygO7V+A= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4= github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c h1:cxQVoh6kY+c4b0HUchHjGWBI8288VhH50qxKG3hdEg0= github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c/go.mod h1:3XzxudkrYVUvbduN/uI2fl4lSrMSzU0+3RCu2mpnfx8= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.33.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4= github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -153,31 +201,15 @@ github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0 h1:V2/ZgjfDFIygAX3ZapeigkVBoVUtOJKSwrhZdlpSvaA= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= -github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 h1:SDlJ7bAm4ewvrmZtR0DaiYbQGdKPeaaIm7bM+qRhFeU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= @@ -188,8 +220,11 @@ github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1 github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.1 h1:7a1wuFXL1cMy7a3f7/VFcEtriuXQnUBhtoVfOZiaysc= github.com/bytedance/sonic v1.10.1/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -214,6 +249,7 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -221,6 +257,7 @@ github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU= @@ -233,28 +270,34 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= github.com/cometbft/cometbft v0.37.5 h1:/U/TlgMh4NdnXNo+YU9T2NMCWyhXNDF34Mx582jlvq0= github.com/cometbft/cometbft v0.37.5/go.mod h1:QC+mU0lBhKn8r9qvmnq53Dmf3DWBt4VtkcKw2C81wxY= -github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= +github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= @@ -271,15 +314,16 @@ github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= github.com/cosmos/iavl v0.20.1 h1:rM1kqeG3/HBT85vsZdoSNsehciqUQPWrR4BYmqE2+zg= github.com/cosmos/iavl v0.20.1/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.0.1 h1:NIBNRWjlOoFvFQu1ZlgwkaSeHO5avf4C1YQiWegt8jw= -github.com/cosmos/ibc-go/v7 v7.0.1/go.mod h1:vEaapV6nuLPQlS+g8IKmxMo6auPi0i7HMv1PhViht/E= -github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw= -github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab/go.mod h1:2CwqasX5dSD7Hbp/9b6lhK6BwoBDCBldx7gPKRukR60= +github.com/cosmos/ibc-go/v7 v7.5.1 h1:KqS/g7W7EMX1OtOvufS8lWMJibOKpdgtNNZIU6fAgVU= +github.com/cosmos/ibc-go/v7 v7.5.1/go.mod h1:ktFg5GvKOyrGCqTWtW7Grj5uweU4ZapxrNeVS1CLLbo= +github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= @@ -297,21 +341,18 @@ github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuA github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e/go.mod h1:IJgIiGUARc4aOr4bOQ85klmjsShkEEfiRc6q/yBSfo8= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dfuse-io/logging v0.0.0-20201110202154-26697de88c79/go.mod h1:V+ED4kT/t/lKtH99JQmKIb0v9WL3VaYkJ36CfHlVECI= @@ -323,27 +364,48 @@ github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KP github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/digitalocean/godo v1.42.0/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200706150819-a40b877fbb9e+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.2+incompatible h1:/OaKeauroa10K4Nqavw4zlhcDq/WBcPMc5DbjOGgozY= +github.com/docker/docker v25.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dominikbraun/graph v0.23.0 h1:TdZB4pPqCLFxYhdyMFb1TBdFxp8XLcJfTTBQucVPgCo= github.com/dominikbraun/graph v0.23.0/go.mod h1:yOjYyogZLY1LSG9E33JWZJiq5k83Qy2C6POAuiViluc= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -355,12 +417,7 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -370,8 +427,11 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -399,6 +459,7 @@ github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSG github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9yhSRvsmYyZsshflcR6ePWYLql6UU1amW13IM= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk= github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI= @@ -421,6 +482,10 @@ github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZ github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= github.com/gkampitakis/go-snaps v0.5.4 h1:GX+dkKmVsRenz7SoTbdIEL4KQARZctkMiZ8ZKprRwT8= github.com/gkampitakis/go-snaps v0.5.4/go.mod h1:ZABkO14uCuVxBHAXAfKG+bqNz+aa1bGPAg8jkI0Nk8Y= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -432,6 +497,7 @@ github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -444,22 +510,80 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= -github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.4/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -472,18 +596,46 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0= github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= @@ -496,15 +648,19 @@ github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14j github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -518,6 +674,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -537,6 +694,7 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -546,8 +704,9 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -561,10 +720,12 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-tpm v0.9.0 h1:sQF6YqWMi+SCXpsmS3fd21oPy/vSddwZry4JnmltHVk= github.com/google/go-tpm v0.9.0/go.mod h1:FkNVkc6C+IsvDI9Jw1OveJmxGZUUaKxtrpOS47QWKfU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -575,13 +736,16 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -590,13 +754,20 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gophercloud/gophercloud v0.12.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= @@ -604,18 +775,21 @@ github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kX github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/grafana/pyroscope-go v1.1.1 h1:PQoUU9oWtO3ve/fgIiklYuGilvsm8qaGhlY4Vw6MAcQ= -github.com/grafana/pyroscope-go v1.1.1/go.mod h1:Mw26jU7jsL/KStNSGGuuVYdUq7Qghem5P8aXYXSXG88= +github.com/grafana/pyroscope-go v1.1.2 h1:7vCfdORYQMCxIzI3NlYAs3FcBP760+gWuYWOyiVyYx8= +github.com/grafana/pyroscope-go v1.1.2/go.mod h1:HSSmHo2KRn6FasBA4vK7BMiQqyQq8KSuBKvrhkXxYPU= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= github.com/graph-gophers/dataloader v5.0.0+incompatible h1:R+yjsbrNq1Mo3aPG+Z/EKYrXrXXUNJHOgbRt+U6jOug= github.com/graph-gophers/dataloader v5.0.0+incompatible/go.mod h1:jk4jk0c5ZISbKaMe8WsVopGB5/15GvGHMdMdPtwlRp4= github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= @@ -624,6 +798,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwn github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= @@ -636,7 +812,11 @@ github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/b github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -651,9 +831,12 @@ github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8J github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -664,20 +847,24 @@ github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -686,8 +873,12 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= @@ -703,12 +894,14 @@ github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3 github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= @@ -716,6 +909,15 @@ github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPt github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY= +github.com/influxdata/influxdb v1.8.1/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= @@ -767,17 +969,20 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -787,36 +992,51 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -836,19 +1056,33 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.7.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8= +github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -860,25 +1094,33 @@ github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -891,12 +1133,14 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= @@ -904,8 +1148,8 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -922,11 +1166,22 @@ github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 h1:mPMvm github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1/go.mod h1:ye2e/VUEtE2BHE+G/QcKkcLQVAEJoYRFj5VUOQatCRE= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -936,54 +1191,80 @@ github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249/go.mod h1:mpRZBD8SJ55 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= -github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/runc v1.1.7 h1:y2EZDS8sNng4Ksf0GUYNhKbTShZJPJg1FiXJNH/uoCk= +github.com/opencontainers/runc v1.1.7/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -991,6 +1272,8 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -1000,41 +1283,57 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= +github.com/prometheus/alertmanager v0.21.0/go.mod h1:h7tJ81NA0VLWvWEayi1QltevFkLF3KxmC/malTcT8Go= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0= github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.48.1 h1:CTszphSNTXkuCG6O0IfpKdHcJkvvnAAE1GbELKS+NFk= -github.com/prometheus/prometheus v0.48.1/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= +github.com/prometheus/prometheus v1.8.2-0.20200727090838-6f296594a852 h1:aRBuOcI/bN5f/UqmIGn8CajY6W0mPBEajK8q+SFgNZY= +github.com/prometheus/prometheus v1.8.2-0.20200727090838-6f296594a852/go.mod h1:yzkxU+U4d5ZgVH/ywg/zONKN91UPLKsKCYkcyGOBH18= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -1042,28 +1341,34 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= -github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/samuel/go-zookeeper v0.0.0-20200724154423-2164a8ac840e/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= @@ -1071,9 +1376,13 @@ github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPO github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scylladb/go-reflectx v1.0.1 h1:b917wZM7189pZdlND9PbIJ6NQxfDPfBvUaQ7cjj1iZQ= github.com/scylladb/go-reflectx v1.0.1/go.mod h1:rWnOfDIRWBGN0miMLIcoPt/Dhi2doCMZqwMCJ3KupFc= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -1087,12 +1396,18 @@ github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/shurcooL/vfsgen v0.0.0-20200627165143-92b8a710ab6c/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 h1:qQH6fZZe31nBAG6INHph3z5ysDTPptyu0TR9uoJ1+ok= +github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86/go.mod h1:WtWOoVQQEHxRHL2hNmuRrvDfYfQG/CioFNoa9Rr2mBE= github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnjjIQAEBnutCtksPzVDY= github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8= @@ -1124,32 +1439,40 @@ github.com/smartcontractkit/wsrpc v0.8.2/go.mod h1:2u/wfnhl5R4RlSXseN4n6HHIWk8w1 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75 h1:ZqpS7rAhhKD7S7DnrpEdrnW1/gZcv82ytpMviovkli4= github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1160,6 +1483,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1178,11 +1502,8 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= @@ -1206,16 +1527,20 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -1232,6 +1557,8 @@ github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 h1:10Nbw6cACsnQm7 github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722/go.mod h1:c8J0h9aULj2i3umrfyestM6jCq0LK0U6ly6bWy96nd4= github.com/unrolled/secure v1.13.0 h1:sdr3Phw2+f8Px8HE5sd1EHdj1aV3yUwed/uZXChLFsk= github.com/unrolled/secure v1.13.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= @@ -1240,6 +1567,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fastjson v1.4.1 h1:hrltpHpIpkaxll8QltMU8c3QZ5+qIiCL8yKqPFJI/yE= github.com/valyala/fastjson v1.4.1/go.mod h1:nV6MsjxL2IMJQUoHDIrjEI7oLyeqK6aBD7EFWPsvP8o= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -1247,13 +1576,18 @@ github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcY github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -1274,11 +1608,20 @@ go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRL go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= +go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= @@ -1307,6 +1650,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9RO go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= @@ -1335,6 +1680,7 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= @@ -1359,18 +1705,27 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -1383,7 +1738,10 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -1395,6 +1753,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1421,17 +1780,20 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1440,15 +1802,21 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1461,6 +1829,7 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= @@ -1476,15 +1845,18 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1492,40 +1864,57 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1549,6 +1938,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1561,11 +1951,13 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1575,47 +1967,66 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1624,7 +2035,9 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200513201620-d5fe73897c97/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200725200936-102e7d357031/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= @@ -1642,8 +2055,15 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1659,17 +2079,20 @@ google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSr google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -1678,6 +2101,7 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= @@ -1688,6 +2112,7 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200724131911-43cab4749ae7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= @@ -1695,8 +2120,11 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1: google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E= google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -1720,6 +2148,7 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -1733,8 +2162,11 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/guregu/null.v2 v2.1.2 h1:YOuepWdYqGnrenzPyMi+ybCjeDzjdazynbwsXXOk4i8= @@ -1752,23 +2184,28 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYs gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1776,16 +2213,27 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= -k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= -k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= -k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/client-go v0.30.0 h1:sB1AGGlhY/o7KCyCEQ0bPWzYDL0pwOZO4vAtTSh/gJQ= -k8s.io/client-go v0.30.0/go.mod h1:g7li5O5256qe6TYdAMyX/otJqMhIiGgTapdLchhmOaY= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= +k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= +k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= +k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc= +k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= +k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= +k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6zX/gcJr22cjrsej+W784Tc= +k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= @@ -1815,7 +2263,12 @@ rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/core/scripts/keystone/src/01_deploy_contracts_cmd.go b/core/scripts/keystone/src/01_deploy_contracts_cmd.go index b3049737956..8c1032c6087 100644 --- a/core/scripts/keystone/src/01_deploy_contracts_cmd.go +++ b/core/scripts/keystone/src/01_deploy_contracts_cmd.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" helpers "github.com/smartcontractkit/chainlink/core/scripts/common" + ksdeploy "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability" ) @@ -156,7 +157,7 @@ func deploy( func setOCR3Config( env helpers.Environment, - ocrConfig orc2drOracleConfig, + ocrConfig ksdeploy.Orc2drOracleConfig, artefacts string, ) { loadedContracts, err := LoadDeployedContracts(artefacts) diff --git a/core/scripts/keystone/src/88_gen_jobspecs.go b/core/scripts/keystone/src/88_gen_jobspecs.go index 39adcac2671..4199e3f2b89 100644 --- a/core/scripts/keystone/src/88_gen_jobspecs.go +++ b/core/scripts/keystone/src/88_gen_jobspecs.go @@ -7,6 +7,7 @@ import ( "strings" helpers "github.com/smartcontractkit/chainlink/core/scripts/common" + ksdeploy "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" ) type spec []string @@ -73,7 +74,7 @@ func replacePlaceholders( chainID, p2pPort int64, contractAddress, bootHost string, - boot, node NodeKeys, + boot, node ksdeploy.NodeKeys, ) (output []string) { chainIDStr := strconv.FormatInt(chainID, 10) bootstrapper := fmt.Sprintf("%s@%s:%d", boot.P2PPeerID, bootHost, p2pPort) diff --git a/core/scripts/keystone/src/88_gen_ocr3_config.go b/core/scripts/keystone/src/88_gen_ocr3_config.go index f0a03ecafb3..6d959e50b41 100644 --- a/core/scripts/keystone/src/88_gen_ocr3_config.go +++ b/core/scripts/keystone/src/88_gen_ocr3_config.go @@ -1,219 +1,19 @@ package src import ( - "crypto/ed25519" - "encoding/hex" - "encoding/json" - "fmt" - "time" - - "github.com/ethereum/go-ethereum/common" - - "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" - "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" - "github.com/smartcontractkit/libocr/offchainreporting2plus/types" - helpers "github.com/smartcontractkit/chainlink/core/scripts/common" - "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" + ksdeploy "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" ) -type TopLevelConfigSource struct { - OracleConfig OracleConfigSource -} - -type OracleConfigSource struct { - MaxQueryLengthBytes uint32 - MaxObservationLengthBytes uint32 - MaxReportLengthBytes uint32 - MaxRequestBatchSize uint32 - UniqueReports bool - - DeltaProgressMillis uint32 - DeltaResendMillis uint32 - DeltaInitialMillis uint32 - DeltaRoundMillis uint32 - DeltaGraceMillis uint32 - DeltaCertifiedCommitRequestMillis uint32 - DeltaStageMillis uint32 - MaxRoundsPerEpoch uint64 - TransmissionSchedule []int - - MaxDurationQueryMillis uint32 - MaxDurationObservationMillis uint32 - MaxDurationAcceptMillis uint32 - MaxDurationTransmitMillis uint32 - - MaxFaultyOracles int -} - -type NodeKeys struct { - EthAddress string `json:"EthAddress"` - AptosAccount string `json:"AptosAccount"` - AptosBundleID string `json:"AptosBundleID"` - AptosOnchainPublicKey string `json:"AptosOnchainPublicKey"` - P2PPeerID string `json:"P2PPeerID"` // p2p_ - OCR2BundleID string `json:"OCR2BundleID"` // used only in job spec - OCR2OnchainPublicKey string `json:"OCR2OnchainPublicKey"` // ocr2on_evm_ - OCR2OffchainPublicKey string `json:"OCR2OffchainPublicKey"` // ocr2off_evm_ - OCR2ConfigPublicKey string `json:"OCR2ConfigPublicKey"` // ocr2cfg_evm_ - CSAPublicKey string `json:"CSAPublicKey"` -} - -type orc2drOracleConfig struct { - Signers [][]byte - Transmitters []common.Address - F uint8 - OnchainConfig []byte - OffchainConfigVersion uint64 - OffchainConfig []byte -} - -func (c orc2drOracleConfig) MarshalJSON() ([]byte, error) { - alias := struct { - Signers []string - Transmitters []string - F uint8 - OnchainConfig string - OffchainConfigVersion uint64 - OffchainConfig string - }{ - Signers: make([]string, len(c.Signers)), - Transmitters: make([]string, len(c.Transmitters)), - F: c.F, - OnchainConfig: "0x" + hex.EncodeToString(c.OnchainConfig), - OffchainConfigVersion: c.OffchainConfigVersion, - OffchainConfig: "0x" + hex.EncodeToString(c.OffchainConfig), - } - - for i, signer := range c.Signers { - alias.Signers[i] = hex.EncodeToString(signer) - } - - for i, transmitter := range c.Transmitters { - alias.Transmitters[i] = transmitter.Hex() - } - - return json.Marshal(alias) -} - -func mustReadConfig(fileName string) (output TopLevelConfigSource) { - return mustParseJSON[TopLevelConfigSource](fileName) +func mustReadConfig(fileName string) (output ksdeploy.TopLevelConfigSource) { + return mustParseJSON[ksdeploy.TopLevelConfigSource](fileName) } -func generateOCR3Config(nodeList string, configFile string, chainID int64, pubKeysPath string) orc2drOracleConfig { +func generateOCR3Config(nodeList string, configFile string, chainID int64, pubKeysPath string) ksdeploy.Orc2drOracleConfig { topLevelCfg := mustReadConfig(configFile) cfg := topLevelCfg.OracleConfig nca := downloadNodePubKeys(nodeList, chainID, pubKeysPath) - - onchainPubKeys := [][]byte{} - allPubKeys := map[string]any{} - for _, n := range nca { - ethPubKey := common.HexToAddress(n.OCR2OnchainPublicKey) - aptosPubKey, err := hex.DecodeString(n.AptosOnchainPublicKey) - if err != nil { - panic(err) - } - pubKeys := map[string]types.OnchainPublicKey{ - "evm": ethPubKey[:], - "aptos": aptosPubKey, - } - // validate uniqueness of each individual key - for _, key := range pubKeys { - raw := hex.EncodeToString(key) - _, exists := allPubKeys[raw] - if exists { - panic(fmt.Sprintf("Duplicate onchain public key: %v", raw)) - } - allPubKeys[raw] = struct{}{} - } - pubKey, err := ocrcommon.MarshalMultichainPublicKey(pubKeys) - if err != nil { - panic(err) - } - onchainPubKeys = append(onchainPubKeys, pubKey) - } - - offchainPubKeysBytes := []types.OffchainPublicKey{} - for _, n := range nca { - pkBytes, err := hex.DecodeString(n.OCR2OffchainPublicKey) - if err != nil { - panic(err) - } - - pkBytesFixed := [ed25519.PublicKeySize]byte{} - nCopied := copy(pkBytesFixed[:], pkBytes) - if nCopied != ed25519.PublicKeySize { - panic("wrong num elements copied from ocr2 offchain public key") - } - - offchainPubKeysBytes = append(offchainPubKeysBytes, types.OffchainPublicKey(pkBytesFixed)) - } - - configPubKeysBytes := []types.ConfigEncryptionPublicKey{} - for _, n := range nca { - pkBytes, err := hex.DecodeString(n.OCR2ConfigPublicKey) - helpers.PanicErr(err) - - pkBytesFixed := [ed25519.PublicKeySize]byte{} - n := copy(pkBytesFixed[:], pkBytes) - if n != ed25519.PublicKeySize { - panic("wrong num elements copied") - } - - configPubKeysBytes = append(configPubKeysBytes, types.ConfigEncryptionPublicKey(pkBytesFixed)) - } - - identities := []confighelper.OracleIdentityExtra{} - for index := range nca { - identities = append(identities, confighelper.OracleIdentityExtra{ - OracleIdentity: confighelper.OracleIdentity{ - OnchainPublicKey: onchainPubKeys[index][:], - OffchainPublicKey: offchainPubKeysBytes[index], - PeerID: nca[index].P2PPeerID, - TransmitAccount: types.Account(nca[index].EthAddress), - }, - ConfigEncryptionPublicKey: configPubKeysBytes[index], - }) - } - - signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, err := ocr3confighelper.ContractSetConfigArgsForTests( - time.Duration(cfg.DeltaProgressMillis)*time.Millisecond, - time.Duration(cfg.DeltaResendMillis)*time.Millisecond, - time.Duration(cfg.DeltaInitialMillis)*time.Millisecond, - time.Duration(cfg.DeltaRoundMillis)*time.Millisecond, - time.Duration(cfg.DeltaGraceMillis)*time.Millisecond, - time.Duration(cfg.DeltaCertifiedCommitRequestMillis)*time.Millisecond, - time.Duration(cfg.DeltaStageMillis)*time.Millisecond, - cfg.MaxRoundsPerEpoch, - cfg.TransmissionSchedule, - identities, - nil, // empty plugin config - time.Duration(cfg.MaxDurationQueryMillis)*time.Millisecond, - time.Duration(cfg.MaxDurationObservationMillis)*time.Millisecond, - time.Duration(cfg.MaxDurationAcceptMillis)*time.Millisecond, - time.Duration(cfg.MaxDurationTransmitMillis)*time.Millisecond, - cfg.MaxFaultyOracles, - nil, // empty onChain config - ) + c, err := ksdeploy.GenerateOCR3Config(cfg, nca) helpers.PanicErr(err) - - var configSigners [][]byte - for _, signer := range signers { - configSigners = append(configSigners, signer) - } - - transmitterAddresses, err := evm.AccountToAddress(transmitters) - PanicErr(err) - - config := orc2drOracleConfig{ - Signers: configSigners, - Transmitters: transmitterAddresses, - F: f, - OnchainConfig: onchainConfig, - OffchainConfigVersion: offchainConfigVersion, - OffchainConfig: offchainConfig, - } - - return config + return c } diff --git a/core/scripts/keystone/src/99_fetch_keys.go b/core/scripts/keystone/src/99_fetch_keys.go index 91750f7422d..9d88ba59643 100644 --- a/core/scripts/keystone/src/99_fetch_keys.go +++ b/core/scripts/keystone/src/99_fetch_keys.go @@ -13,16 +13,17 @@ import ( "github.com/urfave/cli" helpers "github.com/smartcontractkit/chainlink/core/scripts/common" + ksdeploy "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/cmd" "github.com/smartcontractkit/chainlink/v2/core/web/presenters" ) -func downloadNodePubKeys(nodeList string, chainID int64, pubKeysPath string) []NodeKeys { +func downloadNodePubKeys(nodeList string, chainID int64, pubKeysPath string) []ksdeploy.NodeKeys { // Check if file exists already, and if so, return the keys if _, err := os.Stat(pubKeysPath); err == nil { fmt.Println("Loading existing public keys at:", pubKeysPath) - return mustParseJSON[[]NodeKeys](pubKeysPath) + return mustParseJSON[[]ksdeploy.NodeKeys](pubKeysPath) } nodes := downloadNodeAPICredentials(nodeList) @@ -96,7 +97,7 @@ type ocr2Bundle struct { ConfigPublicKey string `json:"configPublicKey"` } -func mustFetchNodesKeys(chainID int64, nodes []*node) (nca []NodeKeys) { +func mustFetchNodesKeys(chainID int64, nodes []*node) (nca []ksdeploy.NodeKeys) { for _, n := range nodes { output := &bytes.Buffer{} client, app := newApp(n, output) @@ -208,7 +209,7 @@ func mustFetchNodesKeys(chainID int64, nodes []*node) (nca []NodeKeys) { helpers.PanicErr(err) output.Reset() - nc := NodeKeys{ + nc := ksdeploy.NodeKeys{ EthAddress: ethAddress, AptosAccount: aptosAccount, P2PPeerID: peerID, diff --git a/integration-tests/deployment/address_book.go b/integration-tests/deployment/address_book.go index be004f27d0d..e0efbc00af7 100644 --- a/integration-tests/deployment/address_book.go +++ b/integration-tests/deployment/address_book.go @@ -88,6 +88,7 @@ type AddressBookMap struct { AddressesByChain map[uint64]map[string]TypeAndVersion } +// Save will save an address for a given chain selector. It will error if there is a conflicting existing address. func (m *AddressBookMap) Save(chainSelector uint64, address string, typeAndVersion TypeAndVersion) error { _, exists := chainsel.ChainBySelector(chainSelector) if !exists { @@ -131,7 +132,8 @@ func (m *AddressBookMap) AddressesForChain(chainSelector uint64) (map[string]Typ return m.AddressesByChain[chainSelector], nil } -// Attention this will mutate existing book +// Merge will merge the addresses from another address book into this one. +// It will error on any existing addresses. func (m *AddressBookMap) Merge(ab AddressBook) error { addresses, err := ab.Addresses() if err != nil { diff --git a/integration-tests/deployment/clo/don_nodeset.go b/integration-tests/deployment/clo/don_nodeset.go new file mode 100644 index 00000000000..5962b6f4ba8 --- /dev/null +++ b/integration-tests/deployment/clo/don_nodeset.go @@ -0,0 +1,67 @@ +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 new file mode 100644 index 00000000000..2a88f6c5e11 --- /dev/null +++ b/integration-tests/deployment/clo/don_nodeset_test.go @@ -0,0 +1,116 @@ +package clo_test + +import ( + "encoding/json" + "os" + "reflect" + "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 TestFilterNopNodes(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` + 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 +} +func TestDonNodeset(t *testing.T) { + 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 { + b, err := json.MarshalIndent(m["workflow"], "", " ") + require.NoError(t, err) + require.NoError(t, os.WriteFile("testdata/workflow_nodes.json", b, 0644)) // nolint: gosec + + b, err = json.MarshalIndent(m["chainWriter"], "", " ") + require.NoError(t, err) + require.NoError(t, os.WriteFile("testdata/chain_writer_nodes.json", b, 0644)) // nolint: gosec + + b, err = json.MarshalIndent(m["asset"], "", " ") + require.NoError(t, err) + require.NoError(t, os.WriteFile("testdata/asset_nodes.json", b, 0644)) // nolint: gosec + } + + gotWFNops := m["workflow"] + sort.Slice(gotWFNops, func(i, j int) bool { + return gotWFNops[i].ID < gotWFNops[j].ID + }) + expectedWorkflowNops := loadTestNops(t, "testdata/workflow_nodes.json") + assert.True(t, reflect.DeepEqual(gotWFNops, expectedWorkflowNops), "workflow nodes do not match") + + gotChainWriterNops := m["chainWriter"] + sort.Slice(gotChainWriterNops, func(i, j int) bool { + return gotChainWriterNops[i].ID < gotChainWriterNops[j].ID + }) + expectedChainWriterNops := loadTestNops(t, "testdata/chain_writer_nodes.json") + assert.True(t, reflect.DeepEqual(gotChainWriterNops, expectedChainWriterNops), "chain writer nodes do not match") +} + +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 new file mode 100644 index 00000000000..d2680f13e58 --- /dev/null +++ b/integration-tests/deployment/clo/env.go @@ -0,0 +1,133 @@ +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.Ocr1Config.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) *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 { + 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 new file mode 100644 index 00000000000..1d33cff84d5 --- /dev/null +++ b/integration-tests/deployment/clo/models/models.go @@ -0,0 +1,28 @@ +// 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 new file mode 100644 index 00000000000..836eb7e7add --- /dev/null +++ b/integration-tests/deployment/clo/models/models_gen.go @@ -0,0 +1,3650 @@ +// 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" +) + +var AllChainType = []ChainType{ + ChainTypeEvm, + ChainTypeSolana, + ChainTypeStarknet, +} + +func (e ChainType) IsValid() bool { + switch e { + case ChainTypeEvm, ChainTypeSolana, ChainTypeStarknet: + 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 new file mode 100644 index 00000000000..c11b528a14e --- /dev/null +++ b/integration-tests/deployment/clo/offchain_client_impl.go @@ -0,0 +1,213 @@ +package clo + +import ( + "context" + + "go.uber.org/zap" + "google.golang.org/grpc" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" + csav1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/csa/v1" + jobv1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/job/v1" + nodev1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/node/v1" +) + +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 new file mode 100644 index 00000000000..863da17ffa1 --- /dev/null +++ b/integration-tests/deployment/clo/offchain_client_impl_test.go @@ -0,0 +1,582 @@ +package clo_test + +import ( + "context" + "encoding/json" + "reflect" + "testing" + + "github.com/test-go/testify/require" + "google.golang.org/grpc" + + "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/clo/models" + nodev1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/node/v1" + "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/asset_nodes.json b/integration-tests/deployment/clo/testdata/asset_nodes.json new file mode 100644 index 00000000000..9c8c4e0fd03 --- /dev/null +++ b/integration-tests/deployment/clo/testdata/asset_nodes.json @@ -0,0 +1,978 @@ +[ + { + "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/clo/testdata/chain_writer_nodes.json b/integration-tests/deployment/clo/testdata/chain_writer_nodes.json new file mode 100644 index 00000000000..b89a012cd41 --- /dev/null +++ b/integration-tests/deployment/clo/testdata/chain_writer_nodes.json @@ -0,0 +1,1446 @@ +[ + { + "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/clo/testdata/keystone_nops.json b/integration-tests/deployment/clo/testdata/keystone_nops.json new file mode 100644 index 00000000000..679a85935a4 --- /dev/null +++ b/integration-tests/deployment/clo/testdata/keystone_nops.json @@ -0,0 +1,3162 @@ +[ + { + "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/clo/testdata/workflow_nodes.json b/integration-tests/deployment/clo/testdata/workflow_nodes.json new file mode 100644 index 00000000000..ade92a8d9f8 --- /dev/null +++ b/integration-tests/deployment/clo/testdata/workflow_nodes.json @@ -0,0 +1,886 @@ +[ + { + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "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" + } + ] + } + ], + "createdAt": "2024-08-14T20:42:49.446864Z" + } +] \ No newline at end of file diff --git a/integration-tests/deployment/environment.go b/integration-tests/deployment/environment.go index eb2ecca645a..163a29bf5b4 100644 --- a/integration-tests/deployment/environment.go +++ b/integration-tests/deployment/environment.go @@ -16,14 +16,15 @@ import ( chain_selectors "github.com/smartcontractkit/chain-selectors" types2 "github.com/smartcontractkit/libocr/offchainreporting2/types" types3 "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + "google.golang.org/grpc" csav1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/csa/v1" jobv1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/job/v1" nodev1 "github.com/smartcontractkit/chainlink/integration-tests/deployment/jd/node/v1" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" ) type OnchainClient interface { @@ -63,6 +64,9 @@ func (e Environment) AllChainSelectors() []uint64 { for sel := range e.Chains { selectors = append(selectors, sel) } + sort.Slice(selectors, func(i, j int) bool { + return selectors[i] < selectors[j] + }) return selectors } @@ -80,6 +84,9 @@ func (e Environment) AllChainSelectorsExcluding(excluding []uint64) []uint64 { } selectors = append(selectors, sel) } + sort.Slice(selectors, func(i, j int) bool { + return selectors[i] < selectors[j] + }) return selectors } @@ -194,9 +201,13 @@ func MustPeerIDFromString(s string) p2pkey.PeerID { return p } +type NodeChainConfigsLister interface { + ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNodeChainConfigsRequest, opts ...grpc.CallOption) (*nodev1.ListNodeChainConfigsResponse, error) +} + // Gathers all the node info through JD required to be able to set // OCR config for example. -func NodeInfo(nodeIDs []string, oc OffchainClient) (Nodes, error) { +func NodeInfo(nodeIDs []string, oc NodeChainConfigsLister) (Nodes, error) { var nodes []Node for _, nodeID := range nodeIDs { // TODO: Filter should accept multiple nodes diff --git a/integration-tests/deployment/keystone/README.md b/integration-tests/deployment/keystone/README.md new file mode 100644 index 00000000000..4d11a7b66da --- /dev/null +++ b/integration-tests/deployment/keystone/README.md @@ -0,0 +1,106 @@ +# Programmatic deployment of Keystone + +The current scope of this package is the ability to deploy and configure the Capability Registry, OCR3 and Forwarder contracts. + +It builds on the `Environment` abstraction introduced by `chainlink-deployments`. The concept of Environment is used delineate dev vs testnet vs prod. +A deployment injects the necessary configuration (eg simulated chain vs testnet chain) as appropriate via the `Environment` abstraction, and the +deployment implementation be agnostic to these details. + + +The entry point to the deployment is the `Deploy` func. The arguments to the this func are environment dependent, and vary from one deployment to another. + +``` +type DeployRequest struct { + RegistryChainSel uint64 + Env *deployment.Environment + + Dons []DonCapabilities // externally sourced based on the environment + OCR3Config *OracleConfigSource // TODO: probably should be a map of don to config; but currently we only have one wf don therefore one config +} + +type DeployResponse struct { + Changeset *deployment.ChangesetOutput + DonInfos map[string]capabilities_registry.CapabilitiesRegistryDONInfo +} + +func Deploy(ctx context.Context, lggr logger.Logger, req DeployRequest) (*DeployResponse, error) +``` + + +In order to make this all work we need a mapping what nodes run which capabilities, which nodes belong to what don, and ocr configuration for consensus. The first two are represented by `Dons, OCR3Config`, respectively. + +The mapping for nodes->capability is an external artifact that is declare in configuration for the given environment. The mapping between nodes and Dons is also configuration, however it is constrained by +real world data about the nodes themselves, such as the p2pkeys and so forth. + +For keystone, this constraint boils down to an integration point with CLO, which is the current system of record all Node/NOP metadata (as well the Jobs themselves). + +Therefore, in order to the system to work, we need to source data from CLO. + +# CLO integration + +The integration with CLO is contained `clo` package. It defines a minimal, keystone-specific, translation of the CLO data model to the new Job Distributor model. This is needed because the `Environment` abstraction relies on the JD data model and API (via `OffchainClient`). + +However, at the time of writing, it was not feasible to programmatically access the CLO API within our deployment (KS-454). + +For the time being, there are manual steps to obtain the metadata from CLO as described below. + +## Obtaining and parsing CLO data + +A real deployment requires real data from CLO. + +### Requirements +- clo access to [stage](https://feeds-manager.main.stage.cldev.sh/sign-in), [prod](https://feeds-manager.main.prod.cldev.sh/sign-in) (ask in #topic-keystone-clo and tag Joey Punzel) +- [clo cli](https://github.com/smartcontractkit/feeds-manager#chainlink-orchestrator-api-client) +- stage & prod configuration for the cli + + +As discussed above, CLO is the system that knows about nodes and node operators. One of our goals is to configure the registry contract with the nodes and nops. So we have to faithfully plumb the values in CLO to our deployment. + +For the time being, it is not possible to do this programmatically in golang.T he next best this is to us the existing clo cli to snapshot the relevant state in a consumable format. + +The state is represented in `clo/models/models*go`. Example data is in `clo/testdata/keystone_nops.json` + +First, ensure you can login to the CLO instances [stage](https://feeds-manager.main.stage.cldev.sh/sign-in), [prod](https://feeds-manager.main.prod.cldev.sh/sign-in) (ask in #topic-keystone-clo and tag Joey Punzel) + +Next, you need the clo cli: +See to build and install +https://github.com/smartcontractkit/feeds-manager#chainlink-orchestrator-api-client + +Now, you need config for stage and prod env, eg `~/.fmsclient/stage.yaml` and `~/.fmsclient/prod.yaml` + +`~/.fmsclient/prod.yaml` : +``` +EMAIL: "your.name@smartcontract.com" +PASSWORD: 'XXXredacted' +BASE_URL: "https://gql.feeds-manager.main.prod.cldev.sh" +``` +`~/.fmsclient/stage.yaml` +``` +EMAIL: "your.name@smartcontract.com" +PASSWORD: 'XXXredacted' +BASE_URL: "https://gql.feeds-manager.main.stage.cldev.sh" +``` + + + +Now run the cli to get *all* the node operators +``` +./bin/fmscli --config ~/.fmsclient/prod.yaml get nodeOperators > /some/file.json +``` + +The output of this will be a JSON serialization of `[]*models.NodeOperator` and should same from as the testdata `clo/testdata/keystone_nops.json` This test data was post filtered to only contain keystone node operators. + +In order to make the data in `/some/file` useful for a deployment, you need to filter to only contain `keystone` nodes. This can be heuristically with `CapabilityNodeSet` func. See the test in `clo/don_nodeset_test.go` for an example. + + +This filtered data, the map of don -> []capabilities is enough to fully specify the offchain data required for a deployment. + +See `deploy_test:Test_Deploy/memory_chains_clo_offchain` for an explicit example + +## Chain configuration + +All the tests use in memory chains with simulated backends. Real deployments are in `chainlink-deployment`, which load chain-specific configuration (such as rpc endpoints) to instantiate real chains. + + +## Jobs +Are not handled programmatically yet. They are managed manually in CLO with help from [RDD](https://github.com/smartcontractkit/reference-data-directory#workflows) \ No newline at end of file diff --git a/integration-tests/deployment/keystone/capability_definitions.go b/integration-tests/deployment/keystone/capability_definitions.go new file mode 100644 index 00000000000..61f129a939a --- /dev/null +++ b/integration-tests/deployment/keystone/capability_definitions.go @@ -0,0 +1,34 @@ +package keystone + +import kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + +// TODO: KS-457 configuration management for capabilities from external sources +var StreamTriggerCap = kcr.CapabilitiesRegistryCapability{ + LabelledName: "streams-trigger", + Version: "1.0.0", + CapabilityType: uint8(0), // trigger +} + +var WriteChainCap = kcr.CapabilitiesRegistryCapability{ + LabelledName: "write_ethereum-testnet-sepolia", + Version: "1.0.0", + CapabilityType: uint8(3), // target +} + +var OCR3Cap = kcr.CapabilitiesRegistryCapability{ + LabelledName: "offchain_reporting", + Version: "1.0.0", + CapabilityType: uint8(2), // consensus +} + +var DonToCapabilities = map[string][]kcr.CapabilitiesRegistryCapability{ + WFDonName: []kcr.CapabilitiesRegistryCapability{OCR3Cap}, + TargetDonName: []kcr.CapabilitiesRegistryCapability{WriteChainCap}, + StreamDonName: []kcr.CapabilitiesRegistryCapability{StreamTriggerCap}, +} + +var ( + WFDonName = "wf" + TargetDonName = "target" + StreamDonName = "streams" +) diff --git a/integration-tests/deployment/keystone/capability_registry_deployer.go b/integration-tests/deployment/keystone/capability_registry_deployer.go new file mode 100644 index 00000000000..cd4de63558c --- /dev/null +++ b/integration-tests/deployment/keystone/capability_registry_deployer.go @@ -0,0 +1,66 @@ +package keystone + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" +) + +type CapabilitiesRegistryDeployer struct { + lggr logger.Logger + contract *capabilities_registry.CapabilitiesRegistry +} + +var CapabilityRegistryTypeVersion = deployment.TypeAndVersion{ + Type: CapabilitiesRegistry, + Version: deployment.Version1_0_0, +} + +func (c *CapabilitiesRegistryDeployer) deploy(req deployRequest) (*deployResponse, error) { + est, err := estimateDeploymentGas(req.Chain.Client, capabilities_registry.CapabilitiesRegistryABI) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + c.lggr.Debugf("Capability registry estimated gas: %d", est) + + capabilitiesRegistryAddr, tx, capabilitiesRegistry, err := capabilities_registry.DeployCapabilitiesRegistry( + req.Chain.DeployerKey, + req.Chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to deploy CapabilitiesRegistry: %w", err) + } + + _, err = req.Chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm and save CapabilitiesRegistry: %w", err) + } + resp := &deployResponse{ + Address: capabilitiesRegistryAddr, + Tx: tx.Hash(), + Tv: CapabilityRegistryTypeVersion, + } + c.contract = capabilitiesRegistry + return resp, nil +} + +func estimateDeploymentGas(client deployment.OnchainClient, bytecode string) (uint64, error) { + // fake contract address required for gas estimation, otherwise it will fail + contractAddress := common.HexToAddress("0x0000000000000000000000000000000000000000") + + msg := ethereum.CallMsg{ + To: &contractAddress, // nil ok for + Gas: 0, // initial gas estimate (will be updated) + Data: []byte(bytecode), + } + gasEstimate, err := client.EstimateGas(context.Background(), msg) + if err != nil { + return 0, fmt.Errorf("failed to estimate gas: %w", err) + } + return gasEstimate, nil +} diff --git a/integration-tests/deployment/keystone/changeset/0001_deploy_registry.go b/integration-tests/deployment/keystone/changeset/0001_deploy_registry.go new file mode 100644 index 00000000000..887ef2de009 --- /dev/null +++ b/integration-tests/deployment/keystone/changeset/0001_deploy_registry.go @@ -0,0 +1,22 @@ +package changeset + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + kslib "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" +) + +func Apply0001(lggr logger.Logger, env deployment.Environment, ab deployment.AddressBook, registryChainSel uint64) (deployment.ChangesetOutput, error) { + c, ok := env.Chains[registryChainSel] + if !ok { + return deployment.ChangesetOutput{}, fmt.Errorf("chain not found in environment") + } + err := kslib.DeployCapabilitiesRegistry(lggr, c, ab) + + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy CapabilitiesRegistry: %w", err) + } + return deployment.ChangesetOutput{AddressBook: ab}, nil +} diff --git a/integration-tests/deployment/keystone/changeset/0001_deploy_registry_test.go b/integration-tests/deployment/keystone/changeset/0001_deploy_registry_test.go new file mode 100644 index 00000000000..8aca7c09105 --- /dev/null +++ b/integration-tests/deployment/keystone/changeset/0001_deploy_registry_test.go @@ -0,0 +1,40 @@ +package changeset_test + +import ( + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone/changeset" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/memory" +) + +func TestApply0001(t *testing.T) { + t.Parallel() + lggr := logger.Test(t) + ab := deployment.NewMemoryAddressBook() + cfg := memory.MemoryEnvironmentConfig{ + Nodes: 1, + Chains: 2, + } + env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) + + registrySel := env.AllChainSelectors()[0] + resp, err := changeset.Apply0001(lggr, env, ab, registrySel) + require.NoError(t, err) + require.NotNil(t, resp) + // capabilities registry should be deployed on chain 0 + addrs, err := resp.AddressBook.AddressesForChain(registrySel) + require.NoError(t, err) + require.Len(t, addrs, 1) + + // no capabilities registry on chain 1 + require.NotEqual(t, registrySel, env.AllChainSelectors()[1]) + oaddrs, _ := resp.AddressBook.AddressesForChain(env.AllChainSelectors()[1]) + require.Len(t, oaddrs, 0) + +} diff --git a/integration-tests/deployment/keystone/changeset/0002_deploy_ocr3.go b/integration-tests/deployment/keystone/changeset/0002_deploy_ocr3.go new file mode 100644 index 00000000000..aa106f0a8fb --- /dev/null +++ b/integration-tests/deployment/keystone/changeset/0002_deploy_ocr3.go @@ -0,0 +1,40 @@ +package changeset + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + kslib "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" +) + +func Apply0002(lggr logger.Logger, env deployment.Environment, ab deployment.AddressBook, registryChainSel uint64) (deployment.ChangesetOutput, error) { + // must have capabilities registry deployed + regAddrs, err := ab.AddressesForChain(registryChainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("no addresses found for chain %d: %w", registryChainSel, err) + } + found := false + for _, addr := range regAddrs { + if addr.Type == kslib.CapabilityRegistryTypeVersion.Type { + found = true + break + } + } + if !found { + return deployment.ChangesetOutput{}, fmt.Errorf("no capabilities registry found for changeset %s", "0001_deploy_registry") + } + + // ocr3 only deployed on registry chain + c, ok := env.Chains[registryChainSel] + if !ok { + return deployment.ChangesetOutput{}, fmt.Errorf("chain not found in environment") + } + err = kslib.DeployOCR3(lggr, c, ab) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy OCR3Capability: %w", err) + } + + return deployment.ChangesetOutput{AddressBook: ab}, nil + +} diff --git a/integration-tests/deployment/keystone/changeset/0002_deploy_ocr3_test.go b/integration-tests/deployment/keystone/changeset/0002_deploy_ocr3_test.go new file mode 100644 index 00000000000..f985258b3c6 --- /dev/null +++ b/integration-tests/deployment/keystone/changeset/0002_deploy_ocr3_test.go @@ -0,0 +1,48 @@ +package changeset_test + +import ( + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + kslb "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone/changeset" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/memory" +) + +func TestApply0002(t *testing.T) { + t.Parallel() + lggr := logger.Test(t) + ab := deployment.NewMemoryAddressBook() + cfg := memory.MemoryEnvironmentConfig{ + Nodes: 1, // nodes unused but required in config + Chains: 2, + } + env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) + + registrySel := env.AllChainSelectors()[0] + // err if no capabilities registry on chain 0 + _, err := changeset.Apply0002(lggr, env, ab, registrySel) + require.Error(t, err) + + // fake capabilities registry + err = ab.Save(registrySel, "0x0000000000000000000000000000000000000001", kslb.CapabilityRegistryTypeVersion) + require.NoError(t, err) + resp, err := changeset.Apply0002(lggr, env, ab, registrySel) + require.NoError(t, err) + require.NotNil(t, resp) + // OCR3 should be deployed on chain 0 + addrs, err := resp.AddressBook.AddressesForChain(registrySel) + require.NoError(t, err) + require.Len(t, addrs, 2) + + // nothing on chain 1 + require.NotEqual(t, registrySel, env.AllChainSelectors()[1]) + oaddrs, _ := resp.AddressBook.AddressesForChain(env.AllChainSelectors()[1]) + assert.Len(t, oaddrs, 0) +} diff --git a/integration-tests/deployment/keystone/changeset/0003_deploy_forwarder.go b/integration-tests/deployment/keystone/changeset/0003_deploy_forwarder.go new file mode 100644 index 00000000000..adb71dc97f3 --- /dev/null +++ b/integration-tests/deployment/keystone/changeset/0003_deploy_forwarder.go @@ -0,0 +1,30 @@ +package changeset + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + kslib "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" +) + +func Apply0003(lggr logger.Logger, env deployment.Environment, ab deployment.AddressBook, registryChainSel uint64) (deployment.ChangesetOutput, error) { + + // expect OCR3 to be deployed & capabilities registry + regAddrs, err := ab.AddressesForChain(registryChainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("no addresses found for chain %d: %w", registryChainSel, err) + } + if len(regAddrs) != 2 { + return deployment.ChangesetOutput{}, fmt.Errorf("expected 2 addresses for chain %d, got %d", registryChainSel, len(regAddrs)) + } + for _, c := range env.Chains { + lggr.Infow("deploying forwarder", "chainSelector", c.Selector) + err := kslib.DeployForwarder(lggr, c, ab) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy KeystoneForwarder to chain selector %d: %w", c.Selector, err) + } + } + + return deployment.ChangesetOutput{AddressBook: ab}, nil +} diff --git a/integration-tests/deployment/keystone/changeset/0003_deploy_forwarder_test.go b/integration-tests/deployment/keystone/changeset/0003_deploy_forwarder_test.go new file mode 100644 index 00000000000..4814698acd9 --- /dev/null +++ b/integration-tests/deployment/keystone/changeset/0003_deploy_forwarder_test.go @@ -0,0 +1,76 @@ +package changeset_test + +import ( + "testing" + + "go.uber.org/zap/zapcore" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + kslb "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone/changeset" + "github.com/smartcontractkit/chainlink/integration-tests/deployment/memory" +) + +func TestApply0003(t *testing.T) { + t.Parallel() + + lggr := logger.Test(t) + cfg := memory.MemoryEnvironmentConfig{ + Nodes: 1, // nodes unused but required in config + Chains: 2, + } + env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) + + registrySel := env.AllChainSelectors()[0] + t.Run("err if no capabilities registry on registry chain", func(t *testing.T) { + ab := deployment.NewMemoryAddressBook() + m := make(map[uint64]map[string]deployment.TypeAndVersion) + m[registrySel] = map[string]deployment.TypeAndVersion{ + "0x0000000000000000000000000000000000000002": kslb.OCR3CapabilityTypeVersion, + } + deployment.NewMemoryAddressBookFromMap(m) + // capabilities registry and ocr3 must be deployed on registry chain + _, err := changeset.Apply0003(lggr, env, ab, registrySel) + require.Error(t, err) + }) + + t.Run("err if no ocr3 on registry chain", func(t *testing.T) { + ab := deployment.NewMemoryAddressBook() + m := make(map[uint64]map[string]deployment.TypeAndVersion) + m[registrySel] = map[string]deployment.TypeAndVersion{ + "0x0000000000000000000000000000000000000001": kslb.CapabilityRegistryTypeVersion, + } + deployment.NewMemoryAddressBookFromMap(m) + // capabilities registry and ocr3 must be deployed on registry chain + _, err := changeset.Apply0003(lggr, env, ab, registrySel) + require.Error(t, err) + }) + + t.Run("should deploy forwarder", func(t *testing.T) { + ab := deployment.NewMemoryAddressBook() + // fake capabilities registry + err := ab.Save(registrySel, "0x0000000000000000000000000000000000000001", kslb.CapabilityRegistryTypeVersion) + require.NoError(t, err) + + // fake ocr3 + err = ab.Save(registrySel, "0x0000000000000000000000000000000000000002", kslb.OCR3CapabilityTypeVersion) + require.NoError(t, err) + // deploy forwarder + resp, err := changeset.Apply0003(lggr, env, ab, registrySel) + require.NoError(t, err) + require.NotNil(t, resp) + // registry, ocr3, forwarder should be deployed on registry chain + addrs, err := resp.AddressBook.AddressesForChain(registrySel) + require.NoError(t, err) + require.Len(t, addrs, 3) + + // only forwarder on chain 1 + require.NotEqual(t, registrySel, env.AllChainSelectors()[1]) + oaddrs, err := resp.AddressBook.AddressesForChain(env.AllChainSelectors()[1]) + require.NoError(t, err) + require.Len(t, oaddrs, 1) + }) +} diff --git a/integration-tests/deployment/keystone/changeset/0004_configure_contracts.go b/integration-tests/deployment/keystone/changeset/0004_configure_contracts.go new file mode 100644 index 00000000000..3db0be0a666 --- /dev/null +++ b/integration-tests/deployment/keystone/changeset/0004_configure_contracts.go @@ -0,0 +1,62 @@ +package changeset + +import ( + "context" + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + kslib "github.com/smartcontractkit/chainlink/integration-tests/deployment/keystone" +) + +// func Apply0004(lggr logger.Logger, env deployment.Environment, ab deployment.AddressBook, registryChainSel uint64) (deployment.ChangesetOutput, error) { +func Apply0004(lggr logger.Logger, req *kslib.ConfigureContractsRequest) (deployment.ChangesetOutput, error) { + if err := req.Validate(); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to validate request: %w", err) + } + + regAddrs, err := req.AddressBook.AddressesForChain(req.RegistryChainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("no addresses found for chain %d: %w", req.RegistryChainSel, err) + } + foundRegistry := false + foundOCR3 := false + foundForwarder := false + for _, addr := range regAddrs { + switch addr.Type { + case kslib.CapabilityRegistryTypeVersion.Type: + foundRegistry = true + case kslib.OCR3CapabilityTypeVersion.Type: + foundOCR3 = true + case kslib.ForwarderTypeVersion.Type: + foundForwarder = true + } + } + if !foundRegistry || !foundOCR3 || !foundForwarder { + return deployment.ChangesetOutput{}, fmt.Errorf("missing contracts on registry chain %d in addressbook for changeset %s registry exists %t, ocr3 exist %t, forwarder exists %t ", req.RegistryChainSel, "0003_deploy_forwarder", + foundRegistry, foundOCR3, foundForwarder) + } + // forwarder on all chains + foundForwarder = false + for _, c := range req.Env.Chains { + addrs, err2 := req.AddressBook.AddressesForChain(c.Selector) + if err2 != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("no addresses found for chain %d: %w", c.Selector, err2) + } + for _, addr := range addrs { + if addr.Type == kslib.ForwarderTypeVersion.Type { + foundForwarder = true + break + } + } + if !foundForwarder { + return deployment.ChangesetOutput{}, fmt.Errorf("no forwarder found for chain %d", c.Selector) + } + } + + resp, err := kslib.ConfigureContracts(context.TODO(), lggr, *req) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to configure contracts: %w", err) + } + return *resp.Changeset, nil +} diff --git a/integration-tests/deployment/keystone/contract_set.go b/integration-tests/deployment/keystone/contract_set.go new file mode 100644 index 00000000000..d82532614ae --- /dev/null +++ b/integration-tests/deployment/keystone/contract_set.go @@ -0,0 +1,93 @@ +package keystone + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" +) + +type deployContractsRequest struct { + chain deployment.Chain + isRegistryChain bool + ad deployment.AddressBook +} + +type deployContractSetResponse struct { + deployment.AddressBook +} + +func deployContractsToChain(lggr logger.Logger, req deployContractsRequest) (*deployContractSetResponse, error) { + if req.ad == nil { + req.ad = deployment.NewMemoryAddressBook() + } + // this is mutated in the Deploy* functions + resp := &deployContractSetResponse{ + AddressBook: req.ad, + } + + // cap reg and ocr3 only deployed on registry chain + if req.isRegistryChain { + err := DeployCapabilitiesRegistry(lggr, req.chain, resp.AddressBook) + if err != nil { + return nil, fmt.Errorf("failed to deploy CapabilitiesRegistry: %w", err) + } + err = DeployOCR3(lggr, req.chain, resp.AddressBook) + if err != nil { + return nil, fmt.Errorf("failed to deploy OCR3Capability: %w", err) + } + } + err := DeployForwarder(lggr, req.chain, resp.AddressBook) + if err != nil { + return nil, fmt.Errorf("failed to deploy KeystoneForwarder: %w", err) + } + return resp, nil +} + +// DeployCapabilitiesRegistry deploys the CapabilitiesRegistry contract to the chain +// and saves the address in the address book. This mutates the address book. +func DeployCapabilitiesRegistry(lggr logger.Logger, chain deployment.Chain, ab deployment.AddressBook) error { + capabilitiesRegistryDeployer := CapabilitiesRegistryDeployer{lggr: lggr} + capabilitiesRegistryResp, err := capabilitiesRegistryDeployer.deploy(deployRequest{Chain: chain}) + if err != nil { + return fmt.Errorf("failed to deploy CapabilitiesRegistry: %w", err) + } + err = ab.Save(chain.Selector, capabilitiesRegistryResp.Address.String(), capabilitiesRegistryResp.Tv) + if err != nil { + return fmt.Errorf("failed to save CapabilitiesRegistry: %w", err) + } + lggr.Infof("Deployed %s chain selector %d addr %s", CapabilityRegistryTypeVersion.String(), chain.Selector, capabilitiesRegistryResp.Address.String()) + return nil +} + +// DeployOCR3 deploys the OCR3Capability contract to the chain +// and saves the address in the address book. This mutates the address book. +func DeployOCR3(lggr logger.Logger, chain deployment.Chain, ab deployment.AddressBook) error { + ocr3Deployer := OCR3Deployer{lggr: lggr} + ocr3Resp, err := ocr3Deployer.deploy(deployRequest{Chain: chain}) + if err != nil { + return fmt.Errorf("failed to deploy OCR3Capability: %w", err) + } + err = ab.Save(chain.Selector, ocr3Resp.Address.String(), ocr3Resp.Tv) + if err != nil { + return fmt.Errorf("failed to save OCR3Capability: %w", err) + } + lggr.Infof("Deployed %s chain selector %d addr %s", ocr3Resp.Tv.String(), chain.Selector, ocr3Resp.Address.String()) + return nil +} + +// DeployForwarder deploys the KeystoneForwarder contract to the chain +// and saves the address in the address book. This mutates the address book. +func DeployForwarder(lggr logger.Logger, chain deployment.Chain, ab deployment.AddressBook) error { + forwarderDeployer := KeystoneForwarderDeployer{lggr: lggr} + forwarderResp, err := forwarderDeployer.deploy(deployRequest{Chain: chain}) + if err != nil { + return fmt.Errorf("failed to deploy KeystoneForwarder: %w", err) + } + err = ab.Save(chain.Selector, forwarderResp.Address.String(), forwarderResp.Tv) + if err != nil { + return fmt.Errorf("failed to save KeystoneForwarder: %w", err) + } + lggr.Infof("Deployed %s chain selector %d addr %s", forwarderResp.Tv.String(), chain.Selector, forwarderResp.Address.String()) + return nil +} diff --git a/integration-tests/deployment/keystone/deploy.go b/integration-tests/deployment/keystone/deploy.go new file mode 100644 index 00000000000..e108bc6ba4e --- /dev/null +++ b/integration-tests/deployment/keystone/deploy.go @@ -0,0 +1,799 @@ +package keystone + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "sort" + "strings" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/rpc" + + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/durationpb" + + chainsel "github.com/smartcontractkit/chain-selectors" + + capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" + "github.com/smartcontractkit/chainlink-common/pkg/values" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + kf "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder" + kocr3 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" +) + +type ConfigureContractsRequest struct { + RegistryChainSel uint64 + Env *deployment.Environment + + Dons []DonCapabilities // externally sourced based on the environment + OCR3Config *OracleConfigSource // TODO: probably should be a map of don to config; but currently we only have one wf don therefore one config + + AddressBook deployment.AddressBook + DoContractDeploy bool // if false, the contracts are assumed to be deployed and the address book is used +} + +func (r ConfigureContractsRequest) Validate() error { + if r.OCR3Config == nil { + return errors.New("OCR3Config is nil") + } + if r.Env == nil { + return errors.New("environment is nil") + } + if r.AddressBook == nil { + return errors.New("address book is nil") + } + if len(r.Dons) == 0 { + return errors.New("no DONS") + } + _, ok := chainsel.ChainBySelector(r.RegistryChainSel) + if !ok { + return fmt.Errorf("chain %d not found in environment", r.RegistryChainSel) + } + return nil +} + +type ConfigureContractsResponse struct { + Changeset *deployment.ChangesetOutput + DonInfos map[string]capabilities_registry.CapabilitiesRegistryDONInfo +} + +// ConfigureContracts configures contracts them with the given DONS and their capabilities. It optionally deploys the contracts +// but best practice is to deploy them separately and pass the address book in the request +func ConfigureContracts(ctx context.Context, lggr logger.Logger, req ConfigureContractsRequest) (*ConfigureContractsResponse, error) { + if err := req.Validate(); err != nil { + return nil, fmt.Errorf("invalid request: %w", err) + } + + addrBook := req.AddressBook + if req.DoContractDeploy { + contractDeployCS, err := DeployContracts(lggr, req.Env, req.RegistryChainSel) + if err != nil { + return nil, fmt.Errorf("failed to deploy contracts: %w", err) + } + addrBook = contractDeployCS.AddressBook + } else { + lggr.Debug("skipping contract deployment") + } + if addrBook == nil { + return nil, errors.New("address book is nil") + } + + cfgRegistryResp, err := ConfigureRegistry(ctx, lggr, req, addrBook) + if err != nil { + return nil, fmt.Errorf("failed to configure registry: %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) + if err != nil { + return nil, fmt.Errorf("failed to assimilate registry to Dons: %w", err) + } + err = ConfigureForwardContracts(req.Env, dons, addrBook) + if err != nil { + return nil, fmt.Errorf("failed to configure forwarder contracts: %w", err) + } + + err = ConfigureOCR3Contract(req.Env, req.RegistryChainSel, dons, addrBook, req.OCR3Config) + if err != nil { + return nil, fmt.Errorf("failed to configure OCR3 contract: %w", err) + } + + return &ConfigureContractsResponse{ + Changeset: &deployment.ChangesetOutput{ + AddressBook: addrBook, + }, + DonInfos: cfgRegistryResp.DonInfos, + }, nil +} + +// DeployContracts deploys the all the keystone contracts on all chains and returns the address book in the changeset +func DeployContracts(lggr logger.Logger, e *deployment.Environment, chainSel uint64) (*deployment.ChangesetOutput, error) { + adbook := deployment.NewMemoryAddressBook() + // deploy contracts on all chains and track the registry and ocr3 contracts + for _, chain := range e.Chains { + lggr.Infow("deploying contracts", "chain", chain.Selector) + deployResp, err := deployContractsToChain(lggr, deployContractsRequest{ + chain: chain, + isRegistryChain: chain.Selector == chainSel, + }, + ) + if err != nil { + return nil, fmt.Errorf("failed to deploy contracts: %w", err) + } + err = adbook.Merge(deployResp.AddressBook) + if err != nil { + return nil, fmt.Errorf("failed to merge address book: %w", err) + } + } + return &deployment.ChangesetOutput{ + AddressBook: adbook, + }, 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) { + registryChain, ok := req.Env.Chains[req.RegistryChainSel] + if !ok { + return nil, fmt.Errorf("chain %d not found in environment", req.RegistryChainSel) + } + + contractSetsResp, err := GetContractSets(&GetContractSetsRequest{ + Chains: req.Env.Chains, + AddressBook: addrBook, + }) + if err != nil { + return nil, fmt.Errorf("failed to get contract sets: %w", err) + } + + // ensure registry is deployed and get the registry contract and chain + var registry *capabilities_registry.CapabilitiesRegistry + registryChainContracts, ok := contractSetsResp.ContractSets[req.RegistryChainSel] + if !ok { + return nil, fmt.Errorf("failed to deploy registry chain contracts. expected chain %d", req.RegistryChainSel) + } + registry = registryChainContracts.CapabilitiesRegistry + if registry == nil { + return nil, fmt.Errorf("no registry contract found") + } + lggr.Debugf("registry contract address: %s, chain %d", registry.Address().String(), req.RegistryChainSel) + + // 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) + 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) + if err != nil { + return nil, fmt.Errorf("failed to map nodes to nops: %w", err) + } + + // register capabilities + capabilitiesResp, err := registerCapabilities(lggr, registerCapabilitiesRequest{ + chain: registryChain, + registry: registry, + donToCapabilities: donToCapabilities, + }) + if err != nil { + return nil, fmt.Errorf("failed to register capabilities: %w", err) + } + lggr.Infow("registered capabilities", "capabilities", capabilitiesResp.donToCapabilities) + + // register node operators + var nops []capabilities_registry.CapabilitiesRegistryNodeOperator + for _, nop := range nodeIdToNop { + nops = append(nops, nop) + } + nopsResp, err := registerNOPS(ctx, registerNOPSRequest{ + chain: registryChain, + registry: registry, + nops: nops, + }) + if err != nil { + return nil, fmt.Errorf("failed to register node operators: %w", err) + } + lggr.Infow("registered node operators", "nops", nopsResp.nops) + + // register nodes + nodesResp, err := registerNodes(lggr, ®isterNodesRequest{ + registry: registry, + chain: registryChain, + nodeIdToNop: nodeIdToNop, + donToOcr2Nodes: donToOcr2Nodes, + donToCapabilities: capabilitiesResp.donToCapabilities, + nops: nopsResp.nops, + }) + if err != nil { + return nil, fmt.Errorf("failed to register nodes: %w", err) + } + lggr.Infow("registered nodes", "nodes", nodesResp.nodeIDToParams) + + // register DONS + donsResp, err := registerDons(lggr, registerDonsRequest{ + registry: registry, + chain: registryChain, + nodeIDToParams: nodesResp.nodeIDToParams, + donToCapabilities: capabilitiesResp.donToCapabilities, + donToOcr2Nodes: donToOcr2Nodes, + }) + if err != nil { + return nil, fmt.Errorf("failed to register DONS: %w", err) + } + lggr.Infow("registered DONS", "dons", len(donsResp.donInfos)) + + return &ConfigureContractsResponse{ + Changeset: &deployment.ChangesetOutput{ + AddressBook: addrBook, + }, + DonInfos: donsResp.donInfos, + }, nil +} + +// ConfigureForwardContracts configures the forwarder contracts on all chains for the given DONS +// the address book is required to contain the an address of the deployed forwarder contract for every chain in the environment +func ConfigureForwardContracts(env *deployment.Environment, dons []RegisteredDon, addrBook deployment.AddressBook) error { + contractSetsResp, err := GetContractSets(&GetContractSetsRequest{ + Chains: env.Chains, + AddressBook: addrBook, + }) + if err != nil { + return fmt.Errorf("failed to get contract sets: %w", err) + } + + // configure forwarders on all chains + for _, chain := range env.Chains { + // get the forwarder contract for the chain + contracts, ok := contractSetsResp.ContractSets[chain.Selector] + if !ok { + return fmt.Errorf("failed to get contract set for chain %d", chain.Selector) + } + fwrd := contracts.Forwarder + if fwrd == nil { + return fmt.Errorf("no forwarder contract found for chain %d", chain.Selector) + } + + err := configureForwarder(chain, fwrd, dons) + if err != nil { + return fmt.Errorf("failed to configure forwarder for chain selector %d: %w", chain.Selector, err) + } + } + return nil +} + +// ocr3 contract on the registry chain for the wf dons +func ConfigureOCR3Contract(env *deployment.Environment, chainSel uint64, dons []RegisteredDon, addrBook deployment.AddressBook, cfg *OracleConfigSource) error { + registryChain, ok := env.Chains[chainSel] + if !ok { + return fmt.Errorf("chain %d not found in environment", chainSel) + } + + contractSetsResp, err := GetContractSets(&GetContractSetsRequest{ + Chains: env.Chains, + AddressBook: addrBook, + }) + if err != nil { + return fmt.Errorf("failed to get contract sets: %w", err) + } + + for _, don := range dons { + if !don.Info.AcceptsWorkflows { + continue + } + // only on the registry chain + contracts, ok := contractSetsResp.ContractSets[chainSel] + if !ok { + return fmt.Errorf("failed to get contract set for chain %d", chainSel) + } + contract := contracts.OCR3 + if contract == nil { + return fmt.Errorf("no forwarder contract found for chain %d", chainSel) + } + + _, err := configureOCR3contract(configureOCR3Request{ + cfg: cfg, + chain: registryChain, + contract: contract, + don: don, + }) + if err != nil { + return fmt.Errorf("failed to configure OCR3 contract for don %s: %w", don.Name, err) + } + } + return nil +} + +type registerCapabilitiesRequest struct { + chain deployment.Chain + registry *capabilities_registry.CapabilitiesRegistry + donToCapabilities map[string][]kcr.CapabilitiesRegistryCapability +} + +type registerCapabilitiesResponse struct { + donToCapabilities map[string][]registeredCapability +} + +type registeredCapability struct { + capabilities_registry.CapabilitiesRegistryCapability + id [32]byte +} + +// registerCapabilities add computes the capability id, adds it to the registry and associates the registered capabilities with appropriate don(s) +func registerCapabilities(lggr logger.Logger, req registerCapabilitiesRequest) (*registerCapabilitiesResponse, error) { + if len(req.donToCapabilities) == 0 { + return nil, fmt.Errorf("no capabilities to register") + } + resp := ®isterCapabilitiesResponse{ + donToCapabilities: make(map[string][]registeredCapability), + } + + // capability could be hosted on multiple dons. need to deduplicate + uniqueCaps := make(map[kcr.CapabilitiesRegistryCapability][32]byte) + for don, caps := range req.donToCapabilities { + var registerCaps []registeredCapability + for _, cap := range caps { + id, ok := uniqueCaps[cap] + if !ok { + var err error + id, err = req.registry.GetHashedCapabilityId(&bind.CallOpts{}, cap.LabelledName, cap.Version) + if err != nil { + return nil, fmt.Errorf("failed to call GetHashedCapabilityId for capability %v: %w", cap, err) + } + uniqueCaps[cap] = id + } + registerCap := registeredCapability{ + CapabilitiesRegistryCapability: cap, + id: id, + } + lggr.Debugw("hashed capability id", "capability", cap, "id", id) + registerCaps = append(registerCaps, registerCap) + } + resp.donToCapabilities[don] = registerCaps + } + + var capabilities []kcr.CapabilitiesRegistryCapability + for cap := range uniqueCaps { + capabilities = append(capabilities, cap) + } + + tx, err := req.registry.AddCapabilities(req.chain.DeployerKey, capabilities) + if err != nil { + err = DecodeErr(kcr.CapabilitiesRegistryABI, err) + // no typed errors in the abi, so we have to do string matching + // try to add all capabilities in one go, if that fails, fall back to 1-by-1 + if !strings.Contains(err.Error(), "CapabilityAlreadyExists") { + return nil, fmt.Errorf("failed to call AddCapabilities: %w", err) + } + lggr.Warnw("capabilities already exist, falling back to 1-by-1", "capabilities", capabilities) + for _, cap := range capabilities { + tx, err = req.registry.AddCapabilities(req.chain.DeployerKey, []kcr.CapabilitiesRegistryCapability{cap}) + if err != nil { + err = DecodeErr(kcr.CapabilitiesRegistryABI, err) + if strings.Contains(err.Error(), "CapabilityAlreadyExists") { + lggr.Warnw("capability already exists, skipping", "capability", cap) + continue + } + return nil, fmt.Errorf("failed to call AddCapabilities for capability %v: %w", cap, err) + } + // 1-by-1 tx is pending and we need to wait for it to be mined + _, err = req.chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm AddCapabilities confirm transaction %s: %w", tx.Hash().String(), err) + } + lggr.Debugw("registered capability", "capability", cap) + + } + } else { + // the bulk add tx is pending and we need to wait for it to be mined + _, err = req.chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm AddCapabilities confirm transaction %s: %w", tx.Hash().String(), err) + } + lggr.Info("registered capabilities", "capabilities", capabilities) + } + return resp, nil +} + +type registerNOPSRequest struct { + chain deployment.Chain + registry *capabilities_registry.CapabilitiesRegistry + nops []capabilities_registry.CapabilitiesRegistryNodeOperator +} + +type registerNOPSResponse struct { + nops []*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded +} + +func registerNOPS(ctx context.Context, req registerNOPSRequest) (*registerNOPSResponse, error) { + nops := req.nops + tx, err := req.registry.AddNodeOperators(req.chain.DeployerKey, nops) + if err != nil { + err = DecodeErr(kcr.CapabilitiesRegistryABI, err) + return nil, fmt.Errorf("failed to call AddNodeOperators: %w", err) + } + // for some reason that i don't understand, the confirm must be called before the WaitMined or the latter will hang + // (at least for a simulated backend chain) + _, err = req.chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm AddNodeOperators confirm transaction %s: %w", tx.Hash().String(), err) + } + + receipt, err := bind.WaitMined(ctx, req.chain.Client, tx) + if err != nil { + return nil, fmt.Errorf("failed to mine AddNodeOperators confirm transaction %s: %w", tx.Hash().String(), err) + } + if len(receipt.Logs) != len(nops) { + return nil, fmt.Errorf("expected %d log entries for AddNodeOperators, got %d", len(nops), len(receipt.Logs)) + } + resp := ®isterNOPSResponse{ + nops: make([]*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded, len(receipt.Logs)), + } + for i, log := range receipt.Logs { + o, err := req.registry.ParseNodeOperatorAdded(*log) + if err != nil { + return nil, fmt.Errorf("failed to parse log %d for operator added: %w", i, err) + } + resp.nops[i] = o + } + + return resp, nil +} + +func defaultCapConfig(capType uint8, nNodes int) *capabilitiespb.CapabilityConfig { + switch capType { + // TODO: use the enum defined in ?? + case uint8(0): // trigger + return &capabilitiespb.CapabilityConfig{ + DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(), + RemoteConfig: &capabilitiespb.CapabilityConfig_RemoteTriggerConfig{ + RemoteTriggerConfig: &capabilitiespb.RemoteTriggerConfig{ + RegistrationRefresh: durationpb.New(20 * time.Second), + RegistrationExpiry: durationpb.New(60 * time.Second), + // F + 1; assuming n = 3f+1 + MinResponsesToAggregate: uint32(nNodes/3) + 1, + }, + }, + } + case uint8(2): // consensus + return &capabilitiespb.CapabilityConfig{ + DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(), + } + case uint8(3): // target + return &capabilitiespb.CapabilityConfig{ + DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(), + RemoteConfig: &capabilitiespb.CapabilityConfig_RemoteTargetConfig{ + RemoteTargetConfig: &capabilitiespb.RemoteTargetConfig{ + RequestHashExcludedAttributes: []string{"signed_report.Signatures"}, // TODO: const defn in a common place + }, + }, + } + default: + return &capabilitiespb.CapabilityConfig{ + DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(), + } + } +} + +func DecodeErr(encodedABI string, err error) error { + if err == nil { + return nil + } + + //revive:disable + var d rpc.DataError + ok := errors.As(err, &d) + if ok { + errStr, parseErr := deployment.ParseErrorFromABI(d.ErrorData().(string), encodedABI) + if parseErr != nil { + return fmt.Errorf("failed to decode error with abi: %w", parseErr) + } + return fmt.Errorf("contract error: %s", errStr) + } + return fmt.Errorf("cannot decode error with abi: %w", err) +} + +// register nodes +type registerNodesRequest struct { + registry *capabilities_registry.CapabilitiesRegistry + chain deployment.Chain + nodeIdToNop map[string]capabilities_registry.CapabilitiesRegistryNodeOperator + donToOcr2Nodes map[string][]*ocr2Node + donToCapabilities map[string][]registeredCapability + nops []*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded +} +type registerNodesResponse struct { + nodeIDToParams map[string]capabilities_registry.CapabilitiesRegistryNodeParams +} + +// registerNodes registers the nodes with the registry. it assumes that the deployer key in the Chain +// can sign the transactions update the contract state +// TODO: 467 refactor to support MCMS. Specifically need to separate the call data generation from the actual contract call +func registerNodes(lggr logger.Logger, req *registerNodesRequest) (*registerNodesResponse, error) { + nopToNodeIDs := make(map[capabilities_registry.CapabilitiesRegistryNodeOperator][]string) + for nodeID, nop := range req.nodeIdToNop { + if _, ok := nopToNodeIDs[nop]; !ok { + nopToNodeIDs[nop] = make([]string, 0) + } + nopToNodeIDs[nop] = append(nopToNodeIDs[nop], nodeID) + } + nodeToRegisterNop := make(map[string]*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded) + for _, nop := range req.nops { + n := capabilities_registry.CapabilitiesRegistryNodeOperator{ + Name: nop.Name, + Admin: nop.Admin, + } + nodeIDs := nopToNodeIDs[n] + for _, nodeID := range nodeIDs { + _, exists := nodeToRegisterNop[nodeID] + if !exists { + nodeToRegisterNop[nodeID] = nop + } + } + } + + nodeIDToParams := make(map[string]capabilities_registry.CapabilitiesRegistryNodeParams) + for don, ocr2nodes := range req.donToOcr2Nodes { + caps, ok := req.donToCapabilities[don] + if !ok { + return nil, fmt.Errorf("capabilities not found for node operator %s", don) + } + var hashedCapabilityIds [][32]byte + for _, cap := range caps { + hashedCapabilityIds = append(hashedCapabilityIds, cap.id) + } + lggr.Debugw("hashed capability ids", "don", don, "ids", hashedCapabilityIds) + + for _, n := range ocr2nodes { + if n.IsBoostrap { // bootstraps are part of the DON but don't host capabilities + continue + } + nop, ok := nodeToRegisterNop[n.ID] + if !ok { + return nil, fmt.Errorf("node operator not found for node %s", n.ID) + } + params, ok := nodeIDToParams[n.ID] + + if !ok { + params = capabilities_registry.CapabilitiesRegistryNodeParams{ + NodeOperatorId: nop.NodeOperatorId, + Signer: n.Signer, + P2pId: n.P2PKey, + HashedCapabilityIds: hashedCapabilityIds, + } + } else { + // when we have a node operator, we need to dedup capabilities against the existing ones + var newCapIds [][32]byte + for _, proposedCapId := range hashedCapabilityIds { + shouldAdd := true + for _, existingCapId := range params.HashedCapabilityIds { + if existingCapId == proposedCapId { + shouldAdd = false + break + } + } + if shouldAdd { + newCapIds = append(newCapIds, proposedCapId) + } + } + params.HashedCapabilityIds = append(params.HashedCapabilityIds, newCapIds...) + } + nodeIDToParams[n.ID] = params + } + } + + var uniqueNodeParams []capabilities_registry.CapabilitiesRegistryNodeParams + for _, v := range nodeIDToParams { + uniqueNodeParams = append(uniqueNodeParams, v) + } + lggr.Debugw("unique node params to add", "count", len(uniqueNodeParams)) + tx, err := req.registry.AddNodes(req.chain.DeployerKey, uniqueNodeParams) + if err != nil { + err = DecodeErr(kcr.CapabilitiesRegistryABI, err) + // no typed errors in the abi, so we have to do string matching + // try to add all nodes in one go, if that fails, fall back to 1-by-1 + if !strings.Contains(err.Error(), "NodeAlreadyExists") { + return nil, fmt.Errorf("failed to call AddNodes for bulk add nodes: %w", err) + } + lggr.Warn("nodes already exist, falling back to 1-by-1") + for _, singleNodeParams := range uniqueNodeParams { + tx, err = req.registry.AddNodes(req.chain.DeployerKey, []capabilities_registry.CapabilitiesRegistryNodeParams{singleNodeParams}) + if err != nil { + err = DecodeErr(kcr.CapabilitiesRegistryABI, err) + if strings.Contains(err.Error(), "NodeAlreadyExists") { + lggr.Warnw("node already exists, skipping", "p2pid", singleNodeParams.P2pId) + continue + } + return nil, fmt.Errorf("failed to call AddNode for node with p2pid %v: %w", singleNodeParams.P2pId, err) + } + // 1-by-1 tx is pending and we need to wait for it to be mined + _, err = req.chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm AddNode of p2pid node %v transaction %s: %w", singleNodeParams.P2pId, tx.Hash().String(), err) + } + lggr.Debugw("registered node", "p2pid", singleNodeParams.P2pId) + } + } else { + // the bulk add tx is pending and we need to wait for it to be mined + _, err = req.chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm AddNode confirm transaction %s: %w", tx.Hash().String(), err) + } + } + return ®isterNodesResponse{ + nodeIDToParams: nodeIDToParams, + }, nil +} + +type registerDonsRequest struct { + registry *capabilities_registry.CapabilitiesRegistry + chain deployment.Chain + + nodeIDToParams map[string]capabilities_registry.CapabilitiesRegistryNodeParams + donToCapabilities map[string][]registeredCapability + donToOcr2Nodes map[string][]*ocr2Node +} + +type registerDonsResponse struct { + donInfos map[string]capabilities_registry.CapabilitiesRegistryDONInfo +} + +func sortedHash(p2pids [][32]byte) string { + sha256Hash := sha256.New() + sort.Slice(p2pids, func(i, j int) bool { + return bytes.Compare(p2pids[i][:], p2pids[j][:]) < 0 + }) + for _, id := range p2pids { + sha256Hash.Write(id[:]) + } + return hex.EncodeToString(sha256Hash.Sum(nil)) +} + +func registerDons(lggr logger.Logger, req registerDonsRequest) (*registerDonsResponse, error) { + resp := ®isterDonsResponse{ + donInfos: make(map[string]capabilities_registry.CapabilitiesRegistryDONInfo), + } + // track hash of sorted p2pids to don name because the registry return value does not include the don name + // and we need to map it back to the don name to access the other mapping data such as the don's capabilities & nodes + p2pIdsToDon := make(map[string]string) + + for don, ocr2nodes := range req.donToOcr2Nodes { + var p2pIds [][32]byte + for _, n := range ocr2nodes { + if n.IsBoostrap { + continue + } + params, ok := req.nodeIDToParams[n.ID] + if !ok { + return nil, fmt.Errorf("node params not found for non-bootstrap node %s", n.ID) + } + p2pIds = append(p2pIds, params.P2pId) + } + + p2pSortedHash := sortedHash(p2pIds) + p2pIdsToDon[p2pSortedHash] = don + caps, ok := req.donToCapabilities[don] + if !ok { + return nil, fmt.Errorf("capabilities not found for node operator %s", don) + } + wfSupported := false + var cfgs []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration + for _, cap := range caps { + if cap.CapabilityType == 2 { // OCR3 capability => WF supported + wfSupported = true + } + // TODO: accept configuration from external source for each (don,capability) + capCfg := defaultCapConfig(cap.CapabilityType, len(p2pIds)) + cfgb, err := proto.Marshal(capCfg) + if err != nil { + return nil, fmt.Errorf("failed to marshal capability config for %v: %w", cap, err) + } + cfgs = append(cfgs, capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{ + CapabilityId: cap.id, + Config: cfgb, + }) + } + + f := len(p2pIds) / 3 // assuming n=3f+1. TODO should come for some config. + tx, err := req.registry.AddDON(req.chain.DeployerKey, p2pIds, cfgs, true, wfSupported, uint8(f)) + if err != nil { + err = DecodeErr(kcr.CapabilitiesRegistryABI, err) + return nil, fmt.Errorf("failed to call AddDON for don '%s' p2p2Id hash %s capability %v: %w", don, p2pSortedHash, cfgs, err) + } + _, err = req.chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm AddDON transaction %s for don %s: %w", tx.Hash().String(), don, err) + } + lggr.Debugw("registered DON", "don", don, "p2p sorted hash", p2pSortedHash, "cgs", cfgs, "wfSupported", wfSupported, "f", f) + } + donInfos, err := req.registry.GetDONs(&bind.CallOpts{}) + if err != nil { + err = DecodeErr(kcr.CapabilitiesRegistryABI, err) + return nil, fmt.Errorf("failed to call GetDONs: %w", err) + } + for i, donInfo := range donInfos { + donName, ok := p2pIdsToDon[sortedHash(donInfo.NodeP2PIds)] + if !ok { + return nil, fmt.Errorf("don not found for p2pids %s in %v", sortedHash(donInfo.NodeP2PIds), p2pIdsToDon) + } + resp.donInfos[donName] = donInfos[i] + } + return resp, nil +} + +// configureForwarder sets the config for the forwarder contract on the chain for all Dons that accept workflows +// dons that don't accept workflows are not registered with the forwarder +func configureForwarder(chain deployment.Chain, fwdr *kf.KeystoneForwarder, dons []RegisteredDon) error { + if fwdr == nil { + return errors.New("nil forwarder contract") + } + for _, dn := range dons { + if !dn.Info.AcceptsWorkflows { + continue + } + ver := dn.Info.ConfigCount // note config count on the don info is the version on the forwarder + tx, err := fwdr.SetConfig(chain.DeployerKey, dn.Info.Id, ver, dn.Info.F, dn.signers()) + if err != nil { + err = DecodeErr(kf.KeystoneForwarderABI, err) + return fmt.Errorf("failed to call SetConfig for forwarder %s on chain %d: %w", fwdr.Address().String(), chain.Selector, err) + } + _, err = chain.Confirm(tx) + if err != nil { + err = DecodeErr(kf.KeystoneForwarderABI, err) + return fmt.Errorf("failed to confirm SetConfig for forwarder %s: %w", fwdr.Address().String(), err) + } + } + return nil +} + +type configureOCR3Request struct { + cfg *OracleConfigSource + chain deployment.Chain + contract *kocr3.OCR3Capability + don RegisteredDon +} +type configureOCR3Response struct { + ocrConfig Orc2drOracleConfig +} + +func configureOCR3contract(req configureOCR3Request) (*configureOCR3Response, error) { + if req.contract == nil { + return nil, fmt.Errorf("OCR3 contract is nil") + } + nks := makeNodeKeysSlice(req.don.Nodes) + ocrConfig, err := GenerateOCR3Config(*req.cfg, nks) + if err != nil { + return nil, fmt.Errorf("failed to generate OCR3 config: %w", err) + } + tx, err := req.contract.SetConfig(req.chain.DeployerKey, + ocrConfig.Signers, + ocrConfig.Transmitters, + ocrConfig.F, + ocrConfig.OnchainConfig, + ocrConfig.OffchainConfigVersion, + ocrConfig.OffchainConfig, + ) + if err != nil { + err = DecodeErr(kocr3.OCR3CapabilityABI, err) + return nil, fmt.Errorf("failed to call SetConfig for OCR3 contract %s: %w", req.contract.Address().String(), err) + } + _, err = req.chain.Confirm(tx) + if err != nil { + err = DecodeErr(kocr3.OCR3CapabilityABI, err) + return nil, fmt.Errorf("failed to confirm SetConfig for OCR3 contract %s: %w", req.contract.Address().String(), err) + } + return &configureOCR3Response{ocrConfig}, nil +} diff --git a/integration-tests/deployment/keystone/deploy_test.go b/integration-tests/deployment/keystone/deploy_test.go new file mode 100644 index 00000000000..13adfc09740 --- /dev/null +++ b/integration-tests/deployment/keystone/deploy_test.go @@ -0,0 +1,178 @@ +package keystone_test + +import ( + "context" + "encoding/json" + "fmt" + "os" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/stretchr/testify/assert" + "github.com/test-go/testify/require" + + chainsel "github.com/smartcontractkit/chain-selectors" + + "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" + kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +func TestDeploy(t *testing.T) { + lggr := logger.TestLogger(t) + + wfNops := loadTestNops(t, "../clo/testdata/workflow_nodes.json") + cwNops := loadTestNops(t, "../clo/testdata/chain_writer_nodes.json") + assetNops := loadTestNops(t, "../clo/testdata/asset_nodes.json") + require.Len(t, wfNops, 10) + require.Len(t, cwNops, 10) + require.Len(t, assetNops, 16) + + wfDon := keystone.DonCapabilities{ + Name: keystone.WFDonName, + Nops: wfNops, + Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.OCR3Cap}, + } + cwDon := keystone.DonCapabilities{ + Name: keystone.TargetDonName, + Nops: cwNops, + Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.WriteChainCap}, + } + assetDon := keystone.DonCapabilities{ + Name: keystone.StreamDonName, + Nops: assetNops, + Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.StreamTriggerCap}, + } + + env := makeMultiDonTestEnv(t, lggr, []keystone.DonCapabilities{wfDon, cwDon, assetDon}) + + // sepolia; all nodes are on the this chain + registryChainSel, err := chainsel.SelectorFromChainId(11155111) + require.NoError(t, err) + + var ocr3Config = keystone.OracleConfigSource{ + MaxFaultyOracles: len(wfNops) / 3, + } + + ctx := context.Background() + + // explicitly deploy the contracts + cs, err := keystone.DeployContracts(lggr, env, registryChainSel) + require.NoError(t, err) + + deployReq := keystone.ConfigureContractsRequest{ + RegistryChainSel: registryChainSel, + Env: env, + OCR3Config: &ocr3Config, + Dons: []keystone.DonCapabilities{wfDon, cwDon, assetDon}, + AddressBook: cs.AddressBook, + DoContractDeploy: false, + } + deployResp, err := keystone.ConfigureContracts(ctx, lggr, deployReq) + require.NoError(t, err) + ad := deployResp.Changeset.AddressBook + addrs, err := ad.Addresses() + require.NoError(t, err) + lggr.Infow("Deployed Keystone contracts", "address book", addrs) + + // all contracts on home chain + homeChainAddrs, err := ad.AddressesForChain(registryChainSel) + 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 { + require.Len(t, chainAddrs, 1) + } else { + require.Len(t, chainAddrs, 3) + } + containsForwarder := false + for _, tv := range chainAddrs { + if tv.Type == keystone.KeystoneForwarder { + containsForwarder = true + break + } + } + require.True(t, containsForwarder, "no forwarder found in %v on chain %d for target don", chainAddrs, sel) + } + req := &keystone.GetContractSetsRequest{ + Chains: env.Chains, + AddressBook: ad, + } + + contractSetsResp, err := keystone.GetContractSets(req) + require.NoError(t, err) + require.Len(t, contractSetsResp.ContractSets, len(env.Chains)) + // check the registry + regChainContracts, ok := contractSetsResp.ContractSets[registryChainSel] + require.True(t, ok) + gotRegistry := regChainContracts.CapabilitiesRegistry + require.NotNil(t, gotRegistry) + // contract reads + gotDons, err := gotRegistry.GetDONs(&bind.CallOpts{}) + if err != nil { + err = keystone.DecodeErr(kcr.CapabilitiesRegistryABI, err) + require.Fail(t, fmt.Sprintf("failed to get Dons from registry at %s: %s", gotRegistry.Address().String(), err)) + } + require.NoError(t, err) + assert.Len(t, gotDons, len(deployReq.Dons)) + + for n, info := range deployResp.DonInfos { + found := false + for _, gdon := range gotDons { + if gdon.Id == info.Id { + found = true + assert.EqualValues(t, info, gdon) + break + } + } + require.True(t, found, "don %s not found in registry", n) + } + // check the forwarder + for _, cs := range contractSetsResp.ContractSets { + forwarder := cs.Forwarder + require.NotNil(t, forwarder) + // any read to ensure that the contract is deployed correctly + _, err := forwarder.Owner(&bind.CallOpts{}) + require.NoError(t, err) + // TODO expand this test; there is no get method on the forwarder so unclear how to test it + } + // check the ocr3 contract + for chainSel, cs := range contractSetsResp.ContractSets { + if chainSel != registryChainSel { + require.Nil(t, cs.OCR3) + continue + } + require.NotNil(t, cs.OCR3) + // any read to ensure that the contract is deployed correctly + _, err := cs.OCR3.LatestConfigDetails(&bind.CallOpts{}) + require.NoError(t, err) + } +} + +func makeMultiDonTestEnv(t *testing.T, lggr logger.Logger, dons []keystone.DonCapabilities) *deployment.Environment { + var donToEnv = make(map[string]*deployment.Environment) + for _, don := range dons { + env := clo.NewDonEnvWithMemoryChains(t, clo.DonEnvConfig{ + DonName: don.Name, + Nops: don.Nops, + Logger: lggr, + }) + 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/forwarder_deployer.go b/integration-tests/deployment/keystone/forwarder_deployer.go new file mode 100644 index 00000000000..8ec58ebe023 --- /dev/null +++ b/integration-tests/deployment/keystone/forwarder_deployer.go @@ -0,0 +1,46 @@ +package keystone + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder" +) + +type KeystoneForwarderDeployer struct { + lggr logger.Logger + contract *forwarder.KeystoneForwarder +} + +var ForwarderTypeVersion = deployment.TypeAndVersion{ + Type: KeystoneForwarder, + Version: deployment.Version1_0_0, +} + +func (c *KeystoneForwarderDeployer) deploy(req deployRequest) (*deployResponse, error) { + est, err := estimateDeploymentGas(req.Chain.Client, forwarder.KeystoneForwarderABI) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + c.lggr.Debugf("Forwarder estimated gas: %d", est) + + forwarderAddr, tx, forwarder, err := forwarder.DeployKeystoneForwarder( + req.Chain.DeployerKey, + req.Chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to deploy KeystoneForwarder: %w", err) + } + + _, err = req.Chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm and save KeystoneForwarder: %w", err) + } + resp := &deployResponse{ + Address: forwarderAddr, + Tx: tx.Hash(), + Tv: ForwarderTypeVersion, + } + c.contract = forwarder + return resp, nil +} diff --git a/integration-tests/deployment/keystone/ocr3_deployer.go b/integration-tests/deployment/keystone/ocr3_deployer.go new file mode 100644 index 00000000000..fb1fddfa16c --- /dev/null +++ b/integration-tests/deployment/keystone/ocr3_deployer.go @@ -0,0 +1,46 @@ +package keystone + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability" +) + +type OCR3Deployer struct { + lggr logger.Logger + contract *ocr3_capability.OCR3Capability +} + +var OCR3CapabilityTypeVersion = deployment.TypeAndVersion{ + Type: OCR3Capability, + Version: deployment.Version1_0_0, +} + +func (c *OCR3Deployer) deploy(req deployRequest) (*deployResponse, error) { + est, err := estimateDeploymentGas(req.Chain.Client, ocr3_capability.OCR3CapabilityABI) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + c.lggr.Infof("ocr3 capability estimated gas: %d", est) + + ocr3Addr, tx, ocr3, err := ocr3_capability.DeployOCR3Capability( + req.Chain.DeployerKey, + req.Chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to deploy OCR3Capability: %w", err) + } + + _, err = req.Chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm transaction %s: %w", tx.Hash().String(), err) + } + resp := &deployResponse{ + Address: ocr3Addr, + Tx: tx.Hash(), + Tv: OCR3CapabilityTypeVersion, + } + c.contract = ocr3 + return resp, nil +} diff --git a/integration-tests/deployment/keystone/ocr3config.go b/integration-tests/deployment/keystone/ocr3config.go new file mode 100644 index 00000000000..3115f03c051 --- /dev/null +++ b/integration-tests/deployment/keystone/ocr3config.go @@ -0,0 +1,227 @@ +// TODO: KS-458 copied from https://github.com/smartcontractkit/chainlink/blob/65924811dc53a211613927c814d7f04fd85439a4/core/scripts/keystone/src/88_gen_ocr3_config.go#L1 +// to unblock go mod issues when trying to import the scripts package +package keystone + +import ( + "crypto/ed25519" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "time" + + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" + "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" + "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" + "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" + "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" +) + +type TopLevelConfigSource struct { + OracleConfig OracleConfigSource +} + +type OracleConfigSource struct { + MaxQueryLengthBytes uint32 + MaxObservationLengthBytes uint32 + MaxReportLengthBytes uint32 + MaxRequestBatchSize uint32 + UniqueReports bool + + DeltaProgressMillis uint32 + DeltaResendMillis uint32 + DeltaInitialMillis uint32 + DeltaRoundMillis uint32 + DeltaGraceMillis uint32 + DeltaCertifiedCommitRequestMillis uint32 + DeltaStageMillis uint32 + MaxRoundsPerEpoch uint64 + TransmissionSchedule []int + + MaxDurationQueryMillis uint32 + MaxDurationObservationMillis uint32 + MaxDurationAcceptMillis uint32 + MaxDurationTransmitMillis uint32 + + MaxFaultyOracles int +} + +type NodeKeys struct { + EthAddress string `json:"EthAddress"` + AptosAccount string `json:"AptosAccount"` + AptosBundleID string `json:"AptosBundleID"` + AptosOnchainPublicKey string `json:"AptosOnchainPublicKey"` + P2PPeerID string `json:"P2PPeerID"` // p2p_ + OCR2BundleID string `json:"OCR2BundleID"` // used only in job spec + OCR2OnchainPublicKey string `json:"OCR2OnchainPublicKey"` // ocr2on_evm_ + OCR2OffchainPublicKey string `json:"OCR2OffchainPublicKey"` // ocr2off_evm_ + OCR2ConfigPublicKey string `json:"OCR2ConfigPublicKey"` // ocr2cfg_evm_ + CSAPublicKey string `json:"CSAPublicKey"` +} + +type Orc2drOracleConfig struct { + Signers [][]byte + Transmitters []common.Address + F uint8 + OnchainConfig []byte + OffchainConfigVersion uint64 + OffchainConfig []byte +} + +func (c Orc2drOracleConfig) MarshalJSON() ([]byte, error) { + alias := struct { + Signers []string + Transmitters []string + F uint8 + OnchainConfig string + OffchainConfigVersion uint64 + OffchainConfig string + }{ + Signers: make([]string, len(c.Signers)), + Transmitters: make([]string, len(c.Transmitters)), + F: c.F, + OnchainConfig: "0x" + hex.EncodeToString(c.OnchainConfig), + OffchainConfigVersion: c.OffchainConfigVersion, + OffchainConfig: "0x" + hex.EncodeToString(c.OffchainConfig), + } + + for i, signer := range c.Signers { + alias.Signers[i] = hex.EncodeToString(signer) + } + + for i, transmitter := range c.Transmitters { + alias.Transmitters[i] = transmitter.Hex() + } + + return json.Marshal(alias) +} + +func GenerateOCR3Config(cfg OracleConfigSource, nca []NodeKeys) (Orc2drOracleConfig, error) { + onchainPubKeys := [][]byte{} + allPubKeys := map[string]any{} + for _, n := range nca { + // evm keys always required + if n.OCR2OnchainPublicKey == "" { + return Orc2drOracleConfig{}, errors.New("OCR2OnchainPublicKey is required") + } + ethPubKey := common.HexToAddress(n.OCR2OnchainPublicKey) + pubKeys := map[string]types.OnchainPublicKey{ + string(chaintype.EVM): ethPubKey.Bytes(), + } + // add aptos key if present + if n.AptosOnchainPublicKey != "" { + aptosPubKey, err := hex.DecodeString(n.AptosOnchainPublicKey) + if err != nil { + return Orc2drOracleConfig{}, fmt.Errorf("failed to decode AptosOnchainPublicKey: %w", err) + } + pubKeys[string(chaintype.Aptos)] = aptosPubKey + } + // validate uniqueness of each individual key + for _, key := range pubKeys { + raw := hex.EncodeToString(key) + _, exists := allPubKeys[raw] + if exists { + return Orc2drOracleConfig{}, fmt.Errorf("Duplicate onchain public key: '%s'", raw) + } + allPubKeys[raw] = struct{}{} + } + pubKey, err := ocrcommon.MarshalMultichainPublicKey(pubKeys) + if err != nil { + return Orc2drOracleConfig{}, fmt.Errorf("failed to marshal multichain public key: %w", err) + } + onchainPubKeys = append(onchainPubKeys, pubKey) + } + + offchainPubKeysBytes := []types.OffchainPublicKey{} + for _, n := range nca { + pkBytes, err := hex.DecodeString(n.OCR2OffchainPublicKey) + if err != nil { + return Orc2drOracleConfig{}, fmt.Errorf("failed to decode OCR2OffchainPublicKey: %w", err) + } + + pkBytesFixed := [ed25519.PublicKeySize]byte{} + nCopied := copy(pkBytesFixed[:], pkBytes) + if nCopied != ed25519.PublicKeySize { + return Orc2drOracleConfig{}, fmt.Errorf("wrong num elements copied from ocr2 offchain public key. expected %d but got %d", ed25519.PublicKeySize, nCopied) + } + + offchainPubKeysBytes = append(offchainPubKeysBytes, types.OffchainPublicKey(pkBytesFixed)) + } + + configPubKeysBytes := []types.ConfigEncryptionPublicKey{} + for _, n := range nca { + pkBytes, err := hex.DecodeString(n.OCR2ConfigPublicKey) + if err != nil { + return Orc2drOracleConfig{}, fmt.Errorf("failed to decode OCR2ConfigPublicKey: %w", err) + } + + pkBytesFixed := [ed25519.PublicKeySize]byte{} + n := copy(pkBytesFixed[:], pkBytes) + if n != ed25519.PublicKeySize { + return Orc2drOracleConfig{}, fmt.Errorf("wrong num elements copied from ocr2 config public key. expected %d but got %d", ed25519.PublicKeySize, n) + } + + configPubKeysBytes = append(configPubKeysBytes, types.ConfigEncryptionPublicKey(pkBytesFixed)) + } + + identities := []confighelper.OracleIdentityExtra{} + for index := range nca { + identities = append(identities, confighelper.OracleIdentityExtra{ + OracleIdentity: confighelper.OracleIdentity{ + OnchainPublicKey: onchainPubKeys[index][:], + OffchainPublicKey: offchainPubKeysBytes[index], + PeerID: nca[index].P2PPeerID, + TransmitAccount: types.Account(nca[index].EthAddress), + }, + ConfigEncryptionPublicKey: configPubKeysBytes[index], + }) + } + + signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, err := ocr3confighelper.ContractSetConfigArgsForTests( + time.Duration(cfg.DeltaProgressMillis)*time.Millisecond, + time.Duration(cfg.DeltaResendMillis)*time.Millisecond, + time.Duration(cfg.DeltaInitialMillis)*time.Millisecond, + time.Duration(cfg.DeltaRoundMillis)*time.Millisecond, + time.Duration(cfg.DeltaGraceMillis)*time.Millisecond, + time.Duration(cfg.DeltaCertifiedCommitRequestMillis)*time.Millisecond, + time.Duration(cfg.DeltaStageMillis)*time.Millisecond, + cfg.MaxRoundsPerEpoch, + cfg.TransmissionSchedule, + identities, + nil, // empty plugin config + time.Duration(cfg.MaxDurationQueryMillis)*time.Millisecond, + time.Duration(cfg.MaxDurationObservationMillis)*time.Millisecond, + time.Duration(cfg.MaxDurationAcceptMillis)*time.Millisecond, + time.Duration(cfg.MaxDurationTransmitMillis)*time.Millisecond, + cfg.MaxFaultyOracles, + nil, // empty onChain config + ) + if err != nil { + return Orc2drOracleConfig{}, fmt.Errorf("failed to generate contract config args: %w", err) + } + + var configSigners [][]byte + for _, signer := range signers { + configSigners = append(configSigners, signer) + } + + transmitterAddresses, err := evm.AccountToAddress(transmitters) + if err != nil { + return Orc2drOracleConfig{}, fmt.Errorf("failed to convert transmitters to addresses: %w", err) + } + + config := Orc2drOracleConfig{ + Signers: configSigners, + Transmitters: transmitterAddresses, + F: f, + OnchainConfig: onchainConfig, + OffchainConfigVersion: offchainConfigVersion, + OffchainConfig: offchainConfig, + } + + return config, nil +} diff --git a/integration-tests/deployment/keystone/state.go b/integration-tests/deployment/keystone/state.go new file mode 100644 index 00000000000..cd8769dafa4 --- /dev/null +++ b/integration-tests/deployment/keystone/state.go @@ -0,0 +1,79 @@ +package keystone + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink/integration-tests/deployment" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability" +) + +type GetContractSetsRequest struct { + Chains map[uint64]deployment.Chain + AddressBook deployment.AddressBook +} + +type GetContractSetsResponse struct { + ContractSets map[uint64]ContractSet +} + +type ContractSet struct { + OCR3 *ocr3_capability.OCR3Capability + Forwarder *forwarder.KeystoneForwarder + CapabilitiesRegistry *capabilities_registry.CapabilitiesRegistry +} + +func GetContractSets(req *GetContractSetsRequest) (*GetContractSetsResponse, error) { + resp := &GetContractSetsResponse{ + ContractSets: make(map[uint64]ContractSet), + } + for id, chain := range req.Chains { + addrs, err := req.AddressBook.AddressesForChain(id) + if err != nil { + return nil, fmt.Errorf("failed to get addresses for chain %d: %w", id, err) + } + cs, err := loadContractSet(chain, addrs) + if err != nil { + return nil, fmt.Errorf("failed to load contract set for chain %d: %w", id, err) + } + resp.ContractSets[id] = *cs + } + return resp, nil +} + +func loadContractSet(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*ContractSet, error) { + var out ContractSet + + for addr, tv := range addresses { + // todo handle versions + if !tv.Version.Equal(&deployment.Version1_0_0) { + return nil, fmt.Errorf("unsupported version %s", tv.Version.String()) + } + switch tv.Type { + case CapabilitiesRegistry: + c, err := capabilities_registry.NewCapabilitiesRegistry(common.HexToAddress(addr), chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to create capability registry contract from address %s: %w", addr, err) + } + out.CapabilitiesRegistry = c + case KeystoneForwarder: + c, err := forwarder.NewKeystoneForwarder(common.HexToAddress(addr), chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to create forwarder contract from address %s: %w", addr, err) + } + out.Forwarder = c + case OCR3Capability: + c, err := ocr3_capability.NewOCR3Capability(common.HexToAddress(addr), chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err) + } + out.OCR3 = c + default: + return nil, fmt.Errorf("unknown contract type %s", tv.Type) + } + } + return &out, nil +} diff --git a/integration-tests/deployment/keystone/testdata/ocr3config.json b/integration-tests/deployment/keystone/testdata/ocr3config.json new file mode 100644 index 00000000000..6835a4143f4 --- /dev/null +++ b/integration-tests/deployment/keystone/testdata/ocr3config.json @@ -0,0 +1,27 @@ +{ + "OracleConfig": { + "MaxQueryLengthBytes": 1000000, + "MaxObservationLengthBytes": 1000000, + "MaxReportLengthBytes": 1000000, + "MaxRequestBatchSize": 1000, + "UniqueReports": true, + + "DeltaProgressMillis": 5000, + "DeltaResendMillis": 5000, + "DeltaInitialMillis": 5000, + "DeltaRoundMillis": 2000, + "DeltaGraceMillis": 500, + "DeltaCertifiedCommitRequestMillis": 1000, + "DeltaStageMillis": 30000, + "MaxRoundsPerEpoch": 10, + "TransmissionSchedule": [1, 1, 1, 1], + + "MaxDurationQueryMillis": 1000, + "MaxDurationObservationMillis": 1000, + "MaxDurationReportMillis": 1000, + "MaxDurationAcceptMillis": 1000, + "MaxDurationTransmitMillis": 1000, + + "MaxFaultyOracles": 1 + } +} diff --git a/integration-tests/deployment/keystone/types.go b/integration-tests/deployment/keystone/types.go new file mode 100644 index 00000000000..dc0ccea75f8 --- /dev/null +++ b/integration-tests/deployment/keystone/types.go @@ -0,0 +1,307 @@ +package keystone + +import ( + "encoding/hex" + "errors" + "fmt" + "sort" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/common" + + 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/integration-tests/deployment/jd/node/v1" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" +) + +var ( + CapabilitiesRegistry deployment.ContractType = "CapabilitiesRegistry" + KeystoneForwarder deployment.ContractType = "KeystoneForwarder" + OCR3Capability deployment.ContractType = "OCR3Capability" +) + +type deployResponse struct { + Address common.Address + Tx common.Hash // todo: chain agnostic + Tv deployment.TypeAndVersion +} + +type deployRequest struct { + Chain deployment.Chain +} + +type DonNode struct { + Don string + Node string // not unique across environments +} + +type CapabilityHost struct { + NodeID string // globally unique + Capabilities []capabilities_registry.CapabilitiesRegistryCapability +} + +type Nop struct { + capabilities_registry.CapabilitiesRegistryNodeOperator + NodeIDs []string // nodes run by this operator +} + +// ocr2Node is a subset of the node configuration that is needed to register a node +// with the capabilities registry. Signer and P2PKey are chain agnostic. +// TODO: KS-466 when we migrate fully to the JD offchain client, we should be able remove this shim and use environment.Node directly +type ocr2Node struct { + ID string + Signer [32]byte // note that in capabilities registry we need a [32]byte, but in the forwarder we need a common.Address [20]byte + P2PKey p2pkey.PeerID + IsBoostrap bool + // useful when have to register the ocr3 contract config + p2pKeyBundle *v1.OCR2Config_P2PKeyBundle + ocrKeyBundle *v1.OCR2Config_OCRKeyBundle + accountAddress string +} + +func (o *ocr2Node) signerAddress() common.Address { + return common.BytesToAddress(o.Signer[:]) +} + +func (o *ocr2Node) toNodeKeys() NodeKeys { + return NodeKeys{ + EthAddress: o.accountAddress, + P2PPeerID: o.p2pKeyBundle.PeerId, + OCR2BundleID: o.ocrKeyBundle.BundleId, + OCR2OnchainPublicKey: o.ocrKeyBundle.OnchainSigningAddress, + OCR2OffchainPublicKey: o.ocrKeyBundle.OffchainPublicKey, + OCR2ConfigPublicKey: o.ocrKeyBundle.ConfigPublicKey, + // TODO Aptos support. How will that be modeled in clo data? + } +} + +func newOcr2Node(id string, ccfg *v1.ChainConfig) (*ocr2Node, error) { + if ccfg == nil { + return nil, errors.New("nil ocr2config") + } + ocfg := ccfg.Ocr2Config + p := p2pkey.PeerID{} + if err := p.UnmarshalString(ocfg.P2PKeyBundle.PeerId); err != nil { + return nil, fmt.Errorf("failed to unmarshal peer id %s: %w", ocfg.P2PKeyBundle.PeerId, err) + } + + signer := ocfg.OcrKeyBundle.OnchainSigningAddress + if len(signer) != 40 { + return nil, fmt.Errorf("invalid onchain signing address %s", ocfg.OcrKeyBundle.OnchainSigningAddress) + } + signerB, err := hex.DecodeString(signer) + if err != nil { + return nil, fmt.Errorf("failed to convert signer %s: %w", signer, err) + } + + var sigb [32]byte + copy(sigb[:], signerB) + + return &ocr2Node{ + ID: id, + Signer: sigb, + P2PKey: p, + IsBoostrap: ocfg.IsBootstrap, + p2pKeyBundle: ocfg.P2PKeyBundle, + ocrKeyBundle: ocfg.OcrKeyBundle, + accountAddress: ccfg.AccountAddress, + }, nil +} + +func makeNodeKeysSlice(nodes []*ocr2Node) []NodeKeys { + var out []NodeKeys + for _, n := range nodes { + out = append(out, n.toNodeKeys()) + } + return out +} + +// DonCapabilities is a set of capabilities hosted by a set of node operators +// 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 + 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) { + 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), + } + } + } + if !found { + return nil, fmt.Errorf("node '%s' %s does not support chain %d", node.Name, node.ID, cid) + } + } + } + return out, nil +} + +// 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) { + out := make(map[string]capabilities_registry.CapabilitiesRegistryNodeOperator) + for _, don := range dons { + nops, err := don.nodeIdToNop(chainSel) + if err != nil { + return nil, fmt.Errorf("failed to get registry NOPs for don %s: %w", don.Name, err) + } + for donName, nop := range nops { + _, exists := out[donName] + if exists { + continue + } + out[donName] = nop + } + } + return out, nil +} + +// mapDonsToCaps converts a list of DonCapabilities to a map of don name to capabilities +func mapDonsToCaps(dons []DonCapabilities) map[string][]kcr.CapabilitiesRegistryCapability { + out := make(map[string][]kcr.CapabilitiesRegistryCapability) + for _, don := range dons { + out[don.Name] = don.Capabilities + } + return out +} + +// mapDonsToNodes returns a map of don name to simplified representation of their nodes +func mapDonsToNodes(dons []DonCapabilities, 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 { + // 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) + } + chain := node.ChainConfigs[0] + ccfg := chainConfigFromClo(chain) + ocr2n, err := newOcr2Node(node.ID, ccfg) + 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 +} + +// RegisteredDon is a representation of a don that exists in the in the capabilities registry all with the enriched node data +type RegisteredDon struct { + Name string + Info capabilities_registry.CapabilitiesRegistryDONInfo + Nodes []*ocr2Node +} + +func (d RegisteredDon) signers() []common.Address { + sort.Slice(d.Nodes, func(i, j int) bool { + return d.Nodes[i].P2PKey.String() < d.Nodes[j].P2PKey.String() + }) + var out []common.Address + for _, n := range d.Nodes { + if n.IsBoostrap { + continue + } + out = append(out, n.signerAddress()) + } + return out +} + +func joinInfoAndNodes(donInfos map[string]kcr.CapabilitiesRegistryDONInfo, dons []DonCapabilities) ([]RegisteredDon, error) { + // all maps should have the same keys + nodes, err := mapDonsToNodes(dons, true) + if err != nil { + return nil, fmt.Errorf("failed to map dons to capabilities: %w", err) + } + if len(donInfos) != len(nodes) { + return nil, fmt.Errorf("mismatched lengths don infos %d, nodes %d", len(donInfos), len(nodes)) + } + var out []RegisteredDon + for donName, info := range donInfos { + + ocr2nodes, ok := nodes[donName] + if !ok { + return nil, fmt.Errorf("nodes not found for don %s", donName) + } + out = append(out, RegisteredDon{ + Name: donName, + Info: info, + Nodes: ocr2nodes, + }) + } + + 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 +// contract registry disallows 0x0 as an admin address, but our test net nops use it +func adminAddr(addr string) common.Address { + needsFixing := addr == emptyAddr + addr = strings.TrimPrefix(addr, "0x") + if needsFixing { + addr = strings.ReplaceAll(addr, "0", "f") + } + return common.HexToAddress(strings.TrimPrefix(addr, "0x")) +} diff --git a/integration-tests/deployment/memory/chain.go b/integration-tests/deployment/memory/chain.go index 153d9d19e93..1cbf2f9df71 100644 --- a/integration-tests/deployment/memory/chain.go +++ b/integration-tests/deployment/memory/chain.go @@ -58,6 +58,25 @@ func GenerateChains(t *testing.T, numChains int) map[uint64]EVMChain { chains := make(map[uint64]EVMChain) for i := 0; i < numChains; i++ { chainID := chainsel.TEST_90000001.EvmChainID + uint64(i) + key, err := crypto.GenerateKey() + require.NoError(t, err) + owner, err := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) + require.NoError(t, err) + // there have to be enough initial funds on each chain to allocate for all the nodes that share the given chain in the test + backend := backends.NewSimulatedBackend(core.GenesisAlloc{ + owner.From: {Balance: big.NewInt(0).Mul(big.NewInt(7000), big.NewInt(params.Ether))}}, 50000000) + tweakChainTimestamp(t, backend, time.Hour*8) + chains[chainID] = EVMChain{ + Backend: backend, + DeployerKey: owner, + } + } + return chains +} + +func GenerateChainsWithIds(t *testing.T, chainIDs []uint64) map[uint64]EVMChain { + chains := make(map[uint64]EVMChain) + for _, chainID := range chainIDs { key, err := crypto.GenerateKey() require.NoError(t, err) owner, err := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) diff --git a/integration-tests/deployment/memory/environment.go b/integration-tests/deployment/memory/environment.go index 2b68d5666fa..b462086405b 100644 --- a/integration-tests/deployment/memory/environment.go +++ b/integration-tests/deployment/memory/environment.go @@ -33,8 +33,17 @@ type MemoryEnvironmentConfig struct { // i.e. CapReg. func NewMemoryChains(t *testing.T, numChains int) map[uint64]deployment.Chain { mchains := GenerateChains(t, numChains) + return generateMemoryChain(t, mchains) +} + +func NewMemoryChainsWithChainIDs(t *testing.T, chainIDs []uint64) map[uint64]deployment.Chain { + mchains := GenerateChainsWithIds(t, chainIDs) + return generateMemoryChain(t, mchains) +} + +func generateMemoryChain(t *testing.T, inputs map[uint64]EVMChain) map[uint64]deployment.Chain { chains := make(map[uint64]deployment.Chain) - for cid, chain := range mchains { + for cid, chain := range inputs { sel, err := chainsel.SelectorFromChainId(cid) require.NoError(t, err) chains[sel] = deployment.Chain{ diff --git a/integration-tests/deployment/memory/job_client.go b/integration-tests/deployment/memory/job_client.go index 16dbfc2b828..74ba224ee19 100644 --- a/integration-tests/deployment/memory/job_client.go +++ b/integration-tests/deployment/memory/job_client.go @@ -2,6 +2,8 @@ package memory import ( "context" + "errors" + "fmt" "strconv" "github.com/ethereum/go-ethereum/common" @@ -58,12 +60,49 @@ 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 implement me - panic("implement me") + //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 id, n := range j.Nodes { + if include(id) { + nodes = append(nodes, &nodev1.Node{ + Id: id, + PublicKey: n.Keys.OCRKeyBundle.ID(), // is this the correct val? + IsEnabled: true, + IsConnected: true, + }) + } + } + return &nodev1.ListNodesResponse{ + Nodes: nodes, + }, nil + } func (j JobClient) ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNodeChainConfigsRequest, opts ...grpc.CallOption) (*nodev1.ListNodeChainConfigsResponse, error) { - n := j.Nodes[in.Filter.NodeIds[0]] + if in.Filter == nil { + return nil, errors.New("filter is required") + } + if len(in.Filter.NodeIds) != 1 { + return nil, errors.New("only one node id is supported") + } + n, ok := j.Nodes[in.Filter.NodeIds[0]] + 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() var chainConfigs []*nodev1.ChainConfig diff --git a/integration-tests/deployment/memory/node.go b/integration-tests/deployment/memory/node.go index 1befa38dc69..dc364f69993 100644 --- a/integration-tests/deployment/memory/node.go +++ b/integration-tests/deployment/memory/node.go @@ -16,13 +16,13 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" - coretypes "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks" - "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" "github.com/smartcontractkit/chainlink/integration-tests/deployment" + + "github.com/smartcontractkit/chainlink/v2/core/capabilities" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client" v2toml "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml" @@ -165,7 +165,7 @@ func NewNode( Logger: lggr, LoopRegistry: plugins.NewLoopRegistry(lggr.Named("LoopRegistry"), cfg.Tracing(), cfg.Telemetry()), GRPCOpts: loop.GRPCOpts{}, - CapabilitiesRegistry: coretypes.NewCapabilitiesRegistry(t), + CapabilitiesRegistry: capabilities.NewRegistry(lggr), } initOps := []chainlink.CoreRelayerChainInitFunc{chainlink.InitEVM(context.Background(), relayerFactory, evmOpts)} rci, err := chainlink.NewCoreRelayerChainInteroperators(initOps...) diff --git a/integration-tests/deployment/multiclient.go b/integration-tests/deployment/multiclient.go index eb172f906bb..94dcc95f9ec 100644 --- a/integration-tests/deployment/multiclient.go +++ b/integration-tests/deployment/multiclient.go @@ -7,10 +7,13 @@ import ( "time" "github.com/avast/retry-go/v4" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" ) const ( @@ -42,18 +45,19 @@ type MultiClient struct { *ethclient.Client Backups []*ethclient.Client RetryConfig RetryConfig + lggr logger.Logger } -func NewMultiClient(rpcs []RPC, opts ...func(client *MultiClient)) (*MultiClient, error) { +func NewMultiClient(lggr logger.Logger, rpcs []RPC, opts ...func(client *MultiClient)) (*MultiClient, error) { if len(rpcs) == 0 { - return nil, fmt.Errorf("No RPCs provided, need at least one") + return nil, errors.New("No RPCs provided, need at least one") } - var mc MultiClient + mc := MultiClient{lggr: lggr} clients := make([]*ethclient.Client, 0, len(rpcs)) for _, rpc := range rpcs { client, err := ethclient.Dial(rpc.WSURL) if err != nil { - return nil, errors.Wrapf(err, "failed to dial %s", rpc.WSURL) + return nil, fmt.Errorf("failed to dial ws url '%s': %w", rpc.WSURL, err) } clients = append(clients, client) } @@ -68,14 +72,14 @@ func NewMultiClient(rpcs []RPC, opts ...func(client *MultiClient)) (*MultiClient } func (mc *MultiClient) SendTransaction(ctx context.Context, tx *types.Transaction) error { - return mc.retryWithBackups(func(client *ethclient.Client) error { + return mc.retryWithBackups("SendTransaction", func(client *ethclient.Client) error { return client.SendTransaction(ctx, tx) }) } func (mc *MultiClient) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) { var code []byte - err := mc.retryWithBackups(func(client *ethclient.Client) error { + err := mc.retryWithBackups("CodeAt", func(client *ethclient.Client) error { var err error code, err = client.CodeAt(ctx, account, blockNumber) return err @@ -85,7 +89,7 @@ func (mc *MultiClient) CodeAt(ctx context.Context, account common.Address, block func (mc *MultiClient) NonceAt(ctx context.Context, account common.Address) (uint64, error) { var count uint64 - err := mc.retryWithBackups(func(client *ethclient.Client) error { + err := mc.retryWithBackups("NonceAt", func(client *ethclient.Client) error { var err error count, err = client.NonceAt(ctx, account, nil) return err @@ -93,14 +97,50 @@ func (mc *MultiClient) NonceAt(ctx context.Context, account common.Address) (uin return count, err } -func (mc *MultiClient) retryWithBackups(op func(*ethclient.Client) error) error { +func (mc *MultiClient) WaitMined(ctx context.Context, tx *types.Transaction) (*types.Receipt, error) { + mc.lggr.Debugf("Waiting for tx %s to be mined", tx.Hash().Hex()) + // no retries here because we want to wait for the tx to be mined + resultCh := make(chan *types.Receipt) + doneCh := make(chan struct{}) + + waitMined := func(client *ethclient.Client, tx types.Transaction) { + mc.lggr.Debugf("Waiting for tx %s to be mined with client %v", tx.Hash().Hex(), client) + receipt, err := bind.WaitMined(ctx, client, &tx) + if err != nil { + mc.lggr.Warnf("WaitMined error %v with client %v", err, client) + return + } + select { + case resultCh <- receipt: + case <-doneCh: + return + } + } + + for _, client := range append([]*ethclient.Client{mc.Client}, mc.Backups...) { + txn := tx + c := client + go waitMined(c, *txn) + } + var receipt *types.Receipt + select { + case receipt = <-resultCh: + close(doneCh) + return receipt, nil + case <-ctx.Done(): + mc.lggr.Warnf("WaitMined context done %v", ctx.Err()) + close(doneCh) + return nil, ctx.Err() + } +} + +func (mc *MultiClient) retryWithBackups(opName string, op func(*ethclient.Client) error) error { var err error for _, client := range append([]*ethclient.Client{mc.Client}, mc.Backups...) { err2 := retry.Do(func() error { err = op(client) if err != nil { - // TODO: logger? - fmt.Printf("Error %v with client %v\n", err, client) + mc.lggr.Warnf("retryable error '%s' for op %s with client %v", err.Error(), opName, client) return err } return nil @@ -108,7 +148,7 @@ func (mc *MultiClient) retryWithBackups(op func(*ethclient.Client) error) error if err2 == nil { return nil } - fmt.Printf("Client %v failed, trying next client\n", client) + mc.lggr.Infof("Client %v failed, trying next client", client) } return errors.Wrapf(err, "All backup clients %v failed", mc.Backups) } diff --git a/integration-tests/deployment/multiclient_test.go b/integration-tests/deployment/multiclient_test.go index a3176691c0c..0dbebbe3a6a 100644 --- a/integration-tests/deployment/multiclient_test.go +++ b/integration-tests/deployment/multiclient_test.go @@ -7,9 +7,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink/v2/core/logger" ) func TestMultiClient(t *testing.T) { + lggr := logger.TestLogger(t) // Expect an error if no RPCs supplied. s := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { writer.WriteHeader(http.StatusOK) @@ -17,17 +20,17 @@ func TestMultiClient(t *testing.T) { require.NoError(t, err) })) defer s.Close() - _, err := NewMultiClient([]RPC{}) + _, err := NewMultiClient(lggr, []RPC{}) require.Error(t, err) // Expect defaults to be set if not provided. - mc, err := NewMultiClient([]RPC{{WSURL: s.URL}}) + mc, err := NewMultiClient(lggr, []RPC{{WSURL: s.URL}}) require.NoError(t, err) assert.Equal(t, mc.RetryConfig.Attempts, uint(RPC_DEFAULT_RETRY_ATTEMPTS)) assert.Equal(t, mc.RetryConfig.Delay, RPC_DEFAULT_RETRY_DELAY) // Expect second client to be set as backup. - mc, err = NewMultiClient([]RPC{ + mc, err = NewMultiClient(lggr, []RPC{ {WSURL: s.URL}, {WSURL: s.URL}, }) diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 34cf2df9cbb..b6bfe36b9b5 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -134,6 +134,7 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/blendle/zapdriver v1.3.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/btcsuite/btcd/btcutil v1.1.3 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect github.com/bytedance/sonic v1.10.1 // indirect @@ -438,7 +439,7 @@ require ( github.com/tidwall/btree v1.6.0 // indirect github.com/tidwall/gjson v1.17.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/pretty v1.2.1 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index bd416855c59..490a5903a64 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -160,6 +160,7 @@ github.com/Workiva/go-datastructures v1.1.0 h1:hu20UpgZneBhQ3ZvwiOGlqJSKIosin2Rd github.com/Workiva/go-datastructures v1.1.0/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/XSAM/otelsql v0.27.0 h1:i9xtxtdcqXV768a5C6SoT/RkG+ue3JTOgkYInzlTOqs= github.com/XSAM/otelsql v0.27.0/go.mod h1:0mFB3TvLa7NCuhm/2nU7/b2wEtsczkj8Rey8ygO7V+A= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= @@ -270,13 +271,31 @@ github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHf github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj0JTv4mTs= github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= -github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.0 h1:V2/ZgjfDFIygAX3ZapeigkVBoVUtOJKSwrhZdlpSvaA= +github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 h1:SDlJ7bAm4ewvrmZtR0DaiYbQGdKPeaaIm7bM+qRhFeU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= @@ -436,16 +455,20 @@ github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnG github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e/go.mod h1:IJgIiGUARc4aOr4bOQ85klmjsShkEEfiRc6q/yBSfo8= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= @@ -1034,6 +1057,7 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= @@ -1056,6 +1080,7 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -1070,6 +1095,7 @@ github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dv github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -1259,13 +1285,17 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= @@ -1534,6 +1564,7 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= @@ -1557,8 +1588,9 @@ github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vl github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -1740,6 +1772,7 @@ go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1807,6 +1840,7 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1840,6 +1874,7 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1936,8 +1971,10 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2218,6 +2255,7 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 85b57698a3e..7badf1b15a3 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -425,7 +425,7 @@ require ( github.com/tidwall/btree v1.6.0 // indirect github.com/tidwall/gjson v1.17.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/pretty v1.2.1 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index b921352eeb5..882950e5e9d 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -267,8 +267,8 @@ github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 h1:SDlJ7bAm4ewvrmZtR0DaiYbQGdKPeaaIm7bM+qRhFeU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= @@ -1531,8 +1531,9 @@ github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vl github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=