diff --git a/.changeset/brown-ghosts-buy.md b/.changeset/brown-ghosts-buy.md new file mode 100644 index 00000000000..01b4be5bc66 --- /dev/null +++ b/.changeset/brown-ghosts-buy.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#added OCR2 config option SampleTelemetry which enables telemetry sampling. diff --git a/.changeset/chilly-tools-walk.md b/.changeset/chilly-tools-walk.md new file mode 100644 index 00000000000..aa9cbf31aaf --- /dev/null +++ b/.changeset/chilly-tools-walk.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal disable 3 upgrade e2e tests due to flakiness diff --git a/.changeset/neat-suns-hammer.md b/.changeset/neat-suns-hammer.md new file mode 100644 index 00000000000..5ca220dbcfb --- /dev/null +++ b/.changeset/neat-suns-hammer.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#added changeset to mint link tokens from MCMS diff --git a/.changeset/polite-cobras-make.md b/.changeset/polite-cobras-make.md new file mode 100644 index 00000000000..bb34dae7580 --- /dev/null +++ b/.changeset/polite-cobras-make.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal #added Sampling of LLO telemetry. diff --git a/.changeset/tiny-moons-bathe.md b/.changeset/tiny-moons-bathe.md new file mode 100644 index 00000000000..24683bdaa81 --- /dev/null +++ b/.changeset/tiny-moons-bathe.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#updated bumped chainlink-data-streams version diff --git a/.changeset/violet-lamps-pay.md b/.changeset/violet-lamps-pay.md new file mode 100644 index 00000000000..a0c7699231f --- /dev/null +++ b/.changeset/violet-lamps-pay.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#bugfix Upgrades plugin: chainlink-data-streams so that calculated streams do not generate wrong timestamps diff --git a/.github/actions/setup-sui/action.yaml b/.github/actions/setup-sui/action.yaml index 99969602b3f..1d80fce2311 100644 --- a/.github/actions/setup-sui/action.yaml +++ b/.github/actions/setup-sui/action.yaml @@ -2,9 +2,9 @@ name: Setup Sui CLI description: Install and cache Sui CLI using suiup inputs: version: - description: Sui CLI version to install (e.g., mainnet-v1.57.2) + description: Sui CLI version to install (e.g., mainnet-v1.61.2) required: false - default: mainnet-v1.57.2 + default: mainnet-v1.61.2 github-token: description: GitHub token to use for authentication required: true @@ -17,7 +17,7 @@ runs: name: Cache Sui CLI with: path: | - ~/.suiup/bin + ~/.local/bin/sui key: ${{ runner.os }}-suiup-${{ inputs.version }} - if: ${{ steps.cache.outputs.cache-hit != 'true' }} @@ -32,4 +32,5 @@ runs: - name: Export Sui CLI to PATH shell: bash - run: echo "PATH=$HOME/.suiup/bin:$HOME/.local/bin:$HOME/.cargo/bin:$PATH" >> $GITHUB_ENV + run: | + echo "PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" >> $GITHUB_ENV diff --git a/.github/integration-in-memory-tests.yml b/.github/integration-in-memory-tests.yml index 6e81905a9b5..b542e725c69 100644 --- a/.github/integration-in-memory-tests.yml +++ b/.github/integration-in-memory-tests.yml @@ -771,20 +771,20 @@ runner-test-matrix: install_plugins_public: true free_disk_space: true - - id: smoke/ccip/ccip_sui_messaging_test.go:Test_CCIP_Messaging_EVM2Sui - path: integration-tests/smoke/ccip/ccip_sui_messaging_test.go - test_env_type: in-memory - runs_on: ubuntu-latest - triggers: - - PR Integration CCIP Tests - - Nightly Integration CCIP Tests - test_cmd: | - echo "🚀 Starting CCIP EVM2Sui test..." - go test ./smoke/ccip -run "Test_CCIP_Messaging_EVM2Sui" -timeout 10m -test.parallel=1 -count=1 -json - test_go_project_path: integration-tests - sui_cli_version: mainnet-1.60.1 - install_plugins_public: true - free_disk_space: true + # - id: smoke/ccip/ccip_sui_messaging_test.go:Test_CCIP_Messaging_EVM2Sui + # path: integration-tests/smoke/ccip/ccip_sui_messaging_test.go + # test_env_type: in-memory + # runs_on: ubuntu-latest + # triggers: + # - PR Integration CCIP Tests + # - Nightly Integration CCIP Tests + # test_cmd: | + # echo "🚀 Starting CCIP EVM2Sui test..." + # go test ./smoke/ccip -run "Test_CCIP_Messaging_EVM2Sui" -timeout 10m -test.parallel=1 -count=1 -json + # test_go_project_path: integration-tests + # sui_cli_version: mainnet-1.60.1 + # install_plugins_public: true + # free_disk_space: true - id: smoke/ccip/ccip_sui_messaging_test.go:Test_CCIP_EVM2Sui_ZeroReceiver path: integration-tests/smoke/ccip/ccip_sui_messaging_test.go @@ -940,47 +940,47 @@ runner-test-matrix: install_plugins_public: true free_disk_space: true - - id: smoke/ccip/ccip_sui_upgrade_test.go:Test_CCIP_Upgrade_EVM2Sui - path: integration-tests/smoke/ccip/ccip_sui_upgrade_test.go - test_env_type: in-memory - runs_on_self_hosted: runs-on/cpu=16/ram=64/family=m6i+m5.*/spot=false/image=ubuntu24-full-x64/extras=s3-cache+tmpfs - triggers: - - PR Integration CCIP Tests - - Nightly Integration CCIP Tests - test_cmd: | - go test ./smoke/ccip -run "Test_CCIP_Upgrade_EVM2Sui" -timeout 25m -test.parallel=1 -count=1 -json - test_go_project_path: integration-tests - sui_cli_version: mainnet-1.60.1 - install_plugins_public: true - free_disk_space: true + # - id: smoke/ccip/ccip_sui_upgrade_test.go:Test_CCIP_Upgrade_EVM2Sui + # path: integration-tests/smoke/ccip/ccip_sui_upgrade_test.go + # test_env_type: in-memory + # runs_on_self_hosted: runs-on/cpu=16/ram=64/family=m6i+m5.*/spot=false/image=ubuntu24-full-x64/extras=s3-cache+tmpfs + # triggers: + # - PR Integration CCIP Tests + # - Nightly Integration CCIP Tests + # test_cmd: | + # go test ./smoke/ccip -run "Test_CCIP_Upgrade_EVM2Sui" -timeout 25m -test.parallel=1 -count=1 -json + # test_go_project_path: integration-tests + # sui_cli_version: mainnet-1.60.1 + # install_plugins_public: true + # free_disk_space: true - - id: smoke/ccip/ccip_sui_upgrade_test.go:Test_CCIP_Upgrade_CommonPkg_EVM2Sui - path: integration-tests/smoke/ccip/ccip_sui_upgrade_test.go - test_env_type: in-memory - runs_on: ubuntu-latest - triggers: - - PR Integration CCIP Tests - - Nightly Integration CCIP Tests - test_cmd: | - go test ./smoke/ccip -run "Test_CCIP_Upgrade_CommonPkg_EVM2Sui" -timeout 25m -test.parallel=1 -count=1 -json - test_go_project_path: integration-tests - sui_cli_version: mainnet-1.60.1 - install_plugins_public: true - free_disk_space: true + # - id: smoke/ccip/ccip_sui_upgrade_test.go:Test_CCIP_Upgrade_CommonPkg_EVM2Sui + # path: integration-tests/smoke/ccip/ccip_sui_upgrade_test.go + # test_env_type: in-memory + # runs_on: ubuntu-latest + # triggers: + # - PR Integration CCIP Tests + # - Nightly Integration CCIP Tests + # test_cmd: | + # go test ./smoke/ccip -run "Test_CCIP_Upgrade_CommonPkg_EVM2Sui" -timeout 25m -test.parallel=1 -count=1 -json + # test_go_project_path: integration-tests + # sui_cli_version: mainnet-1.60.1 + # install_plugins_public: true + # free_disk_space: true - - id: smoke/ccip/ccip_sui_upgrade_test.go:Test_CCIP_Upgrade_NoBlock_EVM2Sui - path: integration-tests/smoke/ccip/ccip_sui_upgrade_test.go - test_env_type: in-memory - runs_on_self_hosted: runs-on/cpu=16/ram=64/family=m6i+m5.*/spot=false/image=ubuntu24-full-x64/extras=s3-cache+tmpfs - triggers: - - PR Integration CCIP Tests - - Nightly Integration CCIP Tests - test_cmd: | - go test ./smoke/ccip -run "Test_CCIP_Upgrade_NoBlock_EVM2Sui" -timeout 25m -test.parallel=1 -count=1 -json - test_go_project_path: integration-tests - sui_cli_version: mainnet-1.60.1 - install_plugins_public: true - free_disk_space: true + # - id: smoke/ccip/ccip_sui_upgrade_test.go:Test_CCIP_Upgrade_NoBlock_EVM2Sui + # path: integration-tests/smoke/ccip/ccip_sui_upgrade_test.go + # test_env_type: in-memory + # runs_on_self_hosted: runs-on/cpu=16/ram=64/family=m6i+m5.*/spot=false/image=ubuntu24-full-x64/extras=s3-cache+tmpfs + # triggers: + # - PR Integration CCIP Tests + # - Nightly Integration CCIP Tests + # test_cmd: | + # go test ./smoke/ccip -run "Test_CCIP_Upgrade_NoBlock_EVM2Sui" -timeout 25m -test.parallel=1 -count=1 -json + # test_go_project_path: integration-tests + # sui_cli_version: mainnet-1.60.1 + # install_plugins_public: true + # free_disk_space: true # - id: smoke/ccip/ccip_sui_token_transfer_test.go:Test_CCIPPureTokenTransfer_EVM2SUI_BurnMintTokenPool # path: integration-tests/smoke/ccip/ccip_sui_token_transfer_test.go diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index bc6b7f39571..fbcbf755145 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -23,7 +23,7 @@ jobs: permissions: pull-requests: read outputs: - affected-modules: ${{ steps.resolved-modules.outputs.module_names }} + affected-modules: ${{ steps.changed-modules.outputs.modules-json }} # Runs on workflow changes, any deployment change, or any (non-ignored) core change should-run-deployment-tests: >- ${{ @@ -96,24 +96,9 @@ jobs: all: - '**' - - name: Resolve affected files to affected modules - id: resolved-modules - shell: bash - env: - GH_EVENT_NAME: ${{ github.event_name }} - run: | - # if scheduled, run for all modules (apart from the CRE workflow examples). Otherwise, run for only affected modules. - if [[ "$GH_EVENT_NAME" == "schedule" || "$GH_EVENT_NAME" == "workflow_dispatch" ]]; then - json_array=$(find . -name 'go.mod' -not -path './core/scripts/cre/environment/examples/workflows/*' -exec dirname {} \; | sed 's|^./||' | uniq | jq -R -s -c 'split("\n") | map(select(length > 0))') - echo "module_names=$json_array" >> "$GITHUB_OUTPUT" - else - # Ensure the step uses `with.list-files: json` to get the list of files in JSON format - bash ./.github/scripts/map-affected-files-to-modules.sh '${{ steps.match-every.outputs.all_files }}' '["core/scripts/cre/environment/examples/workflows"]' - fi - - name: Changed modules + id: changed-modules uses: smartcontractkit/.github/actions/changed-modules-go@changed-modules-go/v1 - continue-on-error: true # don't let this call affect the outcome of the job (during rollout) with: # when scheduled/workflow_dispatch, run against all modules no-change-behaviour: all @@ -160,7 +145,9 @@ jobs: go-directory: ${{ matrix.modules }} - name: Notify Slack - if: ${{ failure() && needs.run-frequency.outputs.one-per-day-frequency == 'true' }} + # Skip for now as it's always failing on scheduled runs + if: false + # if: ${{ failure() && needs.run-frequency.outputs.one-per-day-frequency == 'true' }} uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: method: chat.postMessage @@ -174,15 +161,40 @@ jobs: # Inclusive check: all (new) modules are analyzed, but no need to enable "required" checks for each one golangci-matrix-results-validation: name: lint - if: ${{ always() && needs.golangci.result != 'skipped' && !contains(join(github.event.pull_request.labels.*.name, ' '), 'allow-lint-issues') }} - needs: [golangci] + if: ${{ always() }} + needs: [filter, golangci] runs-on: ubuntu-latest steps: - name: Check Golangci-lint Matrix Results - if: ${{ needs.golangci.result != 'success' }} + env: + GOLANGCI_RESULT: ${{ needs.golangci.result }} + ALLOW_FAILURE: ${{ contains(join(github.event.pull_request.labels.*.name, ' '), 'allow-lint-issues') }} + SKIPPED: ${{ needs.filter.outputs.affected-modules == '[]' }} run: | - echo "At least one 'GolangCI Lint' matrix job failed. Check the failed lint jobs." - exit 1 + if [[ "${GOLANGCI_RESULT}" == "success" ]]; then + echo "All 'GolangCI Lint' matrix jobs succeeded." + exit 0 + fi + + if [[ "${GOLANGCI_RESULT}" == "skipped" || "${SKIPPED}" == "true" ]]; then + echo "'GolangCI Lint' jobs were skipped." + exit 0 + fi + + if [[ "${ALLOW_FAILURE}" == "true" ]]; then + echo "Some 'GolangCI Lint' matrix jobs failed, but failures are allowed due to 'allow-lint-issues' label." + exit 0 + fi + + if [[ "${GOLANGCI_RESULT}" == "cancelled" ]]; then + echo "'GolangCI Lint' jobs were cancelled." + exit 1 + fi + + if [[ "${GOLANGCI_RESULT}" == "failure" ]]; then + echo "'GolangCI Lint' matrix jobs had failures." + exit 1 + fi core: env: @@ -265,12 +277,12 @@ jobs: with: CLI_VERSION: 7.10.0 - - name: Setup Sui CLI v1.57.2 + - name: Setup Sui CLI v1.61.2 if: ${{ matrix.type.should-run == 'true' && matrix.type.setup-sui == 'true' }} uses: ./.github/actions/setup-sui with: github-token: ${{ secrets.GITHUB_TOKEN }} - version: mainnet-1.57.2 + version: mainnet-v1.61.2 - name: Setup wasmd if: ${{ matrix.type.should-run == 'true' }} diff --git a/CHANGELOG.md b/CHANGELOG.md index e346bc63d81..144d03bbd6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -146,6 +146,7 @@ - [#19667](https://github.com/smartcontractkit/chainlink/pull/19667) [`535a014`](https://github.com/smartcontractkit/chainlink/commit/535a014bef3a6a007ecf7fe8c2d9f21907e4d127) - #added Add Workflow Registry Chain Selector to CRE v2 registry events. + ## 2.30.1 - 2025-11-18 ### Patch Changes diff --git a/ccip/config/evm/fallback.toml b/ccip/config/evm/fallback.toml index 0ec8531ed31..01d0fa0b9e4 100644 --- a/ccip/config/evm/fallback.toml +++ b/ccip/config/evm/fallback.toml @@ -88,7 +88,7 @@ EnforceRepeatableRead = false DeathDeclarationDelay = '10s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 diff --git a/config_docs_test.go b/config_docs_test.go index fc0321f453e..c9576cf10cd 100644 --- a/config_docs_test.go +++ b/config_docs_test.go @@ -19,8 +19,7 @@ var ( func TestConfigDocs(t *testing.T) { config, err := docs.GenerateConfig() assert.NoError(t, err, "invalid config docs") - assert.Equal(t, configMD, config, "docs/CONFIG.md is out of date. Run '"+ - "' to regenerate.") + assert.Equal(t, configMD, config, "docs/CONFIG.md is out of date. Run 'make config-docs' to regenerate.") secrets, err := docs.GenerateSecrets() assert.NoError(t, err, "invalid secrets docs") diff --git a/core/cmd/shell_local_test.go b/core/cmd/shell_local_test.go index 6d7cd256685..21acc4372f0 100644 --- a/core/cmd/shell_local_test.go +++ b/core/cmd/shell_local_test.go @@ -506,6 +506,7 @@ func TestShell_RemoveBlocks(t *testing.T) { } func TestShell_BeforeNode(t *testing.T) { + testutils.SkipShortDB(t) tests := []struct { name string pwdfile string diff --git a/core/config/docs/chains-evm.toml b/core/config/docs/chains-evm.toml index 79ccee56d56..93d97cdc28d 100644 --- a/core/config/docs/chains-evm.toml +++ b/core/config/docs/chains-evm.toml @@ -483,7 +483,7 @@ VerifyChainID = true # Default # Only CRE workflow requests are considered external requests. # Only applies for RPCs configured with HTTP urls. There is no limit for WS only RPCs. # Set to 0 to disable the size check and allow responses of any size. -ExternalRequestMaxResponseSize = 50000 # Default +ExternalRequestMaxResponseSize = 1000000 # Default # **ADVANCED** # Errors enable the node to provide custom regex patterns to match against error messages from RPCs. [EVM.NodePool.Errors] diff --git a/core/config/docs/core.toml b/core/config/docs/core.toml index 5cd4fa720d2..72e4cf1f2af 100644 --- a/core/config/docs/core.toml +++ b/core/config/docs/core.toml @@ -403,6 +403,8 @@ DefaultTransactionQueueDepth = 1 # Default SimulateTransactions = false # Default # TraceLogging enables trace level logging. TraceLogging = false # Default +# SampleTelemetry enables telemetry sampling. +SampleTelemetry = false # Default # KeyValueStoreRootDir is the root directory for the key-value store used by OCR3.1. # This directory must be writable by the Chainlink node process and should support long-term persistence. KeyValueStoreRootDir = '~/.chainlink-data' # Default diff --git a/core/config/ocr2_config.go b/core/config/ocr2_config.go index 6c9998ecdd0..a721fde5509 100644 --- a/core/config/ocr2_config.go +++ b/core/config/ocr2_config.go @@ -17,6 +17,7 @@ type OCR2 interface { KeyBundleID() (string, error) // OCR2 config, cannot override in jobs TraceLogging() bool + SampleTelemetry() bool CaptureEATelemetry() bool DefaultTransactionQueueDepth() uint32 SimulateTransactions() bool diff --git a/core/config/toml/types.go b/core/config/toml/types.go index 489e1c9ab3e..74800fcb5a5 100644 --- a/core/config/toml/types.go +++ b/core/config/toml/types.go @@ -1349,6 +1349,7 @@ type OCR2 struct { DefaultTransactionQueueDepth *uint32 SimulateTransactions *bool TraceLogging *bool + SampleTelemetry *bool KeyValueStoreRootDir *string } @@ -1395,6 +1396,9 @@ func (o *OCR2) setFrom(f *OCR2) { if v := f.TraceLogging; v != nil { o.TraceLogging = v } + if v := f.SampleTelemetry; v != nil { + o.SampleTelemetry = v + } if v := f.KeyValueStoreRootDir; v != nil { o.KeyValueStoreRootDir = v } diff --git a/core/scripts/cre/environment/configs/workflow-don.toml b/core/scripts/cre/environment/configs/workflow-don.toml index 626e892adb4..63826a37821 100755 --- a/core/scripts/cre/environment/configs/workflow-don.toml +++ b/core/scripts/cre/environment/configs/workflow-don.toml @@ -70,7 +70,7 @@ [nodesets.chain_capabilities] write-evm = ["1337", "2337"] read-contract = ["1337", "2337"] - evm = ["1337"] + evm = ["1337", "2337"] # See ./examples/workflow-don-overrides.toml to learn how to override capability configs diff --git a/core/scripts/cre/environment/configs/workflow-gateway-capabilities-don.toml b/core/scripts/cre/environment/configs/workflow-gateway-capabilities-don.toml index 39b8d90c888..763e55e45b0 100644 --- a/core/scripts/cre/environment/configs/workflow-gateway-capabilities-don.toml +++ b/core/scripts/cre/environment/configs/workflow-gateway-capabilities-don.toml @@ -42,13 +42,18 @@ override_mode = "each" http_port_range_start = 10100 + # even though this DON is not using any capability for chain with ID 2337 we still need it to be connected to it, + # because bootstrap job for capability DON will be created on the boostrap node from this DON + supported_evm_chains = [1337, 2337] + env_vars = { CL_EVM_CMD = "" } capabilities = ["ocr3", "custom-compute", "web-api-trigger", "cron", "http-action", "http-trigger", "consensus", "don-time"] [nodesets.chain_capabilities] - # we want to write only to the home chain, so that we can test whether remote write-evm-2337 capability of the 'capabilities DON' is used + # we want to write only to the home chain, so that we can test whether remote capabilities of the 'capabilities DON' are used write-evm = ["1337"] read-contract = ["1337"] + evm = ["1337"] # See ./examples/workflow-don-overrides.toml to learn how to override capability configs @@ -108,13 +113,17 @@ override_mode = "all" http_port_range_start = 10200 + # we need to have chain 1337 configured (even if no capability uses it), because we use node addresses on chain 1337 + # to identify nodes in the gateway configuration (required by both web-api-target and vault capabilities) + supported_evm_chains = [1337, 2337] + env_vars = { CL_EVM_CMD = "" } capabilities = ["web-api-target","vault"] [nodesets.chain_capabilities] write-evm = ["2337"] read-contract = ["2337"] - evm = ["1337"] + evm = ["2337"] [nodesets.db] image = "postgres:12.0" diff --git a/core/scripts/cre/environment/configs/workflow-gateway-don.toml b/core/scripts/cre/environment/configs/workflow-gateway-don.toml index 383281ac6b6..023b2c09e90 100644 --- a/core/scripts/cre/environment/configs/workflow-gateway-don.toml +++ b/core/scripts/cre/environment/configs/workflow-gateway-don.toml @@ -48,7 +48,7 @@ [nodesets.chain_capabilities] write-evm = ["1337", "2337"] read-contract = ["1337", "2337"] - evm = ["1337"] + evm = ["1337", "2337"] # See ./examples/workflow-don-overrides.toml to learn how to override capability configs diff --git a/core/scripts/cre/environment/environment/environment.go b/core/scripts/cre/environment/environment/environment.go index 81a1dcdd4e2..2a106d062fc 100644 --- a/core/scripts/cre/environment/environment/environment.go +++ b/core/scripts/cre/environment/environment/environment.go @@ -70,11 +70,6 @@ var ( ) const ( - TopologyWorkflow = "workflow" - TopologyWorkflowGateway = "workflow-gateway" - TopologyWorkflowGatewayCapabilities = "workflow-gateway-capabilities" - TopologyMock = "mock" - WorkflowTriggerWebTrigger = "web-trigger" WorkflowTriggerCron = "cron" ) @@ -243,6 +238,7 @@ func startCmd() *cobra.Command { cleanupWait time.Duration withBeholder bool withDashboards bool + withObs bool withBilling bool setupConfig SetupConfig ) @@ -386,6 +382,13 @@ func startCmd() *cobra.Command { } } + if withObs { + if err := framework.ObservabilityUpFull(); err != nil { + return fmt.Errorf("failed to start ctf observability stack: %w", err) + } + fmt.Print(libformat.PurpleText("\nObservability stack started successfully\n")) + } + if withDashboards { err := setupDashboards(setupConfig) if err != nil { @@ -478,6 +481,7 @@ func startCmd() *cobra.Command { cmd.Flags().StringVarP(&exampleWorkflowTrigger, "example-workflow-trigger", "y", "web-trigger", "Trigger for example workflow to deploy (web-trigger or cron)") cmd.Flags().BoolVarP(&withBeholder, "with-beholder", "b", false, "Deploy Beholder (Chip Ingress + Red Panda)") cmd.Flags().BoolVarP(&withDashboards, "with-dashboards", "d", false, "Deploy Observability Stack and Grafana Dashboards") + cmd.Flags().BoolVar(&withObs, "with-observability", false, "Start Observability Stack") cmd.Flags().BoolVar(&withBilling, "with-billing", false, "Deploy Billing Platform Service") cmd.Flags().BoolVarP(&doSetup, "auto-setup", "a", false, "Run setup before starting the environment") cmd.Flags().StringVar(&withContractsVersion, "with-contracts-version", "v1", "Version of workflow and capabilities registry contracts to use (v1 or v2)") @@ -491,33 +495,31 @@ func setupDashboards(setupCfg SetupConfig) error { return errors.Wrap(cfgErr, "failed to read config") } - // Run the `ctf obs up -f` command from the ./bin directory - ctfCmd := exec.Command("./bin/ctf", "obs", "up", "-f") - - obsOutput, err := ctfCmd.CombinedOutput() - if err != nil { - fmt.Fprintf(os.Stderr, "Error: %s\n", err) - return errors.Wrap(err, "failed to start ctf observability stack: "+string(obsOutput)) - } - - fmt.Print(libformat.PurpleText("\nObservabilty stack setup completed successfully\n")) - // Wait for grafana at localhost:3000 to be available - fmt.Print(libformat.PurpleText("\nWaiting for Grafana to be available at http://localhost:3000\n")) - grafanaContacted := false - for range 30 { - time.Sleep(1 * time.Second) - req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://localhost:3000", nil) - _, err = http.DefaultClient.Do(req) - if err != nil { - continue + var isGrafanaUp = func() bool { + for range 30 { + time.Sleep(1 * time.Second) + req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://localhost:3000", nil) + _, err := http.DefaultClient.Do(req) + if err != nil { + continue + } + return true } - grafanaContacted = true - break + + return false } - if !grafanaContacted { - return errors.New("timed out waiting for Grafana to be available at http://localhost:3000") + // if Grafana isn't running start it + if !isGrafanaUp() { + if err := framework.ObservabilityUpFull(); err != nil { + return fmt.Errorf("failed to start ctf observability stack: %w", err) + } + fmt.Print(libformat.PurpleText("\nWaiting for Grafana to be available at http://localhost:3000\n")) + if !isGrafanaUp() { + return errors.New("timed out waiting for Grafana to be available at http://localhost:3000") + } + fmt.Print(libformat.PurpleText("\nObservabilty stack setup completed successfully\n")) } targetPath := cfg.Observability.TargetPath @@ -532,10 +534,12 @@ func setupDashboards(setupCfg SetupConfig) error { // Check the file exists before trying to run the script scriptPath := filepath.Join(targetPath, "deploy-cre-local.sh") - if _, err = os.Stat(scriptPath); os.IsNotExist(err) { - return errors.New("deploy-cre-local.sh script does not exist, ensure the setup command has been run") + if _, err := os.Stat(scriptPath); os.IsNotExist(err) { + return fmt.Errorf("%s script does not exist, ensure the setup command has been run", scriptPath) } + fmt.Print(libformat.PurpleText("\nDeploying dashboards...") + "\n(watch for potential authorization requests!)\n") + deployDashboardsCmd := exec.Command("./deploy-cre-local.sh") deployDashboardsCmd.Dir = targetPath deployOutput, err := deployDashboardsCmd.CombinedOutput() @@ -597,12 +601,17 @@ func stopCmd() *cobra.Command { if allFlag { stopBeholderErr := stopBeholder() if stopBeholderErr != nil { - return errors.Wrap(stopBeholderErr, "failed to stop beholder") + framework.L.Warn().Msgf("failed to stop Beholder: %s", stopBeholderErr) } stopBillingErr := stopBilling() if stopBillingErr != nil { - return errors.Wrap(stopBillingErr, "failed to stop billing") + framework.L.Warn().Msgf("failed to stop Billing: %s", stopBillingErr) + } + + stopObsStack := framework.ObservabilityDown() + if stopObsStack != nil { + framework.L.Warn().Msgf("failed to stop observability stack: %s", stopObsStack) } removeCacheErr := envconfig.RemoveAllEnvironmentStateDir(relativePathToRepoRoot) diff --git a/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.mod b/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.mod index 001df3b99d9..e6d0ebb944e 100644 --- a/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.mod +++ b/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.mod @@ -4,7 +4,6 @@ go 1.25.5 require ( github.com/ethereum/go-ethereum v1.16.2 - github.com/smartcontractkit/chain-selectors v1.0.67 github.com/smartcontractkit/chainlink-common v0.9.6-0.20251028192540-2ac3c24aa883 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022073203-7d8ae8cf67c1 github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8 diff --git a/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.sum b/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.sum index db28c365717..004b0e8a61b 100644 --- a/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.sum +++ b/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/go.sum @@ -227,8 +227,6 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= -github.com/smartcontractkit/chain-selectors v1.0.67 h1:gxTqP/JC40KDe3DE1SIsIKSTKTZEPyEU1YufO1admnw= -github.com/smartcontractkit/chain-selectors v1.0.67/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-common v0.9.6-0.20251028192540-2ac3c24aa883 h1:MbuTvXfQtde3qsynoMSC9tP8fRpqUoaAfZtT0mpXVgg= github.com/smartcontractkit/chainlink-common v0.9.6-0.20251028192540-2ac3c24aa883/go.mod h1:al5VNrscTtWnxJaYJN6E3jixY17CvazC4VA6rOpLEHI= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022073203-7d8ae8cf67c1 h1:NTODgwAil7BLoijS7y6KnEuNbQ9v60VUhIR9FcAzIhg= diff --git a/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/main.go b/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/main.go index 338f1eeca22..916dd4773b8 100644 --- a/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/main.go +++ b/core/scripts/cre/environment/examples/workflows/v2/proof-of-reserve/cron-based/main.go @@ -15,8 +15,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" - chain_selectors "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink-protos/cre/go/values" "github.com/smartcontractkit/cre-sdk-go/capabilities/blockchain/evm" @@ -43,7 +41,7 @@ func onTrigger(config types.WorkflowConfig, runtime cre.Runtime, payload *cron.P runtime.Logger().Info("PoR workflow started", "payload", payload) // get balance with BalanceAt() - evmClient := evm.Client{ChainSelector: chain_selectors.GETH_TESTNET.Selector} + evmClient := evm.Client{ChainSelector: config.ChainSelector} runtime.Logger().Info("Got EVM client", "chainSelector", evmClient.ChainSelector) addressesToRead := config.BalanceReaderConfig.AddressesToRead runtime.Logger().Info("Got addresses to read", "addresses", addressesToRead) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index cfd833a880f..a9ea42ed5c7 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -47,10 +47,10 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 - github.com/smartcontractkit/chainlink-data-streams v0.1.6 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 + github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 @@ -492,11 +492,11 @@ require ( github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251127040717-30244f57ea7a // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 // indirect - github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 // indirect + github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 // indirect github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 // indirect @@ -508,8 +508,8 @@ require ( github.com/smartcontractkit/chainlink-protos/svr v1.1.0 // indirect github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 // indirect - github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c // indirect - github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c // indirect + github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c // indirect + github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c // indirect github.com/smartcontractkit/chainlink-testing-framework/framework/components/fake v0.10.0 // indirect github.com/smartcontractkit/chainlink-testing-framework/parrot v0.6.2 // indirect github.com/smartcontractkit/chainlink-ton v0.0.0-20251128154102-ae6a4d19188f // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 428e269c48e..6430a2e0a63 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1632,28 +1632,28 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e h1:hQEOz6nRQgIQf0HS3EsjS22cAwejLa6q4nCyFGYrb/s= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 h1:sdBNurxM3XEsclOJVSqyqM+WKV/rw/2ykgCeIox4YT0= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1/go.mod h1:Dspcf1LYGPDvgUKO09kqfexFvnOFbKfoGz02VwHpuw4= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 h1:2LHrlWAStA2oRcDKrJ9lKOShC9an2Pkis2BwY8J7gDw= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 h1:0IMjHpzI9mgvGGtmsr1NdRhoXp++gU805f/f9oN94ls= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599/go.mod h1:Ysd/qkofD0bepk29RS7Q4ZlVDd4yAHXucYsp5gAy6AE= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 h1:b8aHhus/+bikhHlR5+Ll4Z0hsczJPA0hEj68/8+xyXs= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7/go.mod h1:yaDOAZF6MNB+NGYpxGCUc+owIdKrjvFW0JODdTcQ3V0= -github.com/smartcontractkit/chainlink-data-streams v0.1.6 h1:B3cwmJrVYoJVAjPOyQWTNaGD+V30HI1vFHhC2dQpWDo= -github.com/smartcontractkit/chainlink-data-streams v0.1.6/go.mod h1:e9jETTzrVO8iu9Zp5gDuTCmBVhSJwUOk6K4Q/VFrJ6o= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 h1:gU4suSMid2uQVSxdtPhqGR9s9w3ViclcGtwkQaNbrtM= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19/go.mod h1:GPsn6PKJvPe1UfRYyVxsDzOWq6NILzBstiiLq/w+kG0= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 h1:wo2KL2viGZK/LhHLM8F88sRyhZF9wwWh+YDzW8hS00g= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0/go.mod h1:Cp7PuO7HUDugp7bWGP/TcDAvvvkFLdKOVrSm0zXlnhg= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb h1:/oWqkc0mU63UNydxUiRZTv+ZYRzGF+9WHrpbuxDTBtY= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb/go.mod h1:OQCmZCKnOiNp7LVbHAr6xZ9SThAU7jx5uI+aCvLOn1Q= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec h1:K8sLjgwPgozQb86LH+aWXqBUJak6VGwSt5YiKbCI/uY= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec/go.mod h1:9VcrUs+H/f9ekkqAdfUd70Pk2dA1Zc3KykJVFBfJNHs= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b h1:Dqhm/67Sb1ohgce8FW6tnK1CRXo2zoLCbV+EGyew5sg= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b/go.mod h1:oyfOm4k0uqmgZIfxk1elI/59B02shbbJQiiUdPdbMgI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 h1:ACpDbAxG4fa4sA83dbtYcrnlpE/y7thNIZfHxTv2ZLs= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 h1:Mf+IRvrXutcKAKpuOxq5Ae+AAw4Z5vc66q1xI7qimZQ= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= @@ -1682,10 +1682,10 @@ github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331- github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 h1:4cvFf82P3VcNHgqUG0aRBeIMZd+wSX37ha28Gkie9Lk= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6/go.mod h1:zX8dX6aXjJNkfbpr1AiTzCioma0sHh5CBPZKtqC7plY= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c h1:M+LA7CVnz4R9A9ZxPz4jcNjGNw50HYR4cNl+PLvQynA= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c h1:AY6zMBsk8Y+woOfT5LiiODloohDCtSj8FyR/iEvGmP0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c h1:aNA7J31EuOf755BDgNuhxte5+Z6wucBx/ONGihw2OqA= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c h1:uV+yJbVYI5RoTNFSh/tDflWDXJtRk8Yrp0m1VgTy6ro= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3OrOQfLubJ+os0/oau2V6RISgsEdBg+Q002zkgXpQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.17 h1:rOYrH9lx2nXyqtvpuTq50RlW5VtplJFWtXD6cf7uEWc= diff --git a/core/services/ccv/ccvcommitteeverifier/delegate.go b/core/services/ccv/ccvcommitteeverifier/delegate.go index 853e5bfc029..c974129c0c8 100644 --- a/core/services/ccv/ccvcommitteeverifier/delegate.go +++ b/core/services/ccv/ccvcommitteeverifier/delegate.go @@ -16,7 +16,8 @@ import ( "github.com/smartcontractkit/chainlink-ccv/integration/pkg/constructors" "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-ccv/protocol/common/hmac" - "github.com/smartcontractkit/chainlink-ccv/verifier" + "github.com/smartcontractkit/chainlink-ccv/verifier/commit" + "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink/v2/core/config" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -36,14 +37,16 @@ type Delegate struct { // TODO: EVM specific (!) chainServices []commontypes.ChainService ocrKs keystore.OCR2 + ds sqlutil.DataSource isNewlyCreatedJob bool } -func NewDelegate(lggr logger.Logger, ccvConfig config.CCV, ocrKs keystore.OCR2, chainServices []commontypes.ChainService) *Delegate { +func NewDelegate(lggr logger.Logger, ds sqlutil.DataSource, ccvConfig config.CCV, ocrKs keystore.OCR2, chainServices []commontypes.ChainService) *Delegate { return &Delegate{ delegateLogger: lggr.Named("CCVCommitteeVerifierDelegate"), lggr: lggr, + ds: ds, ccvConfig: ccvConfig, chainServices: chainServices, ocrKs: ocrKs, @@ -61,7 +64,7 @@ func (d *Delegate) BeforeJobCreated(spec job.Job) { func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services []job.ServiceCtx, err error) { d.delegateLogger.Infow("Creating services for CCV committee verifier job", "jobID", spec.ID) - var decodedCfg verifier.Config + var decodedCfg commit.Config err = toml.Unmarshal([]byte(spec.CCVCommitteeVerifierSpec.CommitteeVerifierConfig), &decodedCfg) if err != nil { return nil, fmt.Errorf("failed to unmarshal committeeVerifierConfig into the verifier config struct: %w", err) @@ -139,6 +142,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services common.HexToAddress(decodedCfg.SignerAddress).Bytes(), newSignerAdapter(signingKey), legacyChains, + d.ds, ) if err != nil { return nil, fmt.Errorf("failed to create verification coordinator: %w", err) diff --git a/core/services/ccv/ccvcommitteeverifier/validate.go b/core/services/ccv/ccvcommitteeverifier/validate.go index 064b355ab28..950154ca2f3 100644 --- a/core/services/ccv/ccvcommitteeverifier/validate.go +++ b/core/services/ccv/ccvcommitteeverifier/validate.go @@ -6,7 +6,7 @@ import ( "github.com/pelletier/go-toml" - "github.com/smartcontractkit/chainlink-ccv/verifier" + "github.com/smartcontractkit/chainlink-ccv/verifier/commit" "github.com/smartcontractkit/chainlink/v2/core/services/job" ) @@ -35,7 +35,7 @@ func ValidatedCCVCommitteeVerifierSpec(tomlString string) (jb job.Job, err error return job.Job{}, errors.New("committeeVerifierConfig must be set") } - var cfg verifier.Config + var cfg commit.Config err = toml.Unmarshal([]byte(jb.CCVCommitteeVerifierSpec.CommitteeVerifierConfig), &cfg) if err != nil { return job.Job{}, fmt.Errorf("failed to unmarshal committeeVerifierConfig into the verifier config struct: %w", err) diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go index 45fa5ba74e0..220e6ad4650 100644 --- a/core/services/chainlink/application.go +++ b/core/services/chainlink/application.go @@ -18,6 +18,7 @@ import ( "github.com/google/uuid" "github.com/grafana/pyroscope-go" "github.com/jonboulle/clockwork" + "github.com/pelletier/go-toml/v2" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel" @@ -50,11 +51,13 @@ import ( "github.com/smartcontractkit/chainlink-evm/pkg/logpoller" "github.com/smartcontractkit/chainlink-evm/pkg/txmgr" evmutils "github.com/smartcontractkit/chainlink-evm/pkg/utils" + "github.com/smartcontractkit/chainlink/v2/core/services/ccv/ccvcommitteeverifier" "github.com/smartcontractkit/chainlink/v2/core/services/ccv/ccvexecutor" "github.com/smartcontractkit/chainlink/v2/core/services/cresettings" "github.com/smartcontractkit/chainlink-common/pkg/services/orgresolver" + "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/build" "github.com/smartcontractkit/chainlink/v2/core/capabilities" @@ -265,6 +268,12 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err if opts.DonTimeStore == nil { opts.DonTimeStore = dontime.NewStore(dontime.DefaultRequestTimeout) } + + creSettingsTOML, err := toml.Marshal(commoncresettings.Default) + if err != nil { + return nil, fmt.Errorf("failed to marshal cre settings TOML: %w", err) + } + globalLogger.Debugf("# CRESettings defaults: \n%s", creSettingsTOML) atomicSettings := loop.NewAtomicSettings(commoncresettings.DefaultGetter) limitsFactory := limits.Factory{ Meter: beholder.GetMeter(), @@ -618,6 +627,7 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err ), job.CCVCommitteeVerifier: ccvcommitteeverifier.NewDelegate( globalLogger, + opts.DS, cfg.CCV(), keyStore.OCR2(), relayChainInterops.LegacyEVMChains().Slice(), diff --git a/core/services/chainlink/config_ocr2.go b/core/services/chainlink/config_ocr2.go index 2d1e6c8c16d..15d9387bf2c 100644 --- a/core/services/chainlink/config_ocr2.go +++ b/core/services/chainlink/config_ocr2.go @@ -53,6 +53,10 @@ func (o *ocr2Config) TraceLogging() bool { return *o.c.TraceLogging } +func (o *ocr2Config) SampleTelemetry() bool { + return *o.c.SampleTelemetry +} + func (o *ocr2Config) CaptureEATelemetry() bool { return *o.c.CaptureEATelemetry } diff --git a/core/services/chainlink/config_ocr2_test.go b/core/services/chainlink/config_ocr2_test.go index 9059ad2257d..ebaef4e7f0b 100644 --- a/core/services/chainlink/config_ocr2_test.go +++ b/core/services/chainlink/config_ocr2_test.go @@ -36,6 +36,7 @@ func TestOCR2Config(t *testing.T) { require.Equal(t, expectedContractSubscribeInterval, ocr2Cfg.ContractSubscribeInterval()) require.False(t, ocr2Cfg.SimulateTransactions()) require.False(t, ocr2Cfg.TraceLogging()) + require.False(t, ocr2Cfg.SampleTelemetry()) require.Equal(t, uint32(1), ocr2Cfg.DefaultTransactionQueueDepth()) require.False(t, ocr2Cfg.CaptureEATelemetry()) require.True(t, ocr2Cfg.CaptureAutomationCustomTelemetry()) diff --git a/core/services/chainlink/config_test.go b/core/services/chainlink/config_test.go index e153682669d..c6a5fa5f770 100644 --- a/core/services/chainlink/config_test.go +++ b/core/services/chainlink/config_test.go @@ -438,6 +438,7 @@ func TestConfig_Marshal(t *testing.T) { DefaultTransactionQueueDepth: ptr[uint32](1), SimulateTransactions: ptr(false), TraceLogging: ptr(false), + SampleTelemetry: ptr(false), KeyValueStoreRootDir: ptr("~/.chainlink-data"), } full.OCR = toml.OCR{ @@ -1129,6 +1130,7 @@ AllowNoBootstrappers = true DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' `}, {"JobDistributor", Config{Core: toml.Core{JobDistributor: full.JobDistributor}}, `[JobDistributor] diff --git a/core/services/chainlink/testdata/config-empty-effective.toml b/core/services/chainlink/testdata/config-empty-effective.toml index 3864ab119c2..d090b8d15e9 100644 --- a/core/services/chainlink/testdata/config-empty-effective.toml +++ b/core/services/chainlink/testdata/config-empty-effective.toml @@ -161,6 +161,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] diff --git a/core/services/chainlink/testdata/config-full.toml b/core/services/chainlink/testdata/config-full.toml index d525399823d..b2f2447b804 100644 --- a/core/services/chainlink/testdata/config-full.toml +++ b/core/services/chainlink/testdata/config-full.toml @@ -167,6 +167,7 @@ AllowNoBootstrappers = true DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] diff --git a/core/services/chainlink/testdata/config-multi-chain-effective.toml b/core/services/chainlink/testdata/config-multi-chain-effective.toml index 61bfc1f9e25..c93130eb868 100644 --- a/core/services/chainlink/testdata/config-multi-chain-effective.toml +++ b/core/services/chainlink/testdata/config-multi-chain-effective.toml @@ -161,6 +161,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -485,7 +486,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 @@ -608,7 +609,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 @@ -725,7 +726,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/core/services/feeds/config.go b/core/services/feeds/config.go index fe3fa9f3577..4481eefbb89 100644 --- a/core/services/feeds/config.go +++ b/core/services/feeds/config.go @@ -4,6 +4,7 @@ import ( "time" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + coreconfig "github.com/smartcontractkit/chainlink/v2/core/config" ) @@ -42,4 +43,5 @@ type OCR2Config interface { DefaultTransactionQueueDepth() uint32 SimulateTransactions() bool TraceLogging() bool + SampleTelemetry() bool } diff --git a/core/services/llo/delegate.go b/core/services/llo/delegate.go index 40391ede32e..28b82f161cd 100644 --- a/core/services/llo/delegate.go +++ b/core/services/llo/delegate.go @@ -72,6 +72,7 @@ type DelegateConfig struct { // OCR3 TraceLogging bool + SampleTelemetry bool BinaryNetworkEndpointFactory ocr2types.BinaryNetworkEndpointFactory V2Bootstrappers []ocrcommontypes.BootstrapperLocator // One Oracle will be started for each ContractConfigTracker @@ -118,6 +119,7 @@ func NewDelegate(cfg DelegateConfig) (job.ServiceCtx, error) { CaptureObservationTelemetry: cfg.CaptureObservationTelemetry, CaptureOutcomeTelemetry: cfg.CaptureOutcomeTelemetry, CaptureReportTelemetry: cfg.CaptureReportTelemetry, + SampleTelemetry: cfg.SampleTelemetry, }) ds := observation.NewDataSource( diff --git a/core/services/llo/telem/sampling.go b/core/services/llo/telem/sampling.go new file mode 100644 index 00000000000..049a161c068 --- /dev/null +++ b/core/services/llo/telem/sampling.go @@ -0,0 +1,179 @@ +package telem + +import ( + "context" + "encoding/hex" + "errors" + "strconv" + "strings" + "sync" + "time" + + "google.golang.org/protobuf/proto" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-data-streams/llo" + + "github.com/smartcontractkit/chainlink/v2/core/services/synchronization" +) + +const ( + defaultPrunePeriod = 10 * time.Second + + samplerDelimiter = "-" +) + +var errUnsupportedTelemetryType = errors.New("unsupported telemetry type") + +// sampler keeps track of what kind of telemetry has already been sent to the collection point and decides whether the +// next telemetry package will be sent or dropped. +type sampler struct { + // samples keeps track of the telemetry samples we've already sent (or approved for sending). + // The format is `map[fingerprint][observation timestamp in seconds]any`. We intentionally use int32 because it's + // enough for seconds but not enough for nanos, so we can't mix them up. + samples map[string]map[int32]any + samplesMu sync.Mutex + + enabled bool + prunePeriod time.Duration // exists, so we can test pruning + lggr logger.Logger +} + +func newSampler(lgger logger.SugaredLogger, samplingEnabled bool) *sampler { + return &sampler{ + samples: make(map[string]map[int32]any), + enabled: samplingEnabled, + prunePeriod: defaultPrunePeriod, + lggr: lgger, + } +} + +// Sample is the method which decides whether we're going to send the data downstream or not. +func (s *sampler) Sample(typ synchronization.TelemetryType, msg proto.Message) bool { + // If sampling is not enabled we want to send each and every telemetry message, so always return true. + if !s.enabled { + return true + } + + fp, ots, err := fingerprint(typ, msg) + if err != nil { + if !errors.Is(err, errUnsupportedTelemetryType) { + s.lggr.Warnw("Couldn't determine fingerprint", "type", typ, "err", err) + } + return true + } + + s.samplesMu.Lock() + defer s.samplesMu.Unlock() + // Do we have any records for this fingerprint? + if _, ok := s.samples[fp]; !ok { + s.samples[fp] = make(map[int32]any) + } + // Do we already have a record for this fingerprint and this second? + if _, ok := s.samples[fp][ots]; !ok { + s.samples[fp][ots] = struct{}{} + return true + } + // We already have a record, and we don't need to send another one. + return false +} + +// StartPruningLoop starts a regular check routine which removes old entries from the sampling records. +// +// This method is non-blocking. It starts a goroutine and returns. +func (s *sampler) StartPruningLoop(ctx context.Context, wg *sync.WaitGroup) { + // We don't need pruning if sampling is not enabled. + if !s.enabled { + return + } + + wg.Add(1) + go func() { + defer wg.Done() + t := time.NewTicker(s.prunePeriod) + defer t.Stop() + + for { + select { + case <-t.C: + s.pruneStorage() + case <-ctx.Done(): + return + } + } + }() +} + +// pruneStorage removes all records which are older than a predefined period (s.prunePeriod). +func (s *sampler) pruneStorage() { + s.samplesMu.Lock() + defer s.samplesMu.Unlock() + + cutoff := int32(time.Now().Add(-s.prunePeriod).Unix()) //nolint:gosec // G115 + for _, ots := range s.samples { + for ts := range ots { + if ts < cutoff { + delete(ots, ts) + } + } + } +} + +// fingerprint combines unique characteristics of each supported telemetry report type and constructs a string +// fingerprint of it. It returns the fingerprint, together with an observation timestamp in seconds. +// TODO improve encoding efficiency by switching from string to hex([]byte) or string([]byte). +func fingerprint(typ synchronization.TelemetryType, msg proto.Message) (string, int32, error) { + switch typ { + case synchronization.LLOObservation: + m, ok := msg.(*LLOObservationTelemetry) + if !ok || m == nil { + return "", 0, errors.New("invalid telemetry type, expected LLOObservation") + } + traits := []string{ + strconv.FormatUint(uint64(m.DonId), 10), + strconv.FormatUint(uint64(m.GetStreamId()), 10), + hex.EncodeToString(m.ConfigDigest), + } + return strings.Join(traits, samplerDelimiter), nanosToSec(m.ObservationTimestamp), nil + case synchronization.LLOOutcome: + m, ok := msg.(*llo.LLOOutcomeTelemetry) + if !ok || m == nil { + return "", 0, errors.New("invalid telemetry type, expected LLOOutcomeTelemetry") + } + traits := []string{ + strconv.FormatUint(uint64(m.DonId), 10), + hex.EncodeToString(m.ConfigDigest), + } + return strings.Join(traits, samplerDelimiter), nanosToSec(int64(m.ObservationTimestampNanoseconds)), nil //nolint:gosec // G115 + case synchronization.LLOReport: + m, ok := msg.(*llo.LLOReportTelemetry) + if !ok || m == nil { + return "", 0, errors.New("invalid telemetry type, expected LLOReportTelemetry") + } + traits := []string{ + strconv.FormatUint(uint64(m.DonId), 10), + strconv.FormatUint(uint64(m.ChannelId), 10), + hex.EncodeToString(m.ConfigDigest), + } + return strings.Join(traits, samplerDelimiter), nanosToSec(int64(m.ObservationTimestampNanoseconds)), nil //nolint:gosec // G115 + case synchronization.PipelineBridge: + m, ok := msg.(*LLOBridgeTelemetry) + if !ok || m == nil { + return "", 0, errors.New("invalid telemetry type, expected LLOBridgeTelemetry") + } + traits := []string{ + strconv.FormatUint(uint64(m.DonId), 10), + strconv.FormatUint(uint64(m.GetStreamId()), 10), + strconv.FormatUint(uint64(m.SpecId), 10), //nolint:gosec // G115 + m.BridgeAdapterName, + hex.EncodeToString(m.ConfigDigest), + } + return strings.Join(traits, samplerDelimiter), nanosToSec(m.ObservationTimestamp), nil + default: + return "", 0, errUnsupportedTelemetryType + } +} + +func nanosToSec(n int64) int32 { + return int32(n / int64(time.Second)) //nolint:gosec // G115 +} diff --git a/core/services/llo/telem/sampling_test.go b/core/services/llo/telem/sampling_test.go new file mode 100644 index 00000000000..804a87dda2c --- /dev/null +++ b/core/services/llo/telem/sampling_test.go @@ -0,0 +1,227 @@ +package telem + +import ( + "context" + "crypto/sha256" + "fmt" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-data-streams/llo" + + "github.com/smartcontractkit/chainlink/v2/core/services/synchronization" +) + +func TestFingerprint(t *testing.T) { + t.Parallel() + + ot := time.Now() + bytes32 := sha256.Sum256([]byte(ot.String())) + configDigest := bytes32[:] + donID := uint32(2) + streamID := uint32(123) + channelID := uint32(234) + + tests := []struct { + name string + msg proto.Message + typ synchronization.TelemetryType + fingerprint string + ts int32 + err error + }{ + { + name: "successful observation", + msg: &LLOObservationTelemetry{ + DonId: donID, + StreamId: streamID, + ConfigDigest: configDigest, + ObservationTimestamp: ot.UnixNano(), + }, + typ: synchronization.LLOObservation, + fingerprint: fmt.Sprintf("%d-%d-%x", donID, streamID, configDigest), + ts: int32(ot.Unix()), //nolint:gosec // G115 + err: nil, + }, + { + name: "successful outcome", + msg: &llo.LLOOutcomeTelemetry{ + DonId: donID, + ConfigDigest: configDigest, + ObservationTimestampNanoseconds: uint64(ot.UnixNano()), //nolint:gosec // G115 + }, + typ: synchronization.LLOOutcome, + fingerprint: fmt.Sprintf("%d-%x", donID, configDigest), + ts: int32(ot.Unix()), //nolint:gosec // G115 + err: nil, + }, + { + name: "successful report", + msg: &llo.LLOReportTelemetry{ + DonId: donID, + ChannelId: channelID, + ConfigDigest: configDigest, + ObservationTimestampNanoseconds: uint64(ot.UnixNano()), //nolint:gosec // G115 + }, + typ: synchronization.LLOReport, + fingerprint: fmt.Sprintf("%d-%d-%x", donID, channelID, configDigest), + ts: int32(ot.Unix()), //nolint:gosec // G115 + err: nil, + }, + { + name: "successful bridge", + msg: &LLOBridgeTelemetry{ + DonId: donID, + StreamId: &streamID, + SpecId: 345, + BridgeAdapterName: "bridge-adapter", + ConfigDigest: configDigest, + ObservationTimestamp: ot.UnixNano(), + }, + typ: synchronization.PipelineBridge, + fingerprint: fmt.Sprintf("%d-%d-%d-%s-%x", donID, streamID, 345, "bridge-adapter", configDigest), + ts: int32(ot.Unix()), //nolint:gosec // G115 + err: nil, + }, + { + name: "unsupported telemetry type", + typ: synchronization.HeadReport, + err: errUnsupportedTelemetryType, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + fp, ts, err := fingerprint(test.typ, test.msg) + if test.err != nil { + assert.EqualError(t, err, test.err.Error()) + } else { + require.NoError(t, err) + assert.Equal(t, test.fingerprint, fp) + assert.Equal(t, test.ts, ts) + } + }) + } +} + +// TestSample ensures Sample() correctly chooses which messages to send. +func TestSample(t *testing.T) { + t.Parallel() + + lggr := logger.TestSugared(t) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + samplr := newSampler(lggr, true) + samplr.StartPruningLoop(ctx, &sync.WaitGroup{}) + + t0 := time.Now() + msg0 := &llo.LLOOutcomeTelemetry{ + DonId: 2, + ConfigDigest: []byte("digest"), + ObservationTimestampNanoseconds: uint64(t0.UnixNano()), //nolint:gosec // G115 + } + msg1 := &llo.LLOOutcomeTelemetry{ + DonId: 2, + ConfigDigest: []byte("digest"), + ObservationTimestampNanoseconds: uint64(t0.Add(50 * time.Millisecond).UnixNano()), //nolint:gosec // G115 + } + + // Evaluate two messages from the same source with timestamp difference under our desired fidelity of 1s. + // The first one should be sent, the second one should be omitted. + shouldSend := samplr.Sample(synchronization.LLOOutcome, msg0) + assert.True(t, shouldSend) + shouldSend = samplr.Sample(synchronization.LLOOutcome, msg1) + assert.False(t, shouldSend) +} + +// TestPruningLoop ensures the pruning loop works as expected. +func TestPruningLoop(t *testing.T) { + t.Parallel() + + lggr := logger.TestSugared(t) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + samplr := newSampler(lggr, true) + // We need a prune time of at least one second in order to detect outdated entries. + // The entries have second-based timestamps and cannot distinguish shorter intervals. + samplr.prunePeriod = time.Second + samplr.StartPruningLoop(ctx, &sync.WaitGroup{}) + + msg := &llo.LLOOutcomeTelemetry{ + DonId: 2, + ConfigDigest: []byte("digest"), + ObservationTimestampNanoseconds: uint64(time.Now().UnixNano()), //nolint:gosec // G115 + } + fp, ots, err := fingerprint(synchronization.LLOOutcome, msg) + require.NoError(t, err) + + hasSampleFn := func(s *sampler, fp string, ts int32) bool { + s.samplesMu.Lock() + defer s.samplesMu.Unlock() + flag := s.samples[fp][ts] // we're OK with this panicking + return flag != nil + } + + msg2 := &llo.LLOOutcomeTelemetry{ + DonId: 2, + ConfigDigest: []byte("digest"), + ObservationTimestampNanoseconds: uint64(time.Now().Add(10 * time.Second).UnixNano()), //nolint:gosec // G115 + } + samplr.Sample(synchronization.LLOOutcome, msg2) + fp2, ots2, _ := fingerprint(synchronization.LLOOutcome, msg2) + require.True(t, hasSampleFn(samplr, fp2, ots2)) + + require.False(t, hasSampleFn(samplr, fp, ots)) + + // Sample a message. + _ = samplr.Sample(synchronization.LLOOutcome, msg) + // Ensure the message is among the samples. + require.True(t, hasSampleFn(samplr, fp, ots)) + // Wait for the entry to expire. + time.Sleep(3 * samplr.prunePeriod) + // Ensure the message has been removed from the samples. + require.False(t, hasSampleFn(samplr, fp, ots)) +} + +// TestPruningLoop_Exits ensures the pruning loop exits when its context is cancelled and doesn't leak goroutines. +func TestPruningLoop_Exits(t *testing.T) { + t.Parallel() + + lggr := logger.TestSugared(t) + ctx, cancel := context.WithCancel(context.Background()) + wg := &sync.WaitGroup{} + + // Start the sampler and its loop. This increments the waitgroup's counter. + samplr := newSampler(lggr, true) + samplr.StartPruningLoop(ctx, wg) + + // Create a channel which will be closed when the waitgroup is done, i.e. when the loop is closed. + ch := make(chan struct{}) + go func() { + wg.Wait() + close(ch) + }() + // A helper function to check if the channel is closed. + doneFn := func(timeout time.Duration) bool { + select { + case <-ch: + return true + case <-time.After(timeout): + return false + } + } + + // Assert the channel is not closed after 100ms. + assert.False(t, doneFn(100*time.Millisecond)) + + // Cancel the context and assert that the channel is closed within 100ms. + cancel() + assert.True(t, doneFn(100*time.Millisecond)) +} diff --git a/core/services/llo/telem/telemetry.go b/core/services/llo/telem/telemetry.go index 3654aebbe4c..a55f34da153 100644 --- a/core/services/llo/telem/telemetry.go +++ b/core/services/llo/telem/telemetry.go @@ -15,6 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-data-streams/llo" datastreamsllo "github.com/smartcontractkit/chainlink-data-streams/llo" "github.com/smartcontractkit/chainlink-data-streams/llo/reportcodecs/evm" + "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline/eautils" @@ -49,6 +50,7 @@ type TelemeterParams struct { CaptureObservationTelemetry bool CaptureOutcomeTelemetry bool CaptureReportTelemetry bool + SampleTelemetry bool } func NewTelemeterService(params TelemeterParams) TelemeterService { @@ -77,6 +79,7 @@ func newTelemeter(params TelemeterParams) *telemeter { }, 10), currentSeqNr: make(map[string]uint64), telemetryBuffer: make(map[string]map[uint64][]telemetryEntry), + sampler: newSampler(logger.Sugared(params.Logger), params.SampleTelemetry), } if params.CaptureOutcomeTelemetry { t.chOutcomeTelemetry = make(chan *datastreamsllo.LLOOutcomeTelemetry, 100) // only one per round so 100 buffer should be more than enough even for very fast rounds @@ -139,6 +142,8 @@ type telemeter struct { // for transmitting rounds sequence numbers telemetryBufferMu sync.Mutex telemetryBuffer map[string]map[uint64][]telemetryEntry + + sampler *sampler } func (t *telemeter) EnqueueV3PremiumLegacy(run *pipeline.Run, trrs pipeline.TaskRunResults, streamID uint32, opts llo.DSOpts, val llo.StreamValue, err error) { @@ -218,6 +223,7 @@ func (t *telemeter) CaptureObservationTelemetry() bool { func (t *telemeter) start(_ context.Context) error { t.eng.Go(func(ctx context.Context) { wg := sync.WaitGroup{} + t.sampler.StartPruningLoop(ctx, &wg) for { select { case tcc := <-t.chch: @@ -270,7 +276,7 @@ func (t *telemeter) sendBufferedTelemetry(digest types.ConfigDigest, seqNr uint6 digestMessages := t.telemetryBuffer[cd] // include any message from the previous sequence number - // that was enqueued after the its transmission + // that was enqueued after the seq's transmission var messages [2][]telemetryEntry messages[0] = digestMessages[currentSeqNr] messages[1] = digestMessages[seqNr] @@ -316,7 +322,9 @@ func (t *telemeter) enqueueTelemetry(digest string, seqNr uint64, typ synchroniz return } // observation and bridge telemetry are not buffered - t.monitoringEndpoint.SendTypedLog(typ, bytes) + if t.sampler.Sample(typ, msg) { + t.monitoringEndpoint.SendTypedLog(typ, bytes) + } default: // synchronization.LLOOutcome, synchronization.LLOReport t.telemetryBufferMu.Lock() defer t.telemetryBufferMu.Unlock() @@ -324,10 +332,12 @@ func (t *telemeter) enqueueTelemetry(digest string, seqNr uint64, typ synchroniz if _, ok := t.telemetryBuffer[digest]; !ok { t.telemetryBuffer[digest] = make(map[uint64][]telemetryEntry) } - t.telemetryBuffer[digest][seqNr] = append(t.telemetryBuffer[digest][seqNr], telemetryEntry{ - telemType: typ, - msg: msg, - }) + if t.sampler.Sample(typ, msg) { + t.telemetryBuffer[digest][seqNr] = append(t.telemetryBuffer[digest][seqNr], telemetryEntry{ + telemType: typ, + msg: msg, + }) + } } } diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go index a6f0761386b..f484604653e 100644 --- a/core/services/ocr2/delegate.go +++ b/core/services/ocr2/delegate.go @@ -34,6 +34,7 @@ import ( ocr2keepers21config "github.com/smartcontractkit/chainlink-automation/pkg/v3/config" ocr2keepers21 "github.com/smartcontractkit/chainlink-automation/pkg/v3/plugin" evmconfig "github.com/smartcontractkit/chainlink-evm/pkg/config" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes" "github.com/smartcontractkit/chainlink/v2/core/config/env" syncerV2 "github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer/v2" @@ -200,6 +201,7 @@ type ocr2Config interface { KeyBundleID() (string, error) SimulateTransactions() bool TraceLogging() bool + SampleTelemetry() bool CaptureAutomationCustomTelemetry() bool AllowNoBootstrappers() bool KeyValueStoreRootDir() string @@ -1447,6 +1449,7 @@ func (d *Delegate) newServicesLLO( ChainID: rid.ChainID, TraceLogging: d.cfg.OCR2().TraceLogging(), + SampleTelemetry: d.cfg.OCR2().SampleTelemetry(), BinaryNetworkEndpointFactory: d.peerWrapper.Peer2, V2Bootstrappers: bootstrapPeers, ContractTransmitter: provider.ContractTransmitter(), diff --git a/core/services/ocr2/plugins/llo/integration_test.go b/core/services/ocr2/plugins/llo/integration_test.go index d519a6a6f85..0b62130ac13 100644 --- a/core/services/ocr2/plugins/llo/integration_test.go +++ b/core/services/ocr2/plugins/llo/integration_test.go @@ -1233,7 +1233,7 @@ dp -> deribit_funding_interval_hours_parse -> deribit_funding_interval_hours_dec assert.Equal(t, "000000000000000000000000000000000000000000000000000d8e0d00000001", fmt.Sprintf("%x", reportCtx.([3][32]uint8)[2])) // extra hash reportElems := make(map[string]any) - err = lloevm.BaseSchema.UnpackIntoMap(reportElems, report.([]byte)) + err = lloevm.BaseSchemaUint32.UnpackIntoMap(reportElems, report.([]byte)) require.NoError(t, err) feedID := reportElems["feedId"].([32]uint8) diff --git a/core/services/ocr2/validate/config.go b/core/services/ocr2/validate/config.go index 54c29e7d057..6ffb1a4ea9b 100644 --- a/core/services/ocr2/validate/config.go +++ b/core/services/ocr2/validate/config.go @@ -22,6 +22,7 @@ type OCR2Config interface { DefaultTransactionQueueDepth() uint32 SimulateTransactions() bool TraceLogging() bool + SampleTelemetry() bool } type InsecureConfig interface { diff --git a/core/services/workflows/syncer/v2/handler.go b/core/services/workflows/syncer/v2/handler.go index 48c41aeab3c..378c02b31fc 100644 --- a/core/services/workflows/syncer/v2/handler.go +++ b/core/services/workflows/syncer/v2/handler.go @@ -37,7 +37,11 @@ type ORM interface { artifacts.WorkflowSpecsDS } -type engineFactoryFn func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) +// engineFactoryFn creates a workflow engine. The initDone channel is used to signal when the engine +// has completed initialization (including trigger subscriptions). For v2 engines, this is wired to +// the OnInitialized lifecycle hook. For v1 legacy DAG engines, nil is sent immediately after engine +// creation since they don't support async initialization hooks. +type engineFactoryFn func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, initDone chan<- error) (services.Service, error) // eventHandler is a handler for WorkflowRegistryEvent events. Each event type has a corresponding method that handles the event. type eventHandler struct { @@ -71,6 +75,8 @@ func WithEngineRegistry(er *EngineRegistry) func(*eventHandler) { } } +// WithEngineFactoryFn allows for overriding the engine factory function. +// if in doubt, close initDone channel immediately in tests to prevent deadlocks. func WithEngineFactoryFn(efn engineFactoryFn) func(*eventHandler) { return func(e *eventHandler) { e.engineFactory = efn @@ -79,7 +85,11 @@ func WithEngineFactoryFn(efn engineFactoryFn) func(*eventHandler) { func WithStaticEngine(engine services.Service) func(*eventHandler) { return func(e *eventHandler) { - e.engineFactory = func(_ context.Context, _ string, _ string, _ types.WorkflowName, _ string, _ []byte, _ []byte) (services.Service, error) { + e.engineFactory = func(_ context.Context, _ string, _ string, _ types.WorkflowName, _ string, _ []byte, _ []byte, initDone chan<- error) (services.Service, error) { + // For static engines (used in tests), signal immediate initialization success + if initDone != nil { + initDone <- nil + } return engine, nil } } @@ -458,7 +468,7 @@ func (h *eventHandler) fetchOrganizationID(ctx context.Context, workflowOwner st return organizationID, nil } -func (h *eventHandler) engineFactoryFn(ctx context.Context, workflowID string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) { +func (h *eventHandler) engineFactoryFn(ctx context.Context, workflowID string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, initDone chan<- error) (services.Service, error) { lggr := h.lggr.Named("WorkflowEngine.Module").With("workflowID", workflowID, "workflowName", name, "workflowOwner", owner) moduleConfig := &host.ModuleConfig{ Logger: lggr, @@ -534,6 +544,22 @@ func (h *eventHandler) engineFactoryFn(ctx context.Context, workflowID string, o WorkflowRegistryChainSelector: h.workflowRegistryChainSelector, OrgResolver: h.orgResolver, } + + // Wire the initDone channel to the OnInitialized lifecycle hook. + // This will be called when the engine completes initialization (including trigger subscriptions). + // We compose with any existing hook to avoid overwriting test hooks or other user-provided hooks. + if initDone != nil { + existingHook := cfg.Hooks.OnInitialized + cfg.Hooks.OnInitialized = func(err error) { + // Signal completion to the handler first + initDone <- err + // Then call any existing hook (e.g., from tests) + if existingHook != nil { + existingHook(err) + } + } + } + return v2.NewEngine(cfg) } @@ -592,7 +618,9 @@ func (h *eventHandler) tryEngineCleanup(workflowID types.WorkflowID) error { return nil } -// tryEngineCreate attempts to create a new workflow engine, start it, and register it with the engine registry +// tryEngineCreate attempts to create a new workflow engine, start it, and register it with the engine registry. +// This function waits for the engine to complete initialization (including trigger subscriptions) before returning, +// ensuring that the workflowActivated event accurately reflects the deployment status including trigger registration. func (h *eventHandler) tryEngineCreate(ctx context.Context, spec *job.WorkflowSpec) error { // Ensure the capabilities registry is ready before creating any Engine instances. // This should be guaranteed by the Workflow Registry Syncer. @@ -631,6 +659,12 @@ func (h *eventHandler) tryEngineCreate(ctx context.Context, spec *job.WorkflowSp if err != nil { return fmt.Errorf("invalid workflow name: %w", err) } + + // Create a channel to receive the initialization result. + // This allows us to wait for the engine to complete initialization (including trigger subscriptions) + // before emitting the workflowActivated event, ensuring the event accurately reflects deployment status. + initDone := make(chan error, 1) + engine, err := h.engineFactory( ctx, spec.WorkflowID, @@ -639,6 +673,7 @@ func (h *eventHandler) tryEngineCreate(ctx context.Context, spec *job.WorkflowSp spec.WorkflowTag, []byte(spec.Config), decodedBinary, + initDone, ) if err != nil { return fmt.Errorf("failed to create workflow engine: %w", err) @@ -648,6 +683,30 @@ func (h *eventHandler) tryEngineCreate(ctx context.Context, spec *job.WorkflowSp return fmt.Errorf("failed to start workflow engine: %w", err) } + // Wait for the engine to complete initialization (including trigger subscriptions). + // This ensures we don't emit workflowActivated events before the engine initializes successfully. + select { + case <-ctx.Done(): + // Context cancelled while waiting for initialization + if closeErr := engine.Close(); closeErr != nil { + h.lggr.Errorw("failed to close engine after context cancellation", "error", closeErr, "workflowID", spec.WorkflowID) + } + return fmt.Errorf("context cancelled while waiting for engine initialization: %w", ctx.Err()) + case initErr := <-initDone: + if initErr != nil { + // Engine initialization failed (e.g., trigger subscription failed) + // TODO (cre-1482) add logic to mark a deployment as failed to avoid churn. + // Currently, failed deployments will be retried on each poll cycle (with exponential backoff). + // If the failure is due to user error (e.g., invalid trigger config), this causes unnecessary retries. + // Consider marking the workflow spec as "failed" in the database and requiring workflow redeployment. + if closeErr := engine.Close(); closeErr != nil { + h.lggr.Errorw("failed to close engine after initialization failure", "error", closeErr, "workflowID", spec.WorkflowID) + } + return fmt.Errorf("engine initialization failed: %w", initErr) + } + } + + // Engine is fully initialized, add to registry if err := h.engineRegistry.Add(wid, engine); err != nil { if closeErr := engine.Close(); closeErr != nil { return fmt.Errorf("failed to close workflow engine: %w during invariant violation: %w", closeErr, err) diff --git a/core/services/workflows/syncer/v2/handler_test.go b/core/services/workflows/syncer/v2/handler_test.go index 562991d1912..1ae98f5288f 100644 --- a/core/services/workflows/syncer/v2/handler_test.go +++ b/core/services/workflows/syncer/v2/handler_test.go @@ -105,6 +105,15 @@ func (m *mockEngine) HealthReport() map[string]error { return nil } func (m *mockEngine) Name() string { return "mockEngine" } +// mockEngineFactory returns a standard mock engine factory for tests. +// It sends nil to initDone to signal successful initialization. +func mockEngineFactory(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, initDone chan<- error) (services.Service, error) { + if initDone != nil { + initDone <- nil + } + return &mockEngine{}, nil +} + func Test_Handler(t *testing.T) { t.Run("fails with unsupported event type", func(t *testing.T) { lggr := logger.TestLogger(t) @@ -213,9 +222,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { signedConfigURL: {Body: config, Err: nil}, }) }, - engineFactoryFn: func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) { - return &mockEngine{}, nil - }, + engineFactoryFn: mockEngineFactory, GiveConfig: config, ConfigURLFactory: configURLFactory, BinaryURLFactory: binaryURLFactory, @@ -248,7 +255,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { signedConfigURL: {Body: config, Err: nil}, }) }, - engineFactoryFn: func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) { + engineFactoryFn: func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, initDone chan<- error) (services.Service, error) { if _, err := hex.DecodeString(name.Hex()); err != nil { return nil, fmt.Errorf("invalid workflow name: %w", err) } @@ -256,6 +263,9 @@ func Test_workflowRegisteredHandler(t *testing.T) { if want != name.Hex() { return nil, fmt.Errorf("invalid workflow name: doesn't match, got %s, want %s", name.Hex(), want) } + if initDone != nil { + initDone <- nil + } return &mockEngine{}, nil }, GiveConfig: config, @@ -289,7 +299,10 @@ func Test_workflowRegisteredHandler(t *testing.T) { signedConfigURL: {Body: config, Err: nil}, }) }, - engineFactoryFn: func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) { + engineFactoryFn: func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, initDone chan<- error) (services.Service, error) { + if initDone != nil { + initDone <- nil + } return &mockEngine{StartErr: assert.AnError}, nil }, GiveConfig: config, @@ -382,6 +395,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { ConfigURL: configURLFactory(hex.EncodeToString(wfID)), } }, + engineFactoryFn: mockEngineFactory, validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { me := &mockEngine{} oldWfIDBytes := [32]byte{0, 1, 2, 3, 5} @@ -470,6 +484,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { ConfigURL: configURLFactory(hex.EncodeToString(wfID)), } }, + engineFactoryFn: mockEngineFactory, validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string, ) { @@ -519,6 +534,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { signedBinaryURL: {Body: encodedBinary, Err: nil}, }) }, + engineFactoryFn: mockEngineFactory, validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { defaultValidationFn(t, ctx, event, h, s, wfOwner, wfName, wfID, fetcher) @@ -555,6 +571,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { signedConfigURL: {Body: config, Err: nil}, }) }, + engineFactoryFn: mockEngineFactory, validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { // Create the record in the database entry := &job.WorkflowSpec{ @@ -606,7 +623,7 @@ type testCase struct { fetcherFactory func(wfID []byte) *mockFetcher Event func(wfID []byte) WorkflowRegisteredEvent validationFn func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) - engineFactoryFn func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) + engineFactoryFn func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, initDone chan<- error) (services.Service, error) } func testRunningWorkflow(t *testing.T, tc testCase) { @@ -761,7 +778,10 @@ func Test_workflowDeletedHandler(t *testing.T) { })) require.NoError(t, err) - h, err := NewEventHandler(lggr, store, nil, true, registry, NewEngineRegistry(), emitter, limiters, rl, workflowLimits, artifactStore, workflowEncryptionKey, &testDonNotifier{}, WithEngineRegistry(er)) + h, err := NewEventHandler(lggr, store, nil, true, registry, NewEngineRegistry(), emitter, limiters, rl, workflowLimits, artifactStore, workflowEncryptionKey, &testDonNotifier{}, + WithEngineRegistry(er), + WithEngineFactoryFn(mockEngineFactory), + ) require.NoError(t, err) ctx = contexts.WithCRE(ctx, contexts.CRE{Owner: hex.EncodeToString(wfOwner), Workflow: wfIDString}) err = h.workflowRegisteredEvent(ctx, active) @@ -908,7 +928,10 @@ func Test_workflowDeletedHandler(t *testing.T) { mockAS := newMockArtifactStore(artifactStore, errors.New(failWith)) - h, err := NewEventHandler(lggr, store, nil, true, registry, NewEngineRegistry(), emitter, limiters, rl, workflowLimits, mockAS, workflowEncryptionKey, &testDonNotifier{}, WithEngineRegistry(er)) + h, err := NewEventHandler(lggr, store, nil, true, registry, NewEngineRegistry(), emitter, limiters, rl, workflowLimits, mockAS, workflowEncryptionKey, &testDonNotifier{}, + WithEngineRegistry(er), + WithEngineFactoryFn(mockEngineFactory), + ) require.NoError(t, err) ctx = contexts.WithCRE(ctx, contexts.CRE{Owner: hex.EncodeToString(wfOwner), Workflow: wfIDString}) err = h.workflowRegisteredEvent(ctx, active) @@ -1037,9 +1060,7 @@ func Test_Handler_OrganizationID(t *testing.T) { h, err := NewEventHandler(lggr, store, nil, true, registry, er, emitter, limiters, rl, workflowLimits, artifactStore, workflowEncryptionKey, &testDonNotifier{}, WithEngineRegistry(er), - WithEngineFactoryFn(func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) { - return &mockEngine{}, nil - }), + WithEngineFactoryFn(mockEngineFactory), WithOrgResolver(orgResolver), ) require.NoError(t, err) @@ -1106,9 +1127,7 @@ func Test_Handler_OrganizationID(t *testing.T) { hDelete, err := NewEventHandler(lggr, store, nil, true, registry, er, deleteEmitter, limiters, rl, workflowLimits, deleteArtifactStore, workflowEncryptionKey, &testDonNotifier{}, WithEngineRegistry(er), - WithEngineFactoryFn(func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte) (services.Service, error) { - return &mockEngine{}, nil - }), + WithEngineFactoryFn(mockEngineFactory), WithOrgResolver(orgResolver), ) require.NoError(t, err) diff --git a/core/services/workflows/v2/capability_executor.go b/core/services/workflows/v2/capability_executor.go index 20d52e86c8d..bce59cd1a79 100644 --- a/core/services/workflows/v2/capability_executor.go +++ b/core/services/workflows/v2/capability_executor.go @@ -12,11 +12,13 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/capabilities" caperrors "github.com/smartcontractkit/chainlink-common/pkg/capabilities/errors" + "github.com/smartcontractkit/chainlink-common/pkg/contexts" "github.com/smartcontractkit/chainlink-common/pkg/settings/limits" "github.com/smartcontractkit/chainlink-common/pkg/workflows/wasm/host" sdkpb "github.com/smartcontractkit/chainlink-protos/cre/go/sdk" "github.com/smartcontractkit/chainlink-protos/cre/go/values" protoevents "github.com/smartcontractkit/chainlink-protos/workflows/go/events" + "github.com/smartcontractkit/chainlink/v2/core/platform" "github.com/smartcontractkit/chainlink/v2/core/services/workflows/events" "github.com/smartcontractkit/chainlink/v2/core/services/workflows/metering" @@ -32,12 +34,14 @@ type ExecutionHelper struct { TimeProvider SecretsFetcher + chainAllowed limits.GateLimiter callLimiters map[capCall]limits.BoundLimiter[int] mu sync.Mutex callCounts map[limits.Limiter[int]]int } func (c *ExecutionHelper) initLimiters(limiters *EngineLimiters) { + c.chainAllowed = limiters.ChainAllowed c.callLimiters = map[capCall]limits.BoundLimiter[int]{ {"consensus", "Simple"}: limiters.ConsensusCalls, {"consensus", "Report"}: limiters.ConsensusCalls, @@ -54,7 +58,19 @@ type capCall struct { // CallCapability handles requests generated by the wasm guest func (c *ExecutionHelper) CallCapability(ctx context.Context, request *sdkpb.CapabilityRequest) (*sdkpb.CapabilityResponse, error) { - capName, _, _ := capabilities.ParseID(request.Id) + capName, labels, _ := capabilities.ParseID(request.Id) + if chainSelector, err := capabilities.ChainSelectorLabel(labels); err != nil { + return nil, err + } else if chainSelector != nil { + err2 := c.chainAllowed.AllowErr(contexts.WithChainSelector(ctx, *chainSelector)) + if err2 != nil { + if errors.Is(err2, limits.ErrorNotAllowed{}) { + return nil, fmt.Errorf("unable to call capability %s: ChainSelector %d: %w", request.Id, *chainSelector, err2) + } + return nil, fmt.Errorf("failed to check access for ChainSelector %d: %w", *chainSelector, err2) + } + } + limiter, ok := c.callLimiters[capCall{name: capName, method: request.Method}] if ok { c.mu.Lock() @@ -69,11 +85,13 @@ func (c *ExecutionHelper) CallCapability(ctx context.Context, request *sdkpb.Cap c.callCounts[limiter] = cnt c.mu.Unlock() } + free, err := c.capCallsSemaphore.Wait(ctx, 1) if err != nil { return nil, err } defer free() + return c.callCapability(ctx, request) } diff --git a/core/services/workflows/v2/config.go b/core/services/workflows/v2/config.go index fef78d67bd0..afbcd075b56 100644 --- a/core/services/workflows/v2/config.go +++ b/core/services/workflows/v2/config.go @@ -85,6 +85,7 @@ type EngineLimiters struct { CapabilityCallTime limits.TimeLimiter LogEvent limits.BoundLimiter[int] LogLine limits.BoundLimiter[config.Size] + ChainAllowed limits.GateLimiter ChainWriteTargets limits.BoundLimiter[int] ChainReadCalls limits.BoundLimiter[int] @@ -168,6 +169,10 @@ func (l *EngineLimiters) init(lf limits.Factory, cfgFn func(*cresettings.Workflo if err != nil { return } + l.ChainAllowed, err = limits.MakeGateLimiter(lf, cfg.ChainAllowed) + if err != nil { + return + } l.ChainWriteTargets, err = limits.MakeBoundLimiter(lf, cfg.ChainWrite.TargetsLimit) if err != nil { return @@ -202,6 +207,7 @@ func (l *EngineLimiters) Close() error { l.CapabilityCallTime, l.LogEvent, l.LogLine, + l.ChainAllowed, l.ChainWriteTargets, l.ChainReadCalls, l.ConsensusCalls, @@ -222,6 +228,8 @@ type EngineLimits struct { } type LifecycleHooks struct { + // OnInitialized is used to emit a workflowActivated event after the engine + // has completed initialization. It is also helpful for testing. OnInitialized func(err error) OnSubscribedToTriggers func(triggerIDs []string) OnExecutionFinished func(executionID string, status string) diff --git a/core/services/workflows/v2/engine.go b/core/services/workflows/v2/engine.go index 11ec5558ae6..672009421f7 100644 --- a/core/services/workflows/v2/engine.go +++ b/core/services/workflows/v2/engine.go @@ -11,6 +11,7 @@ import ( "time" "github.com/shopspring/decimal" + "golang.org/x/sync/errgroup" "google.golang.org/protobuf/types/known/anypb" "github.com/smartcontractkit/chainlink-common/pkg/aggregation" @@ -350,6 +351,20 @@ func (e *Engine) runTriggerSubscriptionPhase(ctx context.Context) error { // check if all requested triggers exist in the registry triggers := make([]capabilities.TriggerCapability, 0, len(subs.Subscriptions)) for _, sub := range subs.Subscriptions { + _, labels, _ := capabilities.ParseID(sub.Id) + chainSelector, err2 := capabilities.ChainSelectorLabel(labels) + if err2 != nil { + return fmt.Errorf("invalid chain selector for ID %s: %w", sub.Id, err2) + } + if chainSelector != nil { + err2 := e.cfg.LocalLimiters.ChainAllowed.AllowErr(contexts.WithChainSelector(ctx, *chainSelector)) + if err2 != nil { + if errors.Is(err2, limits.ErrorNotAllowed{}) { + return fmt.Errorf("unable to subscribe to capability %s: ChainSelector %d: %w", sub.Id, *chainSelector, err2) + } + return fmt.Errorf("failed to check access for ChainSelector %d: %w", *chainSelector, err2) + } + } triggerCap, triggerErr := e.cfg.CapRegistry.GetTrigger(ctx, sub.Id) if triggerErr != nil { return fmt.Errorf("trigger capability not found: %w", triggerErr) @@ -357,53 +372,99 @@ func (e *Engine) runTriggerSubscriptionPhase(ctx context.Context) error { triggers = append(triggers, triggerCap) } - // register to all triggers + // register to all triggers concurrently regCtx, regCancel, err := e.cfg.LocalLimiters.TriggerRegistrationsTime.WithTimeout(ctx) if err != nil { return err } defer regCancel() + + // trigger registration results for use in concurrent trigger subscriptions + type triggerRegResult struct { + index int + registrationID string + triggerCap capabilities.TriggerCapability + eventCh <-chan capabilities.TriggerResponse + payload *anypb.Any + method string + triggerCapID string + } + + resultsCh := make(chan triggerRegResult, len(subs.Subscriptions)) + g, gCtx := errgroup.WithContext(regCtx) + + // Launch concurrent trigger registrations + for i, sub := range subs.Subscriptions { + triggerCap := triggers[i] + g.Go(func() error { + registrationID := fmt.Sprintf("trigger_reg_%s_%d", e.cfg.WorkflowID, i) + e.logger().Debugw("Registering trigger", "triggerID", sub.Id, "method", sub.Method) + triggerEventCh, regErr := triggerCap.RegisterTrigger(gCtx, capabilities.TriggerRegistrationRequest{ + TriggerID: registrationID, + Metadata: capabilities.RequestMetadata{ + WorkflowID: e.cfg.WorkflowID, + WorkflowOwner: e.cfg.WorkflowOwner, + WorkflowName: e.cfg.WorkflowName.Hex(), + WorkflowTag: e.cfg.WorkflowTag, + DecodedWorkflowName: e.cfg.WorkflowName.String(), + WorkflowDonID: e.localNode.Load().WorkflowDON.ID, + WorkflowDonConfigVersion: e.localNode.Load().WorkflowDON.ConfigVersion, + ReferenceID: fmt.Sprintf("trigger_%d", i), + WorkflowRegistryChainSelector: e.cfg.WorkflowRegistryChainSelector, + WorkflowRegistryAddress: e.cfg.WorkflowRegistryAddress, + EngineVersion: platform.ValueWorkflowVersionV2, + // no WorkflowExecutionID needed (or available at this stage) + }, + Payload: sub.Payload, + Method: sub.Method, + // no Config needed - NoDAG uses Payload + }) + if regErr != nil { + e.logger().Errorw("Trigger registration failed", "triggerID", sub.Id, "err", regErr) + e.metrics.With(platform.KeyTriggerID, sub.Id).IncrementRegisterTriggerFailureCounter(gCtx) + return fmt.Errorf("failed to register trigger %s: %w", sub.Id, regErr) + } + // Send successful result + resultsCh <- triggerRegResult{ + index: i, + registrationID: registrationID, + triggerCap: triggerCap, + eventCh: triggerEventCh, + payload: sub.Payload, + method: sub.Method, + triggerCapID: sub.Id, + } + return nil + }) + } + + // wait for all registrations to complete. + // returns first non-nil error. + registrationErr := g.Wait() + close(resultsCh) + + // Collect results into e.triggers map e.triggersRegMu.Lock() defer e.triggersRegMu.Unlock() + eventChans := make([]<-chan capabilities.TriggerResponse, len(subs.Subscriptions)) triggerCapIDs := make([]string, len(subs.Subscriptions)) - for i, sub := range subs.Subscriptions { - triggerCap := triggers[i] - registrationID := fmt.Sprintf("trigger_reg_%s_%d", e.cfg.WorkflowID, i) - e.logger().Debugw("Registering trigger", "triggerID", sub.Id, "method", sub.Method) - triggerEventCh, err := triggerCap.RegisterTrigger(regCtx, capabilities.TriggerRegistrationRequest{ - TriggerID: registrationID, - Metadata: capabilities.RequestMetadata{ - WorkflowID: e.cfg.WorkflowID, - WorkflowOwner: e.cfg.WorkflowOwner, - WorkflowName: e.cfg.WorkflowName.Hex(), - WorkflowTag: e.cfg.WorkflowTag, - DecodedWorkflowName: e.cfg.WorkflowName.String(), - WorkflowDonID: e.localNode.Load().WorkflowDON.ID, - WorkflowDonConfigVersion: e.localNode.Load().WorkflowDON.ConfigVersion, - ReferenceID: fmt.Sprintf("trigger_%d", i), - WorkflowRegistryChainSelector: e.cfg.WorkflowRegistryChainSelector, - WorkflowRegistryAddress: e.cfg.WorkflowRegistryAddress, - EngineVersion: platform.ValueWorkflowVersionV2, - // no WorkflowExecutionID needed (or available at this stage) - }, - Payload: sub.Payload, - Method: sub.Method, - // no Config needed - NoDAG uses Payload - }) - if err != nil { - e.logger().Errorw("One of trigger registrations failed - reverting all", "triggerID", sub.Id, "err", err) - e.metrics.With(platform.KeyTriggerID, sub.Id).IncrementRegisterTriggerFailureCounter(ctx) - e.unregisterAllTriggers(ctx) - return fmt.Errorf("failed to register trigger: %w", err) - } - e.triggers[registrationID] = &triggerCapability{ - TriggerCapability: triggerCap, - payload: sub.Payload, - method: sub.Method, + + for result := range resultsCh { + e.triggers[result.registrationID] = &triggerCapability{ + TriggerCapability: result.triggerCap, + payload: result.payload, + method: result.method, } - eventChans[i] = triggerEventCh - triggerCapIDs[i] = sub.Id + eventChans[result.index] = result.eventCh + triggerCapIDs[result.index] = result.triggerCapID + } + + // If any registration failed, unregister successful ones and return error + if registrationErr != nil { + e.logger().Errorw("One or more trigger registrations failed - reverting all", "err", registrationErr) + e.unregisterAllTriggers(ctx) // needs to be called under e.triggersRegMu lock + return registrationErr } // start listening for trigger events only if all registrations succeeded diff --git a/core/services/workflows/v2/engine_test.go b/core/services/workflows/v2/engine_test.go index 386104fa9b9..b42a2de38f4 100644 --- a/core/services/workflows/v2/engine_test.go +++ b/core/services/workflows/v2/engine_test.go @@ -254,7 +254,7 @@ func TestEngine_TriggerSubscriptions(t *testing.T) { trigger1.EXPECT().RegisterTrigger(matches.AnyContext, mock.Anything).Return(nil, errors.New("failure ABC")).Once() trigger0.EXPECT().UnregisterTrigger(matches.AnyContext, mock.Anything).Return(nil).Once() servicetest.Run(t, engine) - require.ErrorContains(t, <-initDoneCh, "failed to register trigger: failure ABC") + require.ErrorContains(t, <-initDoneCh, "failed to register trigger id_1: failure ABC") }) } diff --git a/core/services/workflows/v2/secrets.go b/core/services/workflows/v2/secrets.go index f54b4b3a812..c0f96c80a2f 100644 --- a/core/services/workflows/v2/secrets.go +++ b/core/services/workflows/v2/secrets.go @@ -90,12 +90,16 @@ func (s *secretsFetcher) GetSecrets(ctx context.Context, request *sdkpb.GetSecre defer free() return s.getSecretsForBatch(ctx, request) }() - + getSecretsDuration := time.Since(start).Milliseconds() + if err != nil { + // Log errors when secrets fetching fails, for troubleshooting and debugging + s.lggr.Warnw("Secrets fetching failed for request", "request", request, "error", err, "requestLatency", getSecretsDuration) + } s.metrics.With( "workflowOwner", s.workflowOwner, "workflowName", s.workflowName, "success", strconv.FormatBool(err == nil), - ).RecordGetSecretsDuration(ctx, time.Since(start).Milliseconds()) + ).RecordGetSecretsDuration(ctx, getSecretsDuration) return resp, err } diff --git a/core/store/migrate/migrations/0284_ccv_chain_statuses.sql b/core/store/migrate/migrations/0284_ccv_chain_statuses.sql new file mode 100644 index 00000000000..97e6805d4cb --- /dev/null +++ b/core/store/migrate/migrations/0284_ccv_chain_statuses.sql @@ -0,0 +1,15 @@ +-- +goose Up + +CREATE TABLE IF NOT EXISTS ccv_chain_statuses ( + chain_selector TEXT PRIMARY KEY, + finalized_block_height TEXT NOT NULL, + disabled BOOLEAN NOT NULL DEFAULT FALSE, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +CREATE INDEX IF NOT EXISTS idx_ccv_chain_statuses_updated_at ON ccv_chain_statuses(updated_at); + +-- +goose Down + +DROP INDEX IF EXISTS idx_ccv_chain_statuses_updated_at; +DROP TABLE IF EXISTS ccv_chain_statuses; + diff --git a/core/web/resolver/testdata/config-empty-effective.toml b/core/web/resolver/testdata/config-empty-effective.toml index 3864ab119c2..d090b8d15e9 100644 --- a/core/web/resolver/testdata/config-empty-effective.toml +++ b/core/web/resolver/testdata/config-empty-effective.toml @@ -161,6 +161,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] diff --git a/core/web/resolver/testdata/config-full.toml b/core/web/resolver/testdata/config-full.toml index d8292534cad..df0dc9ddaa6 100644 --- a/core/web/resolver/testdata/config-full.toml +++ b/core/web/resolver/testdata/config-full.toml @@ -167,6 +167,7 @@ AllowNoBootstrappers = true DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -520,7 +521,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.NodePool.Errors] NonceTooLow = '(: |^)nonce too low' diff --git a/core/web/resolver/testdata/config-multi-chain-effective.toml b/core/web/resolver/testdata/config-multi-chain-effective.toml index a6fb931f6fb..c2160390a08 100644 --- a/core/web/resolver/testdata/config-multi-chain-effective.toml +++ b/core/web/resolver/testdata/config-multi-chain-effective.toml @@ -161,6 +161,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -485,7 +486,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 @@ -608,7 +609,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 @@ -725,7 +726,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/deployment/ccip/changeset/cs_mint_link_token_mcms.go b/deployment/ccip/changeset/cs_mint_link_token_mcms.go new file mode 100644 index 00000000000..3c6af817569 --- /dev/null +++ b/deployment/ccip/changeset/cs_mint_link_token_mcms.go @@ -0,0 +1,159 @@ +package changeset + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" + + "github.com/smartcontractkit/chainlink/deployment/ccip/shared/deployergroup" + "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" +) + +// This changeset generates a proposal to mint LINK when LINK is already owned by MCMS +var MintLinkTokenMCMS = cldf.CreateChangeSet(MintLinkTokenMCMSLogic, MintLinkTokenMCMSPreconditions) + +type MintLinkTokenMCMSConfig struct { + Selector uint64 `json:"selector"` + ToAddress common.Address `json:"toAddress"` + Amount *big.Int `json:"amount"` + MCMSConfig *proposalutils.TimelockConfig `json:"mcmsConfig"` +} + +func (cfg MintLinkTokenMCMSConfig) Validate(e cldf.Environment) error { + if err := cldf.IsValidChainSelector(cfg.Selector); err != nil { + return fmt.Errorf("invalid chain selector: %d - %w", cfg.Selector, err) + } + + if cfg.ToAddress == (common.Address{}) { + return errors.New("toAddress cannot be empty") + } + + if cfg.Amount == nil || cfg.Amount.Sign() <= 0 { + return errors.New("amount must be greater than zero") + } + + if cfg.MCMSConfig == nil { + return errors.New("mcmsConfig is required for this changeset - use GrantMintRoleAndMint for non-MCMS owned tokens") + } + + return nil +} + +func MintLinkTokenMCMSPreconditions(e cldf.Environment, cfg MintLinkTokenMCMSConfig) error { + if err := cfg.Validate(e); err != nil { + return fmt.Errorf("invalid config: %w", err) + } + + state, err := stateview.LoadOnchainState(e) + if err != nil { + return fmt.Errorf("failed to load onchain state: %w", err) + } + + chainName := e.BlockChains.EVMChains()[cfg.Selector].Name() + if e.Name == "mainnet" || strings.Contains(chainName, "mainnet") { + return errors.New("minting on LINK token is not allowed on Mainnet") + } + + chainState, ok := state.EVMChainState(cfg.Selector) + if !ok { + return fmt.Errorf("%d does not exist in state", cfg.Selector) + } + if linkToken := chainState.LinkToken; linkToken == nil { + return fmt.Errorf("missing linkToken on %d", cfg.Selector) + } + + return nil +} + +func MintLinkTokenMCMSLogic(e cldf.Environment, cfg MintLinkTokenMCMSConfig) (cldf.ChangesetOutput, error) { + state, err := stateview.LoadOnchainState(e) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) + } + + chainState, ok := state.EVMChainState(cfg.Selector) + if !ok { + return cldf.ChangesetOutput{}, fmt.Errorf("chain state not found for selector %d", cfg.Selector) + } + + linkToken := chainState.LinkToken + + // Create deployer group with MCMS config - this will generate a proposal instead of executing directly + deployerGroup := deployergroup.NewDeployerGroup(e, state, cfg.MCMSConfig). + WithDeploymentContext(fmt.Sprintf("Mint %s LINK tokens to %s on chain %d", + cfg.Amount.String(), cfg.ToAddress.Hex(), cfg.Selector)) + + // Get the deployer (TransactOpts) - when MCMS is set, this returns opts configured for the timelock + opts, err := deployerGroup.GetDeployer(cfg.Selector) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to get deployer: %w", err) + } + + // Check if the timelock has the minter role + timelockAddr := opts.From + isMinter, err := linkToken.IsMinter(&bind.CallOpts{Context: e.GetContext()}, timelockAddr) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to check if timelock is minter: %w", err) + } + + // If the timelock doesn't have the minter role, grant it + if !isMinter { + e.Logger.Infow("Timelock does not have minter role, granting mint and burn roles", + "chain", cfg.Selector, + "timelock", timelockAddr.Hex(), + ) + // Grant mint and burn roles to the timelock - creates a simulated transaction that will be included in the MCMS proposal + _, err = linkToken.GrantMintAndBurnRoles(opts, timelockAddr) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to prepare grant mint and burn roles transaction: %w", err) + } + } + + e.Logger.Infow("Preparing MCMS proposal to mint LINK tokens", + "chain", cfg.Selector, + "to", cfg.ToAddress.Hex(), + "amount", cfg.Amount.String(), + ) + + // Call mint - this creates a simulated transaction that will be included in the MCMS proposal + _, err = linkToken.Mint(opts, cfg.ToAddress, cfg.Amount) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to prepare mint transaction: %w", err) + } + + // Always revoke mint/burn roles from timelock after minting + e.Logger.Infow("Adding revoke mint and burn roles to proposal", + "chain", cfg.Selector, + "timelock", timelockAddr.Hex(), + ) + _, err = linkToken.RevokeMintRole(opts, timelockAddr) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to prepare revoke mint role transaction: %w", err) + } + _, err = linkToken.RevokeBurnRole(opts, timelockAddr) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to prepare revoke burn role transaction: %w", err) + } + + // Enact returns the MCMS proposal in the ChangesetOutput + output, err := deployerGroup.Enact() + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to enact deployer group: %w", err) + } + + e.Logger.Infow("Successfully generated MCMS proposal to mint LINK tokens", + "chain", cfg.Selector, + "to", cfg.ToAddress.Hex(), + "amount", cfg.Amount.String(), + "numProposals", len(output.MCMSTimelockProposals), + ) + + return output, nil +} diff --git a/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools.go b/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools.go index d75f4e3ded1..bcf512b3807 100644 --- a/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools.go +++ b/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools.go @@ -213,6 +213,18 @@ func (c SuiChainUpdate) GetSuiTokenAndTokenPool(state suistate.CCIPChainState) ( return "", "", fmt.Errorf("no BnM token pool found for token: %s", c.TokenSymbol) } tpAddress = poolState.PackageID + case suistate.SuiManagedTokenPoolType: + poolState, ok := state.ManagedTokenPools[c.TokenSymbol] + if !ok { + return "", "", fmt.Errorf("no Managed token pool found for token: %s", c.TokenSymbol) + } + tpAddress = poolState.PackageID + case suistate.SuiLnRTokenPoolType: + poolState, ok := state.LnRTokenPools[c.TokenSymbol] + if !ok { + return "", "", fmt.Errorf("no LockRelease token pool found for token: %s", c.TokenSymbol) + } + tpAddress = poolState.PackageID default: return "", "", fmt.Errorf("unknown Aptos token pool type %s", c.Type) } diff --git a/deployment/ccip/shared/deployergroup/deployer_group.go b/deployment/ccip/shared/deployergroup/deployer_group.go index df7309cc2e2..bce0dc3ef82 100644 --- a/deployment/ccip/shared/deployergroup/deployer_group.go +++ b/deployment/ccip/shared/deployergroup/deployer_group.go @@ -335,7 +335,7 @@ func (d *DeployerGroup) Enact() (cldf.ChangesetOutput, error) { return d.enactDeployer() } -func ValidateMCMS(env cldf.Environment, selector uint64, mcmConfig *proposalutils.TimelockConfig) error { +func ValidateMCMSWithState(env cldf.Environment, selector uint64, mcmConfig *proposalutils.TimelockConfig, state stateview.CCIPOnChainState) error { family, err := chain_selectors.GetSelectorFamily(selector) if err != nil { return fmt.Errorf("failed to get chain selector family: %w", err) @@ -343,10 +343,6 @@ func ValidateMCMS(env cldf.Environment, selector uint64, mcmConfig *proposalutil switch family { case chain_selectors.FamilyEVM: - state, err := stateview.LoadOnchainState(env) - if err != nil { - return fmt.Errorf("failed to load onchain state: %w", err) - } mcmsState, ok := state.EVMMCMSStateByChain()[selector] if !ok { return fmt.Errorf("failed to get mcms state for chain %d", selector) @@ -376,7 +372,7 @@ func (d *DeployerGroup) enactMcms() (cldf.ChangesetOutput, error) { batches := make([]mcmstypes.BatchOperation, 0, len(dc.transactions)) describedBatches := make([][]string, 0, len(dc.transactions)) for selector, txs := range dc.transactions { - err := ValidateMCMS(d.e, selector, d.mcmConfig) + err := ValidateMCMSWithState(d.e, selector, d.mcmConfig, d.state) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to validate mcms state: %w", err) } diff --git a/deployment/common/proposalutils/propose.go b/deployment/common/proposalutils/propose.go index a404e6d3258..2e87860af00 100644 --- a/deployment/common/proposalutils/propose.go +++ b/deployment/common/proposalutils/propose.go @@ -34,6 +34,7 @@ type TimelockConfig struct { MCMSAction types.TimelockAction `json:"mcmsAction"` OverrideRoot bool `json:"overrideRoot"` // if true, override the previous root with the new one. TimelockQualifierPerChain map[uint64]string `json:"timelockQualifierPerChain,omitempty"` // optional qualifier to fetch timelock address from datastore + ValidDuration *time.Duration `json:"validDuration" yaml:"validDuration"` } func (tc *TimelockConfig) MCMBasedOnActionSolana(s state.MCMSWithTimelockStateSolana) (string, error) { @@ -212,7 +213,11 @@ func BuildProposalFromBatchesV2( return nil, err } - validUntil := time.Now().Unix() + int64(DefaultValidUntil.Seconds()) + proposalDuration := DefaultValidUntil + if mcmsCfg.ValidDuration != nil { + proposalDuration = *mcmsCfg.ValidDuration + } + validUntil := time.Now().Add(proposalDuration).Unix() builder := mcmslib.NewTimelockProposalBuilder() builder. diff --git a/deployment/cre/capabilities_registry/v2/changeset/add_capabilities_test.go b/deployment/cre/capabilities_registry/v2/changeset/add_capabilities_test.go index cb7179d38d1..b00fff83995 100644 --- a/deployment/cre/capabilities_registry/v2/changeset/add_capabilities_test.go +++ b/deployment/cre/capabilities_registry/v2/changeset/add_capabilities_test.go @@ -22,6 +22,7 @@ import ( var ( newCapID = "new-test-capability@1.0.0" + anotherCapID = "another-test-capability@1.0.0" newCapMetadata = map[string]any{"capabilityType": float64(0), "responseType": float64(0)} newCapConfig = map[string]any{ "restrictedConfig": map[string]any{ @@ -103,17 +104,14 @@ func TestAddCapabilities_VerifyPreconditions(t *testing.T) { require.NoError(t, err) } -func TestAddCapabilities_Apply(t *testing.T) { - // SetupEnvV2 deploys a cap reg v2 and configures it. So no need to do that here, just leverage the existing one. - fixture := test.SetupEnvV2(t, false) - +func addNewCapability(t *testing.T, fixture *test.EnvWrapperV2, capID string) { input := changeset.AddCapabilitiesInput{ RegistryChainSel: fixture.RegistrySelector, RegistryQualifier: test.RegistryQualifier, DonName: test.DONName, CapabilityConfigs: []contracts.CapabilityConfig{{ Capability: contracts.Capability{ - CapabilityID: newCapID, + CapabilityID: capID, ConfigurationContract: common.Address{}, Metadata: newCapMetadata, }, @@ -129,7 +127,9 @@ func TestAddCapabilities_Apply(t *testing.T) { // Apply _, err = changeset.AddCapabilities{}.Apply(*fixture.Env, input) require.NoError(t, err) +} +func requireCapability(t *testing.T, fixture *test.EnvWrapperV2, capID string) { // Validate on-chain state capReg, err := capabilities_registry_v2.NewCapabilitiesRegistry( fixture.RegistryAddress, @@ -137,21 +137,11 @@ func TestAddCapabilities_Apply(t *testing.T) { ) require.NoError(t, err) - // Here we check that the uptyped input of the changeset was correctly applied on-chain as proto and can be decoded back to the same config - // encoding to proto bytes is same as in the changeset and decoding to cap cfg is same as in the v2 registry syncer - capCfg := pkg.CapabilityConfig(newCapConfig) - configProtoBytes, err := capCfg.MarshalProto() // on chain it is stored as proto bytes - require.NoError(t, err, "should be able to marshal new capability config to proto bytes") - - expectedConfig := new(pkg.CapabilityConfig) // expected decoded config, to be compared with decoded on-chain config - err = expectedConfig.UnmarshalProto(configProtoBytes) - require.NoError(t, err, "should be able to unmarshal new capability config from proto bytes") - caps, err := pkg.GetCapabilities(nil, capReg) require.NoError(t, err) var found bool for _, c := range caps { - if c.CapabilityId == newCapID { + if c.CapabilityId == capID { // metadata check var gotMeta map[string]any require.NoError(t, json.Unmarshal(c.Metadata, &gotMeta)) @@ -160,21 +150,31 @@ func TestAddCapabilities_Apply(t *testing.T) { break } } - require.True(t, found, "new capability should be registered") + require.True(t, found, "new capability %s should be registered", capID) // Nodes should now include new capability id nodes, err := pkg.GetNodes(nil, capReg) require.NoError(t, err) for _, n := range nodes { - assert.Contains(t, n.CapabilityIds, newCapID, "node should have new capability id appended") + assert.Contains(t, n.CapabilityIds, capID, "node should have new capability id appended") } + // Here we check that the uptyped input of the changeset was correctly applied on-chain as proto and can be decoded back to the same config + // encoding to proto bytes is same as in the changeset and decoding to cap cfg is same as in the v2 registry syncer + capCfg := pkg.CapabilityConfig(newCapConfig) + configProtoBytes, err := capCfg.MarshalProto() // on chain it is stored as proto bytes + require.NoError(t, err, "should be able to marshal new capability config to proto bytes") + + expectedConfig := new(pkg.CapabilityConfig) // expected decoded config, to be compared with decoded on-chain config + err = expectedConfig.UnmarshalProto(configProtoBytes) + require.NoError(t, err, "should be able to unmarshal new capability config from proto bytes") + // DON capability configurations should include new capability config don, err := capReg.GetDONByName(nil, test.DONName) require.NoError(t, err) var cfgFound bool for _, cfg := range don.CapabilityConfigurations { - if cfg.CapabilityId == newCapID { + if cfg.CapabilityId == capID { got := new(pkg.CapabilityConfig) require.NoError(t, got.UnmarshalProto(cfg.Config), "unmarshal capability config proto bytes should not error") if diff := cmp.Diff(expectedConfig, got, protocmp.Transform()); diff != "" { @@ -184,7 +184,20 @@ func TestAddCapabilities_Apply(t *testing.T) { cfgFound = true } } - require.True(t, cfgFound, "don should have new capability configuration") + require.True(t, cfgFound, "expected don to have %s capability configuration", capID) +} + +func TestAddCapabilities_Apply(t *testing.T) { + // SetupEnvV2 deploys a cap reg v2 and configures it. So no need to do that here, just leverage the existing one. + fixture := test.SetupEnvV2(t, false) + + addNewCapability(t, fixture, newCapID) + requireCapability(t, fixture, newCapID) + + // add another capability and ensure that both are present + addNewCapability(t, fixture, anotherCapID) + requireCapability(t, fixture, newCapID) + requireCapability(t, fixture, anotherCapID) } func TestAddCapabilities_Apply_MCMS(t *testing.T) { diff --git a/deployment/cre/capabilities_registry/v2/changeset/operations/contracts/update_don.go b/deployment/cre/capabilities_registry/v2/changeset/operations/contracts/update_don.go index 03e878d0187..ae5e74c578d 100644 --- a/deployment/cre/capabilities_registry/v2/changeset/operations/contracts/update_don.go +++ b/deployment/cre/capabilities_registry/v2/changeset/operations/contracts/update_don.go @@ -3,6 +3,7 @@ package contracts import ( "errors" "fmt" + "sort" "github.com/Masterminds/semver/v3" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -30,8 +31,9 @@ type UpdateDONInput struct { ChainSelector uint64 // P2PIDs are the peer ids that compose the don. Optional, only provided if the DON composition is changing. - P2PIDs []p2pkey.PeerID - CapabilityConfigs []CapabilityConfig + P2PIDs []p2pkey.PeerID + CapabilityConfigs []CapabilityConfig + MergeCapabilityConfigsWithOnChain bool // DonName to update, this is required DonName string @@ -109,7 +111,7 @@ var UpdateDON = operations.NewOperation[UpdateDONInput, UpdateDONOutput, UpdateD return UpdateDONOutput{}, fmt.Errorf("refusing to update workflow don %d at config version %d because we cannot validate that all forwarder contracts are ready to accept the new configure version", don.Id, don.ConfigCount) } - cfgs, err := computeConfigs(input.CapabilityConfigs, don.CapabilityConfigurations) + cfgs, err := computeConfigs(input.CapabilityConfigs, don.CapabilityConfigurations, input.MergeCapabilityConfigsWithOnChain) if err != nil { return UpdateDONOutput{}, fmt.Errorf("failed to compute configs: %w", err) } @@ -162,21 +164,56 @@ var UpdateDON = operations.NewOperation[UpdateDONInput, UpdateDONOutput, UpdateD }, ) -func computeConfigs(capCfgs []CapabilityConfig, existingCapConfigs []capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration) ([]capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration, error) { - var out []capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration +func computeConfigs( + capCfgs []CapabilityConfig, + existingCapConfigs []capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration, + mergeCapabilities bool) ([]capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration, error) { + capSet := make(map[string]capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration) for _, capCfg := range capCfgs { - cfg := capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration{} - cfg.CapabilityId = capCfg.Capability.CapabilityID - var err error - x := pkg.CapabilityConfig(capCfg.Config) - cfg.Config, err = x.MarshalProto() + onChainCap, err := capabilityConfigToOnChain(capCfg) if err != nil { - return nil, fmt.Errorf("failed to marshal capability configuration config: %w", err) + return nil, fmt.Errorf("failed to convert capability config to on-chain format: %w", err) } - if cfg.Config == nil { - return nil, fmt.Errorf("config is required for capability %s", capCfg.Capability.CapabilityID) + + _, ok := capSet[onChainCap.CapabilityId] + if ok { + return nil, fmt.Errorf("duplicate capability configuration for id: %s", onChainCap.CapabilityId) } - out = append(out, cfg) + + capSet[onChainCap.CapabilityId] = *onChainCap + } + + if mergeCapabilities { + for _, existingCapConfig := range existingCapConfigs { + _, ok := capSet[existingCapConfig.CapabilityId] + if !ok { + capSet[existingCapConfig.CapabilityId] = existingCapConfig + } + } + } + var out []capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration + for _, capCfg := range capSet { + out = append(out, capCfg) } + + sort.Slice(out, func(i, j int) bool { + return out[i].CapabilityId < out[j].CapabilityId + }) return out, nil } + +func capabilityConfigToOnChain(capCfg CapabilityConfig) (*capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration, error) { + cfg := capabilities_registry_v2.CapabilitiesRegistryCapabilityConfiguration{} + cfg.CapabilityId = capCfg.Capability.CapabilityID + var err error + x := pkg.CapabilityConfig(capCfg.Config) + cfg.Config, err = x.MarshalProto() + if err != nil { + return nil, fmt.Errorf("failed to marshal capability configuration config: %w", err) + } + if cfg.Config == nil { + return nil, fmt.Errorf("config is required for capability %s", capCfg.Capability.CapabilityID) + } + + return &cfg, nil +} diff --git a/deployment/cre/capabilities_registry/v2/changeset/sequences/add_capabilities.go b/deployment/cre/capabilities_registry/v2/changeset/sequences/add_capabilities.go index 8cae90e66f3..9b4edb9cee3 100644 --- a/deployment/cre/capabilities_registry/v2/changeset/sequences/add_capabilities.go +++ b/deployment/cre/capabilities_registry/v2/changeset/sequences/add_capabilities.go @@ -184,14 +184,15 @@ var AddCapabilities = operations.NewSequence[AddCapabilitiesInput, AddCapabiliti Strategy: strategy, }, contracts.UpdateDONInput{ - ChainSelector: chainSel, - P2PIDs: p2pIDs, - CapabilityConfigs: input.CapabilityConfigs, - DonName: input.DonName, - F: don.F, - IsPrivate: !don.IsPublic, - Force: input.Force, - MCMSConfig: input.MCMSConfig, + ChainSelector: chainSel, + P2PIDs: p2pIDs, + CapabilityConfigs: input.CapabilityConfigs, + MergeCapabilityConfigsWithOnChain: true, + DonName: input.DonName, + F: don.F, + IsPrivate: !don.IsPublic, + Force: input.Force, + MCMSConfig: input.MCMSConfig, }, ) if err != nil { diff --git a/deployment/cre/common/strategies/mcms_transaction_test.go b/deployment/cre/common/strategies/mcms_transaction_test.go index aecc996fd68..cc7ccad1dc0 100644 --- a/deployment/cre/common/strategies/mcms_transaction_test.go +++ b/deployment/cre/common/strategies/mcms_transaction_test.go @@ -3,6 +3,7 @@ package strategies_test import ( "math/big" "testing" + "time" "github.com/ethereum/go-ethereum/common" mcmstypes "github.com/smartcontractkit/mcms/types" @@ -201,4 +202,31 @@ func TestMCMSTransaction_BuildProposal(t *testing.T) { assert.True(t, ok) assert.Equal(t, mcmsContracts.CancellerMcm.Address().String(), metadata.MCMAddress) }) + + t.Run("uses custom ValidDuration value to set the proposal duration", func(t *testing.T) { + m := getMCMSTransaction(t, *fixture.Env) + validDuration := 2 * time.Second + cfg := contracts.MCMSConfig{ + MinDelay: 0, + TimelockQualifierPerChain: map[uint64]string{ + fixture.RegistrySelector: "", + }, + ValidDuration: &validDuration, + } + mcmsContracts, err := strategies.GetMCMSContracts(*fixture.Env, fixture.RegistrySelector, cfg) + require.NoError(t, err) + m.Config = &cfg + m.MCMSContracts = mcmsContracts + m.ChainSel = fixture.RegistrySelector + + op, err := proposalutils.BatchOperationForChain(m.ChainSel, m.Address.Hex(), []byte{0x01, 0x02, 0x03}, big.NewInt(0), "", nil) + require.NoError(t, err) + + p, err := m.BuildProposal([]mcmstypes.BatchOperation{op}) + require.NoError(t, err) + + expectedValidUntil := time.Now().Add(validDuration).Unix() + // Using InDelta to allow for slight timing differences during test execution + assert.InDelta(t, uint32(expectedValidUntil), p.ValidUntil, 1, "ValidUntil should be within 1 second of expected value") //nolint:gosec // G115 + }) } diff --git a/deployment/cre/contracts/contracts.go b/deployment/cre/contracts/contracts.go index 8a73d9cd314..b2c63a82ede 100644 --- a/deployment/cre/contracts/contracts.go +++ b/deployment/cre/contracts/contracts.go @@ -7,15 +7,13 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" - "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" - - "github.com/smartcontractkit/chainlink-deployments-framework/datastore" - cldf_evm "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm" + "github.com/smartcontractkit/chainlink-deployments-framework/datastore" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" capabilities_registry "github.com/smartcontractkit/chainlink-evm/gethwrappers/keystone/generated/capabilities_registry_1_1_0" diff --git a/deployment/cre/forwarder/configure.go b/deployment/cre/forwarder/configure.go index 071336d7959..25f7dc27069 100644 --- a/deployment/cre/forwarder/configure.go +++ b/deployment/cre/forwarder/configure.go @@ -54,7 +54,8 @@ func (d DonConfiguration) ForwarderConfig(chainFamily string, c offchain.Client) } type ConfigureSeqInput struct { - DON DonConfiguration // the DON to configuration for the forwarder to accept + DON DonConfiguration // the DON to configuration for the forwarder to accept + Qualifier string // used to differentiate Forwarder contracts deployed to the same chain. // MCMSConfig is optional. If non-nil, the changes will be proposed using MCMS. MCMSConfig *contracts.MCMSConfig @@ -96,14 +97,23 @@ var ConfigureSeq = operations.NewSequence[ConfigureSeqInput, ConfigureSeqOutput, continue } - addressesRefs := deps.Env.DataStore.Addresses().Filter( + filters := []datastore.FilterFunc[datastore.AddressRefKey, datastore.AddressRef]{ datastore.AddressRefByChainSelector(chain.Selector), - datastore.AddressRefByType(datastore.ContractType(contracts.KeystoneForwarder)), - ) + datastore.AddressRefByType(datastore.ContractType(contracts.KeystoneForwarder))} + if input.Qualifier != "" { + filters = append(filters, datastore.AddressRefByQualifier(input.Qualifier)) + } + + addressesRefs := deps.Env.DataStore.Addresses().Filter(filters...) if len(addressesRefs) == 0 { return ConfigureSeqOutput{}, fmt.Errorf("configure-forwarders-seq failed: no KeystoneForwarder contract found for chain selector %d", chain.Selector) } + if len(addressesRefs) > 1 { + deps.Env.Logger.Warnf( + "Found %d forwarder contracts for a chain. Config will be applied to all of them.", len(addressesRefs)) + } + var mcmsContracts *changesetstate.MCMSWithTimelockState if input.MCMSConfig != nil { var mcmsErr error diff --git a/deployment/go.mod b/deployment/go.mod index 129ab4b2f01..564e7e68b54 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -42,17 +42,17 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 - github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c - github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c + github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c + github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 github.com/smartcontractkit/chainlink-testing-framework/lib v1.54.5 github.com/smartcontractkit/chainlink-ton v0.0.0-20251128154102-ae6a4d19188f @@ -414,12 +414,12 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251127040717-30244f57ea7a // indirect github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e // indirect - github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 // indirect + github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.6 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a // indirect github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 // indirect github.com/smartcontractkit/chainlink-protos/chainlink-ccv/go v0.0.0-20251126123859-d079d6815edb // indirect diff --git a/deployment/go.sum b/deployment/go.sum index 0145c7e6871..a1c9b1fdcad 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1356,28 +1356,28 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e h1:hQEOz6nRQgIQf0HS3EsjS22cAwejLa6q4nCyFGYrb/s= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 h1:sdBNurxM3XEsclOJVSqyqM+WKV/rw/2ykgCeIox4YT0= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1/go.mod h1:Dspcf1LYGPDvgUKO09kqfexFvnOFbKfoGz02VwHpuw4= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 h1:2LHrlWAStA2oRcDKrJ9lKOShC9an2Pkis2BwY8J7gDw= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 h1:0IMjHpzI9mgvGGtmsr1NdRhoXp++gU805f/f9oN94ls= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599/go.mod h1:Ysd/qkofD0bepk29RS7Q4ZlVDd4yAHXucYsp5gAy6AE= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 h1:b8aHhus/+bikhHlR5+Ll4Z0hsczJPA0hEj68/8+xyXs= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7/go.mod h1:yaDOAZF6MNB+NGYpxGCUc+owIdKrjvFW0JODdTcQ3V0= -github.com/smartcontractkit/chainlink-data-streams v0.1.6 h1:B3cwmJrVYoJVAjPOyQWTNaGD+V30HI1vFHhC2dQpWDo= -github.com/smartcontractkit/chainlink-data-streams v0.1.6/go.mod h1:e9jETTzrVO8iu9Zp5gDuTCmBVhSJwUOk6K4Q/VFrJ6o= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 h1:gU4suSMid2uQVSxdtPhqGR9s9w3ViclcGtwkQaNbrtM= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19/go.mod h1:GPsn6PKJvPe1UfRYyVxsDzOWq6NILzBstiiLq/w+kG0= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 h1:wo2KL2viGZK/LhHLM8F88sRyhZF9wwWh+YDzW8hS00g= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0/go.mod h1:Cp7PuO7HUDugp7bWGP/TcDAvvvkFLdKOVrSm0zXlnhg= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb h1:/oWqkc0mU63UNydxUiRZTv+ZYRzGF+9WHrpbuxDTBtY= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb/go.mod h1:OQCmZCKnOiNp7LVbHAr6xZ9SThAU7jx5uI+aCvLOn1Q= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec h1:K8sLjgwPgozQb86LH+aWXqBUJak6VGwSt5YiKbCI/uY= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec/go.mod h1:9VcrUs+H/f9ekkqAdfUd70Pk2dA1Zc3KykJVFBfJNHs= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b h1:Dqhm/67Sb1ohgce8FW6tnK1CRXo2zoLCbV+EGyew5sg= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b/go.mod h1:oyfOm4k0uqmgZIfxk1elI/59B02shbbJQiiUdPdbMgI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 h1:ACpDbAxG4fa4sA83dbtYcrnlpE/y7thNIZfHxTv2ZLs= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 h1:Mf+IRvrXutcKAKpuOxq5Ae+AAw4Z5vc66q1xI7qimZQ= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= @@ -1406,10 +1406,10 @@ github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331- github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 h1:4cvFf82P3VcNHgqUG0aRBeIMZd+wSX37ha28Gkie9Lk= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6/go.mod h1:zX8dX6aXjJNkfbpr1AiTzCioma0sHh5CBPZKtqC7plY= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c h1:M+LA7CVnz4R9A9ZxPz4jcNjGNw50HYR4cNl+PLvQynA= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c h1:AY6zMBsk8Y+woOfT5LiiODloohDCtSj8FyR/iEvGmP0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c h1:aNA7J31EuOf755BDgNuhxte5+Z6wucBx/ONGihw2OqA= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c h1:uV+yJbVYI5RoTNFSh/tDflWDXJtRk8Yrp0m1VgTy6ro= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3OrOQfLubJ+os0/oau2V6RISgsEdBg+Q002zkgXpQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/lib v1.54.5 h1:jARz/SWbmWoGJJGVcAnWwGMb8JuHRTQQsM3m6ZwrAGk= diff --git a/docs/CONFIG.md b/docs/CONFIG.md index 4c8a1d341c0..8eaf31c1f66 100644 --- a/docs/CONFIG.md +++ b/docs/CONFIG.md @@ -1018,6 +1018,7 @@ AllowNoBootstrappers = false # Default DefaultTransactionQueueDepth = 1 # Default SimulateTransactions = false # Default TraceLogging = false # Default +SampleTelemetry = false # Default KeyValueStoreRootDir = '~/.chainlink-data' # Default ``` @@ -1140,6 +1141,12 @@ TraceLogging = false # Default ``` TraceLogging enables trace level logging. +### SampleTelemetry +```toml +SampleTelemetry = false # Default +``` +SampleTelemetry enables telemetry sampling. + ### KeyValueStoreRootDir ```toml KeyValueStoreRootDir = '~/.chainlink-data' # Default @@ -2702,7 +2709,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -2819,7 +2826,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -2936,7 +2943,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3053,7 +3060,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3175,7 +3182,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -3293,7 +3300,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3410,7 +3417,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3526,7 +3533,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3642,7 +3649,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3759,7 +3766,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3876,7 +3883,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3994,7 +4001,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4111,7 +4118,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4228,7 +4235,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4350,7 +4357,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4467,7 +4474,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4584,7 +4591,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4701,7 +4708,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4823,7 +4830,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4942,7 +4949,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -5061,7 +5068,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -5183,7 +5190,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5303,7 +5310,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5424,7 +5431,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5541,7 +5548,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5657,7 +5664,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5779,7 +5786,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -5900,7 +5907,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6018,7 +6025,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6136,7 +6143,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6257,7 +6264,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6378,7 +6385,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6500,7 +6507,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -6622,7 +6629,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6739,7 +6746,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -6857,7 +6864,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6979,7 +6986,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7095,7 +7102,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7217,7 +7224,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7336,7 +7343,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7454,7 +7461,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7572,7 +7579,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7689,7 +7696,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7805,7 +7812,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7927,7 +7934,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8049,7 +8056,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8165,7 +8172,7 @@ EnforceRepeatableRead = false DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8287,7 +8294,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8409,7 +8416,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8526,7 +8533,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8643,7 +8650,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8759,7 +8766,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8881,7 +8888,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -9000,7 +9007,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -9116,7 +9123,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9233,7 +9240,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9350,7 +9357,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9467,7 +9474,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9585,7 +9592,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -9707,7 +9714,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9830,7 +9837,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9953,7 +9960,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10069,7 +10076,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10191,7 +10198,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10307,7 +10314,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10425,7 +10432,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10546,7 +10553,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10667,7 +10674,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10784,7 +10791,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10906,7 +10913,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11027,7 +11034,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [NodePool.Errors] TerminallyUnderpriced = '(?:: |^)(max fee per gas less than block base fee|virtual machine entered unexpected state. (?:P|p)lease contact developers and provide transaction details that caused this error. Error description: (?:The operator included transaction with an unacceptable gas price|Assertion error: Fair pubdata price too high))$' @@ -11151,7 +11158,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11269,7 +11276,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11390,7 +11397,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11507,7 +11514,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11624,7 +11631,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11742,7 +11749,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11866,7 +11873,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11990,7 +11997,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12107,7 +12114,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12229,7 +12236,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12345,7 +12352,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12464,7 +12471,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12583,7 +12590,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12705,7 +12712,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12827,7 +12834,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12947,7 +12954,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13064,7 +13071,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13181,7 +13188,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13298,7 +13305,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13415,7 +13422,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13537,7 +13544,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13658,7 +13665,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -13780,7 +13787,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -13896,7 +13903,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14012,7 +14019,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14133,7 +14140,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14249,7 +14256,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14365,7 +14372,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14486,7 +14493,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14603,7 +14610,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14720,7 +14727,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14841,7 +14848,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14962,7 +14969,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15083,7 +15090,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15206,7 +15213,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15329,7 +15336,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15447,7 +15454,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15568,7 +15575,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15689,7 +15696,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -15811,7 +15818,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -15933,7 +15940,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16053,7 +16060,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16170,7 +16177,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16292,7 +16299,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -16413,7 +16420,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16534,7 +16541,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16656,7 +16663,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16773,7 +16780,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16890,7 +16897,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17791,7 +17798,7 @@ EnforceRepeatableRead = true # Default DeathDeclarationDelay = '1m' # Default NewHeadsPollInterval = '0s' # Default VerifyChainID = true # Default -ExternalRequestMaxResponseSize = 50000 # Default +ExternalRequestMaxResponseSize = 1000000 # Default ``` The node pool manages multiple RPC endpoints. @@ -17901,7 +17908,7 @@ VerifyChainID enforces RPC Client ChainIDs to match configured ChainID ### ExternalRequestMaxResponseSize ```toml -ExternalRequestMaxResponseSize = 50000 # Default +ExternalRequestMaxResponseSize = 1000000 # Default ``` ExternalRequestMaxResponseSize sets the maximum allowed size (in bytes) for responses to external requests. Responses larger than this value will be rejected to prevent the node from being overloaded. diff --git a/go.mod b/go.mod index ce5e62042c2..f38a2980c27 100644 --- a/go.mod +++ b/go.mod @@ -84,15 +84,15 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 + github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 - github.com/smartcontractkit/chainlink-data-streams v0.1.6 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb + github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 @@ -101,7 +101,7 @@ require ( github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0 github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 - github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c + github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c github.com/smartcontractkit/chainlink-ton v0.0.0-20251128154102-ae6a4d19188f github.com/smartcontractkit/cre-sdk-go v0.7.1-0.20250919133015-2df149f34a81 github.com/smartcontractkit/cre-sdk-go/capabilities/networking/http v0.7.0 diff --git a/go.sum b/go.sum index fe989287c61..042782b34ce 100644 --- a/go.sum +++ b/go.sum @@ -54,6 +54,8 @@ cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/bigmod v0.1.0 h1:UNzDk7y9ADKST+axd9skUpBQeW7fG2KrTZyOE4uGQy8= filippo.io/bigmod v0.1.0/go.mod h1:OjOXDNlClLblvXdwgFFOQFJEocLhhtai8vGLy0JCZlI= @@ -251,6 +253,14 @@ github.com/consensys/gnark-crypto v0.18.1 h1:RyLV6UhPRoYYzaFnPQA4qK3DyuDgkTgskDd github.com/consensys/gnark-crypto v0.18.1/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E= +github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -278,6 +288,8 @@ github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5Rtn github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= 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.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= @@ -325,6 +337,10 @@ github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINA github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +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/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= +github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -337,6 +353,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp 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/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -835,6 +853,8 @@ github.com/linxGnu/grocksdb v1.9.3/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PN 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/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -900,6 +920,20 @@ github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmL github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= +github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= +github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= 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= @@ -907,6 +941,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 h1:mPMvm6X6tf4w8y7j9YIt6V9jfWhL6QlbEc7CCmeQlWk= 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= @@ -1090,6 +1126,8 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhVnuPE= github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg= +github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= +github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= @@ -1124,26 +1162,26 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-f github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 h1:Z4t2ZY+ZyGWxtcXvPr11y4o3CGqhg3frJB5jXkCSvWA= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 h1:sdBNurxM3XEsclOJVSqyqM+WKV/rw/2ykgCeIox4YT0= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1/go.mod h1:Dspcf1LYGPDvgUKO09kqfexFvnOFbKfoGz02VwHpuw4= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 h1:2LHrlWAStA2oRcDKrJ9lKOShC9an2Pkis2BwY8J7gDw= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 h1:0IMjHpzI9mgvGGtmsr1NdRhoXp++gU805f/f9oN94ls= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599/go.mod h1:Ysd/qkofD0bepk29RS7Q4ZlVDd4yAHXucYsp5gAy6AE= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 h1:b8aHhus/+bikhHlR5+Ll4Z0hsczJPA0hEj68/8+xyXs= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7/go.mod h1:yaDOAZF6MNB+NGYpxGCUc+owIdKrjvFW0JODdTcQ3V0= -github.com/smartcontractkit/chainlink-data-streams v0.1.6 h1:B3cwmJrVYoJVAjPOyQWTNaGD+V30HI1vFHhC2dQpWDo= -github.com/smartcontractkit/chainlink-data-streams v0.1.6/go.mod h1:e9jETTzrVO8iu9Zp5gDuTCmBVhSJwUOk6K4Q/VFrJ6o= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb h1:/oWqkc0mU63UNydxUiRZTv+ZYRzGF+9WHrpbuxDTBtY= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb/go.mod h1:OQCmZCKnOiNp7LVbHAr6xZ9SThAU7jx5uI+aCvLOn1Q= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 h1:gU4suSMid2uQVSxdtPhqGR9s9w3ViclcGtwkQaNbrtM= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19/go.mod h1:GPsn6PKJvPe1UfRYyVxsDzOWq6NILzBstiiLq/w+kG0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec h1:K8sLjgwPgozQb86LH+aWXqBUJak6VGwSt5YiKbCI/uY= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec/go.mod h1:9VcrUs+H/f9ekkqAdfUd70Pk2dA1Zc3KykJVFBfJNHs= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b h1:Dqhm/67Sb1ohgce8FW6tnK1CRXo2zoLCbV+EGyew5sg= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b/go.mod h1:oyfOm4k0uqmgZIfxk1elI/59B02shbbJQiiUdPdbMgI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 h1:ACpDbAxG4fa4sA83dbtYcrnlpE/y7thNIZfHxTv2ZLs= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 h1:Mf+IRvrXutcKAKpuOxq5Ae+AAw4Z5vc66q1xI7qimZQ= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= @@ -1168,8 +1206,8 @@ github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331- github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 h1:4cvFf82P3VcNHgqUG0aRBeIMZd+wSX37ha28Gkie9Lk= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6/go.mod h1:zX8dX6aXjJNkfbpr1AiTzCioma0sHh5CBPZKtqC7plY= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c h1:M+LA7CVnz4R9A9ZxPz4jcNjGNw50HYR4cNl+PLvQynA= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c h1:aNA7J31EuOf755BDgNuhxte5+Z6wucBx/ONGihw2OqA= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= github.com/smartcontractkit/chainlink-ton v0.0.0-20251128154102-ae6a4d19188f h1:JM3KNLhwL4mb0RM2X5Zs7Ac8Cq6/mhjA5eJL8YaKAL0= github.com/smartcontractkit/chainlink-ton v0.0.0-20251128154102-ae6a4d19188f/go.mod h1:rxekiaWnJnFFfklae1OvO6T7xHJtsEldDvW/e5+b/qg= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20251014143056-a0c6328c91e9 h1:7Ut0g+Pdm+gcu2J/Xv8OpQOVf7uLGErMX8yhC4b4tIA= @@ -1260,6 +1298,10 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/testcontainers/testcontainers-go v0.39.0 h1:uCUJ5tA+fcxbFAB0uP3pIK3EJ2IjjDUHFSZ1H1UxAts= +github.com/testcontainers/testcontainers-go v0.39.0/go.mod h1:qmHpkG7H5uPf/EvOORKvS6EuDkBUPE3zpVGaH9NL7f8= +github.com/testcontainers/testcontainers-go/modules/postgres v0.39.0 h1:REJz+XwNpGC/dCgTfYvM4SKqobNqDBfvhq74s2oHTUM= +github.com/testcontainers/testcontainers-go/modules/postgres v0.39.0/go.mod h1:4K2OhtHEeT+JSIFX4V8DkGKsyLa96Y2vLdd3xsxD5HE= github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a h1:YuO+afVc3eqrjiCUizNCxI53bl/BnPiVwXqLzqYTqgU= github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a/go.mod h1:/sfW47zCZp9FrtGcWyo1VjbgDaodxX9ovZvgLb/MxaA= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= @@ -1364,6 +1406,8 @@ go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0. go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= go.opentelemetry.io/contrib/propagators/b3 v1.24.0/go.mod h1:k5wRxKRU2uXx2F8uNJ4TaonuEO/V7/5xoz7kdsDACT8= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 5cef235142f..c9a9a01932c 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -51,13 +51,13 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 - github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c - github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c + github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c + github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.5 github.com/smartcontractkit/chainlink-testing-framework/lib v1.54.7 github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.51.0 @@ -496,12 +496,12 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251127040717-30244f57ea7a // indirect github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e // indirect - github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 // indirect + github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.6 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 // indirect github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index b9cb18efaa4..7ce4fdb5c27 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1599,28 +1599,28 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e h1:hQEOz6nRQgIQf0HS3EsjS22cAwejLa6q4nCyFGYrb/s= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 h1:sdBNurxM3XEsclOJVSqyqM+WKV/rw/2ykgCeIox4YT0= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1/go.mod h1:Dspcf1LYGPDvgUKO09kqfexFvnOFbKfoGz02VwHpuw4= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 h1:2LHrlWAStA2oRcDKrJ9lKOShC9an2Pkis2BwY8J7gDw= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 h1:0IMjHpzI9mgvGGtmsr1NdRhoXp++gU805f/f9oN94ls= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599/go.mod h1:Ysd/qkofD0bepk29RS7Q4ZlVDd4yAHXucYsp5gAy6AE= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 h1:b8aHhus/+bikhHlR5+Ll4Z0hsczJPA0hEj68/8+xyXs= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7/go.mod h1:yaDOAZF6MNB+NGYpxGCUc+owIdKrjvFW0JODdTcQ3V0= -github.com/smartcontractkit/chainlink-data-streams v0.1.6 h1:B3cwmJrVYoJVAjPOyQWTNaGD+V30HI1vFHhC2dQpWDo= -github.com/smartcontractkit/chainlink-data-streams v0.1.6/go.mod h1:e9jETTzrVO8iu9Zp5gDuTCmBVhSJwUOk6K4Q/VFrJ6o= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 h1:gU4suSMid2uQVSxdtPhqGR9s9w3ViclcGtwkQaNbrtM= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19/go.mod h1:GPsn6PKJvPe1UfRYyVxsDzOWq6NILzBstiiLq/w+kG0= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 h1:wo2KL2viGZK/LhHLM8F88sRyhZF9wwWh+YDzW8hS00g= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0/go.mod h1:Cp7PuO7HUDugp7bWGP/TcDAvvvkFLdKOVrSm0zXlnhg= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb h1:/oWqkc0mU63UNydxUiRZTv+ZYRzGF+9WHrpbuxDTBtY= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb/go.mod h1:OQCmZCKnOiNp7LVbHAr6xZ9SThAU7jx5uI+aCvLOn1Q= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec h1:K8sLjgwPgozQb86LH+aWXqBUJak6VGwSt5YiKbCI/uY= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec/go.mod h1:9VcrUs+H/f9ekkqAdfUd70Pk2dA1Zc3KykJVFBfJNHs= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b h1:Dqhm/67Sb1ohgce8FW6tnK1CRXo2zoLCbV+EGyew5sg= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b/go.mod h1:oyfOm4k0uqmgZIfxk1elI/59B02shbbJQiiUdPdbMgI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 h1:ACpDbAxG4fa4sA83dbtYcrnlpE/y7thNIZfHxTv2ZLs= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 h1:Mf+IRvrXutcKAKpuOxq5Ae+AAw4Z5vc66q1xI7qimZQ= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= @@ -1649,10 +1649,10 @@ github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331- github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 h1:4cvFf82P3VcNHgqUG0aRBeIMZd+wSX37ha28Gkie9Lk= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6/go.mod h1:zX8dX6aXjJNkfbpr1AiTzCioma0sHh5CBPZKtqC7plY= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c h1:M+LA7CVnz4R9A9ZxPz4jcNjGNw50HYR4cNl+PLvQynA= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c h1:AY6zMBsk8Y+woOfT5LiiODloohDCtSj8FyR/iEvGmP0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c h1:aNA7J31EuOf755BDgNuhxte5+Z6wucBx/ONGihw2OqA= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c h1:uV+yJbVYI5RoTNFSh/tDflWDXJtRk8Yrp0m1VgTy6ro= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3OrOQfLubJ+os0/oau2V6RISgsEdBg+Q002zkgXpQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.5 h1:S5HND0EDtlA+xp2E+mD11DlUTp2wD6uojwixye8ZB/k= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 54ee0d5fb74..50b1cc68d6e 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -32,9 +32,9 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.5 @@ -481,12 +481,12 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251127040717-30244f57ea7a // indirect github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e // indirect - github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 // indirect + github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.6 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 // indirect github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 // indirect @@ -500,8 +500,8 @@ require ( github.com/smartcontractkit/chainlink-protos/svr v1.1.0 // indirect github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 // indirect - github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c // indirect - github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c // indirect + github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c // indirect + github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.51.0 // indirect github.com/smartcontractkit/chainlink-testing-framework/parrot v0.6.2 // indirect github.com/smartcontractkit/chainlink-testing-framework/sentinel v0.1.2 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index a27f0142126..15dd050f49b 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1578,28 +1578,28 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e h1:hQEOz6nRQgIQf0HS3EsjS22cAwejLa6q4nCyFGYrb/s= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 h1:sdBNurxM3XEsclOJVSqyqM+WKV/rw/2ykgCeIox4YT0= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1/go.mod h1:Dspcf1LYGPDvgUKO09kqfexFvnOFbKfoGz02VwHpuw4= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 h1:2LHrlWAStA2oRcDKrJ9lKOShC9an2Pkis2BwY8J7gDw= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 h1:0IMjHpzI9mgvGGtmsr1NdRhoXp++gU805f/f9oN94ls= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599/go.mod h1:Ysd/qkofD0bepk29RS7Q4ZlVDd4yAHXucYsp5gAy6AE= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 h1:b8aHhus/+bikhHlR5+Ll4Z0hsczJPA0hEj68/8+xyXs= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7/go.mod h1:yaDOAZF6MNB+NGYpxGCUc+owIdKrjvFW0JODdTcQ3V0= -github.com/smartcontractkit/chainlink-data-streams v0.1.6 h1:B3cwmJrVYoJVAjPOyQWTNaGD+V30HI1vFHhC2dQpWDo= -github.com/smartcontractkit/chainlink-data-streams v0.1.6/go.mod h1:e9jETTzrVO8iu9Zp5gDuTCmBVhSJwUOk6K4Q/VFrJ6o= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 h1:gU4suSMid2uQVSxdtPhqGR9s9w3ViclcGtwkQaNbrtM= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19/go.mod h1:GPsn6PKJvPe1UfRYyVxsDzOWq6NILzBstiiLq/w+kG0= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 h1:wo2KL2viGZK/LhHLM8F88sRyhZF9wwWh+YDzW8hS00g= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0/go.mod h1:Cp7PuO7HUDugp7bWGP/TcDAvvvkFLdKOVrSm0zXlnhg= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb h1:/oWqkc0mU63UNydxUiRZTv+ZYRzGF+9WHrpbuxDTBtY= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb/go.mod h1:OQCmZCKnOiNp7LVbHAr6xZ9SThAU7jx5uI+aCvLOn1Q= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec h1:K8sLjgwPgozQb86LH+aWXqBUJak6VGwSt5YiKbCI/uY= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec/go.mod h1:9VcrUs+H/f9ekkqAdfUd70Pk2dA1Zc3KykJVFBfJNHs= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b h1:Dqhm/67Sb1ohgce8FW6tnK1CRXo2zoLCbV+EGyew5sg= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b/go.mod h1:oyfOm4k0uqmgZIfxk1elI/59B02shbbJQiiUdPdbMgI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 h1:ACpDbAxG4fa4sA83dbtYcrnlpE/y7thNIZfHxTv2ZLs= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 h1:Mf+IRvrXutcKAKpuOxq5Ae+AAw4Z5vc66q1xI7qimZQ= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= @@ -1628,10 +1628,10 @@ github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331- github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 h1:4cvFf82P3VcNHgqUG0aRBeIMZd+wSX37ha28Gkie9Lk= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6/go.mod h1:zX8dX6aXjJNkfbpr1AiTzCioma0sHh5CBPZKtqC7plY= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c h1:M+LA7CVnz4R9A9ZxPz4jcNjGNw50HYR4cNl+PLvQynA= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c h1:AY6zMBsk8Y+woOfT5LiiODloohDCtSj8FyR/iEvGmP0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c h1:aNA7J31EuOf755BDgNuhxte5+Z6wucBx/ONGihw2OqA= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c h1:uV+yJbVYI5RoTNFSh/tDflWDXJtRk8Yrp0m1VgTy6ro= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3OrOQfLubJ+os0/oau2V6RISgsEdBg+Q002zkgXpQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.5 h1:S5HND0EDtlA+xp2E+mD11DlUTp2wD6uojwixye8ZB/k= diff --git a/plugins/plugins.private.yaml b/plugins/plugins.private.yaml index 6e66b303d28..0435563cdec 100644 --- a/plugins/plugins.private.yaml +++ b/plugins/plugins.private.yaml @@ -41,7 +41,7 @@ plugins: installPath: "." evm: - moduleURI: "github.com/smartcontractkit/capabilities/chain_capabilities/evm" - gitRef: "48b980e79256bdeb2fe2ad7cf70ed9fe8ac0d4d2" + gitRef: "a58bf1a88e6354104831ab442a49ad6df56972f4" installPath: "." mock: - moduleURI: "github.com/smartcontractkit/capabilities/mock" diff --git a/plugins/plugins.public.yaml b/plugins/plugins.public.yaml index c0d2e324d0c..b3a11f8b1c5 100644 --- a/plugins/plugins.public.yaml +++ b/plugins/plugins.public.yaml @@ -15,7 +15,7 @@ plugins: sui: - moduleURI: "github.com/smartcontractkit/chainlink-sui" - gitRef: "v0.0.0-20251128231234-4fdf15cd020c" + gitRef: "v0.0.0-20251205161630-88314452254c" installPath: "./relayer/cmd/chainlink-sui" cosmos: @@ -45,7 +45,7 @@ plugins: streams: - moduleURI: "github.com/smartcontractkit/chainlink-data-streams" - gitRef: "v0.1.6" + gitRef: "v0.1.7-0.20251209111830-ccd12a5b2a19" installPath: "./mercury/cmd/chainlink-mercury" ton: diff --git a/system-tests/lib/cre/features/evm/v2/evm.go b/system-tests/lib/cre/features/evm/v2/evm.go index 6f1ebad54bb..713cae87990 100644 --- a/system-tests/lib/cre/features/evm/v2/evm.go +++ b/system-tests/lib/cre/features/evm/v2/evm.go @@ -76,7 +76,7 @@ func (o *EVM) PreEnvStartup( if exist { selectorsToDeploy := make([]uint64, 0) for _, selector := range evmForwardersSelectors { - // filter out EVM forwarder selectors that might have been already deployed by evm_v2 capability + // filter out EVM forwarder selectors that might have been already deployed by evm_v1 capability forwarderAddr := contracts.MightGetAddressFromDataStore(creEnv.CldfEnvironment.DataStore, selector, keystone_changeset.KeystoneForwarder.String(), creEnv.ContractVersions[keystone_changeset.KeystoneForwarder.String()], "") if forwarderAddr == nil { selectorsToDeploy = append(selectorsToDeploy, selector) @@ -181,7 +181,7 @@ func (o *EVM) PostEnvStartup( chainsWithEVMCapability := chainsWithEVMCapability(creEnv.Blockchains, dons.DonsWithFlag(flag)) for chainID, selector := range chainsWithEVMCapability { qualifier := ks_contracts_op.CapabilityContractIdentifier(uint64(chainID)) - _, _, seqErr := contracts.DeployOCR3Contract(testLogger, qualifier, creEnv.RegistryChainSelector, creEnv.CldfEnvironment, creEnv.ContractVersions) + _, _, seqErr := contracts.DeployOCR3Contract(testLogger, qualifier, uint64(selector), creEnv.CldfEnvironment, creEnv.ContractVersions) if seqErr != nil { return fmt.Errorf("failed to deploy EVM OCR3 contract for chainID %d, selector %d: %w", chainID, selector, seqErr) } @@ -200,11 +200,9 @@ func (o *EVM) PostEnvStartup( // TODO should we make sure that log poller is listening before we try to configure contracts? // configure OCR3 contracts - for chainID := range chainsWithEVMCapability { + for chainID, selector := range chainsWithEVMCapability { qualifier := ks_contracts_op.CapabilityContractIdentifier(uint64(chainID)) - // we have deployed OCR3 contract for each EVM chain on the registry chain to avoid a situation when more than 1 OCR contract (of any type) has the same address - // because in past that violeted a DB constraint for offchain reporting jobs. Now there is no such limitation, but still it's better to have unique addresses to avoid confusion. - evmOCR3Addr := contracts.MustGetAddressFromDataStore(creEnv.CldfEnvironment.DataStore, creEnv.RegistryChainSelector, keystone_changeset.OCR3Capability.String(), semver.MustParse("1.0.0"), qualifier) + evmOCR3Addr := contracts.MustGetAddressFromDataStore(creEnv.CldfEnvironment.DataStore, uint64(selector), keystone_changeset.OCR3Capability.String(), semver.MustParse("1.0.0"), qualifier) var evmDON *cre.Don for _, don := range dons.DonsWithFlag(cre.EVMCapability) { if flags.HasFlagForChain(don.Flags, cre.EVMCapability, uint64(chainID)) { @@ -222,9 +220,9 @@ func (o *EVM) PostEnvStartup( return fmt.Errorf("failed to get default OCR3 config: %w", ocr3confErr) } - chain, ok := creEnv.CldfEnvironment.BlockChains.EVMChains()[creEnv.RegistryChainSelector] + chain, ok := creEnv.CldfEnvironment.BlockChains.EVMChains()[uint64(selector)] if !ok { - return fmt.Errorf("chain with selector %d not found in environment", creEnv.RegistryChainSelector) + return fmt.Errorf("chain with selector %d not found in environment", selector) } strategy, err := strategies.CreateStrategy( @@ -248,7 +246,7 @@ func (o *EVM) PostEnvStartup( }, ks_contracts_op.ConfigureOCR3OpInput{ ContractAddress: ptr.Ptr(common.HexToAddress(evmOCR3Addr)), - ChainSelector: creEnv.RegistryChainSelector, + ChainSelector: uint64(selector), DON: evmDON.KeystoneDONConfig(), Config: evmDON.ResolveORC3Config(ocr3Config), DryRun: false, @@ -350,17 +348,14 @@ func createJobs( qualifier := ks_contracts_op.CapabilityContractIdentifier(chainID) ocr3Key := datastore.NewAddressRefKey( - // we have deployed OCR3 contract for each EVM chain on the registry chain to avoid a situation when more than 1 OCR contract (of any type) has the same address - // because that violates a DB constraint for offchain reporting jobs - // this can be removed once https://smartcontract-it.atlassian.net/browse/PRODCRE-804 is done and we can deploy OCR3 contract for each EVM chain on that chain - creEnv.RegistryChainSelector, + chainSelector, datastore.ContractType(keystone_changeset.OCR3Capability.String()), semver.MustParse("1.0.0"), qualifier, ) ocr3ConfigContractAddress, err := creEnv.CldfEnvironment.DataStore.Addresses().Get(ocr3Key) if err != nil { - return errors.Wrapf(err, "failed contract address for key %s and chainID %d", ocr3Key, chainID) + return errors.Wrapf(err, "failed to get contract address for key %s and chainID %d", ocr3Key, chainID) } bootInput := cre_jobs.ProposeJobSpecInput{ @@ -518,170 +513,6 @@ func createJobs( return nil } -// func createJobs( -// ctx context.Context, -// don *cre.Don, -// dons *cre.Dons, -// creEnv *cre.Environment, -// ) error { -// jobSpecs := []*jobv1.ProposeJobRequest{} - -// capabilityConfig, ok := creEnv.CapabilityConfigs[flag] -// if !ok { -// return fmt.Errorf("%s config not found in capabilities config: %v", flag, creEnv.CapabilityConfigs) -// } - -// bootstrapNode, isBootstrap := dons.Bootstrap() -// if !isBootstrap { -// return errors.New("could not find bootstrap node in topology, exactly one bootstrap node is required") -// } - -// workerNodes, wErr := don.Workers() -// if wErr != nil { -// return errors.Wrap(wErr, "failed to find worker nodes") -// } - -// var nodeSet cre.NodeSetWithCapabilityConfigs -// for _, ns := range dons.AsNodeSetWithChainCapabilities() { -// if ns.GetName() == don.Name { -// nodeSet = ns -// break -// } -// } -// if nodeSet == nil { -// return fmt.Errorf("could not find node set for Don named '%s'", don.Name) -// } - -// command, cErr := standardcapability.GetCommand(capabilityConfig.BinaryPath, creEnv.Provider) -// if cErr != nil { -// return errors.Wrap(cErr, "failed to get command for cron capability") -// } - -// chainConfig, ok := nodeSet.GetChainCapabilityConfigs()[flag] -// if !ok { -// return fmt.Errorf("could not find capability config for capability %s in node set %s", flag, nodeSet.GetName()) -// } - -// for _, chainID := range chainConfig.EnabledChains { -// chainIDStr := strconv.FormatUint(chainID, 10) -// chain, ok := chainselectors.ChainByEvmChainID(chainID) -// if !ok { -// return fmt.Errorf("failed to get chain selector for chain ID %d", chainID) -// } - -// _, templateData, rErr := envconfig.ResolveCapabilityForChain(flag, nodeSet.GetChainCapabilityConfigs(), capabilityConfig.Config, chainID) -// if rErr != nil { -// return errors.Wrap(rErr, "failed to resolve capability config for chain") -// } - -// ocr3Key := datastore.NewAddressRefKey( -// // we have deployed OCR3 contract for each EVM chain on the registry chain to avoid a situation when more than 1 OCR contract (of any type) has the same address -// // because that violates a DB constraint for offchain reporting jobs -// // this can be removed once https://smartcontract-it.atlassian.net/browse/PRODCRE-804 is done and we can deploy OCR3 contract for each EVM chain on that chain -// creEnv.RegistryChainSelector, -// datastore.ContractType(keystone_changeset.OCR3Capability.String()), -// semver.MustParse("1.0.0"), -// ks_contracts_op.CapabilityContractIdentifier(chainID), -// ) -// ocr3ConfigContractAddress, err := creEnv.CldfEnvironment.DataStore.Addresses().Get(ocr3Key) -// if err != nil { -// return errors.Wrapf(err, "failed contract address for key %s and chainID %d", ocr3Key, chainID) -// } - -// jobSpecs = append(jobSpecs, ocr.BootstrapJobSpec(bootstrapNode.JobDistributorDetails.NodeID, flag, ocr3ConfigContractAddress.Address, chainID)) - -// for _, workerNode := range workerNodes { -// evmKey, ok := workerNode.Keys.EVM[chainID] -// if !ok { -// return fmt.Errorf("failed to get EVM key (chainID %d, node index %d)", chainID, workerNode.Index) -// } -// nodeAddress := evmKey.PublicAddress.Hex() - -// evmKeyBundle, ok := workerNode.Keys.OCR2BundleIDs[chainselectors.FamilyEVM] // we can always expect evm bundle key id present since evm is the registry chain -// if !ok { -// return errors.New("failed to get key bundle id for evm family") -// } - -// bootstrapPeers := []string{fmt.Sprintf("%s@%s:%d", strings.TrimPrefix(bootstrapNode.Keys.PeerID(), "p2p_"), bootstrapNode.Host, cre.OCRPeeringPort)} - -// strategyName := "single-chain" -// if len(workerNode.Keys.OCR2BundleIDs) > 1 { -// strategyName = "multi-chain" -// } - -// oracleFactoryConfigInstance := job.OracleFactoryConfig{ -// Enabled: true, -// ChainID: chainIDStr, -// BootstrapPeers: bootstrapPeers, -// OCRContractAddress: ocr3ConfigContractAddress.Address, -// OCRKeyBundleID: evmKeyBundle, -// TransmitterID: nodeAddress, -// OnchainSigning: job.OnchainSigningStrategy{ -// StrategyName: strategyName, -// Config: workerNode.Keys.OCR2BundleIDs, -// }, -// } - -// type OracleFactoryConfigWrapper struct { -// OracleFactory job.OracleFactoryConfig `toml:"oracle_factory"` -// } -// wrapper := OracleFactoryConfigWrapper{OracleFactory: oracleFactoryConfigInstance} - -// var oracleBuffer bytes.Buffer -// if errEncoder := toml.NewEncoder(&oracleBuffer).Encode(wrapper); errEncoder != nil { -// return errors.Wrap(errEncoder, "failed to encode oracle factory config to TOML") -// } -// oracleStr := strings.ReplaceAll(oracleBuffer.String(), "\n", "\n\t") - -// creForwarderKey := datastore.NewAddressRefKey( -// chain.Selector, -// datastore.ContractType(keystone_changeset.KeystoneForwarder.String()), -// semver.MustParse("1.0.0"), -// "", -// ) -// creForwarderAddress, err := creEnv.CldfEnvironment.DataStore.Addresses().Get(creForwarderKey) -// if err != nil { -// return errors.Wrap(err, "failed to get CRE Forwarder address") -// } - -// runtimeFallbacks := buildRuntimeValues(chainID, "evm", creForwarderAddress.Address, nodeAddress) -// var aErr error -// templateData, aErr = credon.ApplyRuntimeValues(templateData, runtimeFallbacks) -// if aErr != nil { -// return errors.Wrap(aErr, "failed to apply runtime values") -// } - -// tmpl, err := template.New("evmConfig").Parse(configTemplate) -// if err != nil { -// return errors.Wrapf(err, "failed to parse %s config template", flag) -// } - -// var configBuffer bytes.Buffer -// if err := tmpl.Execute(&configBuffer, templateData); err != nil { -// return errors.Wrapf(err, "failed to execute %s config template", flag) -// } - -// configStr := configBuffer.String() - -// if err := credon.ValidateTemplateSubstitution(configStr, flag); err != nil { -// return errors.Wrapf(err, "%s template validation failed", flag) -// } - -// jobSpec := standardcapability.WorkerJobSpec(workerNode.JobDistributorDetails.NodeID, fmt.Sprintf("%s-%d", flag, chainID), command, configStr, oracleStr) -// jobSpec.Labels = []*ptypes.Label{{Key: cre.CapabilityLabelKey, Value: ptr.Ptr(flag)}} -// jobSpecs = append(jobSpecs, jobSpec) -// } -// } - -// jobErr := jobs.Create(ctx, creEnv.CldfEnvironment.Offchain, dons, jobSpecs) - -// if jobErr != nil { -// return fmt.Errorf("failed to create EVM OCR3 jobs for don %s: %w", don.Name, jobErr) -// } - -// return nil -// } - // buildRuntimeValues creates runtime-generated values for any keys not specified in TOML func buildRuntimeValues(chainID uint64, networkFamily, creForwarderAddress, nodeAddress string) map[string]any { return map[string]any{ diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index abdecb20956..6d8cc772397 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -33,9 +33,9 @@ require ( github.com/sethvargo/go-retry v0.3.0 github.com/smartcontractkit/chain-selectors v1.0.85 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 @@ -362,6 +362,7 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect + github.com/mfridman/interpolate v0.0.2 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/miekg/dns v1.1.65 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect @@ -422,6 +423,7 @@ require ( github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/pressly/goose/v3 v3.26.0 // indirect github.com/prometheus/client_golang v1.23.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect @@ -455,12 +457,12 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 // indirect github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251127040717-30244f57ea7a // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 // indirect - github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 // indirect + github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.6 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 // indirect github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 // indirect @@ -471,8 +473,8 @@ require ( github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0 // indirect github.com/smartcontractkit/chainlink-protos/svr v1.1.0 // indirect github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4 // indirect - github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c // indirect - github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c // indirect + github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c // indirect + github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c // indirect github.com/smartcontractkit/chainlink-testing-framework/parrot v0.6.2 // indirect github.com/smartcontractkit/chainlink-ton v0.0.0-20251128154102-ae6a4d19188f // indirect github.com/smartcontractkit/chainlink-ton/deployment v0.0.0-20251128154102-ae6a4d19188f // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index ad09e9726fe..31f13b851df 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -718,8 +718,9 @@ github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3 github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -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-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= +github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= 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/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -1338,6 +1339,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ 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 h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +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/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1488,6 +1491,8 @@ github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2 github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= 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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1595,28 +1600,28 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e h1:hQEOz6nRQgIQf0HS3EsjS22cAwejLa6q4nCyFGYrb/s= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 h1:sdBNurxM3XEsclOJVSqyqM+WKV/rw/2ykgCeIox4YT0= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1/go.mod h1:Dspcf1LYGPDvgUKO09kqfexFvnOFbKfoGz02VwHpuw4= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 h1:2LHrlWAStA2oRcDKrJ9lKOShC9an2Pkis2BwY8J7gDw= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 h1:0IMjHpzI9mgvGGtmsr1NdRhoXp++gU805f/f9oN94ls= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599/go.mod h1:Ysd/qkofD0bepk29RS7Q4ZlVDd4yAHXucYsp5gAy6AE= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 h1:b8aHhus/+bikhHlR5+Ll4Z0hsczJPA0hEj68/8+xyXs= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7/go.mod h1:yaDOAZF6MNB+NGYpxGCUc+owIdKrjvFW0JODdTcQ3V0= -github.com/smartcontractkit/chainlink-data-streams v0.1.6 h1:B3cwmJrVYoJVAjPOyQWTNaGD+V30HI1vFHhC2dQpWDo= -github.com/smartcontractkit/chainlink-data-streams v0.1.6/go.mod h1:e9jETTzrVO8iu9Zp5gDuTCmBVhSJwUOk6K4Q/VFrJ6o= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 h1:gU4suSMid2uQVSxdtPhqGR9s9w3ViclcGtwkQaNbrtM= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19/go.mod h1:GPsn6PKJvPe1UfRYyVxsDzOWq6NILzBstiiLq/w+kG0= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 h1:wo2KL2viGZK/LhHLM8F88sRyhZF9wwWh+YDzW8hS00g= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0/go.mod h1:Cp7PuO7HUDugp7bWGP/TcDAvvvkFLdKOVrSm0zXlnhg= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb h1:/oWqkc0mU63UNydxUiRZTv+ZYRzGF+9WHrpbuxDTBtY= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb/go.mod h1:OQCmZCKnOiNp7LVbHAr6xZ9SThAU7jx5uI+aCvLOn1Q= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec h1:K8sLjgwPgozQb86LH+aWXqBUJak6VGwSt5YiKbCI/uY= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec/go.mod h1:9VcrUs+H/f9ekkqAdfUd70Pk2dA1Zc3KykJVFBfJNHs= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b h1:Dqhm/67Sb1ohgce8FW6tnK1CRXo2zoLCbV+EGyew5sg= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b/go.mod h1:oyfOm4k0uqmgZIfxk1elI/59B02shbbJQiiUdPdbMgI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 h1:ACpDbAxG4fa4sA83dbtYcrnlpE/y7thNIZfHxTv2ZLs= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 h1:Mf+IRvrXutcKAKpuOxq5Ae+AAw4Z5vc66q1xI7qimZQ= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= @@ -1645,10 +1650,10 @@ github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331- github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 h1:4cvFf82P3VcNHgqUG0aRBeIMZd+wSX37ha28Gkie9Lk= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6/go.mod h1:zX8dX6aXjJNkfbpr1AiTzCioma0sHh5CBPZKtqC7plY= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c h1:M+LA7CVnz4R9A9ZxPz4jcNjGNw50HYR4cNl+PLvQynA= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c h1:AY6zMBsk8Y+woOfT5LiiODloohDCtSj8FyR/iEvGmP0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c h1:aNA7J31EuOf755BDgNuhxte5+Z6wucBx/ONGihw2OqA= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c h1:uV+yJbVYI5RoTNFSh/tDflWDXJtRk8Yrp0m1VgTy6ro= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3OrOQfLubJ+os0/oau2V6RISgsEdBg+Q002zkgXpQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.15 h1:usf6YCNmSO8R1/rU28wUfIdp7zXlqGGOAttXW5mgkXU= @@ -2600,6 +2605,14 @@ k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A= +modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/sqlite v1.39.0 h1:6bwu9Ooim0yVYA7IZn9demiQk/Ejp0BtTjBWFLymSeY= +modernc.org/sqlite v1.39.0/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index b47b64c0e2b..781497d7617 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -46,8 +46,8 @@ require ( github.com/rs/zerolog v1.34.0 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.85 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 - github.com/smartcontractkit/chainlink-data-streams v0.1.6 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 + github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 @@ -85,8 +85,10 @@ require ( github.com/failsafe-go/failsafe-go v0.9.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b // indirect + github.com/mfridman/interpolate v0.0.2 // indirect + github.com/pressly/goose/v3 v3.26.0 // indirect github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20251127040717-30244f57ea7a // indirect - github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 // indirect + github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 // indirect github.com/smartcontractkit/chainlink-protos/chainlink-ccv/go v0.0.0-20251126123859-d079d6815edb // indirect ) @@ -557,10 +559,10 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb // indirect + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 // indirect github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 // indirect @@ -569,8 +571,8 @@ require ( github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0 // indirect github.com/smartcontractkit/chainlink-protos/svr v1.1.0 // indirect - github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c // indirect - github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c // indirect + github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c // indirect + github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c // indirect github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.15 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect github.com/smartcontractkit/chainlink-testing-framework/parrot v0.6.2 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index be9ab23d65f..7c2c73a42cf 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -801,8 +801,9 @@ github.com/go-redsync/redsync/v4 v4.13.0/go.mod h1:HMW4Q224GZQz6x1Xc7040Yfgacukd github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -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-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= +github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= 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/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -1491,6 +1492,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ 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 h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +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/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1680,6 +1683,8 @@ github.com/redis/go-redis/v9 v9.10.0 h1:FxwK3eV8p/CQa0Ch276C7u2d0eNC9kCmAYQ7mCXC github.com/redis/go-redis/v9 v9.10.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo= github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= +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/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1792,28 +1797,28 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e h1:hQEOz6nRQgIQf0HS3EsjS22cAwejLa6q4nCyFGYrb/s= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1 h1:sdBNurxM3XEsclOJVSqyqM+WKV/rw/2ykgCeIox4YT0= -github.com/smartcontractkit/chainlink-ccv v0.0.0-20251201171152-bd4501ddf2b1/go.mod h1:Dspcf1LYGPDvgUKO09kqfexFvnOFbKfoGz02VwHpuw4= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4 h1:2LHrlWAStA2oRcDKrJ9lKOShC9an2Pkis2BwY8J7gDw= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251125103916-0b41e73b80c4/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599 h1:0IMjHpzI9mgvGGtmsr1NdRhoXp++gU805f/f9oN94ls= +github.com/smartcontractkit/chainlink-ccv v0.0.0-20251210114515-e8434089d599/go.mod h1:Ysd/qkofD0bepk29RS7Q4ZlVDd4yAHXucYsp5gAy6AE= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8 h1:b8aHhus/+bikhHlR5+Ll4Z0hsczJPA0hEj68/8+xyXs= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251210225051-4659b78ac2a8/go.mod h1:uRnGLHKo56QYaPk93z0NRAIgv115lh72rzG40CiE1Mk= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7/go.mod h1:yaDOAZF6MNB+NGYpxGCUc+owIdKrjvFW0JODdTcQ3V0= -github.com/smartcontractkit/chainlink-data-streams v0.1.6 h1:B3cwmJrVYoJVAjPOyQWTNaGD+V30HI1vFHhC2dQpWDo= -github.com/smartcontractkit/chainlink-data-streams v0.1.6/go.mod h1:e9jETTzrVO8iu9Zp5gDuTCmBVhSJwUOk6K4Q/VFrJ6o= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19 h1:gU4suSMid2uQVSxdtPhqGR9s9w3ViclcGtwkQaNbrtM= +github.com/smartcontractkit/chainlink-data-streams v0.1.7-0.20251209111830-ccd12a5b2a19/go.mod h1:GPsn6PKJvPe1UfRYyVxsDzOWq6NILzBstiiLq/w+kG0= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 h1:wo2KL2viGZK/LhHLM8F88sRyhZF9wwWh+YDzW8hS00g= github.com/smartcontractkit/chainlink-deployments-framework v0.70.0/go.mod h1:Cp7PuO7HUDugp7bWGP/TcDAvvvkFLdKOVrSm0zXlnhg= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb h1:/oWqkc0mU63UNydxUiRZTv+ZYRzGF+9WHrpbuxDTBtY= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251201175512-af04e919ebfb/go.mod h1:OQCmZCKnOiNp7LVbHAr6xZ9SThAU7jx5uI+aCvLOn1Q= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec h1:K8sLjgwPgozQb86LH+aWXqBUJak6VGwSt5YiKbCI/uY= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec/go.mod h1:9VcrUs+H/f9ekkqAdfUd70Pk2dA1Zc3KykJVFBfJNHs= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b h1:Dqhm/67Sb1ohgce8FW6tnK1CRXo2zoLCbV+EGyew5sg= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b/go.mod h1:oyfOm4k0uqmgZIfxk1elI/59B02shbbJQiiUdPdbMgI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563 h1:ACpDbAxG4fa4sA83dbtYcrnlpE/y7thNIZfHxTv2ZLs= github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15 h1:Mf+IRvrXutcKAKpuOxq5Ae+AAw4Z5vc66q1xI7qimZQ= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251210101658-1c5c8e4c4f15/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= @@ -1842,10 +1847,10 @@ github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331- github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251025021331-aa7746850cc4/go.mod h1:HIpGvF6nKCdtZ30xhdkKWGM9+4Z4CVqJH8ZBL1FTEiY= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6 h1:4cvFf82P3VcNHgqUG0aRBeIMZd+wSX37ha28Gkie9Lk= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20251121223352-370eb61346d6/go.mod h1:zX8dX6aXjJNkfbpr1AiTzCioma0sHh5CBPZKtqC7plY= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c h1:M+LA7CVnz4R9A9ZxPz4jcNjGNw50HYR4cNl+PLvQynA= -github.com/smartcontractkit/chainlink-sui v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c h1:AY6zMBsk8Y+woOfT5LiiODloohDCtSj8FyR/iEvGmP0= -github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251128231234-4fdf15cd020c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c h1:aNA7J31EuOf755BDgNuhxte5+Z6wucBx/ONGihw2OqA= +github.com/smartcontractkit/chainlink-sui v0.0.0-20251205161630-88314452254c/go.mod h1:zrtmeh3wHL+qXu/vaaR7lZ5TSh00I4JYbpOqqb9bXp0= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c h1:uV+yJbVYI5RoTNFSh/tDflWDXJtRk8Yrp0m1VgTy6ro= +github.com/smartcontractkit/chainlink-sui/deployment v0.0.0-20251205161630-88314452254c/go.mod h1:JYGdUmW7QbjhRcbffpawyZG34YX6uLl/4YAKuIPawOE= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3OrOQfLubJ+os0/oau2V6RISgsEdBg+Q002zkgXpQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.15 h1:usf6YCNmSO8R1/rU28wUfIdp7zXlqGGOAttXW5mgkXU= @@ -2890,6 +2895,14 @@ k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A= +modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/sqlite v1.39.0 h1:6bwu9Ooim0yVYA7IZn9demiQk/Ejp0BtTjBWFLymSeY= +modernc.org/sqlite v1.39.0/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/system-tests/tests/regression/cre/cre_regression_suite_test.go b/system-tests/tests/regression/cre/cre_regression_suite_test.go index 6246810d636..13652b40ee0 100644 --- a/system-tests/tests/regression/cre/cre_regression_suite_test.go +++ b/system-tests/tests/regression/cre/cre_regression_suite_test.go @@ -5,7 +5,6 @@ import ( "strings" "testing" - "github.com/smartcontractkit/chainlink/system-tests/lib/cre/environment/blockchains" t_helpers "github.com/smartcontractkit/chainlink/system-tests/tests/test-helpers" "github.com/smartcontractkit/chainlink-testing-framework/framework" @@ -68,8 +67,6 @@ func runEVMNegativeTestSuite(t *testing.T, testCases []evmNegativeTest) { testName := fmt.Sprintf(evmTestNameTemplate, tCase.functionToTest, tCase.name) t.Run(testName, func(t *testing.T) { testEnv := t_helpers.SetupTestEnvironmentWithConfig(t, t_helpers.GetDefaultTestConfig(t), v2RegistriesFlags...) - // TODO remove this when OCR works properly with multiple chains in Local CRE - testEnv.CreEnvironment.Blockchains = []blockchains.Blockchain{testEnv.CreEnvironment.Blockchains[0]} // Check if test name contains "write" to determine which test function to run if strings.Contains(strings.ToLower(testName), "writereport") { @@ -140,9 +137,6 @@ func Test_CRE_V2_HTTP_Action_CRUD_Regression(t *testing.T) { testName := "[v2] HTTP Action fails with " + tCase.name t.Run(testName, func(t *testing.T) { testEnv := t_helpers.SetupTestEnvironmentWithConfig(t, t_helpers.GetDefaultTestConfig(t), v2RegistriesFlags...) - // TODO remove this when OCR works properly with multiple chains in Local CRE - testEnv.CreEnvironment.Blockchains = []blockchains.Blockchain{testEnv.CreEnvironment.Blockchains[0]} - HTTPActionFailureTest(t, testEnv, tCase) }) } diff --git a/system-tests/tests/smoke/cre/cre_suite_test.go b/system-tests/tests/smoke/cre/cre_suite_test.go index a456f385d3c..a6d66cdf096 100644 --- a/system-tests/tests/smoke/cre/cre_suite_test.go +++ b/system-tests/tests/smoke/cre/cre_suite_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/system-tests/lib/cre/environment/blockchains" t_helpers "github.com/smartcontractkit/chainlink/system-tests/tests/test-helpers" ) @@ -57,9 +56,6 @@ func Test_CRE_V1_Billing_EVM_Write(t *testing.T) { quarantine.Flaky(t, "DX-1911") testEnv := t_helpers.SetupTestEnvironmentWithConfig(t, t_helpers.GetDefaultTestConfig(t)) - // TODO remove this when OCR works properly with multiple chains in Local CRE - testEnv.CreEnvironment.Blockchains = []blockchains.Blockchain{testEnv.CreEnvironment.Blockchains[0]} - require.NoError( t, startBillingStackIfIsNotRunning(t, testEnv.TestConfig.RelativePathToRepoRoot, testEnv.TestConfig.EnvironmentDirPath, testEnv), @@ -75,9 +71,6 @@ func Test_CRE_V1_Billing_EVM_Write(t *testing.T) { func Test_CRE_V1_Billing_Cron_Beholder(t *testing.T) { testEnv := t_helpers.SetupTestEnvironmentWithConfig(t, t_helpers.GetDefaultTestConfig(t)) - // TODO remove this when OCR works properly with multiple chains in Local CRE - testEnv.CreEnvironment.Blockchains = []blockchains.Blockchain{testEnv.CreEnvironment.Blockchains[0]} - require.NoError( t, startBillingStackIfIsNotRunning(t, testEnv.TestConfig.RelativePathToRepoRoot, testEnv.TestConfig.EnvironmentDirPath, testEnv), @@ -96,14 +89,8 @@ To execute tests with v2 contracts start the local CRE first: func Test_CRE_V2_Suite(t *testing.T) { topology := os.Getenv("TOPOLOGY_NAME") t.Run("[v2] Proof Of Reserve - "+topology, func(t *testing.T) { - // TODO: Review why this test cannot run with two chains? (CRE-983) - // How to configure evm for both chains and capabilities DON (DON<>DON topology)? testEnv := t_helpers.SetupTestEnvironmentWithConfig(t, t_helpers.GetDefaultTestConfig(t), v2RegistriesFlags...) - - // TODO: remove this when OCR works properly with multiple chains in Local CRE - testEnv.CreEnvironment.Blockchains = []blockchains.Blockchain{testEnv.CreEnvironment.Blockchains[0]} priceProvider, wfConfig := beforePoRTest(t, testEnv, "por-workflow-v2", PoRWFV2Location) - wfConfig.FeedIDs = []string{wfConfig.FeedIDs[0]} ExecutePoRTest(t, testEnv, priceProvider, wfConfig, false) }) @@ -146,12 +133,9 @@ func Test_CRE_V2_Suite(t *testing.T) { func Test_CRE_V2_EVM_Suite(t *testing.T) { topology := os.Getenv("TOPOLOGY_NAME") testEnv := t_helpers.SetupTestEnvironmentWithConfig(t, t_helpers.GetDefaultTestConfig(t), v2RegistriesFlags...) - // TODO: remove this when OCR works properly with multiple chains in Local CRE - testEnv.CreEnvironment.Blockchains = []blockchains.Blockchain{testEnv.CreEnvironment.Blockchains[0]} t.Run("[v2] EVM Write - "+topology, func(t *testing.T) { priceProvider, porWfCfg := beforePoRTest(t, testEnv, "por-workflowV2", PoRWFV2Location) - porWfCfg.FeedIDs = []string{porWfCfg.FeedIDs[0]} ExecutePoRTest(t, testEnv, priceProvider, porWfCfg, false) }) diff --git a/testdata/scripts/config/merge_raw_configs.txtar b/testdata/scripts/config/merge_raw_configs.txtar index 9532fa7ab8c..44b7765426f 100644 --- a/testdata/scripts/config/merge_raw_configs.txtar +++ b/testdata/scripts/config/merge_raw_configs.txtar @@ -308,6 +308,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] diff --git a/testdata/scripts/node/validate/default.txtar b/testdata/scripts/node/validate/default.txtar index c3ccfe5e4cc..6d984b4a00f 100644 --- a/testdata/scripts/node/validate/default.txtar +++ b/testdata/scripts/node/validate/default.txtar @@ -173,6 +173,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] diff --git a/testdata/scripts/node/validate/defaults-override.txtar b/testdata/scripts/node/validate/defaults-override.txtar index d478388c81f..522b8bd2a24 100644 --- a/testdata/scripts/node/validate/defaults-override.txtar +++ b/testdata/scripts/node/validate/defaults-override.txtar @@ -234,6 +234,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -558,7 +559,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar index e155ba7cc23..8034c1a7156 100644 --- a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar @@ -217,6 +217,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -541,7 +542,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar index 6fc8fc1f880..f3a9d7853e3 100644 --- a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar @@ -217,6 +217,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -541,7 +542,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/testdata/scripts/node/validate/disk-based-logging.txtar b/testdata/scripts/node/validate/disk-based-logging.txtar index 0293b668279..9647eebf92f 100644 --- a/testdata/scripts/node/validate/disk-based-logging.txtar +++ b/testdata/scripts/node/validate/disk-based-logging.txtar @@ -217,6 +217,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -541,7 +542,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/testdata/scripts/node/validate/fallback-override.txtar b/testdata/scripts/node/validate/fallback-override.txtar index 619de02a88b..9a26bcfd06c 100644 --- a/testdata/scripts/node/validate/fallback-override.txtar +++ b/testdata/scripts/node/validate/fallback-override.txtar @@ -315,6 +315,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -639,7 +640,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/testdata/scripts/node/validate/invalid-ocr-p2p.txtar b/testdata/scripts/node/validate/invalid-ocr-p2p.txtar index 3e3adbc6c95..4ed20566c13 100644 --- a/testdata/scripts/node/validate/invalid-ocr-p2p.txtar +++ b/testdata/scripts/node/validate/invalid-ocr-p2p.txtar @@ -202,6 +202,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] diff --git a/testdata/scripts/node/validate/invalid.txtar b/testdata/scripts/node/validate/invalid.txtar index 832fe40d121..559348dc73b 100644 --- a/testdata/scripts/node/validate/invalid.txtar +++ b/testdata/scripts/node/validate/invalid.txtar @@ -213,6 +213,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -537,7 +538,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/testdata/scripts/node/validate/valid.txtar b/testdata/scripts/node/validate/valid.txtar index 0782624a280..ec8e716c6a3 100644 --- a/testdata/scripts/node/validate/valid.txtar +++ b/testdata/scripts/node/validate/valid.txtar @@ -214,6 +214,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] @@ -538,7 +539,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [EVM.OCR] ContractConfirmations = 4 diff --git a/testdata/scripts/node/validate/warnings.txtar b/testdata/scripts/node/validate/warnings.txtar index 15ce85d9dcb..f17f67861c5 100644 --- a/testdata/scripts/node/validate/warnings.txtar +++ b/testdata/scripts/node/validate/warnings.txtar @@ -196,6 +196,7 @@ AllowNoBootstrappers = false DefaultTransactionQueueDepth = 1 SimulateTransactions = false TraceLogging = false +SampleTelemetry = false KeyValueStoreRootDir = '~/.chainlink-data' [OCR] diff --git a/tools/bin/go_core_tests b/tools/bin/go_core_tests index 3eaaaa2309e..5a2968f9a43 100755 --- a/tools/bin/go_core_tests +++ b/tools/bin/go_core_tests @@ -14,6 +14,8 @@ export PATH echo "Running go_core_tests for event: $GITHUB_EVENT_NAME" GO_TEST_FLAGS="-timeout=${GO_TEST_TIMEOUT}" +# Temporary reduction in concurrent packages to reduce RAM usage +GO_TEST_FLAGS="$GO_TEST_FLAGS -p=4" if [[ "$GITHUB_EVENT_NAME" == 'push' ]]; then GO_TEST_FLAGS="$GO_TEST_FLAGS -count=1" elif [[ "$GITHUB_EVENT_NAME" == 'schedule' ]]; then