diff --git a/.changeset/cool-mirrors-beg.md b/.changeset/cool-mirrors-beg.md
deleted file mode 100644
index a030ac7e3a..0000000000
--- a/.changeset/cool-mirrors-beg.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#added L3X Config
diff --git a/.changeset/red-meals-mix.md b/.changeset/red-meals-mix.md
deleted file mode 100644
index a3667ed20e..0000000000
--- a/.changeset/red-meals-mix.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Bump to start the next version
diff --git a/.github/actions/build-sign-publish-chainlink/action.yml b/.github/actions/build-sign-publish-chainlink/action.yml
index 552913fc58..67ca3068ef 100644
--- a/.github/actions/build-sign-publish-chainlink/action.yml
+++ b/.github/actions/build-sign-publish-chainlink/action.yml
@@ -68,6 +68,13 @@ inputs:
description: When set to the string boolean value of "true", the resulting build image signature will be verified
default: "false"
required: false
+outputs:
+ docker-image-tag:
+ description: The docker image tag that was built and pushed
+ value: ${{ steps.save-non-root-image-name-env.outputs.image-tag }}
+ docker-image-digest:
+ description: The docker image digest that was built and pushed
+ value: ${{ steps.save-non-root-image-name-env.outputs.image-digest }}
runs:
using: composite
@@ -208,10 +215,13 @@ runs:
IMAGES_NAME_RAW=${{ fromJSON(steps.buildpush-nonroot.outputs.metadata)['image.name'] }}
IMAGE_DIGEST=${{ fromJSON(steps.buildpush-nonroot.outputs.metadata)['containerimage.digest'] }}
IMAGE_NAME=$(echo "$IMAGES_NAME_RAW" | cut -d"," -f1)
+ IMAGE_TAG=$(echo "$IMAGES_NAME_RAW" | cut -d":" -f2)
echo "nonroot_image_name=${IMAGE_NAME}" >> $GITHUB_ENV
echo '### Docker Image' >> $GITHUB_STEP_SUMMARY
echo "Image Name: ${IMAGE_NAME}" >> $GITHUB_STEP_SUMMARY
echo "Image Digest: ${IMAGE_DIGEST}" >> $GITHUB_STEP_SUMMARY
+ echo "image-tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT
+ echo "image-digest=${IMAGE_DIGEST}" >> $GITHUB_OUTPUT
- name: Check if non-root image runs as root
id: check-nonroot-runs-root
diff --git a/.github/workflows/automation-ondemand-tests.yml b/.github/workflows/automation-ondemand-tests.yml
index 324d5b04b9..7514743fa8 100644
--- a/.github/workflows/automation-ondemand-tests.yml
+++ b/.github/workflows/automation-ondemand-tests.yml
@@ -146,7 +146,7 @@ jobs:
- name: chaos
id: chaos
suite: chaos
- nodes: 15
+ nodes: 20
os: ubuntu-latest
enabled: ${{ inputs.enableChaos }}
pyroscope_env: ci-automation-on-demand-chaos
diff --git a/.github/workflows/build-publish.yml b/.github/workflows/build-publish.yml
index 865bdaf730..4a477a0e14 100644
--- a/.github/workflows/build-publish.yml
+++ b/.github/workflows/build-publish.yml
@@ -8,6 +8,10 @@ on:
branches:
- "release/**"
+env:
+ ECR_HOSTNAME: public.ecr.aws
+ ECR_IMAGE_NAME: chainlink/chainlink
+
jobs:
checks:
name: "Checks"
@@ -30,17 +34,23 @@ jobs:
permissions:
id-token: write
contents: read
+ outputs:
+ docker-image-tag: ${{ steps.build-sign-publish.outputs.docker-image-tag }}
+ docker-image-digest: ${{ steps.build-sign-publish.outputs.docker-image-digest }}
steps:
- name: Checkout repository
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Build, sign and publish chainlink image
+ id: build-sign-publish
uses: ./.github/actions/build-sign-publish-chainlink
with:
publish: true
aws-role-to-assume: ${{ secrets.AWS_OIDC_IAM_ROLE_ARN }}
aws-role-duration-seconds: ${{ secrets.AWS_ROLE_DURATION_SECONDS }}
aws-region: ${{ secrets.AWS_REGION }}
+ ecr-hostname: ${{ env.ECR_HOSTNAME }}
+ ecr-image-name: ${{ env.ECR_IMAGE_NAME }}
sign-images: true
sign-method: "keypair"
cosign-private-key: ${{ secrets.COSIGN_PRIVATE_KEY }}
@@ -60,3 +70,44 @@ jobs:
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: build-sign-publish-chainlink
continue-on-error: true
+
+ # Notify Slack channel for new git tags.
+ slack-notify:
+ if: github.ref_type == 'tag'
+ needs: [build-sign-publish-chainlink]
+ runs-on: ubuntu-24.04
+ environment: build-publish
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
+ - name: Notify Slack
+ uses: smartcontractkit/.github/actions/slack-notify-git-ref@31e00facdd8f57a2bc7868b5e4c8591bf2aa3727 # slack-notify-git-ref@0.1.2
+ with:
+ slack-channel-id: ${{ secrets.SLACK_CHANNEL_RELEASE_NOTIFICATIONS }}
+ slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN_RELENG }} # Releng Bot
+ git-ref: ${{ github.ref_name }}
+ git-ref-type: ${{ github.ref_type }}
+ changelog-url: >-
+ ${{
+ github.ref_type == 'tag' &&
+ format(
+ 'https://github.com/{0}/blob/{1}/CHANGELOG.md',
+ github.repository,
+ github.ref_name
+ ) || ''
+ }}
+ docker-image-name: >-
+ ${{
+ github.ref_type == 'tag' &&
+ format(
+ '{0}/{1}:{2}',
+ env.ECR_HOSTNAME,
+ env.ECR_IMAGE_NAME,
+ needs.build-sign-publish-chainlink.outputs.docker-image-tag
+ ) || ''
+ }}
+ docker-image-digest: >-
+ ${{
+ github.ref_type == 'tag' &&
+ needs.build-sign-publish-chainlink.outputs.docker-image-digest || ''
+ }}
diff --git a/.github/workflows/ccip-live-network-tests.yml b/.github/workflows/ccip-live-network-tests.yml
index 3c638a1546..7d908d9718 100644
--- a/.github/workflows/ccip-live-network-tests.yml
+++ b/.github/workflows/ccip-live-network-tests.yml
@@ -34,7 +34,27 @@ env:
ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests:${{ github.sha }}
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com
AWS_ECR_REPO_PUBLIC_REGISTRY: public.ecr.aws
-
+ E2E_TEST_CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
+ E2E_TEST_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
+ E2E_TEST_LOKI_ENDPOINT: ${{ secrets.LOKI_URL }}
+ E2E_TEST_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
+ E2E_TEST_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
+ # Default private key test secret loaded from Github Secret as only security team has access to it.
+ # this key secrets.QA_SHARED_803C_KEY has a story behind it. To know more, see CCIP-2875 and SECHD-16575 tickets.
+ E2E_TEST_ETHEREUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ARBITRUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BASE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_WEMIX_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_AVALANCHE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ZKSYNC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_MODE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_METIS_ANDROMEDA_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_OPTIMISM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_KROMA_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_GNOSIS_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_POLYGON_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BSC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+
jobs:
build-chainlink:
environment: integration
@@ -128,7 +148,6 @@ jobs:
TEST_LOG_LEVEL: info
REF_NAME: ${{ github.head_ref || github.ref_name }}
ENV_JOB_IMAGE_BASE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests
- BASE64_NETWORK_CONFIG: ${{ secrets.BASE64_NETWORK_CONFIG }}
steps:
- name: Collect Metrics
@@ -149,10 +168,6 @@ jobs:
id: set_override_config
shell: bash
run: |
- # this key secrets.QA_SHARED_803C_KEY has a story behind it. To know more, see CCIP-2875 and SECHD-16575 tickets.
- BASE64_NETWORK_CONFIG=$(echo $BASE64_NETWORK_CONFIG | base64 -w 0 -d | sed -e 's/evm_key/${{ secrets.QA_SHARED_803C_KEY }}/g' | base64 -w 0)
- echo ::add-mask::$BASE64_NETWORK_CONFIG
- echo "BASE64_NETWORK_CONFIG=$BASE64_NETWORK_CONFIG" >> "$GITHUB_ENV"
SLACK_USER=$(jq -r '.inputs.slackMemberID' $GITHUB_EVENT_PATH)
echo ::add-mask::$SLACK_USER
echo "SLACK_USER=$SLACK_USER" >> "$GITHUB_ENV"
@@ -183,7 +198,7 @@ jobs:
chainlinkVersion: ${{ env.CHAINLINK_VERSION }}
logstreamLogTargets: ${{ vars.LOGSTREAM_LOG_TARGETS }}
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@d38226be720c5ccc1ff4d3cee40608ebf264cd59 # v2.3.26
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@94cb11f4bd545607a2f221c6685052b3abee723d # v2.3.32
env:
TEST_SUITE: load
TEST_ARGS: -test.timeout 900h
@@ -194,9 +209,12 @@ jobs:
TEST_TRIGGERED_BY: ccip-load-test-ci
BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
+ E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
with:
test_command_to_run: cd ./integration-tests/ccip-tests && go test -v -timeout 70m -count=1 -json -run ^TestLoadCCIPStableRPS$ ./load 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
+ # Other default test secrets loaded from dotenv Github Secret.
+ test_secrets_defaults_base64: ${{ secrets.CCIP_DEFAULT_TEST_SECRETS }}
test_secrets_override_base64: ${{ secrets[inputs.test_secrets_override_key] }}
token: ${{ secrets.GITHUB_TOKEN }}
go_mod_path: ./integration-tests/go.mod
@@ -209,12 +227,6 @@ jobs:
cache_key_id: ccip-load-${{ env.MOD_CACHE_VERSION }}
cache_restore_only: "true"
should_cleanup: false
- DEFAULT_CHAINLINK_IMAGE: ${{ env.CHAINLINK_IMAGE }}
- DEFAULT_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
- DEFAULT_LOKI_ENDPOINT: ${{ secrets.LOKI_URL }}
- DEFAULT_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
- DEFAULT_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
- DEFAULT_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
ccip-smoke-test:
name: CCIP smoke Test
@@ -236,7 +248,6 @@ jobs:
TEST_LOG_LEVEL: info
REF_NAME: ${{ github.head_ref || github.ref_name }}
ENV_JOB_IMAGE_BASE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests
- BASE64_NETWORK_CONFIG: ${{ secrets.BASE64_NETWORK_CONFIG }}
steps:
- name: Collect Metrics
@@ -257,9 +268,6 @@ jobs:
id: set_override_config
shell: bash
run: |
- BASE64_NETWORK_CONFIG=$(echo $BASE64_NETWORK_CONFIG | base64 -w 0 -d | sed -e 's/evm_key/${{ secrets.QA_SHARED_803C_KEY }}/g' | base64 -w 0)
- echo ::add-mask::$BASE64_NETWORK_CONFIG
- echo "BASE64_NETWORK_CONFIG=$BASE64_NETWORK_CONFIG" >> "$GITHUB_ENV"
SLACK_USER=$(jq -r '.inputs.slackMemberID' $GITHUB_EVENT_PATH)
echo ::add-mask::$SLACK_USER
echo "SLACK_USER=$SLACK_USER" >> "$GITHUB_ENV"
@@ -284,7 +292,7 @@ jobs:
chainlinkVersion: ${{ env.CHAINLINK_VERSION }}
logstreamLogTargets: ${{ vars.LOGSTREAM_LOG_TARGETS }}
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@d38226be720c5ccc1ff4d3cee40608ebf264cd59 # v2.3.26
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@94cb11f4bd545607a2f221c6685052b3abee723d # v2.3.32
env:
TEST_SUITE: smoke
TEST_ARGS: -test.timeout 900h
@@ -295,9 +303,13 @@ jobs:
TEST_TRIGGERED_BY: ccip-smoke-test-ci
BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
+ E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
with:
test_command_to_run: cd ./integration-tests/ccip-tests && go test -v -timeout 70m -count=1 -p 30 -json -run ^TestSmokeCCIPForBidirectionalLane$ ./smoke 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
+ # Other default test secrets loaded from dotenv Github Secret.
+ test_secrets_defaults_base64: ${{ secrets.CCIP_DEFAULT_TEST_SECRETS }}
+ test_secrets_override_base64: ${{ secrets[inputs.test_secrets_override_key] }}
token: ${{ secrets.GITHUB_TOKEN }}
go_mod_path: ./integration-tests/go.mod
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }}
@@ -308,10 +320,4 @@ jobs:
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
cache_key_id: ccip-smoke-${{ env.MOD_CACHE_VERSION }}
cache_restore_only: "true"
- should_cleanup: false
- DEFAULT_CHAINLINK_IMAGE: ${{ env.CHAINLINK_IMAGE }}
- DEFAULT_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
- DEFAULT_LOKI_ENDPOINT: ${{ secrets.LOKI_URL }}
- DEFAULT_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
- DEFAULT_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
- DEFAULT_GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
\ No newline at end of file
+ should_cleanup: false
\ No newline at end of file
diff --git a/.github/workflows/ccip-load-tests.yml b/.github/workflows/ccip-load-tests.yml
index f88f5bd143..633effd86c 100644
--- a/.github/workflows/ccip-load-tests.yml
+++ b/.github/workflows/ccip-load-tests.yml
@@ -29,6 +29,26 @@ env:
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com
AWS_ECR_REPO_PUBLIC_REGISTRY: public.ecr.aws
MOD_CACHE_VERSION: 1
+ E2E_TEST_CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
+ E2E_TEST_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
+ E2E_TEST_LOKI_ENDPOINT: ${{ secrets.LOKI_URL }}
+ E2E_TEST_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
+ E2E_TEST_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
+ # Default private key test secret loaded from Github Secret as only security team has access to it.
+ # this key secrets.QA_SHARED_803C_KEY has a story behind it. To know more, see CCIP-2875 and SECHD-16575 tickets.
+ E2E_TEST_ETHEREUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ARBITRUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BASE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_WEMIX_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_AVALANCHE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ZKSYNC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_MODE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_METIS_ANDROMEDA_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_OPTIMISM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_KROMA_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_GNOSIS_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_POLYGON_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BSC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
jobs:
build-chainlink:
@@ -116,7 +136,6 @@ jobs:
SLACK_CHANNEL: ${{ secrets.QA_SLACK_CHANNEL }}
TEST_LOG_LEVEL: info
REF_NAME: ${{ github.head_ref || github.ref_name }}
- BASE64_NETWORK_CONFIG: ${{ secrets.BASE64_NETWORK_CONFIG }}
strategy:
fail-fast: false
matrix:
@@ -177,7 +196,7 @@ jobs:
chainlinkVersion: ${{ github.sha }}
logstreamLogTargets: ${{ vars.LOGSTREAM_LOG_TARGETS }}
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@d38226be720c5ccc1ff4d3cee40608ebf264cd59 # v2.3.26
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@94cb11f4bd545607a2f221c6685052b3abee723d # v2.3.32
env:
TEST_SUITE: load
TEST_ARGS: -test.timeout 900h
@@ -187,9 +206,13 @@ jobs:
TEST_TRIGGERED_BY: ccip-load-test-ci-${{ matrix.type.name }}
BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
+ E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
with:
test_command_to_run: cd ./integration-tests/ccip-tests && go test -v -timeout 70m -count=1 -json -run ${{ matrix.type.run }} ./load 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci
test_download_vendor_packages_command: cd ./integration-tests && go mod download
+ # Load default test secrets
+ test_secrets_defaults_base64: ${{ secrets.CCIP_DEFAULT_TEST_SECRETS }}
+ # Override default test secrets with custom test secrets if provided
test_secrets_override_base64: ${{ secrets[inputs.test_secrets_override_key] }}
token: ${{ secrets.GITHUB_TOKEN }}
go_mod_path: ./integration-tests/go.mod
@@ -203,12 +226,6 @@ jobs:
cache_key_id: ccip-load-${{ env.MOD_CACHE_VERSION }}
cache_restore_only: "true"
should_cleanup: "true"
- DEFAULT_CHAINLINK_IMAGE: ${{ env.CHAINLINK_IMAGE }}
- DEFAULT_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
- DEFAULT_LOKI_ENDPOINT: ${{ secrets.LOKI_URL }}
- DEFAULT_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
- DEFAULT_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
- DEFAULT_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
# Reporting Jobs
start-slack-thread:
diff --git a/.github/workflows/ccip-offchain-upgrade-tests.yml b/.github/workflows/ccip-offchain-upgrade-tests.yml
index 147f727425..3fe3c79cdd 100644
--- a/.github/workflows/ccip-offchain-upgrade-tests.yml
+++ b/.github/workflows/ccip-offchain-upgrade-tests.yml
@@ -19,6 +19,21 @@ env:
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com
MOD_CACHE_VERSION: 2
AWS_ECR_REPO_PUBLIC_REGISTRY: public.ecr.aws
+ # Default private key test secret loaded from Github Secret as only security team has access to it.
+ # this key secrets.QA_SHARED_803C_KEY has a story behind it. To know more, see CCIP-2875 and SECHD-16575 tickets.
+ E2E_TEST_ETHEREUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ARBITRUM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BASE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_WEMIX_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_AVALANCHE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_ZKSYNC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_MODE_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_METIS_ANDROMEDA_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_OPTIMISM_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_KROMA_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_GNOSIS_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_POLYGON_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
+ E2E_TEST_BSC_MAINNET_WALLET_KEY: ${{ secrets.QA_SHARED_803C_KEY }}
jobs:
# Build Test Dependencies
@@ -230,7 +245,7 @@ jobs:
selectedNetworks: SIMULATED_1,SIMULATED_2
- name: Run Tests
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@d38226be720c5ccc1ff4d3cee40608ebf264cd59 # v2.3.26
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@94cb11f4bd545607a2f221c6685052b3abee723d # v2.3.32
env:
BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
@@ -241,10 +256,17 @@ jobs:
DATABASE_URL: postgresql://postgres:node@localhost:5432/chainlink_test?sslmode=disable
RR_MEM: 8Gi
RR_CPU: 4
- BASE64_NETWORK_CONFIG: ${{ secrets.BASE64_NETWORK_CONFIG }}
+ E2E_TEST_CHAINLINK_IMAGE: ${{ env.AWS_ECR_REPO_PUBLIC_REGISTRY }}/w0i8p0z9/chainlink-ccip
+ E2E_TEST_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
+ E2E_TEST_LOKI_ENDPOINT: ${{ secrets.LOKI_URL_CI }}
+ E2E_TEST_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
+ E2E_TEST_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
+ E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
with:
test_command_to_run: cd ./integration-tests/ccip-tests && go test -timeout 30m -count=1 -json -run ${{ matrix.product.run }} ./smoke 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci
test_download_vendor_packages_command: cd ./integration-tests && go mod download
+ # Load default test secrets
+ test_secrets_defaults_base64: ${{ secrets.CCIP_DEFAULT_TEST_SECRETS }}
cl_repo: ${{ env.AWS_ECR_REPO_PUBLIC_REGISTRY }}/w0i8p0z9/chainlink-ccip # releases are published to public registry
cl_image_tag: ${{ env.RELEASE_TAG }}
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
@@ -261,12 +283,6 @@ jobs:
triggered_by: ${{ env.TEST_TRIGGERED_BY }}
should_tidy: "false"
should_cleanup: "false"
- DEFAULT_CHAINLINK_IMAGE: ${{ env.AWS_ECR_REPO_PUBLIC_REGISTRY }}/w0i8p0z9/chainlink-ccip
- DEFAULT_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
- DEFAULT_LOKI_ENDPOINT: ${{ secrets.LOKI_URL_CI }}
- DEFAULT_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
- DEFAULT_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
- DEFAULT_GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
- name: store laneconfig in artifacts
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
@@ -353,7 +369,7 @@ jobs:
existingNamespace: ${{ needs.run-test-with-last-release.outputs.existing_namespace }}
- name: Run Tests
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@d38226be720c5ccc1ff4d3cee40608ebf264cd59 # v2.3.26
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@94cb11f4bd545607a2f221c6685052b3abee723d # v2.3.32
env:
BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
TEST_BASE64_CCIP_CONFIG_OVERRIDE: ${{ steps.set_override_config.outputs.base_64_override }},${{ steps.setup_create_base64_config_ccip.outputs.base64_config }}
@@ -363,9 +379,18 @@ jobs:
DATABASE_URL: postgresql://postgres:node@localhost:5432/chainlink_test?sslmode=disable
RR_MEM: 8Gi
RR_CPU: 4
+ E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
+ E2E_TEST_CHAINLINK_IMAGE: ${{ env.CHAINLINK_IMAGE }}
+ E2E_TEST_CHAINLINK_UPGRADE_IMAGE: ${{ env.CHAINLINK_IMAGE }}
+ E2E_TEST_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
+ E2E_TEST_LOKI_ENDPOINT: ${{ secrets.LOKI_URL }}
+ E2E_TEST_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
+ E2E_TEST_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
with:
test_command_to_run: cd ./integration-tests/ccip-tests && go test -timeout 1h -count=1 -json -run ${{ matrix.product.run }} ./load 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci
test_download_vendor_packages_command: cd ./integration-tests && go mod download
+ # Load default test secrets
+ test_secrets_defaults_base64: ${{ secrets.CCIP_DEFAULT_TEST_SECRETS }}
cl_repo: ${{ env.CHAINLINK_IMAGE }}
cl_image_tag: ${{ github.sha }}
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
@@ -384,10 +409,3 @@ jobs:
should_tidy: "false"
should_cleanup: "true"
triggered_by: ${{ needs.run-test-with-last-release.outputs.triggered_by }}
- DEFAULT_CHAINLINK_IMAGE: ${{ env.CHAINLINK_IMAGE }}
- DEFAULT_CHAINLINK_UPGRADE_IMAGE: ${{ env.CHAINLINK_IMAGE }}
- DEFAULT_LOKI_TENANT_ID: ${{ vars.LOKI_TENANT_ID }}
- DEFAULT_LOKI_ENDPOINT: ${{ secrets.LOKI_URL }}
- DEFAULT_LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
- DEFAULT_GRAFANA_BASE_URL: ${{ vars.GRAFANA_URL }}
- DEFAULT_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
\ No newline at end of file
diff --git a/.github/workflows/client-compatibility-tests.yml b/.github/workflows/client-compatibility-tests.yml
index 19ed0329fd..7f569168c0 100644
--- a/.github/workflows/client-compatibility-tests.yml
+++ b/.github/workflows/client-compatibility-tests.yml
@@ -54,6 +54,12 @@ jobs:
- name: Check for go.mod changes
id: changes
run: |
+ if [ -z "${{ github.base_ref }}" ]; then
+ echo "No base branch found, this should not happen in a PR or MQ. Please reach out to the Test Tooling team."
+ echo "Github even that triggered the workflow: $GITHUB_EVENT_NAME"
+ echo "Github ref that triggered the workflow: $GITHUB_REF"
+ exit 1
+ fi
git fetch origin ${{ github.base_ref }}
# if no match is found then grep exits with code 1, but if there is a match it exits with code 0
# this will return a match if there are any changes on that corresponding line, for example if spacing was changed
@@ -120,6 +126,7 @@ jobs:
evm_implementations: ${{ steps.select-implementations.outputs.evm_implementations }}
chainlink_version: ${{ steps.select-chainlink-version.outputs.chainlink_version }}
latest_image_count: ${{ steps.get-image-count.outputs.image_count }}
+ chainlink_ref_path: ${{ steps.select-chainlink-version.outputs.cl_ref_path }}
steps:
# ghlatestreleasechecker is a tool to check if new release is available for a given repo
- name: Set Up ghlatestreleasechecker
@@ -186,28 +193,39 @@ jobs:
# we use 100 days since we really want the latest one, and it's highly improbable there won't be a release in last 100 days
chainlink_version=$(ghlatestreleasechecker "smartcontractkit/chainlink" 100)
echo "chainlink_version=$chainlink_version" >> $GITHUB_OUTPUT
+ cl_ref_path="release"
elif [ "$GITHUB_EVENT_NAME" = "workflow_dispatch" ]; then
echo "Fetching Chainlink version from input"
if [ -n "${{ github.event.inputs.chainlinkVersion }}" ]; then
echo "Chainlink version provided in input"
chainlink_version="${{ github.event.inputs.chainlinkVersion }}"
+ if [[ "$chainlink_version" =~ ^[0-9a-f]{40}$ ]]; then
+ cl_ref_path="commit"
+ else
+ cl_ref_path="release"
+ fi
else
echo "Chainlink version not provided in input. Using latest commit SHA."
chainlink_version=${{ github.sha }}
+ cl_ref_path="commit"
fi
echo "chainlink_version=$chainlink_version" >> $GITHUB_OUTPUT
+ echo "cl_ref_path=$cl_ref_path" >> $GITHUB_OUTPUT
elif [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
echo "Fetching Chainlink version from PR's head commit"
chainlink_version="${{ github.event.pull_request.head.sha }}"
echo "chainlink_version=$chainlink_version" >> $GITHUB_OUTPUT
+ echo "cl_ref_path=commit" >> $GITHUB_OUTPUT
elif [ "$GITHUB_EVENT_NAME" = "merge_queue" ]; then
echo "Fetching Chainlink version from merge queue's head commit"
chainlink_version="${{ github.event.merge_group.head_sha }}"
echo "chainlink_version=$chainlink_version" >> $GITHUB_OUTPUT
+ echo "cl_ref_path=commit" >> $GITHUB_OUTPUT
elif [ "$GITHUB_REF_TYPE" = "tag" ]; then
echo "Fetching Chainlink version from tag"
chainlink_version="${{ github.ref_name }}"
echo "chainlink_version=$chainlink_version" >> $GITHUB_OUTPUT
+ echo "cl_ref_path=release" >> $GITHUB_OUTPUT
else
echo "Unsupported trigger event. It's probably an issue with the pipeline definition. Please reach out to the Test Tooling team."
exit 1
@@ -511,7 +529,7 @@ jobs:
run-client-compatibility-matrix:
name: ${{ matrix.evm_node.product }} compatibility with ${{ matrix.evm_node.docker_image }}
- if: always() && needs.should-run.outputs.should_run == 'true' && needs.build-chainlink.result == 'success' && needs.prepare-compatibility-matrix.outputs.matrix != ''
+ if: always() && needs.should-run.outputs.should_run == 'true' && (needs.build-chainlink.result == 'success' || needs.build-chainlink.result == 'skipped') && needs.prepare-compatibility-matrix.outputs.matrix != ''
environment: integration
permissions:
checks: write
@@ -671,7 +689,7 @@ jobs:
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "<${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}|${{ github.ref_name }}> | <${{ github.server_url }}/${{ github.repository }}/commit/${{ needs.select-versions.outputs.chainlink_version }}|${{ needs.select-versions.outputs.chainlink_version }}> | <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Run>"
+ "text": "<${{ github.server_url }}/${{ github.repository }}/${{ needs.select-versions.outputs.chainlink_ref_path }}/${{ needs.select-versions.outputs.chainlink_version }}|${{ needs.select-versions.outputs.chainlink_version }}> | <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Run>"
}
}
]
diff --git a/.mockery.yaml b/.mockery.yaml
index 6e56f27795..34b886d187 100644
--- a/.mockery.yaml
+++ b/.mockery.yaml
@@ -258,14 +258,10 @@ packages:
ORM:
Runner:
PipelineParamUnmarshaler:
- github.com/smartcontractkit/chainlink/v2/core/services/headreporter:
+ github.com/smartcontractkit/chainlink/v2/core/services/promreporter:
config:
- dir: "{{ .InterfaceDir }}"
- filename: "{{ .InterfaceName | snakecase }}_mock.go"
- inpackage: true
- mockname: "Mock{{ .InterfaceName | camelcase }}"
+ dir: core/internal/mocks
interfaces:
- HeadReporter:
PrometheusBackend:
github.com/smartcontractkit/libocr/commontypes:
config:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d25c84b322..a78e070b43 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,88 @@
# Changelog Chainlink Core
+## 2.15.0 - 2024-08-19
+
+### Minor Changes
+
+- [#13472](https://github.com/smartcontractkit/chainlink/pull/13472) [`685681e1b3`](https://github.com/smartcontractkit/chainlink/commit/685681e1b3b44ec9dadd4756ec6f0407ffda8afe) Thanks [@vreff](https://github.com/vreff)! - Remove ocr2vrf
+
+ #removed all ocr2vrf and dkg OCR2 plugin materials.
+
+- [#13787](https://github.com/smartcontractkit/chainlink/pull/13787) [`e065b82d2b`](https://github.com/smartcontractkit/chainlink/commit/e065b82d2b8d565c046c2d96065ad1f593d9b488) Thanks [@cedric-cordenier](https://github.com/cedric-cordenier)! - Initialize registry syncer' contract reader lazily #keystone #internal
+
+- [#13514](https://github.com/smartcontractkit/chainlink/pull/13514) [`f84a3f2f27`](https://github.com/smartcontractkit/chainlink/commit/f84a3f2f276847d26c94bf67215e2a3600951c9c) Thanks [@ilija42](https://github.com/ilija42)! - #internal Change CR GetLatestValue to accept confidenceLevels that map to finality for contract read and event querying. Also remove Pending from BoundContract which used to map to finality for log events.
+
+- [#13805](https://github.com/smartcontractkit/chainlink/pull/13805) [`5daee38379`](https://github.com/smartcontractkit/chainlink/commit/5daee38379495cd858d8022339b5e9202e2ef0aa) Thanks [@silaslenihan](https://github.com/silaslenihan)! - #internal Added small check to allow for nil TxMeta in CW SubmitTransaction
+
+- [#13635](https://github.com/smartcontractkit/chainlink/pull/13635) [`055a9d24f8`](https://github.com/smartcontractkit/chainlink/commit/055a9d24f80a0a6cba8a44cab1a2832eef883761) Thanks [@ilija42](https://github.com/ilija42)! - #internal Add BatchGetLatestValues to ChainReader
+
+- [#13753](https://github.com/smartcontractkit/chainlink/pull/13753) [`8beda6093f`](https://github.com/smartcontractkit/chainlink/commit/8beda6093fe464a98b34ceb77bac6ba51add26b2) Thanks [@snehaagni](https://github.com/snehaagni)! - Bump to start the next version
+
+- [#13678](https://github.com/smartcontractkit/chainlink/pull/13678) [`4e3f5e8d4f`](https://github.com/smartcontractkit/chainlink/commit/4e3f5e8d4f022dcabce177ac52477820b85f04b1) Thanks [@krehermann](https://github.com/krehermann)! - #internal refactor goose migrations to use provider
+
+- [#13843](https://github.com/smartcontractkit/chainlink/pull/13843) [`31557117b2`](https://github.com/smartcontractkit/chainlink/commit/31557117b25f456b0dda38453098fa92dba55200) Thanks [@krehermann](https://github.com/krehermann)! - #internal cleanup heavyweight test databases automatically
+
+- [#13861](https://github.com/smartcontractkit/chainlink/pull/13861) [`b3c93a7f25`](https://github.com/smartcontractkit/chainlink/commit/b3c93a7f259a279060f555098efb4d683ab7e838) Thanks [@reductionista](https://github.com/reductionista)! - #bugfix Set LatestFinalizedBlock for finalized blocks saved by logpoller
+
+- [#13821](https://github.com/smartcontractkit/chainlink/pull/13821) [`5b668c186a`](https://github.com/smartcontractkit/chainlink/commit/5b668c186ac8ba294a97b20484352221f258bae2) Thanks [@ferglor](https://github.com/ferglor)! - Use the new log buffer in automation #changed
+
+### Patch Changes
+
+- [#13749](https://github.com/smartcontractkit/chainlink/pull/13749) [`e28f8a4386`](https://github.com/smartcontractkit/chainlink/commit/e28f8a4386fcd0baa09cf95e5f59e3312b592506) Thanks [@shileiwill](https://github.com/shileiwill)! - add chaos and reorg tests #added
+
+- [#13937](https://github.com/smartcontractkit/chainlink/pull/13937) [`27d9c71b19`](https://github.com/smartcontractkit/chainlink/commit/27d9c71b196961666de87bc3128d31f3c22fb3fa) Thanks [@cds95](https://github.com/cds95)! - #internal address security vulnerabilities around updating nodes and node operators on capabilities registry
+
+- [#13692](https://github.com/smartcontractkit/chainlink/pull/13692) [`5f3d58ba67`](https://github.com/smartcontractkit/chainlink/commit/5f3d58ba67a4e92832d2fa9fc2af487b697ee8ab) Thanks [@samsondav](https://github.com/samsondav)! - Add "VerboseLogging" option to mercury
+
+ Off by default, can be enabled like so:
+
+ ```toml
+ [Mercury]
+ VerboseLogging = true
+ ```
+
+ #updated
+
+- [#13687](https://github.com/smartcontractkit/chainlink/pull/13687) [`df0b06ee1c`](https://github.com/smartcontractkit/chainlink/commit/df0b06ee1ce28a8a7977bd3c9bdd8c9c307bef79) Thanks [@KodeyThomas](https://github.com/KodeyThomas)! - #added support for EIP-1559 transactions for Scroll
+
+- [#13857](https://github.com/smartcontractkit/chainlink/pull/13857) [`6bf25fc01c`](https://github.com/smartcontractkit/chainlink/commit/6bf25fc01c2e0c7de2ef9d79d511688c276368c1) Thanks [@Farber98](https://github.com/Farber98)! - remove tautological err check within evm txm. #internal
+
+- [#13839](https://github.com/smartcontractkit/chainlink/pull/13839) [`48b11ddff4`](https://github.com/smartcontractkit/chainlink/commit/48b11ddff47675c4c645764b0a25fd8a23b247ed) Thanks [@jinhoonbang](https://github.com/jinhoonbang)! - #db_update add an empty BAL spec in migrations
+
+- [#13653](https://github.com/smartcontractkit/chainlink/pull/13653) [`b1c9315776`](https://github.com/smartcontractkit/chainlink/commit/b1c9315776c906bd671c5be404b5cd0c5c34fdba) Thanks [@ferglor](https://github.com/ferglor)! - Dequeue minimum guaranteed upkeeps as a priority #changed
+
+- [#13906](https://github.com/smartcontractkit/chainlink/pull/13906) [`6adb82788a`](https://github.com/smartcontractkit/chainlink/commit/6adb82788a3b53514dd8b2c0742565e5bd175f9b) Thanks [@ettec](https://github.com/ettec)! - #internal change chain reader to use nil blocknumber when reading latest value
+
+- [#13793](https://github.com/smartcontractkit/chainlink/pull/13793) [`741351107b`](https://github.com/smartcontractkit/chainlink/commit/741351107b11966f0af8246a76ac7b5bd6a20556) Thanks [@nickcorin](https://github.com/nickcorin)! - #internal Bumped dependencies for `chainlink-common`, `chainlink-solana`, and `chainlink-starknet`.
+
+- [#13789](https://github.com/smartcontractkit/chainlink/pull/13789) [`e140a2bc1c`](https://github.com/smartcontractkit/chainlink/commit/e140a2bc1c90fa2522109c9da021c3085ed9268d) Thanks [@nickcorin](https://github.com/nickcorin)! - #internal add `NewChainWriter` method onto the dummy relayer.
+
+- [#13761](https://github.com/smartcontractkit/chainlink/pull/13761) [`89196f1fb8`](https://github.com/smartcontractkit/chainlink/commit/89196f1fb8306c90d4e45281130c894bb12328f7) Thanks [@agusaldasoro](https://github.com/agusaldasoro)! - Make send signatures configurable when Transmit in Contract Transmitter #internal
+
+- [#13795](https://github.com/smartcontractkit/chainlink/pull/13795) [`683a12e85e`](https://github.com/smartcontractkit/chainlink/commit/683a12e85e91628f240fe24f32b982b53ac30bd9) Thanks [@KuphJr](https://github.com/KuphJr)! - Updated Functions ToS contract wrappers #internal
+
+- [#13838](https://github.com/smartcontractkit/chainlink/pull/13838) [`d6ebada1b6`](https://github.com/smartcontractkit/chainlink/commit/d6ebada1b6572820a98255b8762cf60810db3210) Thanks [@ettec](https://github.com/ettec)! - #internal end to end test for streams capabilities
+
+- [#13815](https://github.com/smartcontractkit/chainlink/pull/13815) [`fb177f4ee7`](https://github.com/smartcontractkit/chainlink/commit/fb177f4ee77898dd12e20499e421a4d591fb92ef) Thanks [@KuphJr](https://github.com/KuphJr)! - #internal Updated wrappers for improved L1 -> L2 fee calculation for Functions
+
+- [#13335](https://github.com/smartcontractkit/chainlink/pull/13335) [`697e469e41`](https://github.com/smartcontractkit/chainlink/commit/697e469e41e640c8c71214461426174340527b4b) Thanks [@ibrajer](https://github.com/ibrajer)! - VRFV2Plus coordinator and wrapper split contracts between L1 and L2 chains #updated
+
+- [#13785](https://github.com/smartcontractkit/chainlink/pull/13785) [`873abacbc6`](https://github.com/smartcontractkit/chainlink/commit/873abacbc6ce1391fec245045c9436b92d3749f4) Thanks [@martin-cll](https://github.com/martin-cll)! - #internal Mercury v3: Include telemetry if bid/ask violation is detected
+
+- [#13877](https://github.com/smartcontractkit/chainlink/pull/13877) [`81a21bb56c`](https://github.com/smartcontractkit/chainlink/commit/81a21bb56cd597858221f775c796994be0f2e0da) Thanks [@ettec](https://github.com/ettec)! - #internal logging of non determinism in target server
+
+- [#13868](https://github.com/smartcontractkit/chainlink/pull/13868) [`00ef51a7c1`](https://github.com/smartcontractkit/chainlink/commit/00ef51a7c11fd227b73e3533f59950aa78b82162) Thanks [@samsondav](https://github.com/samsondav)! - Protocol-level support for preventing bid/ask variant violations in mercury #added
+
+- [#13120](https://github.com/smartcontractkit/chainlink/pull/13120) [`68a6a66919`](https://github.com/smartcontractkit/chainlink/commit/68a6a6691906aec5807f6c8dae12f9da621304ee) Thanks [@george-dorin](https://github.com/george-dorin)! - #changed Rename the `InBackupHealthReport` to `StartUpHealthReport` and enable it for DB migrations as well. This will enable health report to be available during long start-up tasks (db backups and migrations).
+
+- [#13852](https://github.com/smartcontractkit/chainlink/pull/13852) [`ced300beeb`](https://github.com/smartcontractkit/chainlink/commit/ced300beebbd1971e11e83a558bb9b1efe0290d9) Thanks [@ettec](https://github.com/ettec)! - #internal additional logging to remote target capability
+
+- [#13829](https://github.com/smartcontractkit/chainlink/pull/13829) [`51225f83f3`](https://github.com/smartcontractkit/chainlink/commit/51225f83f30a87606c3c7af56618cd16393c345e) Thanks [@nickcorin](https://github.com/nickcorin)! - #internal Use txid as the idempotency key in the evm chainwriter
+
+- [#13712](https://github.com/smartcontractkit/chainlink/pull/13712) [`535d2795c6`](https://github.com/smartcontractkit/chainlink/commit/535d2795c6e9b66315fe066c7dbaf91977d3e913) Thanks [@dhaidashenko](https://github.com/dhaidashenko)! - Fix TestHeadTracker_CallsHeadTrackableCallbacks flaky test #internal
+
+- [#13713](https://github.com/smartcontractkit/chainlink/pull/13713) [`6d2b5faf10`](https://github.com/smartcontractkit/chainlink/commit/6d2b5faf10efb81a235ff3470bc205c929a6d35d) Thanks [@dhaidashenko](https://github.com/dhaidashenko)! - Fix TestIntegration_KeeperPluginLogUpkeep_ErrHandler flaky test #internal
+
## 2.14.0 - 2024-07-29
### Minor Changes
diff --git a/contracts/.changeset/blue-onions-sleep.md b/contracts/.changeset/blue-onions-sleep.md
deleted file mode 100644
index 35944a0960..0000000000
--- a/contracts/.changeset/blue-onions-sleep.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-capability registry internal review
diff --git a/contracts/.changeset/brave-seahorses-shave.md b/contracts/.changeset/brave-seahorses-shave.md
deleted file mode 100644
index 3f29e6aa4a..0000000000
--- a/contracts/.changeset/brave-seahorses-shave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-upgrade keystone contracts to 0.8.24
diff --git a/contracts/.changeset/calm-bikes-grin.md b/contracts/.changeset/calm-bikes-grin.md
deleted file mode 100644
index 675d42ce4f..0000000000
--- a/contracts/.changeset/calm-bikes-grin.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-add events, add getter and add comments #bugfix
diff --git a/contracts/.changeset/chatty-feet-clean.md b/contracts/.changeset/chatty-feet-clean.md
new file mode 100644
index 0000000000..161bfee8ac
--- /dev/null
+++ b/contracts/.changeset/chatty-feet-clean.md
@@ -0,0 +1,5 @@
+---
+'@chainlink/contracts': patch
+---
+
+#internal address security vulnerabilities around updating nodes and node operators on capabilities registry
diff --git a/contracts/.changeset/chilly-rivers-study.md b/contracts/.changeset/chilly-rivers-study.md
deleted file mode 100644
index 0bd5d713a1..0000000000
--- a/contracts/.changeset/chilly-rivers-study.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-add capability registry comment explaining why we do not validate node operator name
diff --git a/contracts/.changeset/cyan-apes-perform.md b/contracts/.changeset/cyan-apes-perform.md
deleted file mode 100644
index b35f80a981..0000000000
--- a/contracts/.changeset/cyan-apes-perform.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': minor
----
-
-#added EnumerableMapAddresses shared lib for AddressToAddress and AddressToBytes32 maps
diff --git a/contracts/.changeset/dull-phones-retire.md b/contracts/.changeset/dull-phones-retire.md
deleted file mode 100644
index be65a31fac..0000000000
--- a/contracts/.changeset/dull-phones-retire.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-capability registry informational findings
diff --git a/contracts/.changeset/empty-ants-suffer.md b/contracts/.changeset/empty-ants-suffer.md
new file mode 100644
index 0000000000..8270da10f1
--- /dev/null
+++ b/contracts/.changeset/empty-ants-suffer.md
@@ -0,0 +1,5 @@
+---
+'@chainlink/contracts': patch
+---
+
+Added updateFromPrevious method to Functions ToS contract
diff --git a/contracts/.changeset/green-pigs-reflect.md b/contracts/.changeset/green-pigs-reflect.md
deleted file mode 100644
index cb197a32bc..0000000000
--- a/contracts/.changeset/green-pigs-reflect.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-add test for v23 #added
diff --git a/contracts/.changeset/happy-plants-dance.md b/contracts/.changeset/happy-plants-dance.md
deleted file mode 100644
index 1b8c7fcb66..0000000000
--- a/contracts/.changeset/happy-plants-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-allow updating capabilities and to add/remove multiple capabilities at once from the capability registry
diff --git a/contracts/.changeset/healthy-impalas-hammer.md b/contracts/.changeset/healthy-impalas-hammer.md
deleted file mode 100644
index dbbef2fca2..0000000000
--- a/contracts/.changeset/healthy-impalas-hammer.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-remove tracking deprecated arrays
diff --git a/contracts/.changeset/hip-comics-rhyme.md b/contracts/.changeset/hip-comics-rhyme.md
deleted file mode 100644
index f114282148..0000000000
--- a/contracts/.changeset/hip-comics-rhyme.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-track config count in DON struct
diff --git a/contracts/.changeset/large-news-nail.md b/contracts/.changeset/large-news-nail.md
deleted file mode 100644
index 016216426a..0000000000
--- a/contracts/.changeset/large-news-nail.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-Add Additional tests to the callWithExactGasLibrary to ensure proper gas usage
diff --git a/contracts/.changeset/long-beans-turn.md b/contracts/.changeset/long-beans-turn.md
deleted file mode 100644
index 3af5e4a217..0000000000
--- a/contracts/.changeset/long-beans-turn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-implement remove DONs in capability registry
diff --git a/contracts/.changeset/long-cups-perform.md b/contracts/.changeset/long-cups-perform.md
deleted file mode 100644
index 93fba83b55..0000000000
--- a/contracts/.changeset/long-cups-perform.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal
diff --git a/contracts/.changeset/long-jars-protect.md b/contracts/.changeset/long-jars-protect.md
deleted file mode 100644
index 2e5a11e3c8..0000000000
--- a/contracts/.changeset/long-jars-protect.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-update error message when node does not exist
diff --git a/contracts/.changeset/moody-days-share.md b/contracts/.changeset/moody-days-share.md
deleted file mode 100644
index 6c0eb4780b..0000000000
--- a/contracts/.changeset/moody-days-share.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal stub of keystone feed consumer contract
diff --git a/contracts/.changeset/nasty-tables-guess.md b/contracts/.changeset/nasty-tables-guess.md
deleted file mode 100644
index c3c1df76cd..0000000000
--- a/contracts/.changeset/nasty-tables-guess.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-roundup #bugfix
diff --git a/contracts/.changeset/neat-brooms-repeat.md b/contracts/.changeset/neat-brooms-repeat.md
deleted file mode 100644
index 48188702bc..0000000000
--- a/contracts/.changeset/neat-brooms-repeat.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': minor
----
-
-We have multiple validation use-cases on-chain which requires the inputs to be a set, sorted-set or we need to do subset checks.Adding a library for these validations
diff --git a/contracts/.changeset/new-bugs-draw.md b/contracts/.changeset/new-bugs-draw.md
deleted file mode 100644
index 93fba83b55..0000000000
--- a/contracts/.changeset/new-bugs-draw.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal
diff --git a/contracts/.changeset/ninety-cobras-drive.md b/contracts/.changeset/ninety-cobras-drive.md
deleted file mode 100644
index cd57662462..0000000000
--- a/contracts/.changeset/ninety-cobras-drive.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-relax pragma solidity version in VRF SubscriptionAPI.sol
diff --git a/contracts/.changeset/ninety-wolves-sleep.md b/contracts/.changeset/ninety-wolves-sleep.md
deleted file mode 100644
index 7b66938838..0000000000
--- a/contracts/.changeset/ninety-wolves-sleep.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal internal-review-for-capability-registry
diff --git a/contracts/.changeset/odd-gorillas-develop.md b/contracts/.changeset/odd-gorillas-develop.md
deleted file mode 100644
index 93fba83b55..0000000000
--- a/contracts/.changeset/odd-gorillas-develop.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal
diff --git a/contracts/.changeset/orange-tips-attend.md b/contracts/.changeset/orange-tips-attend.md
deleted file mode 100644
index 2b5fa8e88e..0000000000
--- a/contracts/.changeset/orange-tips-attend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-validate that a node is not part of a DON when removing
diff --git a/contracts/.changeset/proud-seals-draw.md b/contracts/.changeset/proud-seals-draw.md
deleted file mode 100644
index 6bda7ed255..0000000000
--- a/contracts/.changeset/proud-seals-draw.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-move v23 contracts #bugfix
diff --git a/contracts/.changeset/proud-turkeys-fold.md b/contracts/.changeset/proud-turkeys-fold.md
deleted file mode 100644
index eab0c19249..0000000000
--- a/contracts/.changeset/proud-turkeys-fold.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-VRFV2Plus coordinator and wrapper split contracts between L1 and L2 chains #updated
diff --git a/contracts/.changeset/quiet-crews-impress.md b/contracts/.changeset/quiet-crews-impress.md
deleted file mode 100644
index 5310806f1c..0000000000
--- a/contracts/.changeset/quiet-crews-impress.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal Use audited version of OCR2Base.sol in OCR3Capability.sol
diff --git a/contracts/.changeset/quiet-guests-march.md b/contracts/.changeset/quiet-guests-march.md
deleted file mode 100644
index 40285829c1..0000000000
--- a/contracts/.changeset/quiet-guests-march.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-Add update DON function to capability registry
diff --git a/contracts/.changeset/red-wasps-behave.md b/contracts/.changeset/red-wasps-behave.md
deleted file mode 100644
index 93fba83b55..0000000000
--- a/contracts/.changeset/red-wasps-behave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal
diff --git a/contracts/.changeset/rich-crabs-smoke.md b/contracts/.changeset/rich-crabs-smoke.md
deleted file mode 100644
index fc33cf7d4e..0000000000
--- a/contracts/.changeset/rich-crabs-smoke.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal Keystone Forwarder and Feeds Consumer
diff --git a/contracts/.changeset/selfish-files-learn.md b/contracts/.changeset/selfish-files-learn.md
deleted file mode 100644
index 3d348d1d8d..0000000000
--- a/contracts/.changeset/selfish-files-learn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-add getters in capability registry
diff --git a/contracts/.changeset/serious-cats-fold.md b/contracts/.changeset/serious-cats-fold.md
deleted file mode 100644
index ccf89c9b04..0000000000
--- a/contracts/.changeset/serious-cats-fold.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-Implemented improved L1 fee calculation for L2 chains in Functions contracts
diff --git a/contracts/.changeset/seven-apes-drop.md b/contracts/.changeset/seven-apes-drop.md
deleted file mode 100644
index 2882975f66..0000000000
--- a/contracts/.changeset/seven-apes-drop.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-increase solhint max-warnings to 2 (from 0) to allow workflow to pass
diff --git a/contracts/.changeset/silent-ravens-lay.md b/contracts/.changeset/silent-ravens-lay.md
deleted file mode 100644
index e987e9e082..0000000000
--- a/contracts/.changeset/silent-ravens-lay.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-remove update capabilities from capability registry
diff --git a/contracts/.changeset/six-ears-sin.md b/contracts/.changeset/six-ears-sin.md
deleted file mode 100644
index 186481a36e..0000000000
--- a/contracts/.changeset/six-ears-sin.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-update ICapabilityConfiguration interface
diff --git a/contracts/.changeset/smart-rules-love.md b/contracts/.changeset/smart-rules-love.md
deleted file mode 100644
index eb2542a685..0000000000
--- a/contracts/.changeset/smart-rules-love.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-Added Base Sepolia to ChainUtils #changed
diff --git a/contracts/.changeset/smart-trainers-begin.md b/contracts/.changeset/smart-trainers-begin.md
deleted file mode 100644
index 5e76abd21e..0000000000
--- a/contracts/.changeset/smart-trainers-begin.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-check data size #bugfix
diff --git a/contracts/.changeset/smooth-years-reply.md b/contracts/.changeset/smooth-years-reply.md
deleted file mode 100644
index 330310cb8d..0000000000
--- a/contracts/.changeset/smooth-years-reply.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-link transfer status check #bugfix
diff --git a/contracts/.changeset/sour-parents-explode.md b/contracts/.changeset/sour-parents-explode.md
deleted file mode 100644
index ff5b52b98f..0000000000
--- a/contracts/.changeset/sour-parents-explode.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-update node signer type
diff --git a/contracts/.changeset/spicy-mirrors-care.md b/contracts/.changeset/spicy-mirrors-care.md
deleted file mode 100644
index 93fba83b55..0000000000
--- a/contracts/.changeset/spicy-mirrors-care.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal
diff --git a/contracts/.changeset/stupid-lamps-sell.md b/contracts/.changeset/stupid-lamps-sell.md
deleted file mode 100644
index ad5d70a04a..0000000000
--- a/contracts/.changeset/stupid-lamps-sell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-verify valid node operator when adding nodes to capability registry
diff --git a/contracts/.changeset/sweet-geese-rescue.md b/contracts/.changeset/sweet-geese-rescue.md
deleted file mode 100644
index ba0f2c916c..0000000000
--- a/contracts/.changeset/sweet-geese-rescue.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-update uint256 to uint32 for donId declaration in capability config interface
diff --git a/contracts/.changeset/swift-ads-stare.md b/contracts/.changeset/swift-ads-stare.md
deleted file mode 100644
index 33a5d0cf16..0000000000
--- a/contracts/.changeset/swift-ads-stare.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-return hashed capability ids
diff --git a/contracts/.changeset/tender-roses-know.md b/contracts/.changeset/tender-roses-know.md
deleted file mode 100644
index 383837fce0..0000000000
--- a/contracts/.changeset/tender-roses-know.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': minor
----
-
-#internal Modify ChainReader tester contract.
diff --git a/contracts/.changeset/tricky-comics-scream.md b/contracts/.changeset/tricky-comics-scream.md
deleted file mode 100644
index f7cd1ceeab..0000000000
--- a/contracts/.changeset/tricky-comics-scream.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-remove stale automation HH tests
diff --git a/contracts/.changeset/tricky-meals-decide.md b/contracts/.changeset/tricky-meals-decide.md
deleted file mode 100644
index afbb24ad9f..0000000000
--- a/contracts/.changeset/tricky-meals-decide.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@chainlink/contracts": patch
----
-
-#bugfix
-fix a funding bug in LinkAvailableBalanceMonitor
diff --git a/contracts/.changeset/two-doors-dance.md b/contracts/.changeset/two-doors-dance.md
deleted file mode 100644
index 93fba83b55..0000000000
--- a/contracts/.changeset/two-doors-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal
diff --git a/contracts/.changeset/witty-onions-relate.md b/contracts/.changeset/witty-onions-relate.md
deleted file mode 100644
index 30d3da6df9..0000000000
--- a/contracts/.changeset/witty-onions-relate.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-#internal KeystoneFeedsConsumer bytes10 decoding bugfix
diff --git a/contracts/.changeset/yellow-snails-wash.md b/contracts/.changeset/yellow-snails-wash.md
deleted file mode 100644
index 479fedcbe4..0000000000
--- a/contracts/.changeset/yellow-snails-wash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@chainlink/contracts': patch
----
-
-return don capability config contract config from capability registry
diff --git a/contracts/CHANGELOG.md b/contracts/CHANGELOG.md
index ba6dabfeb0..01a9dd4b6c 100644
--- a/contracts/CHANGELOG.md
+++ b/contracts/CHANGELOG.md
@@ -1,5 +1,106 @@
# @chainlink/contracts
+## 1.2.0 - 2024-07-18
+
+### Minor Changes
+
+- [#13428](https://github.com/smartcontractkit/chainlink/pull/13428) [`a02bb0a`](https://github.com/smartcontractkit/chainlink/commit/a02bb0a48cb78c815ec3a2f3bd351f2efc3869d7) Thanks [@elatoskinas](https://github.com/elatoskinas)! - #added EnumerableMapAddresses shared lib for AddressToAddress and AddressToBytes32 maps
+
+- [#13774](https://github.com/smartcontractkit/chainlink/pull/13774) [`b5c0ea9`](https://github.com/smartcontractkit/chainlink/commit/b5c0ea9f106ced6daf8e1f35e88bc39d7b82de28) Thanks [@0xsuryansh](https://github.com/0xsuryansh)! - We have multiple validation use-cases on-chain which requires the inputs to be a set, sorted-set or we need to do subset checks.Adding a library for these validations
+
+- [#13514](https://github.com/smartcontractkit/chainlink/pull/13514) [`f84a3f2`](https://github.com/smartcontractkit/chainlink/commit/f84a3f2f276847d26c94bf67215e2a3600951c9c) Thanks [@ilija42](https://github.com/ilija42)! - #internal Modify ChainReader tester contract.
+
+### Patch Changes
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - capability registry internal review
+
+- [#13546](https://github.com/smartcontractkit/chainlink/pull/13546) [`10ddafa`](https://github.com/smartcontractkit/chainlink/commit/10ddafaebedb94ad5a59968d19256b8c4592857f) Thanks [@cds95](https://github.com/cds95)! - upgrade keystone contracts to 0.8.24
+
+- [#13376](https://github.com/smartcontractkit/chainlink/pull/13376) [`bb40d51`](https://github.com/smartcontractkit/chainlink/commit/bb40d51502487b010a1d6621db42458356dbbdc0) Thanks [@shileiwill](https://github.com/shileiwill)! - add events, add getter and add comments #bugfix
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - add capability registry comment explaining why we do not validate node operator name
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - capability registry informational findings
+
+- [#13644](https://github.com/smartcontractkit/chainlink/pull/13644) [`2ed4478`](https://github.com/smartcontractkit/chainlink/commit/2ed4478ecc7fa6bada1138d204c12236fe56a810) Thanks [@shileiwill](https://github.com/shileiwill)! - add test for v23 #added
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - allow updating capabilities and to add/remove multiple capabilities at once from the capability registry
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - remove tracking deprecated arrays
+
+- [#13183](https://github.com/smartcontractkit/chainlink/pull/13183) [`9630475`](https://github.com/smartcontractkit/chainlink/commit/96304756a77cdb2acf251d21d59b6aa8b55bf61a) Thanks [@cds95](https://github.com/cds95)! - track config count in DON struct
+
+- [#13326](https://github.com/smartcontractkit/chainlink/pull/13326) [`732eea0`](https://github.com/smartcontractkit/chainlink/commit/732eea0f834e1f84c3a7520e131698d38762c78b) Thanks [@jhweintraub](https://github.com/jhweintraub)! - Add Additional tests to the callWithExactGasLibrary to ensure proper gas usage
+
+- [#13183](https://github.com/smartcontractkit/chainlink/pull/13183) [`9630475`](https://github.com/smartcontractkit/chainlink/commit/96304756a77cdb2acf251d21d59b6aa8b55bf61a) Thanks [@cds95](https://github.com/cds95)! - implement remove DONs in capability registry
+
+- [#13425](https://github.com/smartcontractkit/chainlink/pull/13425) [`eeb363f`](https://github.com/smartcontractkit/chainlink/commit/eeb363f1230415dde573607a095b177c612d3bef) Thanks [@DeividasK](https://github.com/DeividasK)! - #internal
+
+- [#13453](https://github.com/smartcontractkit/chainlink/pull/13453) [`8c98c80`](https://github.com/smartcontractkit/chainlink/commit/8c98c80376c3b6d72bffeab62ee45a74449b6ef5) Thanks [@cds95](https://github.com/cds95)! - update error message when node does not exist
+
+- [#13366](https://github.com/smartcontractkit/chainlink/pull/13366) [`d53d6d0`](https://github.com/smartcontractkit/chainlink/commit/d53d6d08dac5d3ee27ae89012669c6c2455295c8) Thanks [@bolekk](https://github.com/bolekk)! - #internal stub of keystone feed consumer contract
+
+- [#13287](https://github.com/smartcontractkit/chainlink/pull/13287) [`8491b24`](https://github.com/smartcontractkit/chainlink/commit/8491b247cd5ff240d281ecfbabc0fe0fa19134f1) Thanks [@shileiwill](https://github.com/shileiwill)! - roundup #bugfix
+
+- [#13426](https://github.com/smartcontractkit/chainlink/pull/13426) [`592b2bb`](https://github.com/smartcontractkit/chainlink/commit/592b2bb5a84a0e8858f77c5faa99e881f911878c) Thanks [@archseer](https://github.com/archseer)! - #internal
+
+- [#13600](https://github.com/smartcontractkit/chainlink/pull/13600) [`4406364`](https://github.com/smartcontractkit/chainlink/commit/4406364702dd5af0b34c0397c00f8489510ecb11) Thanks [@jinhoonbang](https://github.com/jinhoonbang)! - relax pragma solidity version in VRF SubscriptionAPI.sol
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - #internal internal-review-for-capability-registry
+
+- [#13528](https://github.com/smartcontractkit/chainlink/pull/13528) [`95502ad`](https://github.com/smartcontractkit/chainlink/commit/95502ad2699d63891662594f70e82e76682f2ed8) Thanks [@DeividasK](https://github.com/DeividasK)! - #internal
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - validate that a node is not part of a DON when removing
+
+- [#13504](https://github.com/smartcontractkit/chainlink/pull/13504) [`815c5ea`](https://github.com/smartcontractkit/chainlink/commit/815c5ea8715462e00f6ea10cdc0b93ec3e1ba505) Thanks [@shileiwill](https://github.com/shileiwill)! - move v23 contracts #bugfix
+
+- [#13335](https://github.com/smartcontractkit/chainlink/pull/13335) [`697e469`](https://github.com/smartcontractkit/chainlink/commit/697e469e41e640c8c71214461426174340527b4b) Thanks [@ibrajer](https://github.com/ibrajer)! - VRFV2Plus coordinator and wrapper split contracts between L1 and L2 chains #updated
+
+- [#13487](https://github.com/smartcontractkit/chainlink/pull/13487) [`5e27da9`](https://github.com/smartcontractkit/chainlink/commit/5e27da95f09f21272e93f086bc2de5a9bc2ae399) Thanks [@bolekk](https://github.com/bolekk)! - #internal Use audited version of OCR2Base.sol in OCR3Capability.sol
+
+- [#13183](https://github.com/smartcontractkit/chainlink/pull/13183) [`9630475`](https://github.com/smartcontractkit/chainlink/commit/96304756a77cdb2acf251d21d59b6aa8b55bf61a) Thanks [@cds95](https://github.com/cds95)! - Add update DON function to capability registry
+
+- [#13566](https://github.com/smartcontractkit/chainlink/pull/13566) [`f1d478d`](https://github.com/smartcontractkit/chainlink/commit/f1d478d8bbba92f9753f7a1d6733ba4efd1f616a) Thanks [@DeividasK](https://github.com/DeividasK)! - #internal
+
+- [#13389](https://github.com/smartcontractkit/chainlink/pull/13389) [`3959091`](https://github.com/smartcontractkit/chainlink/commit/3959091d4f3925b64cb6b0b55b7f7c72a4f924b9) Thanks [@bolekk](https://github.com/bolekk)! - #internal Keystone Forwarder and Feeds Consumer
+
+- [#13183](https://github.com/smartcontractkit/chainlink/pull/13183) [`9630475`](https://github.com/smartcontractkit/chainlink/commit/96304756a77cdb2acf251d21d59b6aa8b55bf61a) Thanks [@cds95](https://github.com/cds95)! - add getters in capability registry
+
+- [#13815](https://github.com/smartcontractkit/chainlink/pull/13815) [`fb177f4`](https://github.com/smartcontractkit/chainlink/commit/fb177f4ee77898dd12e20499e421a4d591fb92ef) Thanks [@KuphJr](https://github.com/KuphJr)! - Implemented improved L1 fee calculation for L2 chains in Functions contracts
+
+- [#13237](https://github.com/smartcontractkit/chainlink/pull/13237) [`53312f0`](https://github.com/smartcontractkit/chainlink/commit/53312f01f3459408402ed97a9e3935ec63ccee7a) Thanks [@erikburt](https://github.com/erikburt)! - increase solhint max-warnings to 2 (from 0) to allow workflow to pass
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - remove update capabilities from capability registry
+
+- [#13183](https://github.com/smartcontractkit/chainlink/pull/13183) [`9630475`](https://github.com/smartcontractkit/chainlink/commit/96304756a77cdb2acf251d21d59b6aa8b55bf61a) Thanks [@cds95](https://github.com/cds95)! - update ICapabilityConfiguration interface
+
+- [#13216](https://github.com/smartcontractkit/chainlink/pull/13216) [`6099abb`](https://github.com/smartcontractkit/chainlink/commit/6099abbdbfb3ad396ca1ed5138ecd7a13159de19) Thanks [@ibrajer](https://github.com/ibrajer)! - Added Base Sepolia to ChainUtils #changed
+
+- [#13352](https://github.com/smartcontractkit/chainlink/pull/13352) [`33a9cdf`](https://github.com/smartcontractkit/chainlink/commit/33a9cdf8d7c42cab4682121b50d5fa12d9b5ff27) Thanks [@shileiwill](https://github.com/shileiwill)! - check data size #bugfix
+
+- [#13177](https://github.com/smartcontractkit/chainlink/pull/13177) [`0d58a8d`](https://github.com/smartcontractkit/chainlink/commit/0d58a8d5db24f42720226e73328e501637ba59c5) Thanks [@shileiwill](https://github.com/shileiwill)! - link transfer status check #bugfix
+
+- [#13183](https://github.com/smartcontractkit/chainlink/pull/13183) [`9630475`](https://github.com/smartcontractkit/chainlink/commit/96304756a77cdb2acf251d21d59b6aa8b55bf61a) Thanks [@cds95](https://github.com/cds95)! - update node signer type
+
+- [#13580](https://github.com/smartcontractkit/chainlink/pull/13580) [`0d4a3b2`](https://github.com/smartcontractkit/chainlink/commit/0d4a3b2cd8ff938ba018d982ef514c754a7df345) Thanks [@DeividasK](https://github.com/DeividasK)! - #internal
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - verify valid node operator when adding nodes to capability registry
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - update uint256 to uint32 for donId declaration in capability config interface
+
+- [#13453](https://github.com/smartcontractkit/chainlink/pull/13453) [`8c98c80`](https://github.com/smartcontractkit/chainlink/commit/8c98c80376c3b6d72bffeab62ee45a74449b6ef5) Thanks [@cds95](https://github.com/cds95)! - return hashed capability ids
+
+- [#13676](https://github.com/smartcontractkit/chainlink/pull/13676) [`ed6b9ad`](https://github.com/smartcontractkit/chainlink/commit/ed6b9ad7909e09d0ff9850b7a1e34a0137762642) Thanks [@RyanRHall](https://github.com/RyanRHall)! - remove stale automation HH tests
+
+- [#13364](https://github.com/smartcontractkit/chainlink/pull/13364) [`fc007a9`](https://github.com/smartcontractkit/chainlink/commit/fc007a94846c178bc9d5203dbff6b6b8c7546a71) Thanks [@FelixFan1992](https://github.com/FelixFan1992)! - #bugfix
+ fix a funding bug in LinkAvailableBalanceMonitor
+
+- [#13569](https://github.com/smartcontractkit/chainlink/pull/13569) [`f5a70eb`](https://github.com/smartcontractkit/chainlink/commit/f5a70eb09abc9a4d859442c9bd062a74a7ec9c54) Thanks [@DeividasK](https://github.com/DeividasK)! - #internal
+
+- [#13436](https://github.com/smartcontractkit/chainlink/pull/13436) [`f37afb9`](https://github.com/smartcontractkit/chainlink/commit/f37afb9ebaeda10f8b3873b069b8a824e60a81c3) Thanks [@bolekk](https://github.com/bolekk)! - #internal KeystoneFeedsConsumer bytes10 decoding bugfix
+
+- [#13368](https://github.com/smartcontractkit/chainlink/pull/13368) [`000f2cb`](https://github.com/smartcontractkit/chainlink/commit/000f2cb36b7d9b6d046d383c85996ae1ae7a606e) Thanks [@cds95](https://github.com/cds95)! - return don capability config contract config from capability registry
+
## 1.1.1 - 2024-05-23
### Patch Changes
@@ -32,7 +133,6 @@
- [#13022](https://github.com/smartcontractkit/chainlink/pull/13022) [`2805fa6c9b`](https://github.com/smartcontractkit/chainlink/commit/2805fa6c9b469d535edcd3d66c08e1d22bbaa2d0) Thanks [@cds95](https://github.com/cds95)! - #internal
-
- [#12812](https://github.com/smartcontractkit/chainlink/pull/12812) [`5b33a3296f`](https://github.com/smartcontractkit/chainlink/commit/5b33a3296f895cec8a23ba2e235989868f398ddb) Thanks [@shileiwill](https://github.com/shileiwill)! - Support decimals #added
- [#12979](https://github.com/smartcontractkit/chainlink/pull/12979) [`0c4c24ad8c`](https://github.com/smartcontractkit/chainlink/commit/0c4c24ad8c95e505cd2a29be711cc40e612658b0) Thanks [@cds95](https://github.com/cds95)! - Add function to remove node operators from capability registry
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 1658bd8dcb..6153b0a079 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -37,61 +37,61 @@ BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23951)
CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2132684)
CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9517)
CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70831)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363664)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 488826)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 453439)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363682)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 488896)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 453458)
CCIPConfig_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 37049)
CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 61065)
CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 60985)
CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11635)
CCIPConfig_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8831)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 312055)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 312026)
CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 49727)
CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 32320)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 376678)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 376649)
CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 121045)
CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 157245)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 376454)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 376425)
CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 157312)
CCIPConfig_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9605)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1851094)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1068315)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1068346)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1851149)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1068320)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1068351)
CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() (gas: 9599)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16070)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16057)
CCIPConfig_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9605)
-CCIPConfig_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 184703)
-CCIPConfig_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 344881)
-CCIPConfig_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20258)
-CCIPConfig_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 267558)
+CCIPConfig_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 184727)
+CCIPConfig_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 344895)
+CCIPConfig_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20329)
+CCIPConfig_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 267569)
CCIPConfig_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14829)
CCIPConfig_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9626)
-CCIPConfig_chainConfig:test_getPaginatedCCIPConfigs_Success() (gas: 370235)
-CCIPConfig_constructor:test_constructor_Success() (gas: 3612901)
-CCIPConfig_constructor:test_constructor_ZeroAddressNotAllowed_Revert() (gas: 61777)
-CCIPConfig_updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1057368)
+CCIPConfig_chainConfig:test_getPaginatedCCIPConfigs_Success() (gas: 370249)
+CCIPConfig_constructor:test_constructor_Success() (gas: 3597863)
+CCIPConfig_constructor:test_constructor_ZeroAddressNotAllowed_Revert() (gas: 61761)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1057386)
CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 27561)
CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 23127)
-CCIPConfig_updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 2009285)
-CCIPConfig_updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2616133)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 2009377)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2616263)
CCIPConfig_updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9605)
-CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsHasDuplicates_Reverts() (gas: 294893)
-CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsNotASubsetOfP2PIds_Reverts() (gas: 298325)
-CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsNotSorted_Reverts() (gas: 295038)
-CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 294357)
-CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 291431)
-CCIPConfig_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 292396)
-CCIPConfig_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 292540)
-CCIPConfig_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 299420)
-CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1160094)
-CCIPConfig_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 291260)
-CCIPConfig_validateConfig:test__validateConfig_P2PIdsHasDuplicates_Reverts() (gas: 295907)
-CCIPConfig_validateConfig:test__validateConfig_P2PIdsLengthNotMatching_Reverts() (gas: 293229)
-CCIPConfig_validateConfig:test__validateConfig_P2PIdsNotSorted_Reverts() (gas: 295623)
-CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 302186)
-CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() (gas: 294539)
-CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1215861)
-CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1214264)
+CCIPConfig_validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 292159)
+CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsHasDuplicates_Reverts() (gas: 295946)
+CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsNotASubsetOfP2PIds_Reverts() (gas: 299396)
+CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsNotSorted_Reverts() (gas: 296081)
+CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 294926)
+CCIPConfig_validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 291771)
+CCIPConfig_validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 292999)
+CCIPConfig_validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 293164)
+CCIPConfig_validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 348310)
+CCIPConfig_validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1209654)
+CCIPConfig_validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 291876)
+CCIPConfig_validateConfig:test__validateConfig_P2PIdsHasDuplicates_Reverts() (gas: 295780)
+CCIPConfig_validateConfig:test__validateConfig_P2PIdsLengthNotMatching_Reverts() (gas: 293785)
+CCIPConfig_validateConfig:test__validateConfig_P2PIdsNotSorted_Reverts() (gas: 296150)
+CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 302468)
+CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() (gas: 295556)
+CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 494442)
CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9584)
CommitStore_constructor:test_Constructor_Success() (gas: 3091326)
CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420)
@@ -347,7 +347,7 @@ FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Rev
FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 107046)
FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 111396)
FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 111449)
-FeeQuoter_constructor:test_Setup_Success() (gas: 5358690)
+FeeQuoter_constructor:test_Setup_Success() (gas: 5355882)
FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 72739)
FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 30963)
FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 94303)
@@ -369,17 +369,17 @@ FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_S
FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40013)
FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29299)
FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18180)
-FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 85936)
-FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 56735)
-FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 242354)
+FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 85916)
+FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 54345)
+FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 242334)
FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22390)
-FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 34187)
+FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 31797)
FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100133)
-FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 147715)
+FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 147677)
FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21043)
-FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 116743)
+FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 116705)
FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22526)
-FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 64374)
+FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 64364)
FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 2094539)
FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 2094497)
FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 2074616)
@@ -536,37 +536,37 @@ MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_Remov
MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 18287)
MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 18216)
MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59331)
-MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44298)
-MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283711)
-MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422848)
-MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 511694)
-MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 829593)
-MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 457446)
+MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 43602)
+MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283585)
+MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422210)
+MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 511089)
+MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 828371)
+MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 456841)
MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12376)
-MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2143220)
-MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141744)
-MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 808478)
-MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 171331)
-MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 30298)
-MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254454)
-MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 861521)
-MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 475825)
+MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2140058)
+MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141702)
+MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 807256)
+MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 158772)
+MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 112266)
+MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254068)
+MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 859969)
+MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 475059)
MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 42837)
MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 48442)
MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 76930)
-MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 66127)
+MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 65770)
MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 33419)
MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 79521)
-MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 34020)
+MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 33633)
MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 47114)
MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 25682)
MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 18714)
MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24191)
-MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61409)
+MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61133)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39890)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 32973)
-MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 414301)
-MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501445)
+MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 413542)
+MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1499109)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37907)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23694)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38763)
@@ -578,10 +578,10 @@ NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success(
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 244814)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 233069)
NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153186)
-NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168681)
-NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 220836)
+NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168317)
+NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 220108)
NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125070)
-NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107910)
+NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107546)
NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 122943)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 42959)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64282)
@@ -629,50 +629,50 @@ OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas:
OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13263)
OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 17988)
OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15300)
-OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 322171)
-OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 263506)
+OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 321369)
+OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 262704)
OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169162)
-OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 188589)
+OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 187787)
OffRamp_batchExecute:test_SingleReport_Success() (gas: 156230)
-OffRamp_batchExecute:test_Unhealthy_Revert() (gas: 533834)
+OffRamp_batchExecute:test_Unhealthy_Revert() (gas: 533030)
OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10461)
OffRamp_ccipReceive:test_Reverts() (gas: 15773)
OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 67458)
OffRamp_commit:test_InvalidInterval_Revert() (gas: 59778)
OffRamp_commit:test_InvalidRootRevert() (gas: 58858)
-OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6560573)
-OffRamp_commit:test_NoConfig_Revert() (gas: 6143711)
-OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 106317)
-OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 116369)
-OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 106338)
-OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 351652)
-OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 159342)
-OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 136480)
-OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 136880)
+OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6534892)
+OffRamp_commit:test_NoConfig_Revert() (gas: 6118635)
+OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 105929)
+OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 115981)
+OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 105950)
+OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 349049)
+OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 158960)
+OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 136092)
+OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 136492)
OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59126)
-OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 225582)
+OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 224806)
OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 117632)
OffRamp_commit:test_Unhealthy_Revert() (gas: 77674)
-OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 205066)
-OffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6554962)
+OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 204296)
+OffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6529281)
OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 47832)
-OffRamp_constructor:test_Constructor_Success() (gas: 6147616)
-OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 137128)
-OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103845)
-OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101716)
-OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 139680)
-OffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 101593)
-OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101660)
+OffRamp_constructor:test_Constructor_Success() (gas: 6121934)
+OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 137089)
+OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103806)
+OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101677)
+OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 139641)
+OffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 101554)
+OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101621)
OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17305)
-OffRamp_execute:test_LargeBatch_Success() (gas: 1828972)
-OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 358063)
-OffRamp_execute:test_MultipleReports_Success() (gas: 285617)
-OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6611685)
-OffRamp_execute:test_NoConfig_Revert() (gas: 6194563)
+OffRamp_execute:test_LargeBatch_Success() (gas: 1812704)
+OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 357260)
+OffRamp_execute:test_MultipleReports_Success() (gas: 284815)
+OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6586004)
+OffRamp_execute:test_NoConfig_Revert() (gas: 6169487)
OffRamp_execute:test_NonArray_Revert() (gas: 27809)
OffRamp_execute:test_SingleReport_Success() (gas: 175620)
OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 147848)
-OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6973803)
+OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6947505)
OffRamp_execute:test_ZeroReports_Revert() (gas: 17225)
OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18257)
OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 249037)
@@ -685,11 +685,11 @@ OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Rev
OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 280859)
OffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 92437)
OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 35104)
-OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 23923)
-OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 492333)
+OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 28724)
+OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 491530)
OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 54457)
-OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 35927)
-OffRamp_executeSingleReport:test_MismatchingOnRampRoot_Revert() (gas: 154493)
+OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 40728)
+OffRamp_executeSingleReport:test_MismatchingOnRampRoot_Revert() (gas: 154111)
OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 35338)
OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 187911)
OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 199215)
@@ -700,15 +700,15 @@ OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas:
OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 212938)
OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 266576)
OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 141191)
-OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 423378)
+OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 422575)
OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 65877)
OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 80932)
-OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 587410)
-OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 535220)
-OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 35743)
-OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 532474)
-OffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 529798)
-OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 495040)
+OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 586607)
+OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 534417)
+OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 40544)
+OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 531671)
+OffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 528995)
+OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 494237)
OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 136580)
OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165799)
OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3742124)
@@ -724,8 +724,8 @@ OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 524603)
OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2388943)
OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 208553)
OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 219343)
-OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 663643)
-OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 330148)
+OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 658822)
+OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 328543)
OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 165822)
OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 24603)
OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 66285)
@@ -734,7 +734,7 @@ OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reve
OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 177934)
OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 191136)
OffRamp_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11423)
-OffRamp_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 215373)
+OffRamp_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 215009)
OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11585)
OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 14152)
OffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 49115)
@@ -743,48 +743,48 @@ OffRamp_trialExecute:test_RateLimitError_Success() (gas: 225795)
OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 234416)
OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 309206)
OffRamp_trialExecute:test_trialExecute_Success() (gas: 283994)
-OffRamp_verify:test_Blessed_Success() (gas: 176664)
-OffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 178754)
-OffRamp_verify:test_NotBlessed_Success() (gas: 141593)
+OffRamp_verify:test_Blessed_Success() (gas: 176276)
+OffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 178366)
+OffRamp_verify:test_NotBlessed_Success() (gas: 141205)
OffRamp_verify:test_TooManyLeaves_Revert() (gas: 51510)
OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390336)
OnRamp_allowListConfigUpdates:test_applyAllowList_Revert() (gas: 66509)
OnRamp_allowListConfigUpdates:test_applyAllowList_Success() (gas: 323566)
OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 64501)
OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13242)
-OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94878)
-OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92812)
-OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97827)
-OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92870)
-OnRamp_constructor:test_Constructor_Success() (gas: 2866937)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115250)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146019)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145615)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143816)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145847)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145216)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 140359)
+OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94862)
+OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92796)
+OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97811)
+OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92854)
+OnRamp_constructor:test_Constructor_Success() (gas: 2852106)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114880)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 145648)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145251)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143464)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145476)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 144852)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 139995)
OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28810)
OnRamp_forwardFromRouter:test_MessageValidationError_Revert() (gas: 138683)
OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 26910)
-OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 74456)
+OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 74122)
OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 12918)
OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 37224)
OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 18179)
-OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 185252)
-OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 211543)
-OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 125128)
-OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 146530)
-OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3894232)
+OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 184142)
+OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210451)
+OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 124764)
+OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 146166)
+OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3892469)
OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 18609)
-OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 111118)
-OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 76545)
-OnRamp_forwardFromRouter:test_forwardFromRouter_WithValidation_Success() (gas: 281240)
-OnRamp_getFee:test_EmptyMessage_Success() (gas: 110107)
-OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 75610)
-OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 95456)
+OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110785)
+OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 76212)
+OnRamp_forwardFromRouter:test_forwardFromRouter_WithValidation_Success() (gas: 280875)
+OnRamp_getFee:test_EmptyMessage_Success() (gas: 110067)
+OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 73220)
+OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 95436)
OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 41814)
-OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 125476)
+OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 125400)
OnRamp_getFee:test_Unhealthy_Revert() (gas: 43669)
OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10438)
OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35204)
diff --git a/contracts/gas-snapshots/functions.gas-snapshot b/contracts/gas-snapshots/functions.gas-snapshot
index b54662b868..69e0271684 100644
--- a/contracts/gas-snapshots/functions.gas-snapshot
+++ b/contracts/gas-snapshots/functions.gas-snapshot
@@ -1,21 +1,21 @@
-ChainSpecificUtil__getL1FeeUpperLimit_Arbitrum:test__getL1FeeUpperLimit_SuccessWhenArbitrumGoerli() (gas: 15903239)
-ChainSpecificUtil__getL1FeeUpperLimit_Arbitrum:test__getL1FeeUpperLimit_SuccessWhenArbitrumMainnet() (gas: 15903196)
-ChainSpecificUtil__getL1FeeUpperLimit_Arbitrum:test__getL1FeeUpperLimit_SuccessWhenArbitrumSepolia() (gas: 15903265)
-ChainSpecificUtil__getL1FeeUpperLimit_Base:test__getL1FeeUpperLimit_SuccessWhenBaseGoerli() (gas: 15903033)
-ChainSpecificUtil__getL1FeeUpperLimit_Base:test__getL1FeeUpperLimit_SuccessWhenBaseMainnet() (gas: 15903011)
-ChainSpecificUtil__getL1FeeUpperLimit_Base:test__getL1FeeUpperLimit_SuccessWhenBaseSepolia() (gas: 15903060)
-ChainSpecificUtil__getL1FeeUpperLimit_Optimism:test__getL1FeeUpperLimit_SuccessWhenOptimismGoerli() (gas: 15902946)
-ChainSpecificUtil__getL1FeeUpperLimit_Optimism:test__getL1FeeUpperLimit_SuccessWhenOptimismMainnet() (gas: 15902968)
-ChainSpecificUtil__getL1FeeUpperLimit_Optimism:test__getL1FeeUpperLimit_SuccessWhenOptimismSepolia() (gas: 15903011)
+ChainSpecificUtil__getL1FeeUpperLimit_Arbitrum:test__getL1FeeUpperLimit_SuccessWhenArbitrumGoerli() (gas: 16076840)
+ChainSpecificUtil__getL1FeeUpperLimit_Arbitrum:test__getL1FeeUpperLimit_SuccessWhenArbitrumMainnet() (gas: 16076819)
+ChainSpecificUtil__getL1FeeUpperLimit_Arbitrum:test__getL1FeeUpperLimit_SuccessWhenArbitrumSepolia() (gas: 16076888)
+ChainSpecificUtil__getL1FeeUpperLimit_Base:test__getL1FeeUpperLimit_SuccessWhenBaseGoerli() (gas: 16076608)
+ChainSpecificUtil__getL1FeeUpperLimit_Base:test__getL1FeeUpperLimit_SuccessWhenBaseMainnet() (gas: 16076564)
+ChainSpecificUtil__getL1FeeUpperLimit_Base:test__getL1FeeUpperLimit_SuccessWhenBaseSepolia() (gas: 16076635)
+ChainSpecificUtil__getL1FeeUpperLimit_Optimism:test__getL1FeeUpperLimit_SuccessWhenOptimismGoerli() (gas: 16076521)
+ChainSpecificUtil__getL1FeeUpperLimit_Optimism:test__getL1FeeUpperLimit_SuccessWhenOptimismMainnet() (gas: 16076543)
+ChainSpecificUtil__getL1FeeUpperLimit_Optimism:test__getL1FeeUpperLimit_SuccessWhenOptimismSepolia() (gas: 16076586)
FunctionsBilling_Constructor:test_Constructor_Success() (gas: 17982)
-FunctionsBilling_DeleteCommitment:test_DeleteCommitment_RevertIfNotRouter() (gas: 13260)
-FunctionsBilling_DeleteCommitment:test_DeleteCommitment_Success() (gas: 15875)
+FunctionsBilling_DeleteCommitment:test_DeleteCommitment_RevertIfNotRouter() (gas: 13283)
+FunctionsBilling_DeleteCommitment:test_DeleteCommitment_Success() (gas: 15853)
FunctionsBilling_EstimateCost:test_EstimateCost_RevertsIfGasPriceAboveCeiling() (gas: 32450)
-FunctionsBilling_EstimateCost:test_EstimateCost_Success() (gas: 90999)
+FunctionsBilling_EstimateCost:test_EstimateCost_Success() (gas: 90977)
FunctionsBilling_EstimateCost:test_EstimateCost_SuccessLowGasPrice() (gas: 91102)
FunctionsBilling_GetAdminFeeJuels:test_GetAdminFeeJuels_Success() (gas: 18671)
-FunctionsBilling_GetConfig:test_GetConfig_Success() (gas: 30727)
-FunctionsBilling_GetDONFeeJuels:test_GetDONFeeJuels_Success() (gas: 41128)
+FunctionsBilling_GetConfig:test_GetConfig_Success() (gas: 30750)
+FunctionsBilling_GetDONFeeJuels:test_GetDONFeeJuels_Success() (gas: 41151)
FunctionsBilling_GetOperationFee:test_GetOperationFeeJuels_Success() (gas: 40548)
FunctionsBilling_GetWeiPerUnitLink:test_GetWeiPerUnitLink_Success() (gas: 29751)
FunctionsBilling_OracleWithdraw:test_OracleWithdraw_RevertIfInsufficientBalance() (gas: 70136)
@@ -23,41 +23,41 @@ FunctionsBilling_OracleWithdraw:test_OracleWithdraw_RevertWithNoBalance() (gas:
FunctionsBilling_OracleWithdraw:test_OracleWithdraw_SuccessCoordinatorOwner() (gas: 129908)
FunctionsBilling_OracleWithdraw:test_OracleWithdraw_SuccessTransmitterWithBalanceNoAmountGiven() (gas: 171930)
FunctionsBilling_OracleWithdraw:test_OracleWithdraw_SuccessTransmitterWithBalanceValidAmountGiven() (gas: 145165)
-FunctionsBilling_OracleWithdrawAll:test_OracleWithdrawAll_RevertIfNotOwner() (gas: 13297)
+FunctionsBilling_OracleWithdrawAll:test_OracleWithdrawAll_RevertIfNotOwner() (gas: 13320)
FunctionsBilling_OracleWithdrawAll:test_OracleWithdrawAll_SuccessPaysTransmittersWithBalance() (gas: 222357)
-FunctionsBilling_UpdateConfig:test_UpdateConfig_RevertIfNotOwner() (gas: 21654)
-FunctionsBilling_UpdateConfig:test_UpdateConfig_Success() (gas: 54121)
+FunctionsBilling_UpdateConfig:test_UpdateConfig_RevertIfNotOwner() (gas: 21632)
+FunctionsBilling_UpdateConfig:test_UpdateConfig_Success() (gas: 54099)
FunctionsBilling__DisperseFeePool:test__DisperseFeePool_RevertIfNotSet() (gas: 8810)
-FunctionsBilling__FulfillAndBill:test__FulfillAndBill_RevertIfInvalidCommitment() (gas: 13375)
-FunctionsBilling__FulfillAndBill:test__FulfillAndBill_Success() (gas: 185953)
+FunctionsBilling__FulfillAndBill:test__FulfillAndBill_RevertIfInvalidCommitment() (gas: 13353)
+FunctionsBilling__FulfillAndBill:test__FulfillAndBill_Success() (gas: 185976)
FunctionsBilling__StartBilling:test__FulfillAndBill_HasUniqueGlobalRequestId() (gas: 524582)
FunctionsClient_Constructor:test_Constructor_Success() (gas: 10407)
-FunctionsClient_HandleOracleFulfillment:test_HandleOracleFulfillment_RevertIfNotRouter() (gas: 14617)
-FunctionsClient_HandleOracleFulfillment:test_HandleOracleFulfillment_Success() (gas: 22917)
+FunctionsClient_HandleOracleFulfillment:test_HandleOracleFulfillment_RevertIfNotRouter() (gas: 14595)
+FunctionsClient_HandleOracleFulfillment:test_HandleOracleFulfillment_Success() (gas: 22983)
FunctionsClient__SendRequest:test__SendRequest_RevertIfInvalidCallbackGasLimit() (gas: 55069)
FunctionsCoordinator_Constructor:test_Constructor_Success() (gas: 15085)
-FunctionsCoordinator_GetDONPublicKey:test_GetDONPublicKey_RevertIfEmpty() (gas: 15378)
+FunctionsCoordinator_GetDONPublicKey:test_GetDONPublicKey_RevertIfEmpty() (gas: 15356)
FunctionsCoordinator_GetDONPublicKey:test_GetDONPublicKey_Success() (gas: 91691)
-FunctionsCoordinator_GetThresholdPublicKey:test_GetThresholdPublicKey_RevertIfEmpty() (gas: 15356)
-FunctionsCoordinator_GetThresholdPublicKey:test_GetThresholdPublicKey_Success() (gas: 515973)
-FunctionsCoordinator_SetDONPublicKey:test_SetDONPublicKey_RevertNotOwner() (gas: 20365)
+FunctionsCoordinator_GetThresholdPublicKey:test_GetThresholdPublicKey_RevertIfEmpty() (gas: 15334)
+FunctionsCoordinator_GetThresholdPublicKey:test_GetThresholdPublicKey_Success() (gas: 515951)
+FunctionsCoordinator_SetDONPublicKey:test_SetDONPublicKey_RevertNotOwner() (gas: 20409)
FunctionsCoordinator_SetDONPublicKey:test_SetDONPublicKey_Success() (gas: 88970)
-FunctionsCoordinator_SetThresholdPublicKey:test_SetThresholdPublicKey_RevertNotOwner() (gas: 13892)
+FunctionsCoordinator_SetThresholdPublicKey:test_SetThresholdPublicKey_RevertNotOwner() (gas: 13915)
FunctionsCoordinator_SetThresholdPublicKey:test_SetThresholdPublicKey_Success() (gas: 513165)
-FunctionsCoordinator_StartRequest:test_StartRequest_RevertIfNotRouter() (gas: 22736)
-FunctionsCoordinator_StartRequest:test_StartRequest_Success() (gas: 152672)
+FunctionsCoordinator_StartRequest:test_StartRequest_RevertIfNotRouter() (gas: 22802)
+FunctionsCoordinator_StartRequest:test_StartRequest_Success() (gas: 152650)
FunctionsCoordinator__IsTransmitter:test__IsTransmitter_SuccessFound() (gas: 15106)
-FunctionsCoordinator__IsTransmitter:test__IsTransmitter_SuccessNotFound() (gas: 22938)
+FunctionsCoordinator__IsTransmitter:test__IsTransmitter_SuccessNotFound() (gas: 22916)
FunctionsRequest_DEFAULT_BUFFER_SIZE:test_DEFAULT_BUFFER_SIZE() (gas: 3089)
FunctionsRequest_EncodeCBOR:test_EncodeCBOR_Success() (gas: 3066)
FunctionsRequest_REQUEST_DATA_VERSION:test_REQUEST_DATA_VERSION() (gas: 3068)
FunctionsRouter_Constructor:test_Constructor_Success() (gas: 15107)
-FunctionsRouter_Fulfill:test_Fulfill_RequestNotProcessedCostExceedsCommitment() (gas: 172497)
+FunctionsRouter_Fulfill:test_Fulfill_RequestNotProcessedCostExceedsCommitment() (gas: 172475)
FunctionsRouter_Fulfill:test_Fulfill_RequestNotProcessedInsufficientGas() (gas: 163010)
FunctionsRouter_Fulfill:test_Fulfill_RequestNotProcessedInvalidCommitment() (gas: 38777)
FunctionsRouter_Fulfill:test_Fulfill_RequestNotProcessedInvalidRequestId() (gas: 35900)
FunctionsRouter_Fulfill:test_Fulfill_RequestNotProcessedSubscriptionBalanceInvariant() (gas: 180976)
-FunctionsRouter_Fulfill:test_Fulfill_RevertIfNotCommittedCoordinator() (gas: 28086)
+FunctionsRouter_Fulfill:test_Fulfill_RevertIfNotCommittedCoordinator() (gas: 28152)
FunctionsRouter_Fulfill:test_Fulfill_RevertIfPaused() (gas: 156535)
FunctionsRouter_Fulfill:test_Fulfill_SuccessClientNoLongerExists() (gas: 335070)
FunctionsRouter_Fulfill:test_Fulfill_SuccessFulfilled() (gas: 348695)
@@ -65,19 +65,19 @@ FunctionsRouter_Fulfill:test_Fulfill_SuccessUserCallbackReverts() (gas: 2627478)
FunctionsRouter_Fulfill:test_Fulfill_SuccessUserCallbackRunsOutOfGas() (gas: 658423)
FunctionsRouter_GetAdminFee:test_GetAdminFee_Success() (gas: 18323)
FunctionsRouter_GetAllowListId:test_GetAllowListId_Success() (gas: 13241)
-FunctionsRouter_GetConfig:test_GetConfig_Success() (gas: 40170)
-FunctionsRouter_GetContractById:test_GetContractById_RevertIfRouteDoesNotExist() (gas: 13839)
+FunctionsRouter_GetConfig:test_GetConfig_Success() (gas: 40193)
+FunctionsRouter_GetContractById:test_GetContractById_RevertIfRouteDoesNotExist() (gas: 13862)
FunctionsRouter_GetContractById:test_GetContractById_SuccessIfRouteExists() (gas: 17704)
-FunctionsRouter_GetProposedContractById:test_GetProposedContractById_RevertIfRouteDoesNotExist() (gas: 16373)
-FunctionsRouter_GetProposedContractById:test_GetProposedContractById_SuccessIfRouteExists() (gas: 24266)
+FunctionsRouter_GetProposedContractById:test_GetProposedContractById_RevertIfRouteDoesNotExist() (gas: 16417)
+FunctionsRouter_GetProposedContractById:test_GetProposedContractById_SuccessIfRouteExists() (gas: 24289)
FunctionsRouter_GetProposedContractSet:test_GetProposedContractSet_Success() (gas: 27289)
FunctionsRouter_IsValidCallbackGasLimit:test_IsValidCallbackGasLimit_RevertGasLimitTooBig() (gas: 28087)
FunctionsRouter_IsValidCallbackGasLimit:test_IsValidCallbackGasLimit_RevertInvalidConfig() (gas: 41095)
FunctionsRouter_IsValidCallbackGasLimit:test_IsValidCallbackGasLimit_Success() (gas: 24632)
-FunctionsRouter_Pause:test_Pause_RevertIfNotOwner() (gas: 13338)
-FunctionsRouter_Pause:test_Pause_Success() (gas: 20669)
-FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_RevertIfEmptyAddress() (gas: 14791)
-FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_RevertIfExceedsMaxProposal() (gas: 21693)
+FunctionsRouter_Pause:test_Pause_RevertIfNotOwner() (gas: 13361)
+FunctionsRouter_Pause:test_Pause_Success() (gas: 20647)
+FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_RevertIfEmptyAddress() (gas: 14769)
+FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_RevertIfExceedsMaxProposal() (gas: 21716)
FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_RevertIfLengthMismatch() (gas: 14670)
FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_RevertIfNotNewContract() (gas: 19048)
FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_RevertIfNotOwner() (gas: 23392)
@@ -85,149 +85,151 @@ FunctionsRouter_ProposeContractsUpdate:test_ProposeContractsUpdate_Success() (ga
FunctionsRouter_SendRequest:test_SendRequest_RevertIfConsumerNotAllowed() (gas: 59400)
FunctionsRouter_SendRequest:test_SendRequest_RevertIfDuplicateRequestId() (gas: 217996)
FunctionsRouter_SendRequest:test_SendRequest_RevertIfEmptyData() (gas: 29426)
-FunctionsRouter_SendRequest:test_SendRequest_RevertIfIncorrectDonId() (gas: 57904)
+FunctionsRouter_SendRequest:test_SendRequest_RevertIfIncorrectDonId() (gas: 57882)
FunctionsRouter_SendRequest:test_SendRequest_RevertIfInsufficientSubscriptionBalance() (gas: 208451)
FunctionsRouter_SendRequest:test_SendRequest_RevertIfInvalidCallbackGasLimit() (gas: 50953)
FunctionsRouter_SendRequest:test_SendRequest_RevertIfInvalidDonId() (gas: 25082)
-FunctionsRouter_SendRequest:test_SendRequest_RevertIfNoSubscription() (gas: 29132)
+FunctionsRouter_SendRequest:test_SendRequest_RevertIfNoSubscription() (gas: 29177)
FunctionsRouter_SendRequest:test_SendRequest_RevertIfPaused() (gas: 34291)
-FunctionsRouter_SendRequest:test_SendRequest_Success() (gas: 226346)
-FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfConsumerNotAllowed() (gas: 65896)
+FunctionsRouter_SendRequest:test_SendRequest_Success() (gas: 226324)
+FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfConsumerNotAllowed() (gas: 65918)
FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfEmptyData() (gas: 36012)
FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfIncorrectDonId() (gas: 29896)
FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfInvalidCallbackGasLimit() (gas: 57539)
FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfInvalidDonId() (gas: 27503)
-FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfNoSubscription() (gas: 35717)
+FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfNoSubscription() (gas: 35672)
FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_RevertIfPaused() (gas: 40810)
FunctionsRouter_SendRequestToProposed:test_SendRequestToProposed_Success() (gas: 232783)
FunctionsRouter_SendRequestToProposed:test_SendRequest_RevertIfInsufficientSubscriptionBalance() (gas: 214899)
FunctionsRouter_SetAllowListId:test_SetAllowListId_Success() (gas: 33531)
-FunctionsRouter_SetAllowListId:test_UpdateConfig_RevertIfNotOwner() (gas: 13403)
-FunctionsRouter_Unpause:test_Unpause_RevertIfNotOwner() (gas: 13293)
-FunctionsRouter_Unpause:test_Unpause_Success() (gas: 77725)
-FunctionsRouter_UpdateConfig:test_UpdateConfig_RevertIfNotOwner() (gas: 24437)
-FunctionsRouter_UpdateConfig:test_UpdateConfig_Success() (gas: 63353)
-FunctionsRouter_UpdateContracts:test_UpdateContracts_RevertIfNotOwner() (gas: 13336)
+FunctionsRouter_SetAllowListId:test_UpdateConfig_RevertIfNotOwner() (gas: 13381)
+FunctionsRouter_Unpause:test_Unpause_RevertIfNotOwner() (gas: 13337)
+FunctionsRouter_Unpause:test_Unpause_Success() (gas: 77748)
+FunctionsRouter_UpdateConfig:test_UpdateConfig_RevertIfNotOwner() (gas: 24415)
+FunctionsRouter_UpdateConfig:test_UpdateConfig_Success() (gas: 63331)
+FunctionsRouter_UpdateContracts:test_UpdateContracts_RevertIfNotOwner() (gas: 13314)
FunctionsRouter_UpdateContracts:test_UpdateContracts_Success() (gas: 39269)
FunctionsSubscriptions_AcceptSubscriptionOwnerTransfer:test_AcceptSubscriptionOwnerTransfer_RevertIfNotAllowedSender() (gas: 60413)
FunctionsSubscriptions_AcceptSubscriptionOwnerTransfer:test_AcceptSubscriptionOwnerTransfer_RevertIfPaused() (gas: 61040)
FunctionsSubscriptions_AcceptSubscriptionOwnerTransfer:test_AcceptSubscriptionOwnerTransfer_RevertIfSenderBecomesBlocked() (gas: 139706)
FunctionsSubscriptions_AcceptSubscriptionOwnerTransfer:test_AcceptSubscriptionOwnerTransfer_RevertIfSenderIsNotNewOwner() (gas: 62780)
-FunctionsSubscriptions_AcceptSubscriptionOwnerTransfer:test_AcceptSubscriptionOwnerTransfer_Success() (gas: 239911)
+FunctionsSubscriptions_AcceptSubscriptionOwnerTransfer:test_AcceptSubscriptionOwnerTransfer_Success() (gas: 239919)
FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfMaximumConsumers() (gas: 138033)
FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfMaximumConsumersAfterConfigUpdate() (gas: 164977)
-FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfNoSubscription() (gas: 12955)
-FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfNotAllowedSender() (gas: 102450)
-FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfNotSubscriptionOwner() (gas: 87205)
+FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfNoSubscription() (gas: 12933)
+FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfNotAllowedSender() (gas: 102428)
+FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfNotSubscriptionOwner() (gas: 87272)
FunctionsSubscriptions_AddConsumer:test_AddConsumer_RevertIfPaused() (gas: 18100)
FunctionsSubscriptions_AddConsumer:test_AddConsumer_Success() (gas: 96221)
FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfNoSubscription() (gas: 15053)
-FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfNotAllowedSender() (gas: 102529)
-FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfNotSubscriptionOwner() (gas: 89318)
+FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfNotAllowedSender() (gas: 102507)
+FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfNotSubscriptionOwner() (gas: 89341)
FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfPaused() (gas: 20157)
-FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfPendingRequests() (gas: 218330)
+FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_RevertIfPendingRequests() (gas: 218308)
FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_SuccessForfeitAllBalanceAsDeposit() (gas: 115656)
FunctionsSubscriptions_CancelSubscription:test_CancelSubscription_SuccessForfeitSomeBalanceAsDeposit() (gas: 126964)
FunctionsSubscriptions_CancelSubscription_ReceiveDeposit:test_CancelSubscription_SuccessRecieveDeposit() (gas: 75369)
FunctionsSubscriptions_Constructor:test_Constructor_Success() (gas: 10488)
FunctionsSubscriptions_CreateSubscriptionWithConsumer:test_CreateSubscriptionWithConsumer_RevertIfNotAllowedSender() (gas: 28688)
-FunctionsSubscriptions_CreateSubscriptionWithConsumer:test_CreateSubscriptionWithConsumer_RevertIfPaused() (gas: 17994)
+FunctionsSubscriptions_CreateSubscriptionWithConsumer:test_CreateSubscriptionWithConsumer_RevertIfPaused() (gas: 18038)
FunctionsSubscriptions_CreateSubscriptionWithConsumer:test_CreateSubscriptionWithConsumer_Success() (gas: 353899)
-FunctionsSubscriptions_GetConsumer:test_GetConsumer_Success() (gas: 17256)
-FunctionsSubscriptions_GetFlags:test_GetFlags_SuccessInvalidSubscription() (gas: 13438)
-FunctionsSubscriptions_GetFlags:test_GetFlags_SuccessValidSubscription() (gas: 41243)
+FunctionsSubscriptions_GetConsumer:test_GetConsumer_Success() (gas: 17279)
+FunctionsSubscriptions_GetFlags:test_GetFlags_SuccessInvalidSubscription() (gas: 13504)
+FunctionsSubscriptions_GetFlags:test_GetFlags_SuccessValidSubscription() (gas: 41221)
FunctionsSubscriptions_GetSubscription:test_GetSubscription_Success() (gas: 32968)
FunctionsSubscriptions_GetSubscriptionCount:test_GetSubscriptionCount_Success() (gas: 13305)
-FunctionsSubscriptions_GetSubscriptionsInRange:test_GetSubscriptionsInRange_RevertIfEndIsAfterLastSubscription() (gas: 16547)
+FunctionsSubscriptions_GetSubscriptionsInRange:test_GetSubscriptionsInRange_RevertIfEndIsAfterLastSubscription() (gas: 16570)
FunctionsSubscriptions_GetSubscriptionsInRange:test_GetSubscriptionsInRange_RevertIfStartIsAfterEnd() (gas: 13465)
-FunctionsSubscriptions_GetSubscriptionsInRange:test_GetSubscriptionsInRange_Success() (gas: 65990)
-FunctionsSubscriptions_GetTotalBalance:test_GetTotalBalance_Success() (gas: 15347)
+FunctionsSubscriptions_GetSubscriptionsInRange:test_GetSubscriptionsInRange_Success() (gas: 65968)
+FunctionsSubscriptions_GetTotalBalance:test_GetTotalBalance_Success() (gas: 15370)
FunctionsSubscriptions_OnTokenTransfer:test_OnTokenTransfer_RevertIfCallerIsNoCalldata() (gas: 39908)
FunctionsSubscriptions_OnTokenTransfer:test_OnTokenTransfer_RevertIfCallerIsNoSubscription() (gas: 42382)
FunctionsSubscriptions_OnTokenTransfer:test_OnTokenTransfer_RevertIfCallerIsNotLink() (gas: 13419)
FunctionsSubscriptions_OnTokenTransfer:test_OnTokenTransfer_RevertIfPaused() (gas: 47325)
FunctionsSubscriptions_OnTokenTransfer:test_OnTokenTransfer_Success() (gas: 84314)
-FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_RevertIfAmountMoreThanBalance() (gas: 20766)
+FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_RevertIfAmountMoreThanBalance() (gas: 20744)
FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_RevertIfBalanceInvariant() (gas: 189)
-FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_RevertIfNoAmount() (gas: 15641)
+FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_RevertIfNoAmount() (gas: 15686)
FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_RevertIfPaused() (gas: 20859)
-FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_SuccessPaysRecipient() (gas: 60075)
+FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_SuccessPaysRecipient() (gas: 60119)
FunctionsSubscriptions_OracleWithdraw:test_OracleWithdraw_SuccessSetsBalanceToZero() (gas: 57716)
-FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_RevertIfNoSubscription() (gas: 12818)
-FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_RevertIfNotOwner() (gas: 15549)
-FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_Success() (gas: 55141)
+FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_RevertIfNoSubscription() (gas: 12796)
+FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_RevertIfNotOwner() (gas: 15594)
+FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_Success() (gas: 55177)
FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_SuccessDeletesSubscription() (gas: 49607)
FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_SuccessSubOwnerRefunded() (gas: 53166)
-FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_SuccessWhenRequestInFlight() (gas: 186533)
-FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_RevertIfAmountMoreThanBalance() (gas: 17945)
+FunctionsSubscriptions_OwnerCancelSubscription:test_OwnerCancelSubscription_SuccessWhenRequestInFlight() (gas: 186511)
+FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_RevertIfAmountMoreThanBalance() (gas: 17923)
FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_RevertIfBalanceInvariant() (gas: 210)
-FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_RevertIfNotOwner() (gas: 15555)
+FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_RevertIfNotOwner() (gas: 15600)
FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_SuccessIfNoAmount() (gas: 33839)
-FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_SuccessIfRecipientAddressZero() (gas: 31649)
+FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_SuccessIfRecipientAddressZero() (gas: 31627)
FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_SuccessPaysRecipient() (gas: 33935)
FunctionsSubscriptions_OwnerWithdraw:test_OwnerWithdraw_SuccessSetsBalanceToZero() (gas: 31584)
-FunctionsSubscriptions_PendingRequestExists:test_PendingRequestExists_SuccessFalseIfNoPendingRequests() (gas: 17818)
-FunctionsSubscriptions_PendingRequestExists:test_PendingRequestExists_SuccessTrueIfPendingRequests() (gas: 203333)
-FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfEmptyNewOwner() (gas: 27664)
-FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfInvalidNewOwner() (gas: 57815)
+FunctionsSubscriptions_PendingRequestExists:test_PendingRequestExists_SuccessFalseIfNoPendingRequests() (gas: 17796)
+FunctionsSubscriptions_PendingRequestExists:test_PendingRequestExists_SuccessTrueIfPendingRequests() (gas: 203311)
+FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfEmptyNewOwner() (gas: 27642)
+FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfInvalidNewOwner() (gas: 57793)
FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfNoSubscription() (gas: 15013)
-FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfNotAllowedSender() (gas: 119775)
-FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfNotSubscriptionOwner() (gas: 17969)
-FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfPaused() (gas: 20137)
-FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_Success() (gas: 68596)
-FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_SuccessChangeProposedOwner() (gas: 83539)
-FunctionsSubscriptions_RecoverFunds:test_OwnerCancelSubscription_RevertIfNotOwner() (gas: 15554)
-FunctionsSubscriptions_RecoverFunds:test_RecoverFunds_Success() (gas: 41376)
+FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfNotAllowedSender() (gas: 119820)
+FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfNotSubscriptionOwner() (gas: 17947)
+FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_RevertIfPaused() (gas: 20181)
+FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_Success() (gas: 68574)
+FunctionsSubscriptions_ProposeSubscriptionOwnerTransfer:test_ProposeSubscriptionOwnerTransfer_SuccessChangeProposedOwner() (gas: 83582)
+FunctionsSubscriptions_RecoverFunds:test_OwnerCancelSubscription_RevertIfNotOwner() (gas: 15577)
+FunctionsSubscriptions_RecoverFunds:test_RecoverFunds_Success() (gas: 41358)
FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfInvalidConsumer() (gas: 30310)
FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfNoSubscription() (gas: 15031)
FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfNotAllowedSender() (gas: 102444)
-FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfNotSubscriptionOwner() (gas: 87254)
-FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfPaused() (gas: 18058)
+FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfNotSubscriptionOwner() (gas: 87277)
+FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfPaused() (gas: 18103)
FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_RevertIfPendingRequests() (gas: 215863)
-FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_Success() (gas: 42088)
+FunctionsSubscriptions_RemoveConsumer:test_RemoveConsumer_Success() (gas: 42066)
FunctionsSubscriptions_SetFlags:test_SetFlags_RevertIfNoSubscription() (gas: 12888)
FunctionsSubscriptions_SetFlags:test_SetFlags_RevertIfNotOwner() (gas: 15684)
FunctionsSubscriptions_SetFlags:test_SetFlags_Success() (gas: 38434)
FunctionsSubscriptions_TimeoutRequests:test_TimeoutRequests_RevertIfPaused() (gas: 25955)
FunctionsSubscriptions_TimeoutRequests:test_TimeoutRequests_RevertIfTimeoutNotExceeded() (gas: 25261)
-FunctionsSubscriptions_TimeoutRequests:test_TimeoutRequests_RevertInvalidRequest() (gas: 28242)
-FunctionsSubscriptions_TimeoutRequests:test_TimeoutRequests_Success() (gas: 58416)
-FunctionsSubscriptions_createSubscription:test_CreateSubscription_RevertIfNotAllowedSender() (gas: 26418)
+FunctionsSubscriptions_TimeoutRequests:test_TimeoutRequests_RevertInvalidRequest() (gas: 28220)
+FunctionsSubscriptions_TimeoutRequests:test_TimeoutRequests_Success() (gas: 58394)
+FunctionsSubscriptions_createSubscription:test_CreateSubscription_RevertIfNotAllowedSender() (gas: 26462)
FunctionsSubscriptions_createSubscription:test_CreateSubscription_RevertIfPaused() (gas: 15759)
FunctionsSubscriptions_createSubscription:test_CreateSubscription_Success() (gas: 153701)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:testAcceptTermsOfService_InvalidSigner_vuln() (gas: 94913)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfAcceptorIsNotSender() (gas: 25859)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfBlockedSender() (gas: 88990)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfInvalidSigner() (gas: 23619)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfRecipientContractIsNotSender() (gas: 1866552)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfRecipientIsNotSender() (gas: 28525)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_SuccessIfAcceptingForContract() (gas: 1946965)
-FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_SuccessIfAcceptingForSelf() (gas: 104509)
-FunctionsTermsOfServiceAllowList_BlockSender:test_BlockSender_RevertIfNotOwner() (gas: 15491)
-FunctionsTermsOfServiceAllowList_BlockSender:test_BlockSender_Success() (gas: 97541)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:testAcceptTermsOfService_InvalidSigner_vuln() (gas: 94943)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfAcceptorIsNotSender() (gas: 25925)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfBlockedSender() (gas: 89013)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfInvalidSigner() (gas: 23620)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfRecipientContractIsNotSender() (gas: 1866619)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_RevertIfRecipientIsNotSender() (gas: 28526)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_SuccessIfAcceptingForContract() (gas: 1946966)
+FunctionsTermsOfServiceAllowList_AcceptTermsOfService:test_AcceptTermsOfService_SuccessIfAcceptingForSelf() (gas: 104555)
+FunctionsTermsOfServiceAllowList_BlockSender:test_BlockSender_RevertIfNotOwner() (gas: 15535)
+FunctionsTermsOfServiceAllowList_BlockSender:test_BlockSender_Success() (gas: 97587)
FunctionsTermsOfServiceAllowList_Constructor:test_Constructor_Success() (gas: 15345)
FunctionsTermsOfServiceAllowList_GetAllAllowedSenders:test_GetAllAllowedSenders_Success() (gas: 19243)
FunctionsTermsOfServiceAllowList_GetAllowedSendersCount:test_GetAllowedSendersCount_Success() (gas: 13332)
-FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_RevertIfAllowedSendersIsEmpty() (gas: 13153024)
-FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_RevertIfEndIsAfterLastAllowedSender() (gas: 16554)
-FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_RevertIfStartIsAfterEnd() (gas: 13284)
-FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_Success() (gas: 20312)
+FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_RevertIfAllowedSendersIsEmpty() (gas: 13326576)
+FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_RevertIfEndIsAfterLastAllowedSender() (gas: 16532)
+FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_RevertIfStartIsAfterEnd() (gas: 13307)
+FunctionsTermsOfServiceAllowList_GetAllowedSendersInRange:test_GetAllowedSendersInRange_Success() (gas: 20335)
FunctionsTermsOfServiceAllowList_GetBlockedSendersCount:test_GetBlockedSendersCount_Success() (gas: 13268)
-FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange:test_GetBlockedSendersInRange_RevertIfAllowedSendersIsEmpty() (gas: 13153034)
+FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange:test_GetBlockedSendersInRange_RevertIfAllowedSendersIsEmpty() (gas: 13326564)
FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange:test_GetBlockedSendersInRange_RevertIfEndIsAfterLastAllowedSender() (gas: 16549)
-FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange:test_GetBlockedSendersInRange_RevertIfStartIsAfterEnd() (gas: 13367)
-FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange:test_GetBlockedSendersInRange_Success() (gas: 18537)
-FunctionsTermsOfServiceAllowList_GetConfig:test_GetConfig_Success() (gas: 16388)
+FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange:test_GetBlockedSendersInRange_RevertIfStartIsAfterEnd() (gas: 13345)
+FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange:test_GetBlockedSendersInRange_Success() (gas: 18580)
+FunctionsTermsOfServiceAllowList_GetConfig:test_GetConfig_Success() (gas: 16411)
FunctionsTermsOfServiceAllowList_GetMessage:test_GetMessage_Success() (gas: 11918)
-FunctionsTermsOfServiceAllowList_HasAccess:test_HasAccess_FalseWhenEnabled() (gas: 16257)
-FunctionsTermsOfServiceAllowList_HasAccess:test_HasAccess_TrueWhenDisabled() (gas: 23848)
+FunctionsTermsOfServiceAllowList_HasAccess:test_HasAccess_FalseWhenEnabled() (gas: 16235)
+FunctionsTermsOfServiceAllowList_HasAccess:test_HasAccess_TrueWhenDisabled() (gas: 23877)
FunctionsTermsOfServiceAllowList_IsBlockedSender:test_IsBlockedSender_SuccessFalse() (gas: 15776)
FunctionsTermsOfServiceAllowList_IsBlockedSender:test_IsBlockedSender_SuccessTrue() (gas: 86974)
-FunctionsTermsOfServiceAllowList_UnblockSender:test_UnblockSender_RevertIfNotOwner() (gas: 13502)
-FunctionsTermsOfServiceAllowList_UnblockSender:test_UnblockSender_Success() (gas: 96216)
-FunctionsTermsOfServiceAllowList_UpdateConfig:test_UpdateConfig_RevertIfNotOwner() (gas: 13812)
-FunctionsTermsOfServiceAllowList_UpdateConfig:test_UpdateConfig_Success() (gas: 22817)
-Gas_AcceptTermsOfService:test_AcceptTermsOfService_Gas() (gas: 84702)
+FunctionsTermsOfServiceAllowList_MigratePreviouslyAllowedSenders:test_MigratePreviouslyAllowedSenders_RevertIfNotOwner() (gas: 13987)
+FunctionsTermsOfServiceAllowList_MigratePreviouslyAllowedSenders:test_MigratePreviouslyAllowedSenders_Success() (gas: 210636)
+FunctionsTermsOfServiceAllowList_UnblockSender:test_UnblockSender_RevertIfNotOwner() (gas: 13548)
+FunctionsTermsOfServiceAllowList_UnblockSender:test_UnblockSender_Success() (gas: 96240)
+FunctionsTermsOfServiceAllowList_UpdateConfig:test_UpdateConfig_RevertIfNotOwner() (gas: 13819)
+FunctionsTermsOfServiceAllowList_UpdateConfig:test_UpdateConfig_Success() (gas: 22824)
+Gas_AcceptTermsOfService:test_AcceptTermsOfService_Gas() (gas: 84725)
Gas_AddConsumer:test_AddConsumer_Gas() (gas: 79140)
Gas_CreateSubscription:test_CreateSubscription_Gas() (gas: 73419)
Gas_FulfillRequest_DuplicateRequestID:test_FulfillRequest_DuplicateRequestID_MaximumGas() (gas: 20562)
diff --git a/contracts/scripts/native_solc_compile_all_keystone b/contracts/scripts/native_solc_compile_all_keystone
index 0516b2aedb..a42b06b8f6 100755
--- a/contracts/scripts/native_solc_compile_all_keystone
+++ b/contracts/scripts/native_solc_compile_all_keystone
@@ -32,3 +32,4 @@ compileContract () {
compileContract keystone/CapabilitiesRegistry.sol
compileContract keystone/KeystoneForwarder.sol
compileContract keystone/OCR3Capability.sol
+compileContract keystone/KeystoneFeedsConsumer.sol
diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol
index 970485e90f..957d146f45 100644
--- a/contracts/src/v0.8/ccip/FeeQuoter.sol
+++ b/contracts/src/v0.8/ccip/FeeQuoter.sol
@@ -467,8 +467,6 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
uint256 numberOfTokens = message.tokenAmounts.length;
_validateMessage(destChainConfig, message.data.length, numberOfTokens, message.receiver);
- uint64 premiumMultiplierWeiPerEth = s_premiumMultiplierWeiPerEth[message.feeToken];
-
// The below call asserts that feeToken is a supported token
(uint224 feeTokenPrice, uint224 packedGasPrice) = getTokenAndGasPrices(message.feeToken, destChainSelector);
@@ -511,7 +509,6 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
// NOTE: when supporting non-EVM chains, revisit how generic this fee logic can be
// NOTE: revisit parsing non-EVM args
-
uint256 executionCost = uint112(packedGasPrice)
* (
destChainConfig.destGasOverhead + (message.data.length * destChainConfig.destGasPerPayloadByte) + tokenTransferGas
@@ -521,7 +518,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
// Calculate number of fee tokens to charge.
// Total USD fee is in 36 decimals, feeTokenPrice is in 18 decimals USD for 1e18 smallest token denominations.
// Result of the division is the number of smallest token denominations.
- return ((premiumFee * premiumMultiplierWeiPerEth) + executionCost + dataAvailabilityCost) / feeTokenPrice;
+ return ((premiumFee * s_premiumMultiplierWeiPerEth[message.feeToken]) + executionCost + dataAvailabilityCost)
+ / feeTokenPrice;
}
/// @notice Sets the fee configuration for a token.
diff --git a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
index ae1e4cc597..5f863ed7ae 100644
--- a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
+++ b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
@@ -6,7 +6,6 @@ import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {ICapabilitiesRegistry} from "./interfaces/ICapabilitiesRegistry.sol";
import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
-
import {SortedSetValidationUtil} from "../../shared/util/SortedSetValidationUtil.sol";
import {Internal} from "../libraries/Internal.sol";
import {CCIPConfigTypes} from "./libraries/CCIPConfigTypes.sol";
@@ -26,7 +25,6 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
/// @param chainSelector The chain selector.
/// @param chainConfig The chain configuration.
event ChainConfigSet(uint64 chainSelector, CCIPConfigTypes.ChainConfig chainConfig);
-
/// @notice Emitted when a chain's configuration is removed.
/// @param chainSelector The chain selector.
event ChainConfigRemoved(uint64 chainSelector);
@@ -37,7 +35,6 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
error ChainSelectorNotSet();
error TooManyOCR3Configs();
error TooManySigners();
- error TooManyTransmitters();
error TooManyBootstrapP2PIds();
error P2PIdsLengthNotMatching(uint256 p2pIdsLength, uint256 signersLength, uint256 transmittersLength);
error NotEnoughTransmitters(uint256 got, uint256 minimum);
@@ -62,6 +59,15 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
/// @notice The canonical capabilities registry address.
address internal immutable i_capabilitiesRegistry;
+ uint8 internal constant MAX_OCR3_CONFIGS_PER_PLUGIN = 2;
+ uint8 internal constant MAX_OCR3_CONFIGS_PER_DON = 4;
+ uint256 internal constant CONFIG_DIGEST_PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..0
+ /// @dev must be equal to libocr multi role: https://github.com/smartcontractkit/libocr/blob/ae747ca5b81236ffdbf1714318c652e923a5ff4d/offchainreporting2plus/types/config_digest.go#L28
+ uint256 internal constant CONFIG_DIGEST_PREFIX = 0x000a << (256 - 16); // 0x000a00..00
+ bytes32 internal constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0)));
+ /// @dev 256 is the hard limit due to the bit encoding of their indexes into a uint256.
+ uint256 internal constant MAX_NUM_ORACLES = 256;
+
/// @notice chain configuration for each chain that CCIP is deployed on.
mapping(uint64 chainSelector => CCIPConfigTypes.ChainConfig chainConfig) internal s_chainConfigurations;
@@ -75,13 +81,6 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
uint32 donId => mapping(Internal.OCRPluginType pluginType => CCIPConfigTypes.OCR3ConfigWithMeta[] ocr3Configs)
) internal s_ocr3Configs;
- uint8 internal constant MAX_OCR3_CONFIGS_PER_PLUGIN = 2;
- uint8 internal constant MAX_OCR3_CONFIGS_PER_DON = 4;
- uint8 internal constant MAX_NUM_ORACLES = 31;
- uint256 internal constant CONFIG_DIGEST_PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..0
- /// @dev must be equal to libocr multi role: https://github.com/smartcontractkit/libocr/blob/ae747ca5b81236ffdbf1714318c652e923a5ff4d/offchainreporting2plus/types/config_digest.go#L28
- uint256 internal constant CONFIG_DIGEST_PREFIX = 0x000a << (256 - 16); // 0x000a00..00
-
/// @param capabilitiesRegistry the canonical capabilities registry address.
constructor(address capabilitiesRegistry) {
if (capabilitiesRegistry == address(0)) {
@@ -172,9 +171,8 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
revert OnlyCapabilitiesRegistryCanCall();
}
- CCIPConfigTypes.OCR3Config[] memory ocr3Configs = abi.decode(config, (CCIPConfigTypes.OCR3Config[]));
(CCIPConfigTypes.OCR3Config[] memory commitConfigs, CCIPConfigTypes.OCR3Config[] memory execConfigs) =
- _groupByPluginType(ocr3Configs);
+ _groupByPluginType(abi.decode(config, (CCIPConfigTypes.OCR3Config[])));
if (commitConfigs.length > 0) {
_updatePluginConfig(donId, Internal.OCRPluginType.Commit, commitConfigs);
}
@@ -363,8 +361,8 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
// access in the for loop below.
commitConfigs = new CCIPConfigTypes.OCR3Config[](MAX_OCR3_CONFIGS_PER_PLUGIN);
execConfigs = new CCIPConfigTypes.OCR3Config[](MAX_OCR3_CONFIGS_PER_PLUGIN);
- uint256 commitCount;
- uint256 execCount;
+ uint256 commitCount = 0;
+ uint256 execCount = 0;
for (uint256 i = 0; i < ocr3Configs.length; ++i) {
if (ocr3Configs[i].pluginType == Internal.OCRPluginType.Commit) {
commitConfigs[commitCount] = ocr3Configs[i];
@@ -391,26 +389,24 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
if (cfg.pluginType != Internal.OCRPluginType.Commit && cfg.pluginType != Internal.OCRPluginType.Execution) {
revert InvalidPluginType();
}
- // TODO: can we do more sophisticated validation than this?
- if (cfg.offrampAddress.length == 0) revert OfframpAddressCannotBeZero();
+ if (cfg.offrampAddress.length == 0 || keccak256(cfg.offrampAddress) == EMPTY_ENCODED_ADDRESS_HASH) {
+ revert OfframpAddressCannotBeZero();
+ }
if (!s_remoteChainSelectors.contains(cfg.chainSelector)) revert ChainSelectorNotFound(cfg.chainSelector);
- // Some of these checks below are done in OCR2/3Base config validation, so we do them again here.
- // Role DON OCR configs will have all the Role DON signers but only a subset of transmitters.
- if (cfg.signers.length > MAX_NUM_ORACLES) revert TooManySigners();
- if (cfg.transmitters.length > MAX_NUM_ORACLES) revert TooManyTransmitters();
-
// We check for chain config presence above, so fChain here must be non-zero.
uint256 minTransmittersLength = 3 * s_chainConfigurations[cfg.chainSelector].fChain + 1;
if (cfg.transmitters.length < minTransmittersLength) {
revert NotEnoughTransmitters(cfg.transmitters.length, minTransmittersLength);
}
- if (cfg.F == 0) revert FMustBePositive();
- if (cfg.signers.length <= 3 * cfg.F) revert FTooHigh();
-
- if (cfg.p2pIds.length != cfg.signers.length || cfg.p2pIds.length != cfg.transmitters.length) {
+ uint256 numberOfSigners = cfg.signers.length;
+ if (numberOfSigners > MAX_NUM_ORACLES) revert TooManySigners();
+ if (numberOfSigners != cfg.p2pIds.length || numberOfSigners != cfg.transmitters.length) {
revert P2PIdsLengthNotMatching(cfg.p2pIds.length, cfg.signers.length, cfg.transmitters.length);
}
+ if (cfg.F == 0) revert FMustBePositive();
+ if (numberOfSigners <= 3 * cfg.F) revert FTooHigh();
+
if (cfg.bootstrapP2PIds.length > cfg.p2pIds.length) revert TooManyBootstrapP2PIds();
// check for duplicate p2p ids and bootstrapP2PIds.
@@ -418,9 +414,7 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
SortedSetValidationUtil._checkIsValidUniqueSubset(cfg.bootstrapP2PIds, cfg.p2pIds);
// Check that the readers are in the capabilities registry.
- for (uint256 i = 0; i < cfg.signers.length; ++i) {
- _ensureInRegistry(cfg.p2pIds[i]);
- }
+ _ensureInRegistry(cfg.p2pIds);
}
/// @notice Computes the digest of the provided configuration.
@@ -486,13 +480,10 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
// Process additions next.
for (uint256 i = 0; i < chainConfigAdds.length; ++i) {
CCIPConfigTypes.ChainConfig memory chainConfig = chainConfigAdds[i].chainConfig;
- bytes32[] memory readers = chainConfig.readers;
uint64 chainSelector = chainConfigAdds[i].chainSelector;
// Verify that the provided readers are present in the capabilities registry.
- for (uint256 j = 0; j < readers.length; j++) {
- _ensureInRegistry(readers[j]);
- }
+ _ensureInRegistry(chainConfig.readers);
// Verify that fChain is positive.
if (chainConfig.fChain == 0) {
@@ -507,11 +498,13 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
}
/// @notice Helper function to ensure that a node is in the capabilities registry.
- /// @param p2pId The P2P ID of the node to check.
- function _ensureInRegistry(bytes32 p2pId) internal view {
- ICapabilitiesRegistry.NodeInfo memory node = ICapabilitiesRegistry(i_capabilitiesRegistry).getNode(p2pId);
- if (node.p2pId == bytes32("")) {
- revert NodeNotInRegistry(p2pId);
+ /// @param p2pIds The P2P IDs of the node to check.
+ function _ensureInRegistry(bytes32[] memory p2pIds) internal view {
+ for (uint256 i = 0; i < p2pIds.length; ++i) {
+ // TODO add a method that does the validation in the ICapabilitiesRegistry contract
+ if (ICapabilitiesRegistry(i_capabilitiesRegistry).getNode(p2pIds[i]).p2pId == bytes32("")) {
+ revert NodeNotInRegistry(p2pIds[i]);
+ }
}
}
}
diff --git a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol
index 0b90f88c11..c9fff4d624 100644
--- a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol
+++ b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol
@@ -8,7 +8,7 @@ import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
/// with multiple OCR plugin support.
abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator {
// Maximum number of oracles the offchain reporting protocol is designed for
- uint256 internal constant MAX_NUM_ORACLES = 31;
+ uint256 internal constant MAX_NUM_ORACLES = 256;
/// @notice Triggers a new run of the offchain reporting protocol
/// @param ocrPluginType OCR plugin type for which the config was set
@@ -146,10 +146,7 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator {
}
address[] memory transmitters = ocrConfigArgs.transmitters;
- // Transmitters are expected to never exceed 255 (since this is bounded by MAX_NUM_ORACLES)
- uint8 newTransmittersLength = uint8(transmitters.length);
-
- if (newTransmittersLength > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_TRANSMITTERS);
+ if (transmitters.length > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_TRANSMITTERS);
_clearOracleRoles(ocrPluginType, ocrConfig.transmitters);
@@ -157,13 +154,12 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator {
_clearOracleRoles(ocrPluginType, ocrConfig.signers);
address[] memory signers = ocrConfigArgs.signers;
- ocrConfig.signers = signers;
- uint8 signersLength = uint8(signers.length);
- configInfo.n = signersLength;
+ if (signers.length > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_SIGNERS);
+ if (signers.length <= 3 * ocrConfigArgs.F) revert InvalidConfig(InvalidConfigErrorType.F_TOO_HIGH);
- if (signersLength > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_SIGNERS);
- if (signersLength <= 3 * ocrConfigArgs.F) revert InvalidConfig(InvalidConfigErrorType.F_TOO_HIGH);
+ configInfo.n = uint8(signers.length);
+ ocrConfig.signers = signers;
_assignOracleRoles(ocrPluginType, signers, Role.Signer);
}
@@ -198,13 +194,13 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator {
/// @param oracleAddresses Oracle addresses to assign roles to.
/// @param role Role to assign.
function _assignOracleRoles(uint8 ocrPluginType, address[] memory oracleAddresses, Role role) internal {
- for (uint8 i = 0; i < oracleAddresses.length; ++i) {
+ for (uint256 i = 0; i < oracleAddresses.length; ++i) {
address oracle = oracleAddresses[i];
if (s_oracles[ocrPluginType][oracle].role != Role.Unset) {
revert InvalidConfig(InvalidConfigErrorType.REPEATED_ORACLE_ADDRESS);
}
if (oracle == address(0)) revert OracleCannotBeZeroAddress();
- s_oracles[ocrPluginType][oracle] = Oracle(i, role);
+ s_oracles[ocrPluginType][oracle] = Oracle(uint8(i), role);
}
}
@@ -291,21 +287,20 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator {
bytes32 hashedReport,
bytes32[] memory rs,
bytes32[] memory ss,
- bytes32 rawVs // signatures
+ bytes32 rawVs
) internal view {
- // Verify signatures attached to report
- bool[MAX_NUM_ORACLES] memory signed;
+ // Verify signatures attached to report. Using a uint256 means we can only verify up to 256 oracles.
+ uint256 signed = 0;
uint256 numberOfSignatures = rs.length;
for (uint256 i; i < numberOfSignatures; ++i) {
// Safe from ECDSA malleability here since we check for duplicate signers.
address signer = ecrecover(hashedReport, uint8(rawVs[i]) + 27, rs[i], ss[i]);
- // Since we disallow address(0) as a valid signer address, it can
- // never have a signer role.
+ // Since we disallow address(0) as a valid signer address, it can never have a signer role.
Oracle memory oracle = s_oracles[ocrPluginType][signer];
if (oracle.role != Role.Signer) revert UnauthorizedSigner();
- if (signed[oracle.index]) revert NonUniqueSignatures();
- signed[oracle.index] = true;
+ if (signed & (0x1 << oracle.index) != 0) revert NonUniqueSignatures();
+ signed |= 0x1 << oracle.index;
}
}
diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
index bd847691b4..019fe18327 100644
--- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
@@ -3,7 +3,6 @@ pragma solidity 0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol";
-
import {IFeeQuoter} from "../interfaces/IFeeQuoter.sol";
import {IMessageInterceptor} from "../interfaces/IMessageInterceptor.sol";
import {INonceManager} from "../interfaces/INonceManager.sol";
@@ -328,7 +327,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
uint64 sourceChainSelector = report.sourceChainSelector;
_whenNotCursed(sourceChainSelector);
- SourceChainConfig storage sourceChainConfig = _getEnabledSourceChainConfig(sourceChainSelector);
+ bytes memory onRamp = _getEnabledSourceChainConfig(sourceChainSelector).onRamp;
uint256 numMsgs = report.messages.length;
if (numMsgs == 0) revert EmptyReport();
@@ -349,7 +348,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// over the same data, which increases gas cost.
// Hashing all of the message fields ensures that the message being executed is correct and not tampered with.
// Including the known OnRamp ensures that the message originates from the correct on ramp version
- hashedLeaves[i] = Internal._hash(message, sourceChainConfig.onRamp);
+ hashedLeaves[i] = Internal._hash(message, onRamp);
}
// SECURITY CRITICAL CHECK
@@ -429,7 +428,6 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
}
_setExecutionState(sourceChainSelector, message.header.sequenceNumber, Internal.MessageExecutionState.IN_PROGRESS);
-
(Internal.MessageExecutionState newState, bytes memory returnData) = _trialExecute(message, offchainTokenData);
_setExecutionState(sourceChainSelector, message.header.sequenceNumber, newState);
@@ -461,6 +459,8 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
hashedLeaves[i],
newState,
returnData,
+ // This emit covers not only the execution through the router, but also all of the overhead in executing the
+ // message. This gives the most accurate representation of the gas used in the execution.
gasStart - gasleft()
);
}
@@ -575,12 +575,12 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// Check if the report contains price updates
if (commitReport.priceUpdates.tokenPriceUpdates.length > 0 || commitReport.priceUpdates.gasPriceUpdates.length > 0)
{
- uint64 sequenceNumber = uint64(uint256(reportContext[1]));
+ uint64 ocrSequenceNumber = uint64(uint256(reportContext[1]));
// Check for price staleness based on the epoch and round
- if (s_latestPriceSequenceNumber < sequenceNumber) {
+ if (s_latestPriceSequenceNumber < ocrSequenceNumber) {
// If prices are not stale, update the latest epoch and round
- s_latestPriceSequenceNumber = sequenceNumber;
+ s_latestPriceSequenceNumber = ocrSequenceNumber;
// And update the prices in the fee quoter
IFeeQuoter(s_dynamicConfig.feeQuoter).updatePrices(commitReport.priceUpdates);
} else {
diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
index e0126bdf55..c2dcd9f3b4 100644
--- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
@@ -99,7 +99,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
//solhint-disable gas-struct-packing
struct AllowListConfigArgs {
uint64 destChainSelector; // ─────────────╮ Destination chain selector
- // │ destChainSelector and allowListEnabled are packed in the same slot
+ // │ destChainSelector and allowListEnabled are packed in the same slot
bool allowListEnabled; // ────────────────╯ boolean indicator to specify if allowList check is enabled.
address[] addedAllowlistedSenders; // list of senders to be added to the allowedSendersList
address[] removedAllowlistedSenders; // list of senders to be removed from the allowedSendersList
@@ -208,7 +208,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
}),
sender: originalSender,
data: message.data,
- extraArgs: message.extraArgs,
+ extraArgs: convertedExtraArgs,
receiver: message.receiver,
feeToken: message.feeToken,
feeTokenAmount: feeTokenAmount,
@@ -232,9 +232,6 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
newMessage.tokenAmounts[i].destExecData = destExecDataPerToken[i];
}
- // Override extraArgs with latest version
- newMessage.extraArgs = convertedExtraArgs;
-
// Hash only after all fields have been set
newMessage.header.messageId = Internal._hash(
newMessage,
@@ -425,8 +422,8 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCreator {
}
}
- for (uint256 k = 0; k < allowListConfigArgs.removedAllowlistedSenders.length; ++k) {
- destChainConfig.allowedSendersList.remove(allowListConfigArgs.removedAllowlistedSenders[k]);
+ for (uint256 j = 0; j < allowListConfigArgs.removedAllowlistedSenders.length; ++j) {
+ destChainConfig.allowedSendersList.remove(allowListConfigArgs.removedAllowlistedSenders[j]);
}
if (allowListConfigArgs.removedAllowlistedSenders.length > 0) {
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
index ca7f2114a6..d252698e62 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
@@ -334,13 +334,10 @@ contract CCIPConfig_chainConfig is CCIPConfigSetup {
}
contract CCIPConfig_validateConfig is CCIPConfigSetup {
- // Successes.
-
- function test__validateConfig_Success() public {
+ function _getCorrectOCR3Config() internal returns (CCIPConfigTypes.OCR3Config memory) {
(bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
+ return CCIPConfigTypes.OCR3Config({
pluginType: Internal.OCRPluginType.Commit,
offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
chainSelector: 1,
@@ -352,239 +349,118 @@ contract CCIPConfig_validateConfig is CCIPConfigSetup {
offchainConfigVersion: 30,
offchainConfig: bytes("offchainConfig")
});
- s_ccipCC.validateConfig(config);
+ }
+
+ // Successes.
+
+ function test__validateConfig_Success() public {
+ s_ccipCC.validateConfig(_getCorrectOCR3Config());
}
// Reverts.
function test__validateConfig_ChainSelectorNotSet_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
-
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 0, // invalid
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.chainSelector = 0; // invalid
vm.expectRevert(CCIPConfig.ChainSelectorNotSet.selector);
s_ccipCC.validateConfig(config);
}
function test__validateConfig_OfframpAddressCannotBeZero_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
-
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: bytes(""), // invalid
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.offrampAddress = ""; // invalid
vm.expectRevert(CCIPConfig.OfframpAddressCannotBeZero.selector);
s_ccipCC.validateConfig(config);
}
- function test__validateConfig_ChainSelectorNotFound_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
-
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 2, // not set
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
-
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.ChainSelectorNotFound.selector, 2));
- s_ccipCC.validateConfig(config);
- }
-
- function test__validateConfig_TooManySigners_Reverts() public {
- // 32 > 31 (max num oracles)
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(32);
-
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ function test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() public {
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.offrampAddress = abi.encode(address(0)); // invalid
- vm.expectRevert(CCIPConfig.TooManySigners.selector);
+ vm.expectRevert(CCIPConfig.OfframpAddressCannotBeZero.selector);
s_ccipCC.validateConfig(config);
}
- function test__validateConfig_TooManyTransmitters_Reverts() public {
- // 32 > 31 (max num oracles)
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(32);
-
- // truncate signers but keep transmitters > 31
- assembly {
- mstore(signers, 30)
- }
-
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ function test__validateConfig_ChainSelectorNotFound_Reverts() public {
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.chainSelector = 2; // not set
- vm.expectRevert(CCIPConfig.TooManyTransmitters.selector);
+ vm.expectRevert(abi.encodeWithSelector(CCIPConfig.ChainSelectorNotFound.selector, 2));
s_ccipCC.validateConfig(config);
}
function test__validateConfig_NotEnoughTransmitters_Reverts() public {
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ uint256 numberOfTransmitters = 3;
+
// 32 > 31 (max num oracles)
(bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(31);
// truncate transmitters to < 3 * fChain + 1
// since fChain is 1 in this case, we need to truncate to 3 transmitters.
assembly {
- mstore(transmitters, 3)
+ mstore(transmitters, numberOfTransmitters)
}
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ config.transmitters = transmitters;
+ config.p2pIds = p2pIds;
+ config.signers = signers;
- vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NotEnoughTransmitters.selector, 3, 4));
+ vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NotEnoughTransmitters.selector, numberOfTransmitters, 4));
s_ccipCC.validateConfig(config);
}
- function test__validateConfig_FMustBePositive_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
+ function test__validateConfig_TooManySigners_Reverts() public {
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.signers = new bytes[](257);
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 0,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ vm.expectRevert(CCIPConfig.TooManySigners.selector);
+ s_ccipCC.validateConfig(config);
+ }
+
+ function test__validateConfig_FMustBePositive_Reverts() public {
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.F = 0; // not positive
vm.expectRevert(CCIPConfig.FMustBePositive.selector);
s_ccipCC.validateConfig(config);
}
function test__validateConfig_FTooHigh_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
-
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 2,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.F = 2; // too high
vm.expectRevert(CCIPConfig.FTooHigh.selector);
s_ccipCC.validateConfig(config);
}
function test__validateConfig_P2PIdsLengthNotMatching_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
- // truncate the p2pIds length
- assembly {
- mstore(p2pIds, 3)
- }
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ uint256 expectedNumberOfP2pIds = config.signers.length;
+ uint256 wrongNumberOfP2pIds = expectedNumberOfP2pIds - 1;
+ config.p2pIds = new bytes32[](wrongNumberOfP2pIds); // Not enough
vm.expectRevert(
- abi.encodeWithSelector(CCIPConfig.P2PIdsLengthNotMatching.selector, uint256(3), uint256(4), uint256(4))
+ abi.encodeWithSelector(
+ CCIPConfig.P2PIdsLengthNotMatching.selector, wrongNumberOfP2pIds, expectedNumberOfP2pIds, expectedNumberOfP2pIds
+ )
);
s_ccipCC.validateConfig(config);
}
function test__validateConfig_TooManyBootstrapP2PIds_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
-
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _makeBytes32Array(5, 0), // too many bootstrap p2pIds, 5 > 4
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.bootstrapP2PIds = _makeBytes32Array(5, 0); // too many bootstrap p2pIds, 5 > 4
vm.expectRevert(CCIPConfig.TooManyBootstrapP2PIds.selector);
s_ccipCC.validateConfig(config);
}
function test__validateConfig_NodeNotInRegistry_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
+ (bytes32[] memory p2pIds,,) = _addChainConfig(4);
bytes32 nonExistentP2PId = keccak256("notInRegistry");
p2pIds[0] = nonExistentP2PId;
@@ -603,146 +479,65 @@ contract CCIPConfig_validateConfig is CCIPConfigSetup {
})
)
);
-
- // Config is for 4 nodes, so f == 1.
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.p2pIds = p2pIds;
+ config.bootstrapP2PIds = _subset(p2pIds, 0, 1);
vm.expectRevert(abi.encodeWithSelector(CCIPConfig.NodeNotInRegistry.selector, nonExistentP2PId));
s_ccipCC.validateConfig(config);
}
function test__validateConfig_P2PIdsNotSorted_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
- // Config is for 4 nodes, so f == 1.
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
//swapping two adjacent p2pIds to make it unsorted
- (p2pIds[2], p2pIds[3]) = (p2pIds[3], p2pIds[2]);
+ (config.p2pIds[2], config.p2pIds[3]) = (config.p2pIds[3], config.p2pIds[2]);
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 1),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
-
- vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASortedSet.selector, p2pIds));
+ vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASortedSet.selector, config.p2pIds));
s_ccipCC.validateConfig(config);
}
function test__validateConfig_BootstrapP2PIdsNotSorted_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
- // Config is for 4 nodes, so f == 1.
-
- bytes32[] memory bootstrapP2PIds = _subset(p2pIds, 0, 2);
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ bytes32[] memory bootstrapP2PIds = _subset(config.p2pIds, 0, 2);
//swapping bootstrapP2PIds to make it unsorted
(bootstrapP2PIds[0], bootstrapP2PIds[1]) = (bootstrapP2PIds[1], bootstrapP2PIds[0]);
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: bootstrapP2PIds,
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ config.bootstrapP2PIds = bootstrapP2PIds;
vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASortedSet.selector, bootstrapP2PIds));
s_ccipCC.validateConfig(config);
}
function test__validateConfig_P2PIdsHasDuplicates_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
- // Config is for 4 nodes, so f == 1.
-
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
//forcing duplicate p2pIds
- p2pIds[1] = p2pIds[2];
-
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: _subset(p2pIds, 0, 2),
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ config.p2pIds[1] = config.p2pIds[2];
- vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASortedSet.selector, p2pIds));
+ vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASortedSet.selector, config.p2pIds));
s_ccipCC.validateConfig(config);
}
function test__validateConfig_BootstrapP2PIdsHasDuplicates_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
- // Config is for 4 nodes, so f == 1.
-
- bytes32[] memory bootstrapP2PIds = _subset(p2pIds, 0, 2);
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
//forcing duplicate bootstrapP2PIds
- bootstrapP2PIds[1] = bootstrapP2PIds[0];
-
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: bootstrapP2PIds,
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ config.bootstrapP2PIds = _subset(config.p2pIds, 0, 2);
+ config.bootstrapP2PIds[1] = config.bootstrapP2PIds[0];
- vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASortedSet.selector, bootstrapP2PIds));
+ vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASortedSet.selector, config.bootstrapP2PIds));
s_ccipCC.validateConfig(config);
}
function test__validateConfig_BootstrapP2PIdsNotASubsetOfP2PIds_Reverts() public {
- (bytes32[] memory p2pIds, bytes[] memory signers, bytes[] memory transmitters) = _addChainConfig(4);
- // Config is for 4 nodes, so f == 1.
-
- //forcing invalid bootstrapP2PIds where the bootstrapP2PIds is sorted, but one of the element is not in the p2pIdsSet
- bytes32[] memory bootstrapP2PIds = _subset(p2pIds, 0, 2);
- p2pIds[1] = bytes32(uint256(p2pIds[0]) + 100);
+ CCIPConfigTypes.OCR3Config memory config = _getCorrectOCR3Config();
+ config.bootstrapP2PIds = _subset(config.p2pIds, 0, 2);
+ config.p2pIds[1] = bytes32(uint256(config.p2pIds[0]) + 100);
- CCIPConfigTypes.OCR3Config memory config = CCIPConfigTypes.OCR3Config({
- pluginType: Internal.OCRPluginType.Commit,
- offrampAddress: abi.encodePacked(keccak256(abi.encode("offramp"))),
- chainSelector: 1,
- bootstrapP2PIds: bootstrapP2PIds,
- p2pIds: p2pIds,
- signers: signers,
- transmitters: transmitters,
- F: 1,
- offchainConfigVersion: 30,
- offchainConfig: bytes("offchainConfig")
- });
+ vm.expectRevert(
+ abi.encodeWithSelector(SortedSetValidationUtil.NotASubset.selector, config.bootstrapP2PIds, config.p2pIds)
+ );
- vm.expectRevert(abi.encodeWithSelector(SortedSetValidationUtil.NotASubset.selector, bootstrapP2PIds, p2pIds));
s_ccipCC.validateConfig(config);
}
}
diff --git a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol
index 5b784bf721..8867d1b127 100644
--- a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol
+++ b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol
@@ -878,7 +878,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
function test_TooManyTransmitters_Revert() public {
address[] memory signers = new address[](0);
- address[] memory transmitters = new address[](32);
+ address[] memory transmitters = new address[](257);
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({
@@ -899,7 +899,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
}
function test_TooManySigners_Revert() public {
- address[] memory signers = new address[](32);
+ address[] memory signers = new address[](257);
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({
diff --git a/contracts/src/v0.8/functions/dev/v1_X/accessControl/TermsOfServiceAllowList.sol b/contracts/src/v0.8/functions/dev/v1_X/accessControl/TermsOfServiceAllowList.sol
index 04604e6797..0ba8e5d6ca 100644
--- a/contracts/src/v0.8/functions/dev/v1_X/accessControl/TermsOfServiceAllowList.sol
+++ b/contracts/src/v0.8/functions/dev/v1_X/accessControl/TermsOfServiceAllowList.sol
@@ -16,7 +16,8 @@ contract TermsOfServiceAllowList is ITermsOfServiceAllowList, IAccessController,
using EnumerableSet for EnumerableSet.AddressSet;
/// @inheritdoc ITypeAndVersion
- string public constant override typeAndVersion = "Functions Terms of Service Allow List v1.1.0";
+ string public constant override typeAndVersion = "Functions Terms of Service Allow List v1.1.1";
+ address private s_previousToSContract;
EnumerableSet.AddressSet private s_allowedSenders;
EnumerableSet.AddressSet private s_blockedSenders;
@@ -29,6 +30,7 @@ contract TermsOfServiceAllowList is ITermsOfServiceAllowList, IAccessController,
error InvalidUsage();
error RecipientIsBlocked();
error InvalidCalldata();
+ error NoPreviousToSContract();
TermsOfServiceAllowListConfig private s_config;
@@ -41,7 +43,8 @@ contract TermsOfServiceAllowList is ITermsOfServiceAllowList, IAccessController,
constructor(
TermsOfServiceAllowListConfig memory config,
address[] memory initialAllowedSenders,
- address[] memory initialBlockedSenders
+ address[] memory initialBlockedSenders,
+ address previousToSContract
) ConfirmedOwner(msg.sender) {
updateConfig(config);
@@ -56,6 +59,8 @@ contract TermsOfServiceAllowList is ITermsOfServiceAllowList, IAccessController,
}
s_blockedSenders.add(initialBlockedSenders[j]);
}
+
+ s_previousToSContract = previousToSContract;
}
// ================================================================
@@ -197,4 +202,19 @@ contract TermsOfServiceAllowList is ITermsOfServiceAllowList, IAccessController,
return blockedSenders;
}
+
+ /// @inheritdoc ITermsOfServiceAllowList
+ function migratePreviouslyAllowedSenders(address[] memory previousSendersToAdd) external override onlyOwner {
+ if (s_previousToSContract == address(0)) {
+ revert NoPreviousToSContract();
+ }
+ IAccessController previousToSContract = IAccessController(s_previousToSContract);
+ for (uint256 i = 0; i < previousSendersToAdd.length; ++i) {
+ if (previousToSContract.hasAccess(previousSendersToAdd[i], "")) {
+ if (!s_blockedSenders.contains(previousSendersToAdd[i])) {
+ s_allowedSenders.add(previousSendersToAdd[i]);
+ }
+ }
+ }
+ }
}
diff --git a/contracts/src/v0.8/functions/dev/v1_X/accessControl/interfaces/ITermsOfServiceAllowList.sol b/contracts/src/v0.8/functions/dev/v1_X/accessControl/interfaces/ITermsOfServiceAllowList.sol
index 65db9c42b6..32a0ecef79 100644
--- a/contracts/src/v0.8/functions/dev/v1_X/accessControl/interfaces/ITermsOfServiceAllowList.sol
+++ b/contracts/src/v0.8/functions/dev/v1_X/accessControl/interfaces/ITermsOfServiceAllowList.sol
@@ -69,6 +69,10 @@ interface ITermsOfServiceAllowList {
uint64 blockedSenderIdxStart,
uint64 blockedSenderIdxEnd
) external view returns (address[] memory blockedSenders);
+
+ /// @notice Enables migrating any previously allowed senders to the new contract
+ /// @param previousSendersToAdd - List of addresses to migrate. These address must be allowed on the previous ToS contract and not blocked
+ function migratePreviouslyAllowedSenders(address[] memory previousSendersToAdd) external;
}
// ================================================================
diff --git a/contracts/src/v0.8/functions/tests/v1_X/FunctionsTermsOfServiceAllowList.t.sol b/contracts/src/v0.8/functions/tests/v1_X/FunctionsTermsOfServiceAllowList.t.sol
index e121f7b881..9bf09748b8 100644
--- a/contracts/src/v0.8/functions/tests/v1_X/FunctionsTermsOfServiceAllowList.t.sol
+++ b/contracts/src/v0.8/functions/tests/v1_X/FunctionsTermsOfServiceAllowList.t.sol
@@ -11,7 +11,7 @@ import "forge-std/Vm.sol";
/// @notice #constructor
contract FunctionsTermsOfServiceAllowList_Constructor is FunctionsRoutesSetup {
function test_Constructor_Success() public {
- assertEq(s_termsOfServiceAllowList.typeAndVersion(), "Functions Terms of Service Allow List v1.1.0");
+ assertEq(s_termsOfServiceAllowList.typeAndVersion(), "Functions Terms of Service Allow List v1.1.1");
assertEq(s_termsOfServiceAllowList.owner(), OWNER_ADDRESS);
}
}
@@ -511,3 +511,47 @@ contract FunctionsTermsOfServiceAllowList_GetBlockedSendersInRange is FunctionsR
s_termsOfServiceAllowList.getBlockedSendersInRange(1, BlockedSendersCount + 1);
}
}
+
+/// @notice #migratePreviouslyAllowedSenders
+contract FunctionsTermsOfServiceAllowList_MigratePreviouslyAllowedSenders is FunctionsRoutesSetup {
+ function setUp() public virtual override {
+ FunctionsRoutesSetup.setUp();
+ }
+
+ function test_MigratePreviouslyAllowedSenders_RevertIfNotOwner() public {
+ // Send as stranger
+ vm.stopPrank();
+ vm.startPrank(STRANGER_ADDRESS);
+
+ vm.expectRevert("Only callable by owner");
+ address[] memory empty = new address[](0);
+ s_termsOfServiceAllowList.migratePreviouslyAllowedSenders(empty);
+ }
+
+ function test_MigratePreviouslyAllowedSenders_Success() public {
+ address previouslyAllowedSender1 = 0x1000000000000000000000000000000000000000;
+ address previouslyAllowedSender2 = 0x2000000000000000000000000000000000000000;
+ address currentlyBlockedSender = 0xB000000000000000000000000000000000000000;
+
+ address[] memory mockPreviousAllowlist = new address[](3);
+ mockPreviousAllowlist[0] = previouslyAllowedSender1;
+ mockPreviousAllowlist[1] = currentlyBlockedSender;
+ mockPreviousAllowlist[2] = previouslyAllowedSender2;
+
+ s_termsOfServiceAllowList.blockSender(currentlyBlockedSender);
+
+ vm.mockCall(
+ MOCK_PREVIOUS_TOS_ADDRESS,
+ abi.encodeWithSelector(TermsOfServiceAllowList.hasAccess.selector),
+ abi.encode(true)
+ );
+ s_termsOfServiceAllowList.migratePreviouslyAllowedSenders(mockPreviousAllowlist);
+
+ address[] memory currentlyAllowedSenders = s_termsOfServiceAllowList.getAllAllowedSenders();
+
+ address[] memory expectedAllowedSenders = new address[](2);
+ expectedAllowedSenders[0] = previouslyAllowedSender1;
+ expectedAllowedSenders[1] = previouslyAllowedSender2;
+ assertEq(currentlyAllowedSenders, expectedAllowedSenders);
+ }
+}
diff --git a/contracts/src/v0.8/functions/tests/v1_X/Setup.t.sol b/contracts/src/v0.8/functions/tests/v1_X/Setup.t.sol
index 815366e62a..444fc18fe8 100644
--- a/contracts/src/v0.8/functions/tests/v1_X/Setup.t.sol
+++ b/contracts/src/v0.8/functions/tests/v1_X/Setup.t.sol
@@ -37,6 +37,7 @@ contract FunctionsRouterSetup is BaseTest {
int256 internal LINK_USD_RATE = 1_500_000_000;
uint8 internal LINK_USD_DECIMALS = 8;
+ address public MOCK_PREVIOUS_TOS_ADDRESS = 0x746f730000000000000000000000000000000000;
uint256 internal TOS_SIGNER_PRIVATE_KEY = 0x3;
address internal TOS_SIGNER = vm.addr(TOS_SIGNER_PRIVATE_KEY);
@@ -57,7 +58,8 @@ contract FunctionsRouterSetup is BaseTest {
s_termsOfServiceAllowList = new TermsOfServiceAllowList(
getTermsOfServiceConfig(),
initialAllowedSenders,
- initialBlockedSenders
+ initialBlockedSenders,
+ MOCK_PREVIOUS_TOS_ADDRESS
);
}
diff --git a/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol b/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol
index 6b150dc5d7..ba61584d0a 100644
--- a/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol
+++ b/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol
@@ -502,7 +502,7 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface {
NodeOperator memory nodeOperator = nodeOperators[i];
if (nodeOperator.admin == address(0)) revert InvalidNodeOperatorAdmin();
- if (msg.sender != nodeOperator.admin && msg.sender != owner) revert AccessForbidden(msg.sender);
+ if (msg.sender != currentNodeOperator.admin && msg.sender != owner) revert AccessForbidden(msg.sender);
if (
currentNodeOperator.admin != nodeOperator.admin ||
@@ -611,11 +611,12 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface {
bool isOwner = msg.sender == owner();
for (uint256 i; i < nodes.length; ++i) {
NodeParams memory node = nodes[i];
- NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId];
- if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender);
-
Node storage storedNode = s_nodes[node.p2pId];
+ NodeOperator memory nodeOperator = s_nodeOperators[storedNode.nodeOperatorId];
+
if (storedNode.signer == bytes32("")) revert NodeDoesNotExist(node.p2pId);
+ if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender);
+
if (node.signer == bytes32("")) revert InvalidNodeSigner();
bytes32 previousSigner = storedNode.signer;
diff --git a/contracts/src/v0.8/keystone/KeystoneFeedsConsumer.sol b/contracts/src/v0.8/keystone/KeystoneFeedsConsumer.sol
index bc722eff29..ba1a7c6a8c 100644
--- a/contracts/src/v0.8/keystone/KeystoneFeedsConsumer.sol
+++ b/contracts/src/v0.8/keystone/KeystoneFeedsConsumer.sol
@@ -1,15 +1,17 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
+import {IERC165} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
+import {OwnerIsCreator} from "../shared/access/OwnerIsCreator.sol";
import {IReceiver} from "./interfaces/IReceiver.sol";
-import {KeystoneFeedsPermissionHandler} from "./KeystoneFeedsPermissionHandler.sol";
-import {KeystoneFeedDefaultMetadataLib} from "./lib/KeystoneFeedDefaultMetadataLib.sol";
-
-contract KeystoneFeedsConsumer is IReceiver, KeystoneFeedsPermissionHandler {
- using KeystoneFeedDefaultMetadataLib for bytes;
+contract KeystoneFeedsConsumer is IReceiver, OwnerIsCreator, IERC165 {
event FeedReceived(bytes32 indexed feedId, uint224 price, uint32 timestamp);
+ error UnauthorizedSender(address sender);
+ error UnauthorizedWorkflowOwner(address workflowOwner);
+ error UnauthorizedWorkflowName(bytes10 workflowName);
+
struct ReceivedFeedReport {
bytes32 FeedId;
uint224 Price;
@@ -22,11 +24,53 @@ contract KeystoneFeedsConsumer is IReceiver, KeystoneFeedsPermissionHandler {
}
mapping(bytes32 feedId => StoredFeedReport feedReport) internal s_feedReports;
+ address[] internal s_allowedSendersList;
+ mapping(address sender => bool) internal s_allowedSenders;
+ address[] internal s_allowedWorkflowOwnersList;
+ mapping(address owner => bool) internal s_allowedWorkflowOwners;
+ bytes10[] internal s_allowedWorkflowNamesList;
+ mapping(bytes10 workflowName => bool) internal s_allowedWorkflowNames;
+
+ function setConfig(
+ address[] calldata _allowedSendersList,
+ address[] calldata _allowedWorkflowOwnersList,
+ bytes10[] calldata _allowedWorkflowNamesList
+ ) external onlyOwner {
+ for (uint32 i = 0; i < s_allowedSendersList.length; ++i) {
+ s_allowedSenders[s_allowedSendersList[i]] = false;
+ }
+ for (uint32 i = 0; i < _allowedSendersList.length; ++i) {
+ s_allowedSenders[_allowedSendersList[i]] = true;
+ }
+ s_allowedSendersList = _allowedSendersList;
+ for (uint32 i = 0; i < s_allowedWorkflowOwnersList.length; ++i) {
+ s_allowedWorkflowOwners[s_allowedWorkflowOwnersList[i]] = false;
+ }
+ for (uint32 i = 0; i < _allowedWorkflowOwnersList.length; ++i) {
+ s_allowedWorkflowOwners[_allowedWorkflowOwnersList[i]] = true;
+ }
+ s_allowedWorkflowOwnersList = _allowedWorkflowOwnersList;
+ for (uint32 i = 0; i < s_allowedWorkflowNamesList.length; ++i) {
+ s_allowedWorkflowNames[s_allowedWorkflowNamesList[i]] = false;
+ }
+ for (uint32 i = 0; i < _allowedWorkflowNamesList.length; ++i) {
+ s_allowedWorkflowNames[_allowedWorkflowNamesList[i]] = true;
+ }
+ s_allowedWorkflowNamesList = _allowedWorkflowNamesList;
+ }
function onReport(bytes calldata metadata, bytes calldata rawReport) external {
- (bytes10 workflowName, address workflowOwner, bytes2 reportName) = metadata._extractMetadataInfo();
+ if (!s_allowedSenders[msg.sender]) {
+ revert UnauthorizedSender(msg.sender);
+ }
- _validateReportPermission(msg.sender, workflowOwner, workflowName, reportName);
+ (bytes10 workflowName, address workflowOwner) = _getInfo(metadata);
+ if (!s_allowedWorkflowNames[workflowName]) {
+ revert UnauthorizedWorkflowName(workflowName);
+ }
+ if (!s_allowedWorkflowOwners[workflowOwner]) {
+ revert UnauthorizedWorkflowOwner(workflowOwner);
+ }
ReceivedFeedReport[] memory feeds = abi.decode(rawReport, (ReceivedFeedReport[]));
for (uint256 i = 0; i < feeds.length; ++i) {
@@ -35,8 +79,27 @@ contract KeystoneFeedsConsumer is IReceiver, KeystoneFeedsPermissionHandler {
}
}
+ // solhint-disable-next-line chainlink-solidity/explicit-returns
+ function _getInfo(bytes memory metadata) internal pure returns (bytes10 workflowName, address workflowOwner) {
+ // (first 32 bytes contain length of the byte array)
+ // workflow_cid // offset 32, size 32
+ // workflow_name // offset 64, size 10
+ // workflow_owner // offset 74, size 20
+ // report_name // offset 94, size 2
+ assembly {
+ // no shifting needed for bytes10 type
+ workflowName := mload(add(metadata, 64))
+ // shift right by 12 bytes to get the actual value
+ workflowOwner := shr(mul(12, 8), mload(add(metadata, 74)))
+ }
+ }
+
function getPrice(bytes32 feedId) external view returns (uint224, uint32) {
StoredFeedReport memory report = s_feedReports[feedId];
return (report.Price, report.Timestamp);
}
+
+ function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {
+ return interfaceId == this.onReport.selector;
+ }
}
diff --git a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodeOperatorsTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodeOperatorsTest.t.sol
index e0d1742c98..721fd35eae 100644
--- a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodeOperatorsTest.t.sol
+++ b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodeOperatorsTest.t.sol
@@ -19,10 +19,7 @@ contract CapabilitiesRegistry_UpdateNodeOperatorTest is BaseTest {
changePrank(STRANGER);
CapabilitiesRegistry.NodeOperator[] memory nodeOperators = new CapabilitiesRegistry.NodeOperator[](1);
- nodeOperators[0] = CapabilitiesRegistry.NodeOperator({
- admin: NEW_NODE_OPERATOR_ADMIN,
- name: NEW_NODE_OPERATOR_NAME
- });
+ nodeOperators[0] = CapabilitiesRegistry.NodeOperator({admin: ADMIN, name: NEW_NODE_OPERATOR_NAME});
uint32[] memory nodeOperatorIds = new uint32[](1);
nodeOperatorIds[0] = TEST_NODE_OPERATOR_ID;
diff --git a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol
index 43c6adc35b..9b516767f2 100644
--- a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol
+++ b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol
@@ -59,6 +59,24 @@ contract CapabilitiesRegistry_UpdateNodesTest is BaseTest {
s_CapabilitiesRegistry.updateNodes(nodes);
}
+ function test_RevertWhen_CalledByAnotherNodeOperatorAdmin() public {
+ changePrank(NODE_OPERATOR_TWO_ADMIN);
+ CapabilitiesRegistry.NodeParams[] memory nodes = new CapabilitiesRegistry.NodeParams[](1);
+
+ bytes32[] memory hashedCapabilityIds = new bytes32[](1);
+ hashedCapabilityIds[0] = s_basicHashedCapabilityId;
+
+ nodes[0] = CapabilitiesRegistry.NodeParams({
+ nodeOperatorId: TEST_NODE_OPERATOR_TWO_ID,
+ p2pId: P2P_ID,
+ signer: NEW_NODE_SIGNER,
+ hashedCapabilityIds: hashedCapabilityIds
+ });
+
+ vm.expectRevert(abi.encodeWithSelector(CapabilitiesRegistry.AccessForbidden.selector, NODE_OPERATOR_TWO_ADMIN));
+ s_CapabilitiesRegistry.updateNodes(nodes);
+ }
+
function test_RevertWhen_NodeDoesNotExist() public {
changePrank(NODE_OPERATOR_ONE_ADMIN);
CapabilitiesRegistry.NodeParams[] memory nodes = new CapabilitiesRegistry.NodeParams[](1);
diff --git a/core/capabilities/integration_tests/keystone_contracts_setup.go b/core/capabilities/integration_tests/keystone_contracts_setup.go
new file mode 100644
index 0000000000..42269d1bd4
--- /dev/null
+++ b/core/capabilities/integration_tests/keystone_contracts_setup.go
@@ -0,0 +1,345 @@
+package integration_tests
+
+import (
+ "context"
+ "encoding/hex"
+ "fmt"
+ "log"
+ "os"
+ "strings"
+ "sync"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/eth/ethconfig"
+ gethlog "github.com/ethereum/go-ethereum/log"
+ "github.com/stretchr/testify/require"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/types/known/durationpb"
+
+ ragetypes "github.com/smartcontractkit/libocr/ragep2p/types"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+)
+
+type peer struct {
+ PeerID string
+ Signer string
+}
+
+func peerIDToBytes(peerID string) ([32]byte, error) {
+ var peerIDB ragetypes.PeerID
+ err := peerIDB.UnmarshalText([]byte(peerID))
+ if err != nil {
+ return [32]byte{}, err
+ }
+
+ return peerIDB, nil
+}
+
+func peers(ps []peer) ([][32]byte, error) {
+ out := [][32]byte{}
+ for _, p := range ps {
+ b, err := peerIDToBytes(p.PeerID)
+ if err != nil {
+ return nil, err
+ }
+
+ out = append(out, b)
+ }
+
+ return out, nil
+}
+
+func peerToNode(nopID uint32, p peer) (kcr.CapabilitiesRegistryNodeParams, error) {
+ peerIDB, err := peerIDToBytes(p.PeerID)
+ if err != nil {
+ return kcr.CapabilitiesRegistryNodeParams{}, fmt.Errorf("failed to convert peerID: %w", err)
+ }
+
+ sig := strings.TrimPrefix(p.Signer, "0x")
+ signerB, err := hex.DecodeString(sig)
+ if err != nil {
+ return kcr.CapabilitiesRegistryNodeParams{}, fmt.Errorf("failed to convert signer: %w", err)
+ }
+
+ var sigb [32]byte
+ copy(sigb[:], signerB)
+
+ return kcr.CapabilitiesRegistryNodeParams{
+ NodeOperatorId: nopID,
+ P2pId: peerIDB,
+ Signer: sigb,
+ }, nil
+}
+
+func setupCapabilitiesRegistryContract(ctx context.Context, t *testing.T, workflowDonPeers []peer, triggerDonPeers []peer,
+ targetDonPeerIDs []peer,
+ transactOpts *bind.TransactOpts, backend *ethBackend) common.Address {
+ addr, _, reg, err := kcr.DeployCapabilitiesRegistry(transactOpts, backend)
+ require.NoError(t, err)
+
+ backend.Commit()
+
+ streamsTrigger := kcr.CapabilitiesRegistryCapability{
+ LabelledName: "streams-trigger",
+ Version: "1.0.0",
+ CapabilityType: uint8(capabilities.CapabilityTypeTrigger),
+ }
+ sid, err := reg.GetHashedCapabilityId(&bind.CallOpts{}, streamsTrigger.LabelledName, streamsTrigger.Version)
+ require.NoError(t, err)
+
+ writeChain := kcr.CapabilitiesRegistryCapability{
+ LabelledName: "write_geth-testnet",
+ Version: "1.0.0",
+ CapabilityType: uint8(capabilities.CapabilityTypeTarget),
+ }
+ wid, err := reg.GetHashedCapabilityId(&bind.CallOpts{}, writeChain.LabelledName, writeChain.Version)
+ if err != nil {
+ log.Printf("failed to call GetHashedCapabilityId: %s", err)
+ }
+
+ ocr := kcr.CapabilitiesRegistryCapability{
+ LabelledName: "offchain_reporting",
+ Version: "1.0.0",
+ CapabilityType: uint8(capabilities.CapabilityTypeConsensus),
+ }
+ ocrid, err := reg.GetHashedCapabilityId(&bind.CallOpts{}, ocr.LabelledName, ocr.Version)
+ require.NoError(t, err)
+
+ _, err = reg.AddCapabilities(transactOpts, []kcr.CapabilitiesRegistryCapability{
+ streamsTrigger,
+ writeChain,
+ ocr,
+ })
+ require.NoError(t, err)
+ backend.Commit()
+
+ _, err = reg.AddNodeOperators(transactOpts, []kcr.CapabilitiesRegistryNodeOperator{
+ {
+ Admin: transactOpts.From,
+ Name: "TEST_NODE_OPERATOR",
+ },
+ })
+ require.NoError(t, err)
+ blockHash := backend.Commit()
+
+ logs, err := backend.FilterLogs(ctx, ethereum.FilterQuery{
+ BlockHash: &blockHash,
+ FromBlock: nil,
+ ToBlock: nil,
+ Addresses: nil,
+ Topics: nil,
+ })
+
+ require.NoError(t, err)
+
+ recLog, err := reg.ParseNodeOperatorAdded(logs[0])
+ require.NoError(t, err)
+
+ nopID := recLog.NodeOperatorId
+ nodes := []kcr.CapabilitiesRegistryNodeParams{}
+ for _, wfPeer := range workflowDonPeers {
+ n, innerErr := peerToNode(nopID, wfPeer)
+ require.NoError(t, innerErr)
+
+ n.HashedCapabilityIds = [][32]byte{ocrid}
+ nodes = append(nodes, n)
+ }
+
+ for _, triggerPeer := range triggerDonPeers {
+ n, innerErr := peerToNode(nopID, triggerPeer)
+ require.NoError(t, innerErr)
+
+ n.HashedCapabilityIds = [][32]byte{sid}
+ nodes = append(nodes, n)
+ }
+
+ for _, targetPeer := range targetDonPeerIDs {
+ n, innerErr := peerToNode(nopID, targetPeer)
+ require.NoError(t, innerErr)
+
+ n.HashedCapabilityIds = [][32]byte{wid}
+ nodes = append(nodes, n)
+ }
+
+ _, err = reg.AddNodes(transactOpts, nodes)
+ require.NoError(t, err)
+
+ // workflow DON
+ ps, err := peers(workflowDonPeers)
+ require.NoError(t, err)
+
+ cc := newCapabilityConfig()
+ ccb, err := proto.Marshal(cc)
+ require.NoError(t, err)
+
+ cfgs := []kcr.CapabilitiesRegistryCapabilityConfiguration{
+ {
+ CapabilityId: ocrid,
+ Config: ccb,
+ },
+ }
+
+ workflowDonF := uint8(2)
+ _, err = reg.AddDON(transactOpts, ps, cfgs, false, true, workflowDonF)
+ require.NoError(t, err)
+
+ // trigger DON
+ ps, err = peers(triggerDonPeers)
+ require.NoError(t, err)
+
+ triggerDonF := 1
+ config := &pb.RemoteTriggerConfig{
+ RegistrationRefresh: durationpb.New(20000 * time.Millisecond),
+ RegistrationExpiry: durationpb.New(60000 * time.Millisecond),
+ // F + 1
+ MinResponsesToAggregate: uint32(triggerDonF) + 1,
+ }
+ configb, err := proto.Marshal(config)
+ require.NoError(t, err)
+
+ cfgs = []kcr.CapabilitiesRegistryCapabilityConfiguration{
+ {
+ CapabilityId: sid,
+ Config: configb,
+ },
+ }
+
+ _, err = reg.AddDON(transactOpts, ps, cfgs, true, false, uint8(triggerDonF))
+ require.NoError(t, err)
+
+ // target DON
+ ps, err = peers(targetDonPeerIDs)
+ require.NoError(t, err)
+
+ cfgs = []kcr.CapabilitiesRegistryCapabilityConfiguration{
+ {
+ CapabilityId: wid,
+ Config: ccb,
+ },
+ }
+
+ targetDonF := uint8(1)
+ _, err = reg.AddDON(transactOpts, ps, cfgs, true, false, targetDonF)
+ require.NoError(t, err)
+
+ backend.Commit()
+
+ return addr
+}
+
+func newCapabilityConfig() *pb.CapabilityConfig {
+ return &pb.CapabilityConfig{
+ DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(),
+ }
+}
+
+func setupForwarderContract(t *testing.T, workflowDonPeers []peer, workflowDonId uint32,
+ configVersion uint32, f uint8,
+ transactOpts *bind.TransactOpts, backend *ethBackend) (common.Address, *forwarder.KeystoneForwarder) {
+ addr, _, fwd, err := forwarder.DeployKeystoneForwarder(transactOpts, backend)
+ require.NoError(t, err)
+ backend.Commit()
+
+ var signers []common.Address
+ for _, p := range workflowDonPeers {
+ signers = append(signers, common.HexToAddress(p.Signer))
+ }
+
+ _, err = fwd.SetConfig(transactOpts, workflowDonId, configVersion, f, signers)
+ require.NoError(t, err)
+ backend.Commit()
+
+ return addr, fwd
+}
+
+func setupConsumerContract(t *testing.T, transactOpts *bind.TransactOpts, backend *ethBackend,
+ forwarderAddress common.Address, workflowOwner string, workflowName string) (common.Address, *feeds_consumer.KeystoneFeedsConsumer) {
+ addr, _, consumer, err := feeds_consumer.DeployKeystoneFeedsConsumer(transactOpts, backend)
+ require.NoError(t, err)
+ backend.Commit()
+
+ var nameBytes [10]byte
+ copy(nameBytes[:], workflowName)
+
+ ownerAddr := common.HexToAddress(workflowOwner)
+
+ _, err = consumer.SetConfig(transactOpts, []common.Address{forwarderAddress}, []common.Address{ownerAddr}, [][10]byte{nameBytes})
+ require.NoError(t, err)
+
+ backend.Commit()
+
+ return addr, consumer
+}
+
+type ethBackend struct {
+ services.StateMachine
+ *backends.SimulatedBackend
+
+ blockTimeProcessingTime time.Duration
+
+ stopCh services.StopChan
+ wg sync.WaitGroup
+}
+
+func setupBlockchain(t *testing.T, initialEth int, blockTimeProcessingTime time.Duration) (*ethBackend, *bind.TransactOpts) {
+ transactOpts := testutils.MustNewSimTransactor(t) // config contract deployer and owner
+ genesisData := core.GenesisAlloc{transactOpts.From: {Balance: assets.Ether(initialEth).ToInt()}}
+ backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))
+ gethlog.SetDefault(gethlog.NewLogger(gethlog.NewTerminalHandlerWithLevel(os.Stderr, gethlog.LevelWarn, true)))
+ backend.Commit()
+
+ return ðBackend{SimulatedBackend: backend, stopCh: make(services.StopChan),
+ blockTimeProcessingTime: blockTimeProcessingTime}, transactOpts
+}
+
+func (b *ethBackend) Start(ctx context.Context) error {
+ return b.StartOnce("ethBackend", func() error {
+ b.wg.Add(1)
+ go func() {
+ defer b.wg.Done()
+ ticker := time.NewTicker(b.blockTimeProcessingTime)
+ defer ticker.Stop()
+
+ for {
+ select {
+ case <-b.stopCh:
+ return
+ case <-ctx.Done():
+ return
+ case <-ticker.C:
+ b.SimulatedBackend.Commit()
+ }
+ }
+ }()
+
+ return nil
+ })
+}
+
+func (b *ethBackend) Close() error {
+ return b.StopOnce("ethBackend", func() error {
+ close(b.stopCh)
+ b.wg.Wait()
+ return nil
+ })
+}
diff --git a/core/capabilities/integration_tests/mock_dispatcher.go b/core/capabilities/integration_tests/mock_dispatcher.go
new file mode 100644
index 0000000000..f685f0ad2e
--- /dev/null
+++ b/core/capabilities/integration_tests/mock_dispatcher.go
@@ -0,0 +1,195 @@
+package integration_tests
+
+import (
+ "context"
+ "fmt"
+ "sync"
+ "testing"
+ "time"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+ remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
+ p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
+
+ "google.golang.org/protobuf/proto"
+)
+
+// testAsyncMessageBroker backs the dispatchers created for each node in the test and effectively
+// acts as the rageP2P network layer.
+type testAsyncMessageBroker struct {
+ services.StateMachine
+ t *testing.T
+
+ chanBufferSize int
+ stopCh services.StopChan
+ wg sync.WaitGroup
+
+ peerIDToBrokerNode map[p2ptypes.PeerID]*brokerNode
+
+ mux sync.Mutex
+}
+
+func newTestAsyncMessageBroker(t *testing.T, chanBufferSize int) *testAsyncMessageBroker {
+ return &testAsyncMessageBroker{
+ t: t,
+ stopCh: make(services.StopChan),
+ chanBufferSize: chanBufferSize,
+ peerIDToBrokerNode: make(map[p2ptypes.PeerID]*brokerNode),
+ }
+}
+
+func (a *testAsyncMessageBroker) Start(ctx context.Context) error {
+ return a.StartOnce("testAsyncMessageBroker", func() error {
+ return nil
+ })
+}
+
+func (a *testAsyncMessageBroker) Close() error {
+ return a.StopOnce("testAsyncMessageBroker", func() error {
+ close(a.stopCh)
+ a.wg.Wait()
+ return nil
+ })
+}
+
+// NewDispatcherForNode creates a new dispatcher for a node with the given peer ID.
+func (a *testAsyncMessageBroker) NewDispatcherForNode(nodePeerID p2ptypes.PeerID) remotetypes.Dispatcher {
+ return &brokerDispatcher{
+ callerPeerID: nodePeerID,
+ broker: a,
+ }
+}
+
+func (a *testAsyncMessageBroker) HealthReport() map[string]error {
+ return nil
+}
+
+func (a *testAsyncMessageBroker) Name() string {
+ return "testAsyncMessageBroker"
+}
+
+func (a *testAsyncMessageBroker) registerReceiverNode(nodePeerID p2ptypes.PeerID, capabilityId string, capabilityDonID uint32, receiver remotetypes.Receiver) {
+ a.mux.Lock()
+ defer a.mux.Unlock()
+
+ node, ok := a.peerIDToBrokerNode[nodePeerID]
+ if !ok {
+ node = a.newNode()
+ a.peerIDToBrokerNode[nodePeerID] = node
+ }
+
+ node.registerReceiverCh <- ®isterReceiverRequest{
+ receiverKey: receiverKey{
+ capabilityId: capabilityId,
+ donId: capabilityDonID,
+ },
+ receiver: receiver,
+ }
+}
+
+func (a *testAsyncMessageBroker) Send(msg *remotetypes.MessageBody) {
+ peerID := toPeerID(msg.Receiver)
+ node, ok := a.peerIDToBrokerNode[peerID]
+ if !ok {
+ panic(fmt.Sprintf("node not found for peer ID %v", peerID))
+ }
+
+ node.receiveCh <- msg
+}
+
+type brokerNode struct {
+ registerReceiverCh chan *registerReceiverRequest
+ receiveCh chan *remotetypes.MessageBody
+}
+
+type receiverKey struct {
+ capabilityId string
+ donId uint32
+}
+
+type registerReceiverRequest struct {
+ receiverKey
+ receiver remotetypes.Receiver
+}
+
+func (a *testAsyncMessageBroker) newNode() *brokerNode {
+ n := &brokerNode{
+ receiveCh: make(chan *remotetypes.MessageBody, a.chanBufferSize),
+ registerReceiverCh: make(chan *registerReceiverRequest, a.chanBufferSize),
+ }
+
+ a.wg.Add(1)
+ go func() {
+ defer a.wg.Done()
+ receivers := make(map[receiverKey]remotetypes.Receiver)
+ for {
+ select {
+ case <-a.stopCh:
+ return
+ case msg := <-n.receiveCh:
+ k := receiverKey{
+ capabilityId: msg.CapabilityId,
+ donId: msg.CapabilityDonId,
+ }
+
+ r, ok := receivers[k]
+ if !ok {
+ panic(fmt.Sprintf("receiver not found for key %+v", k))
+ }
+
+ r.Receive(tests.Context(a.t), msg)
+ case reg := <-n.registerReceiverCh:
+ receivers[reg.receiverKey] = reg.receiver
+ }
+ }
+ }()
+ return n
+}
+
+func toPeerID(id []byte) p2ptypes.PeerID {
+ return [32]byte(id)
+}
+
+type broker interface {
+ Send(msg *remotetypes.MessageBody)
+}
+
+type brokerDispatcher struct {
+ callerPeerID p2ptypes.PeerID
+ broker broker
+}
+
+func (t *brokerDispatcher) Send(peerID p2ptypes.PeerID, msgBody *remotetypes.MessageBody) error {
+ clonedMsg := proto.Clone(msgBody).(*remotetypes.MessageBody)
+ clonedMsg.Version = 1
+ clonedMsg.Sender = t.callerPeerID[:]
+ clonedMsg.Receiver = peerID[:]
+ clonedMsg.Timestamp = time.Now().UnixMilli()
+ t.broker.Send(clonedMsg)
+ return nil
+}
+
+func (t *brokerDispatcher) SetReceiver(capabilityId string, donId uint32, receiver remotetypes.Receiver) error {
+ t.broker.(*testAsyncMessageBroker).registerReceiverNode(t.callerPeerID, capabilityId, donId, receiver)
+ return nil
+}
+func (t *brokerDispatcher) RemoveReceiver(capabilityId string, donId uint32) {}
+
+func (t *brokerDispatcher) Start(context.Context) error { return nil }
+
+func (t *brokerDispatcher) Close() error {
+ return nil
+}
+
+func (t *brokerDispatcher) Ready() error {
+ return nil
+}
+
+func (t *brokerDispatcher) HealthReport() map[string]error {
+ return nil
+}
+
+func (t *brokerDispatcher) Name() string {
+ return "mockDispatcher"
+}
diff --git a/core/capabilities/integration_tests/mock_libocr.go b/core/capabilities/integration_tests/mock_libocr.go
new file mode 100644
index 0000000000..39c53d48af
--- /dev/null
+++ b/core/capabilities/integration_tests/mock_libocr.go
@@ -0,0 +1,198 @@
+package integration_tests
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "math/rand"
+ "sync"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/libocr/commontypes"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/ocr3"
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
+)
+
+type libocrNode struct {
+ ocr3types.ReportingPlugin[[]byte]
+ *ocr3.ContractTransmitter
+ key ocr2key.KeyBundle
+}
+
+// mockLibOCR is a mock libocr implementation for testing purposes that simulates libocr protocol rounds without having
+// to setup the libocr network
+type mockLibOCR struct {
+ services.StateMachine
+ t *testing.T
+
+ nodes []*libocrNode
+ f uint8
+ protocolRoundInterval time.Duration
+
+ seqNr uint64
+ outcomeCtx ocr3types.OutcomeContext
+
+ stopCh services.StopChan
+ wg sync.WaitGroup
+}
+
+func newMockLibOCR(t *testing.T, f uint8, protocolRoundInterval time.Duration) *mockLibOCR {
+ return &mockLibOCR{
+ t: t,
+ f: f, outcomeCtx: ocr3types.OutcomeContext{
+ SeqNr: 0,
+ PreviousOutcome: nil,
+ Epoch: 0,
+ Round: 0,
+ },
+ protocolRoundInterval: protocolRoundInterval,
+ stopCh: make(services.StopChan),
+ }
+}
+
+func (m *mockLibOCR) Start(ctx context.Context) error {
+ return m.StartOnce("mockLibOCR", func() error {
+ m.wg.Add(1)
+ go func() {
+ defer m.wg.Done()
+
+ ticker := time.NewTicker(m.protocolRoundInterval)
+ defer ticker.Stop()
+
+ for {
+ select {
+ case <-m.stopCh:
+ return
+ case <-ctx.Done():
+ return
+ case <-ticker.C:
+ err := m.simulateProtocolRound(ctx)
+ if err != nil {
+ require.FailNow(m.t, err.Error())
+ }
+ }
+ }
+ }()
+ return nil
+ })
+}
+
+func (m *mockLibOCR) Close() error {
+ return m.StopOnce("mockLibOCR", func() error {
+ close(m.stopCh)
+ m.wg.Wait()
+ return nil
+ })
+}
+
+func (m *mockLibOCR) AddNode(plugin ocr3types.ReportingPlugin[[]byte], transmitter *ocr3.ContractTransmitter, key ocr2key.KeyBundle) {
+ m.nodes = append(m.nodes, &libocrNode{plugin, transmitter, key})
+}
+
+func (m *mockLibOCR) simulateProtocolRound(ctx context.Context) error {
+ // randomly select a leader
+ leader := m.nodes[rand.Intn(len(m.nodes))]
+
+ // get the query
+ query, err := leader.Query(ctx, m.outcomeCtx)
+ if err != nil {
+ return fmt.Errorf("failed to get query: %w", err)
+ }
+
+ var observations []types.AttributedObservation
+ for oracleID, node := range m.nodes {
+ obs, err2 := node.Observation(ctx, m.outcomeCtx, query)
+ if err2 != nil {
+ return fmt.Errorf("failed to get observation: %w", err)
+ }
+
+ observations = append(observations, types.AttributedObservation{
+ Observation: obs,
+ Observer: commontypes.OracleID(oracleID),
+ })
+ }
+
+ var outcomes []ocr3types.Outcome
+ for _, node := range m.nodes {
+ outcome, err2 := node.Outcome(m.outcomeCtx, query, observations)
+ if err2 != nil {
+ return fmt.Errorf("failed to get outcome: %w", err)
+ }
+
+ if len(outcome) == 0 {
+ return nil // wait until all nodes have an outcome for testing purposes
+ }
+
+ outcomes = append(outcomes, outcome)
+ }
+
+ // if all outcomes are equal proceed to reports
+ for _, outcome := range outcomes {
+ if !bytes.Equal(outcome, outcomes[0]) {
+ return nil
+ }
+ }
+
+ reports, err := leader.Reports(0, outcomes[0])
+ if err != nil {
+ return fmt.Errorf("failed to get reports: %w", err)
+ }
+ for _, report := range reports {
+ // create signatures
+ var signatures []types.AttributedOnchainSignature
+ for i, node := range m.nodes {
+ sig, err := node.key.Sign(types.ReportContext{}, report.Report)
+ if err != nil {
+ return fmt.Errorf("failed to sign report: %w", err)
+ }
+
+ signatures = append(signatures, types.AttributedOnchainSignature{
+ Signer: commontypes.OracleID(i),
+ Signature: sig,
+ })
+
+ if uint8(len(signatures)) == m.f+1 {
+ break
+ }
+ }
+
+ for _, node := range m.nodes {
+ accept, err := node.ShouldAcceptAttestedReport(ctx, m.seqNr, report)
+ if err != nil {
+ return fmt.Errorf("failed to check if report should be accepted: %w", err)
+ }
+ if !accept {
+ continue
+ }
+
+ transmit, err := node.ShouldTransmitAcceptedReport(ctx, m.seqNr, report)
+ if err != nil {
+ return fmt.Errorf("failed to check if report should be transmitted: %w", err)
+ }
+
+ if !transmit {
+ continue
+ }
+
+ err = node.Transmit(ctx, types.ConfigDigest{}, 0, report, signatures)
+ if err != nil {
+ return fmt.Errorf("failed to transmit report: %w", err)
+ }
+ }
+
+ m.seqNr++
+ m.outcomeCtx = ocr3types.OutcomeContext{
+ SeqNr: 0,
+ PreviousOutcome: outcomes[0],
+ }
+ }
+
+ return nil
+}
diff --git a/core/capabilities/integration_tests/mock_trigger.go b/core/capabilities/integration_tests/mock_trigger.go
new file mode 100644
index 0000000000..cb673f54ff
--- /dev/null
+++ b/core/capabilities/integration_tests/mock_trigger.go
@@ -0,0 +1,147 @@
+package integration_tests
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+ "sync"
+ "testing"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/datastreams"
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
+)
+
+const triggerID = "streams-trigger@1.0.0"
+
+type reportsSink struct {
+ services.StateMachine
+ triggers []streamsTrigger
+
+ stopCh services.StopChan
+ wg sync.WaitGroup
+}
+
+func newReportsSink() *reportsSink {
+ return &reportsSink{
+ stopCh: make(services.StopChan),
+ }
+}
+
+func (r *reportsSink) Start(ctx context.Context) error {
+ return r.StartOnce("reportsSink", func() error {
+ return nil
+ })
+}
+
+func (r *reportsSink) Close() error {
+ return r.StopOnce("reportsSink", func() error {
+ close(r.stopCh)
+ r.wg.Wait()
+ return nil
+ })
+}
+
+func (r *reportsSink) sendReports(reportList []*datastreams.FeedReport) {
+ for _, trigger := range r.triggers {
+ resp, err := wrapReports(reportList, "1", 12, datastreams.SignersMetadata{})
+ if err != nil {
+ panic(err)
+ }
+ trigger.sendResponse(resp)
+ }
+}
+
+func (r *reportsSink) getNewTrigger(t *testing.T) *streamsTrigger {
+ trigger := streamsTrigger{t: t, toSend: make(chan capabilities.CapabilityResponse, 1000),
+ wg: &r.wg, stopCh: r.stopCh}
+ r.triggers = append(r.triggers, trigger)
+ return &trigger
+}
+
+type streamsTrigger struct {
+ t *testing.T
+ cancel context.CancelFunc
+ toSend chan capabilities.CapabilityResponse
+
+ wg *sync.WaitGroup
+ stopCh services.StopChan
+}
+
+func (s *streamsTrigger) sendResponse(resp capabilities.CapabilityResponse) {
+ s.toSend <- resp
+}
+
+func (s *streamsTrigger) Info(ctx context.Context) (capabilities.CapabilityInfo, error) {
+ return capabilities.MustNewCapabilityInfo(
+ triggerID,
+ capabilities.CapabilityTypeTrigger,
+ "issues a trigger when a report is received.",
+ ), nil
+}
+
+func (s *streamsTrigger) RegisterTrigger(ctx context.Context, request capabilities.CapabilityRequest) (<-chan capabilities.CapabilityResponse, error) {
+ if s.cancel != nil {
+ s.t.Fatal("trigger already registered")
+ }
+
+ responseCh := make(chan capabilities.CapabilityResponse)
+
+ ctxWithCancel, cancel := context.WithCancel(ctx)
+ s.cancel = cancel
+ s.wg.Add(1)
+ go func() {
+ defer s.wg.Done()
+ select {
+ case <-s.stopCh:
+ return
+ case <-ctxWithCancel.Done():
+ return
+ case resp := <-s.toSend:
+ responseCh <- resp
+ }
+ }()
+
+ return responseCh, nil
+}
+
+func (s *streamsTrigger) UnregisterTrigger(ctx context.Context, request capabilities.CapabilityRequest) error {
+ if s.cancel == nil {
+ s.t.Fatal("trigger not registered")
+ }
+
+ s.cancel()
+ s.cancel = nil
+ return nil
+}
+
+func wrapReports(reportList []*datastreams.FeedReport, eventID string, timestamp int64, meta datastreams.SignersMetadata) (capabilities.CapabilityResponse, error) {
+ val, err := values.Wrap(reportList)
+ if err != nil {
+ return capabilities.CapabilityResponse{}, err
+ }
+
+ metaVal, err := values.Wrap(meta)
+ if err != nil {
+ return capabilities.CapabilityResponse{}, err
+ }
+
+ triggerEvent := capabilities.TriggerEvent{
+ TriggerType: triggerID,
+ ID: eventID,
+ Timestamp: strconv.FormatInt(timestamp, 10),
+ Metadata: metaVal,
+ Payload: val,
+ }
+
+ triggerEventMapValue, err := values.WrapMap(triggerEvent)
+ if err != nil {
+ return capabilities.CapabilityResponse{}, fmt.Errorf("failed to wrap trigger event: %w", err)
+ }
+
+ // Create a new CapabilityResponse with the MercuryTriggerEvent
+ return capabilities.CapabilityResponse{
+ Value: triggerEventMapValue,
+ }, nil
+}
diff --git a/core/capabilities/integration_tests/setup.go b/core/capabilities/integration_tests/setup.go
new file mode 100644
index 0000000000..6347d55878
--- /dev/null
+++ b/core/capabilities/integration_tests/setup.go
@@ -0,0 +1,439 @@
+package integration_tests
+
+import (
+ "context"
+ "crypto/rand"
+ "encoding/hex"
+ "fmt"
+ "math/big"
+ "strconv"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/mr-tron/base58"
+ "github.com/stretchr/testify/require"
+ "go.uber.org/zap/zapcore"
+
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
+ ocrTypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
+ "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight"
+
+ commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/ocr3"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/datastreams"
+ "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
+ coretypes "github.com/smartcontractkit/chainlink-common/pkg/types/core"
+ v3 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v3"
+
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities"
+ remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
+ p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/v3/reportcodec"
+)
+
+const (
+ // As a default set the logging to info otherwise 10s/100s of MB of logs are created on each test run
+ TestLogLevel = zapcore.InfoLevel
+)
+
+var (
+ workflowName = "abcdef0123"
+ workflowOwnerID = "0100000000000000000000000000000000000001"
+)
+
+type donInfo struct {
+ commoncap.DON
+ keys []ethkey.KeyV2
+ keyBundles []ocr2key.KeyBundle
+ peerIDs []peer
+}
+
+func setupStreamDonsWithTransmissionSchedule(ctx context.Context, t *testing.T, workflowDonInfo donInfo, triggerDonInfo donInfo, targetDonInfo donInfo,
+ feedCount int, deltaStage string, schedule string) (*feeds_consumer.KeystoneFeedsConsumer, []string, *reportsSink) {
+ lggr := logger.TestLogger(t)
+ lggr.SetLogLevel(TestLogLevel)
+
+ ethBlockchain, transactor := setupBlockchain(t, 1000, 1*time.Second)
+ capabilitiesRegistryAddr := setupCapabilitiesRegistryContract(ctx, t, workflowDonInfo.peerIDs, triggerDonInfo.peerIDs, targetDonInfo.peerIDs, transactor, ethBlockchain)
+ forwarderAddr, _ := setupForwarderContract(t, workflowDonInfo.peerIDs, workflowDonInfo.ID, 1, workflowDonInfo.F, transactor, ethBlockchain)
+ consumerAddr, consumer := setupConsumerContract(t, transactor, ethBlockchain, forwarderAddr, workflowOwnerID, workflowName)
+
+ var feedIDs []string
+ for i := 0; i < feedCount; i++ {
+ feedIDs = append(feedIDs, newFeedID(t))
+ }
+
+ sink := newReportsSink()
+
+ libocr := newMockLibOCR(t, workflowDonInfo.F, 1*time.Second)
+ workflowDonNodes, _, _ := createDons(ctx, t, lggr, sink,
+ workflowDonInfo, triggerDonInfo, targetDonInfo,
+ ethBlockchain, capabilitiesRegistryAddr, forwarderAddr,
+ workflowDonInfo.keyBundles, transactor, libocr)
+ for _, node := range workflowDonNodes {
+ addWorkflowJob(t, node, workflowName, workflowOwnerID, feedIDs, consumerAddr, deltaStage, schedule)
+ }
+
+ servicetest.Run(t, ethBlockchain)
+ servicetest.Run(t, libocr)
+ servicetest.Run(t, sink)
+ return consumer, feedIDs, sink
+}
+
+func createDons(ctx context.Context, t *testing.T, lggr logger.Logger, reportsSink *reportsSink,
+ workflowDon donInfo,
+ triggerDon donInfo,
+ targetDon donInfo,
+ simulatedEthBlockchain *ethBackend,
+ capRegistryAddr common.Address,
+ forwarderAddr common.Address,
+ workflowNodeKeyBundles []ocr2key.KeyBundle,
+ transactor *bind.TransactOpts,
+ libocr *mockLibOCR,
+) ([]*cltest.TestApplication, []*cltest.TestApplication, []*cltest.TestApplication) {
+ broker := newTestAsyncMessageBroker(t, 1000)
+
+ var triggerNodes []*cltest.TestApplication
+ for i, triggerPeer := range triggerDon.Members {
+ triggerPeerDispatcher := broker.NewDispatcherForNode(triggerPeer)
+ nodeInfo := commoncap.Node{
+ PeerID: &triggerPeer,
+ }
+
+ capabilityRegistry := capabilities.NewRegistry(lggr)
+ trigger := reportsSink.getNewTrigger(t)
+ err := capabilityRegistry.Add(ctx, trigger)
+ require.NoError(t, err)
+
+ triggerNode := startNewNode(ctx, t, lggr.Named("Trigger-"+strconv.Itoa(i)), nodeInfo, simulatedEthBlockchain, capRegistryAddr, triggerPeerDispatcher,
+ testPeerWrapper{peer: testPeer{triggerPeer}}, capabilityRegistry, nil, transactor,
+ triggerDon.keys[i])
+
+ require.NoError(t, triggerNode.Start(testutils.Context(t)))
+ triggerNodes = append(triggerNodes, triggerNode)
+ }
+
+ var targetNodes []*cltest.TestApplication
+ for i, targetPeer := range targetDon.Members {
+ targetPeerDispatcher := broker.NewDispatcherForNode(targetPeer)
+ nodeInfo := commoncap.Node{
+ PeerID: &targetPeer,
+ }
+
+ capabilityRegistry := capabilities.NewRegistry(lggr)
+
+ targetNode := startNewNode(ctx, t, lggr.Named("Target-"+strconv.Itoa(i)), nodeInfo, simulatedEthBlockchain, capRegistryAddr, targetPeerDispatcher,
+ testPeerWrapper{peer: testPeer{targetPeer}}, capabilityRegistry, &forwarderAddr, transactor,
+ targetDon.keys[i])
+
+ require.NoError(t, targetNode.Start(testutils.Context(t)))
+ targetNodes = append(triggerNodes, targetNode)
+ }
+
+ var workflowNodes []*cltest.TestApplication
+ for i, workflowPeer := range workflowDon.Members {
+ workflowPeerDispatcher := broker.NewDispatcherForNode(workflowPeer)
+ capabilityRegistry := capabilities.NewRegistry(lggr)
+
+ requestTimeout := 10 * time.Minute
+ cfg := ocr3.Config{
+ Logger: lggr,
+ EncoderFactory: evm.NewEVMEncoder,
+ AggregatorFactory: capabilities.NewAggregator,
+ RequestTimeout: &requestTimeout,
+ }
+
+ ocr3Capability := ocr3.NewOCR3(cfg)
+ servicetest.Run(t, ocr3Capability)
+
+ pluginCfg := coretypes.ReportingPluginServiceConfig{}
+ pluginFactory, err := ocr3Capability.NewReportingPluginFactory(ctx, pluginCfg, nil,
+ nil, nil, nil, capabilityRegistry, nil, nil)
+ require.NoError(t, err)
+
+ repConfig := ocr3types.ReportingPluginConfig{
+ F: int(workflowDon.F),
+ }
+ plugin, _, err := pluginFactory.NewReportingPlugin(repConfig)
+ require.NoError(t, err)
+
+ transmitter := ocr3.NewContractTransmitter(lggr, capabilityRegistry, "")
+
+ libocr.AddNode(plugin, transmitter, workflowNodeKeyBundles[i])
+
+ nodeInfo := commoncap.Node{
+ PeerID: &workflowPeer,
+ WorkflowDON: workflowDon.DON,
+ CapabilityDONs: []commoncap.DON{triggerDon.DON, targetDon.DON},
+ }
+
+ workflowNode := startNewNode(ctx, t, lggr.Named("Workflow-"+strconv.Itoa(i)), nodeInfo, simulatedEthBlockchain, capRegistryAddr, workflowPeerDispatcher,
+ testPeerWrapper{peer: testPeer{workflowPeer}}, capabilityRegistry, nil, transactor,
+ workflowDon.keys[i])
+
+ require.NoError(t, workflowNode.Start(testutils.Context(t)))
+ workflowNodes = append(workflowNodes, workflowNode)
+ }
+
+ servicetest.Run(t, broker)
+
+ return workflowNodes, triggerNodes, targetNodes
+}
+
+func startNewNode(ctx context.Context,
+ t *testing.T, lggr logger.Logger, nodeInfo commoncap.Node,
+ backend *ethBackend, capRegistryAddr common.Address,
+ dispatcher remotetypes.Dispatcher,
+ peerWrapper p2ptypes.PeerWrapper,
+ localCapabilities *capabilities.Registry,
+ forwarderAddress *common.Address,
+ transactor *bind.TransactOpts,
+ keyV2 ethkey.KeyV2,
+) *cltest.TestApplication {
+ config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.Capabilities.ExternalRegistry.ChainID = ptr(fmt.Sprintf("%d", testutils.SimulatedChainID))
+ c.Capabilities.ExternalRegistry.Address = ptr(capRegistryAddr.String())
+ c.Capabilities.Peering.V2.Enabled = ptr(true)
+
+ if forwarderAddress != nil {
+ eip55Address := types.EIP55AddressFromAddress(*forwarderAddress)
+ c.EVM[0].Chain.Workflow.ForwarderAddress = &eip55Address
+ c.EVM[0].Chain.Workflow.FromAddress = &keyV2.EIP55Address
+ }
+
+ c.Feature.FeedsManager = ptr(false)
+ })
+
+ n, err := backend.NonceAt(ctx, transactor.From, nil)
+ require.NoError(t, err)
+
+ tx := cltest.NewLegacyTransaction(
+ n, keyV2.Address,
+ assets.Ether(1).ToInt(),
+ 21000,
+ assets.GWei(1).ToInt(),
+ nil)
+ signedTx, err := transactor.Signer(transactor.From, tx)
+ require.NoError(t, err)
+ err = backend.SendTransaction(ctx, signedTx)
+ require.NoError(t, err)
+ backend.Commit()
+
+ return cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, backend.SimulatedBackend, nodeInfo,
+ dispatcher, peerWrapper, localCapabilities, keyV2, lggr)
+}
+
+type don struct {
+ id uint32
+ numNodes int
+ f uint8
+}
+
+func createDonInfo(t *testing.T, don don) donInfo {
+ keyBundles, peerIDs := getKeyBundlesAndPeerIDs(t, don.numNodes)
+
+ donPeers := make([]p2ptypes.PeerID, len(peerIDs))
+ var donKeys []ethkey.KeyV2
+ for i := 0; i < len(peerIDs); i++ {
+ peerID := p2ptypes.PeerID{}
+ require.NoError(t, peerID.UnmarshalText([]byte(peerIDs[i].PeerID)))
+ donPeers[i] = peerID
+ newKey, err := ethkey.NewV2()
+ require.NoError(t, err)
+ donKeys = append(donKeys, newKey)
+ }
+
+ triggerDonInfo := donInfo{
+ DON: commoncap.DON{
+ ID: don.id,
+ Members: donPeers,
+ F: don.f,
+ },
+ peerIDs: peerIDs,
+ keys: donKeys,
+ keyBundles: keyBundles,
+ }
+ return triggerDonInfo
+}
+
+func createFeedReport(t *testing.T, price *big.Int, observationTimestamp int64,
+ feedIDString string,
+ keyBundles []ocr2key.KeyBundle) *datastreams.FeedReport {
+ reportCtx := ocrTypes.ReportContext{}
+ rawCtx := RawReportContext(reportCtx)
+
+ bytes, err := hex.DecodeString(feedIDString[2:])
+ require.NoError(t, err)
+ var feedIDBytes [32]byte
+ copy(feedIDBytes[:], bytes)
+
+ report := &datastreams.FeedReport{
+ FeedID: feedIDString,
+ FullReport: newReport(t, feedIDBytes, price, observationTimestamp),
+ BenchmarkPrice: price.Bytes(),
+ ObservationTimestamp: observationTimestamp,
+ Signatures: [][]byte{},
+ ReportContext: rawCtx,
+ }
+
+ for _, key := range keyBundles {
+ sig, err := key.Sign(reportCtx, report.FullReport)
+ require.NoError(t, err)
+ report.Signatures = append(report.Signatures, sig)
+ }
+
+ return report
+}
+
+func getKeyBundlesAndPeerIDs(t *testing.T, numNodes int) ([]ocr2key.KeyBundle, []peer) {
+ var keyBundles []ocr2key.KeyBundle
+ var donPeerIDs []peer
+ for i := 0; i < numNodes; i++ {
+ peerID := NewPeerID()
+
+ keyBundle, err := ocr2key.New(chaintype.EVM)
+ require.NoError(t, err)
+ keyBundles = append(keyBundles, keyBundle)
+
+ pk := keyBundle.PublicKey()
+
+ p := peer{
+ PeerID: peerID,
+ Signer: fmt.Sprintf("0x%x", pk),
+ }
+
+ donPeerIDs = append(donPeerIDs, p)
+ }
+ return keyBundles, donPeerIDs
+}
+
+func newFeedID(t *testing.T) string {
+ buf := [32]byte{}
+ _, err := rand.Read(buf[:])
+ require.NoError(t, err)
+ return "0x" + hex.EncodeToString(buf[:])
+}
+
+func newReport(t *testing.T, feedID [32]byte, price *big.Int, timestamp int64) []byte {
+ v3Codec := reportcodec.NewReportCodec(feedID, logger.TestLogger(t))
+ raw, err := v3Codec.BuildReport(v3.ReportFields{
+ BenchmarkPrice: price,
+ Timestamp: uint32(timestamp),
+ Bid: big.NewInt(0),
+ Ask: big.NewInt(0),
+ LinkFee: big.NewInt(0),
+ NativeFee: big.NewInt(0),
+ })
+ require.NoError(t, err)
+ return raw
+}
+
+type testPeerWrapper struct {
+ peer testPeer
+}
+
+func (t testPeerWrapper) Start(ctx context.Context) error {
+ return nil
+}
+
+func (t testPeerWrapper) Close() error {
+ return nil
+}
+
+func (t testPeerWrapper) Ready() error {
+ return nil
+}
+
+func (t testPeerWrapper) HealthReport() map[string]error {
+ return nil
+}
+
+func (t testPeerWrapper) Name() string {
+ return "testPeerWrapper"
+}
+
+func (t testPeerWrapper) GetPeer() p2ptypes.Peer {
+ return t.peer
+}
+
+type testPeer struct {
+ id p2ptypes.PeerID
+}
+
+func (t testPeer) Start(ctx context.Context) error {
+ return nil
+}
+
+func (t testPeer) Close() error {
+ return nil
+}
+
+func (t testPeer) Ready() error {
+ return nil
+}
+
+func (t testPeer) HealthReport() map[string]error {
+ return nil
+}
+
+func (t testPeer) Name() string {
+ return "testPeer"
+}
+
+func (t testPeer) ID() p2ptypes.PeerID {
+ return t.id
+}
+
+func (t testPeer) UpdateConnections(peers map[p2ptypes.PeerID]p2ptypes.StreamConfig) error {
+ return nil
+}
+
+func (t testPeer) Send(peerID p2ptypes.PeerID, msg []byte) error {
+ return nil
+}
+
+func (t testPeer) Receive() <-chan p2ptypes.Message {
+ return nil
+}
+
+func NewPeerID() string {
+ var privKey [32]byte
+ _, err := rand.Read(privKey[:])
+ if err != nil {
+ panic(err)
+ }
+
+ peerID := append(libp2pMagic(), privKey[:]...)
+
+ return base58.Encode(peerID[:])
+}
+
+func libp2pMagic() []byte {
+ return []byte{0x00, 0x24, 0x08, 0x01, 0x12, 0x20}
+}
+
+func ptr[T any](t T) *T { return &t }
+
+func RawReportContext(reportCtx ocrTypes.ReportContext) []byte {
+ rc := evmutil.RawReportContext(reportCtx)
+ flat := []byte{}
+ for _, r := range rc {
+ flat = append(flat, r[:]...)
+ }
+ return flat
+}
diff --git a/core/capabilities/integration_tests/streams_test.go b/core/capabilities/integration_tests/streams_test.go
new file mode 100644
index 0000000000..6216e36c85
--- /dev/null
+++ b/core/capabilities/integration_tests/streams_test.go
@@ -0,0 +1,99 @@
+package integration_tests
+
+import (
+ "context"
+ "encoding/hex"
+ "math/big"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/datastreams"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ reporttypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/v3/types"
+)
+
+func Test_AllAtOnceTransmissionSchedule(t *testing.T) {
+ ctx := testutils.Context(t)
+
+ // The don IDs set in the below calls are inferred from the order in which the dons are added to the capabilities registry
+ // in the setupCapabilitiesRegistryContract function, should this order change the don IDs will need updating.
+ workflowDonInfo := createDonInfo(t, don{id: 1, numNodes: 5, f: 1})
+ triggerDonInfo := createDonInfo(t, don{id: 2, numNodes: 7, f: 1})
+ targetDonInfo := createDonInfo(t, don{id: 3, numNodes: 4, f: 1})
+
+ consumer, feedIDs, triggerSink := setupStreamDonsWithTransmissionSchedule(ctx, t, workflowDonInfo, triggerDonInfo, targetDonInfo, 3,
+ "2s", "allAtOnce")
+
+ reports := []*datastreams.FeedReport{
+ createFeedReport(t, big.NewInt(1), 5, feedIDs[0], triggerDonInfo.keyBundles),
+ createFeedReport(t, big.NewInt(3), 7, feedIDs[1], triggerDonInfo.keyBundles),
+ createFeedReport(t, big.NewInt(2), 6, feedIDs[2], triggerDonInfo.keyBundles),
+ }
+
+ triggerSink.sendReports(reports)
+
+ waitForConsumerReports(ctx, t, consumer, reports)
+}
+
+func Test_OneAtATimeTransmissionSchedule(t *testing.T) {
+ ctx := testutils.Context(t)
+
+ // The don IDs set in the below calls are inferred from the order in which the dons are added to the capabilities registry
+ // in the setupCapabilitiesRegistryContract function, should this order change the don IDs will need updating.
+ workflowDonInfo := createDonInfo(t, don{id: 1, numNodes: 5, f: 1})
+ triggerDonInfo := createDonInfo(t, don{id: 2, numNodes: 7, f: 1})
+ targetDonInfo := createDonInfo(t, don{id: 3, numNodes: 4, f: 1})
+
+ consumer, feedIDs, triggerSink := setupStreamDonsWithTransmissionSchedule(ctx, t, workflowDonInfo, triggerDonInfo, targetDonInfo, 3,
+ "2s", "oneAtATime")
+
+ reports := []*datastreams.FeedReport{
+ createFeedReport(t, big.NewInt(1), 5, feedIDs[0], triggerDonInfo.keyBundles),
+ createFeedReport(t, big.NewInt(3), 7, feedIDs[1], triggerDonInfo.keyBundles),
+ createFeedReport(t, big.NewInt(2), 6, feedIDs[2], triggerDonInfo.keyBundles),
+ }
+
+ triggerSink.sendReports(reports)
+
+ waitForConsumerReports(ctx, t, consumer, reports)
+}
+
+func waitForConsumerReports(ctx context.Context, t *testing.T, consumer *feeds_consumer.KeystoneFeedsConsumer, triggerFeedReports []*datastreams.FeedReport) {
+ feedsReceived := make(chan *feeds_consumer.KeystoneFeedsConsumerFeedReceived, 1000)
+ feedsSub, err := consumer.WatchFeedReceived(&bind.WatchOpts{}, feedsReceived, nil)
+ require.NoError(t, err)
+
+ feedToReport := map[string]*datastreams.FeedReport{}
+ for _, report := range triggerFeedReports {
+ feedToReport[report.FeedID] = report
+ }
+
+ ctxWithTimeout, cancel := context.WithTimeout(ctx, 5*time.Minute)
+ defer cancel()
+ feedCount := 0
+ for {
+ select {
+ case <-ctxWithTimeout.Done():
+ t.Fatalf("timed out waiting for feed reports, expected %d, received %d", len(triggerFeedReports), feedCount)
+ case err := <-feedsSub.Err():
+ require.NoError(t, err)
+ case feed := <-feedsReceived:
+ feedID := "0x" + hex.EncodeToString(feed.FeedId[:])
+ report := feedToReport[feedID]
+ decodedReport, err := reporttypes.Decode(report.FullReport)
+ require.NoError(t, err)
+ assert.Equal(t, decodedReport.BenchmarkPrice, feed.Price)
+ assert.Equal(t, decodedReport.ObservationsTimestamp, feed.Timestamp)
+
+ feedCount++
+ if feedCount == len(triggerFeedReports) {
+ return
+ }
+ }
+ }
+}
diff --git a/core/capabilities/integration_tests/workflow.go b/core/capabilities/integration_tests/workflow.go
new file mode 100644
index 0000000000..d116a1ec63
--- /dev/null
+++ b/core/capabilities/integration_tests/workflow.go
@@ -0,0 +1,75 @@
+package integration_tests
+
+import (
+ "fmt"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/testdata/testspecs"
+)
+
+const hardcodedWorkflow = `
+name: "%s"
+owner: "0x%s"
+triggers:
+ - id: "streams-trigger@1.0.0"
+ config:
+ feedIds:
+%s
+
+consensus:
+ - id: "offchain_reporting@1.0.0"
+ ref: "evm_median"
+ inputs:
+ observations:
+ - "$(trigger.outputs)"
+ config:
+ report_id: "0001"
+ aggregation_method: "data_feeds"
+ aggregation_config:
+ feeds:
+%s
+ encoder: "EVM"
+ encoder_config:
+ abi: "(bytes32 FeedID, uint224 Price, uint32 Timestamp)[] Reports"
+
+targets:
+ - id: "write_geth-testnet@1.0.0"
+ inputs:
+ signed_report: "$(evm_median.outputs)"
+ config:
+ address: "%s"
+ params: ["$(report)"]
+ abi: "receive(report bytes)"
+ deltaStage: %s
+ schedule: %s
+`
+
+func addWorkflowJob(t *testing.T, app *cltest.TestApplication,
+ workflowName string,
+ workflowOwner string,
+ feedIDs []string,
+ consumerAddr common.Address,
+ deltaStage string,
+ schedule string) {
+ triggerFeedIDs := ""
+ for _, feedID := range feedIDs {
+ triggerFeedIDs += fmt.Sprintf(" - \"%s\"\n", feedID)
+ }
+
+ aggregationFeeds := ""
+ for _, feedID := range feedIDs {
+ aggregationFeeds += fmt.Sprintf(" \"%s\":\n deviation: \"0.001\"\n heartbeat: 3600\n", feedID)
+ }
+
+ workflowJobSpec := testspecs.GenerateWorkflowJobSpec(t, fmt.Sprintf(hardcodedWorkflow, workflowName, workflowOwner, triggerFeedIDs, aggregationFeeds,
+ consumerAddr.String(), deltaStage, schedule))
+ job := workflowJobSpec.Job()
+
+ err := app.AddJobV2(testutils.Context(t), &job)
+ require.NoError(t, err)
+}
diff --git a/core/capabilities/launcher.go b/core/capabilities/launcher.go
index 267e32055e..b4ade04127 100644
--- a/core/capabilities/launcher.go
+++ b/core/capabilities/launcher.go
@@ -7,12 +7,9 @@ import (
"strings"
"time"
- "google.golang.org/protobuf/proto"
-
"github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/triggers"
"github.com/smartcontractkit/chainlink-common/pkg/services"
- "github.com/smartcontractkit/chainlink-common/pkg/types/core"
"github.com/smartcontractkit/libocr/ragep2p"
ragetypes "github.com/smartcontractkit/libocr/ragep2p/types"
@@ -21,7 +18,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/target"
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/streams"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/logger"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
"github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer"
@@ -46,8 +42,7 @@ type launcher struct {
lggr logger.Logger
peerWrapper p2ptypes.PeerWrapper
dispatcher remotetypes.Dispatcher
- registry core.CapabilitiesRegistry
- localNode capabilities.Node
+ registry *Registry
subServices []services.Service
}
@@ -55,7 +50,7 @@ func NewLauncher(
lggr logger.Logger,
peerWrapper p2ptypes.PeerWrapper,
dispatcher remotetypes.Dispatcher,
- registry core.CapabilitiesRegistry,
+ registry *Registry,
) *launcher {
return &launcher{
lggr: lggr.Named("CapabilitiesLauncher"),
@@ -92,50 +87,8 @@ func (w *launcher) Name() string {
return "CapabilitiesLauncher"
}
-func (w *launcher) LocalNode(ctx context.Context) (capabilities.Node, error) {
- if w.peerWrapper.GetPeer() == nil {
- return w.localNode, errors.New("unable to get local node: peerWrapper hasn't started yet")
- }
-
- if w.localNode.WorkflowDON.ID == 0 {
- return w.localNode, errors.New("unable to get local node: waiting for initial call from syncer")
- }
-
- return w.localNode, nil
-}
-
-func (w *launcher) updateLocalNode(state registrysyncer.State) {
- pid := w.peerWrapper.GetPeer().ID()
-
- var workflowDON capabilities.DON
- capabilityDONs := []capabilities.DON{}
- for _, d := range state.IDsToDONs {
- for _, p := range d.NodeP2PIds {
- if p == pid {
- if d.AcceptsWorkflows {
- if workflowDON.ID == 0 {
- workflowDON = *toDONInfo(d)
- w.lggr.Debug("Workflow DON identified: %+v", workflowDON)
- } else {
- w.lggr.Errorf("Configuration error: node %s belongs to more than one workflowDON", pid)
- }
- }
-
- capabilityDONs = append(capabilityDONs, *toDONInfo(d))
- }
- }
- }
-
- w.localNode = capabilities.Node{
- PeerID: &pid,
- WorkflowDON: workflowDON,
- CapabilityDONs: capabilityDONs,
- }
-}
-
-func (w *launcher) Launch(ctx context.Context, state registrysyncer.State) error {
- w.lggr.Debugw("running capabilities launcher", "state", state)
- w.updateLocalNode(state)
+func (w *launcher) Launch(ctx context.Context, state *registrysyncer.LocalRegistry) error {
+ w.registry.SetLocalRegistry(state)
// Let's start by updating the list of Peers
// We do this by creating a new entry for each node belonging
@@ -143,15 +96,15 @@ func (w *launcher) Launch(ctx context.Context, state registrysyncer.State) error
// We also add the hardcoded peers determined by the NetworkSetup.
allPeers := make(map[ragetypes.PeerID]p2ptypes.StreamConfig)
- publicDONs := []kcr.CapabilitiesRegistryDONInfo{}
+ publicDONs := []registrysyncer.DON{}
for _, d := range state.IDsToDONs {
- if !d.IsPublic {
+ if !d.DON.IsPublic {
continue
}
publicDONs = append(publicDONs, d)
- for _, nid := range d.NodeP2PIds {
+ for _, nid := range d.DON.Members {
allPeers[nid] = defaultStreamConfig
}
}
@@ -171,18 +124,18 @@ func (w *launcher) Launch(ctx context.Context, state registrysyncer.State) error
// We'll also construct a set to record what DONs the current node is a part of,
// regardless of any modifiers (public/acceptsWorkflows etc).
myID := w.peerWrapper.GetPeer().ID()
- myWorkflowDONs := []kcr.CapabilitiesRegistryDONInfo{}
- remoteWorkflowDONs := []kcr.CapabilitiesRegistryDONInfo{}
+ myWorkflowDONs := []registrysyncer.DON{}
+ remoteWorkflowDONs := []registrysyncer.DON{}
myDONs := map[uint32]bool{}
for _, d := range state.IDsToDONs {
- for _, peerID := range d.NodeP2PIds {
+ for _, peerID := range d.Members {
if peerID == myID {
- myDONs[d.Id] = true
+ myDONs[d.ID] = true
}
}
if d.AcceptsWorkflows {
- if myDONs[d.Id] {
+ if myDONs[d.ID] {
myWorkflowDONs = append(myWorkflowDONs, d)
} else {
remoteWorkflowDONs = append(remoteWorkflowDONs, d)
@@ -192,11 +145,11 @@ func (w *launcher) Launch(ctx context.Context, state registrysyncer.State) error
// - remote capability DONs (with IsPublic = true) the current node is a part of.
// These need server-side shims.
- myCapabilityDONs := []kcr.CapabilitiesRegistryDONInfo{}
- remoteCapabilityDONs := []kcr.CapabilitiesRegistryDONInfo{}
+ myCapabilityDONs := []registrysyncer.DON{}
+ remoteCapabilityDONs := []registrysyncer.DON{}
for _, d := range publicDONs {
if len(d.CapabilityConfigurations) > 0 {
- if myDONs[d.Id] {
+ if myDONs[d.ID] {
myCapabilityDONs = append(myCapabilityDONs, d)
} else {
remoteCapabilityDONs = append(remoteCapabilityDONs, d)
@@ -236,14 +189,14 @@ func (w *launcher) Launch(ctx context.Context, state registrysyncer.State) error
return nil
}
-func (w *launcher) addRemoteCapabilities(ctx context.Context, myDON kcr.CapabilitiesRegistryDONInfo, remoteDON kcr.CapabilitiesRegistryDONInfo, state registrysyncer.State) error {
- for _, c := range remoteDON.CapabilityConfigurations {
- capability, ok := state.IDsToCapabilities[c.CapabilityId]
+func (w *launcher) addRemoteCapabilities(ctx context.Context, myDON registrysyncer.DON, remoteDON registrysyncer.DON, state *registrysyncer.LocalRegistry) error {
+ for cid, c := range remoteDON.CapabilityConfigurations {
+ capability, ok := state.IDsToCapabilities[cid]
if !ok {
- return fmt.Errorf("could not find capability matching id %s", c.CapabilityId)
+ return fmt.Errorf("could not find capability matching id %s", cid)
}
- switch toCapabilityType(capability.CapabilityType) {
+ switch capability.CapabilityType {
case capabilities.CapabilityTypeTrigger:
newTriggerFn := func(info capabilities.CapabilityInfo) (capabilityService, error) {
if !strings.HasPrefix(info.ID, "streams-trigger") {
@@ -263,12 +216,6 @@ func (w *launcher) addRemoteCapabilities(ctx context.Context, myDON kcr.Capabili
int(remoteDON.F+1),
w.lggr,
)
- cfg := &remotetypes.RemoteTriggerConfig{}
- cfg.ApplyDefaults()
- err = proto.Unmarshal(c.Config, cfg)
- if err != nil {
- return nil, err
- }
// TODO: We need to implement a custom, Mercury-specific
// aggregator here, because there is no guarantee that
// all trigger events in the workflow will have the same
@@ -276,10 +223,10 @@ func (w *launcher) addRemoteCapabilities(ctx context.Context, myDON kcr.Capabili
// When this is solved, we can move to a generic aggregator
// and remove this.
triggerCap := remote.NewTriggerSubscriber(
- cfg,
+ c.RemoteTriggerConfig,
info,
- *toDONInfo(remoteDON),
- *toDONInfo(myDON),
+ remoteDON.DON,
+ myDON.DON,
w.dispatcher,
aggregator,
w.lggr,
@@ -298,7 +245,7 @@ func (w *launcher) addRemoteCapabilities(ctx context.Context, myDON kcr.Capabili
newTargetFn := func(info capabilities.CapabilityInfo) (capabilityService, error) {
client := target.NewClient(
info,
- *toDONInfo(myDON),
+ myDON.DON,
w.dispatcher,
defaultTargetRequestTimeout,
w.lggr,
@@ -323,24 +270,24 @@ type capabilityService interface {
services.Service
}
-func (w *launcher) addToRegistryAndSetDispatcher(ctx context.Context, capabilityInfo kcr.CapabilitiesRegistryCapabilityInfo, don kcr.CapabilitiesRegistryDONInfo, newCapFn func(info capabilities.CapabilityInfo) (capabilityService, error)) error {
- fullCapID := fmt.Sprintf("%s@%s", capabilityInfo.LabelledName, capabilityInfo.Version)
+func (w *launcher) addToRegistryAndSetDispatcher(ctx context.Context, capability registrysyncer.Capability, don registrysyncer.DON, newCapFn func(info capabilities.CapabilityInfo) (capabilityService, error)) error {
+ capabilityID := capability.ID
info, err := capabilities.NewRemoteCapabilityInfo(
- fullCapID,
- toCapabilityType(capabilityInfo.CapabilityType),
- fmt.Sprintf("Remote Capability for %s", fullCapID),
- toDONInfo(don),
+ capabilityID,
+ capability.CapabilityType,
+ fmt.Sprintf("Remote Capability for %s", capabilityID),
+ &don.DON,
)
if err != nil {
return fmt.Errorf("failed to create remote capability info: %w", err)
}
w.lggr.Debugw("Adding remote capability to registry", "id", info.ID, "don", info.DON)
- capability, err := newCapFn(info)
+ cp, err := newCapFn(info)
if err != nil {
return fmt.Errorf("failed to instantiate capability: %w", err)
}
- err = w.registry.Add(ctx, capability)
+ err = w.registry.Add(ctx, cp)
if err != nil {
// If the capability already exists, then it's either local
// or we've handled this in a previous syncer iteration,
@@ -353,19 +300,19 @@ func (w *launcher) addToRegistryAndSetDispatcher(ctx context.Context, capability
}
err = w.dispatcher.SetReceiver(
- fullCapID,
- don.Id,
- capability,
+ capabilityID,
+ don.ID,
+ cp,
)
if err != nil {
return err
}
- w.lggr.Debugw("Setting receiver for capability", "id", fullCapID, "donID", don.Id)
- err = capability.Start(ctx)
+ w.lggr.Debugw("Setting receiver for capability", "id", capabilityID, "donID", don.ID)
+ err = cp.Start(ctx)
if err != nil {
return fmt.Errorf("failed to start capability: %w", err)
}
- w.subServices = append(w.subServices, capability)
+ w.subServices = append(w.subServices, cp)
return nil
}
@@ -373,32 +320,26 @@ var (
defaultTargetRequestTimeout = time.Minute
)
-func (w *launcher) exposeCapabilities(ctx context.Context, myPeerID p2ptypes.PeerID, don kcr.CapabilitiesRegistryDONInfo, state registrysyncer.State, remoteWorkflowDONs []kcr.CapabilitiesRegistryDONInfo) error {
+func (w *launcher) exposeCapabilities(ctx context.Context, myPeerID p2ptypes.PeerID, don registrysyncer.DON, state *registrysyncer.LocalRegistry, remoteWorkflowDONs []registrysyncer.DON) error {
idsToDONs := map[uint32]capabilities.DON{}
for _, d := range remoteWorkflowDONs {
- idsToDONs[d.Id] = *toDONInfo(d)
+ idsToDONs[d.ID] = d.DON
}
- for _, c := range don.CapabilityConfigurations {
- capability, ok := state.IDsToCapabilities[c.CapabilityId]
+ for cid, c := range don.CapabilityConfigurations {
+ capability, ok := state.IDsToCapabilities[cid]
if !ok {
- return fmt.Errorf("could not find capability matching id %s", c.CapabilityId)
+ return fmt.Errorf("could not find capability matching id %s", cid)
}
- switch toCapabilityType(capability.CapabilityType) {
+ switch capability.CapabilityType {
case capabilities.CapabilityTypeTrigger:
newTriggerPublisher := func(capability capabilities.BaseCapability, info capabilities.CapabilityInfo) (receiverService, error) {
- cfg := &remotetypes.RemoteTriggerConfig{}
- cfg.ApplyDefaults()
- err := proto.Unmarshal(c.Config, cfg)
- if err != nil {
- return nil, err
- }
publisher := remote.NewTriggerPublisher(
- cfg,
+ c.RemoteTriggerConfig,
capability.(capabilities.TriggerCapability),
info,
- *toDONInfo(don),
+ don.DON,
idsToDONs,
w.dispatcher,
w.lggr,
@@ -420,7 +361,7 @@ func (w *launcher) exposeCapabilities(ctx context.Context, myPeerID p2ptypes.Pee
myPeerID,
capability.(capabilities.TargetCapability),
info,
- *toDONInfo(don),
+ don.DON,
idsToDONs,
w.dispatcher,
defaultTargetRequestTimeout,
@@ -444,18 +385,18 @@ type receiverService interface {
remotetypes.Receiver
}
-func (w *launcher) addReceiver(ctx context.Context, capability kcr.CapabilitiesRegistryCapabilityInfo, don kcr.CapabilitiesRegistryDONInfo, newReceiverFn func(capability capabilities.BaseCapability, info capabilities.CapabilityInfo) (receiverService, error)) error {
- fullCapID := fmt.Sprintf("%s@%s", capability.LabelledName, capability.Version)
+func (w *launcher) addReceiver(ctx context.Context, capability registrysyncer.Capability, don registrysyncer.DON, newReceiverFn func(capability capabilities.BaseCapability, info capabilities.CapabilityInfo) (receiverService, error)) error {
+ capID := capability.ID
info, err := capabilities.NewRemoteCapabilityInfo(
- fullCapID,
- toCapabilityType(capability.CapabilityType),
- fmt.Sprintf("Remote Capability for %s", fullCapID),
- toDONInfo(don),
+ capID,
+ capability.CapabilityType,
+ fmt.Sprintf("Remote Capability for %s", capability.ID),
+ &don.DON,
)
if err != nil {
return fmt.Errorf("failed to instantiate remote capability for receiver: %w", err)
}
- underlying, err := w.registry.Get(ctx, fullCapID)
+ underlying, err := w.registry.Get(ctx, capability.ID)
if err != nil {
return fmt.Errorf("failed to get capability from registry: %w", err)
}
@@ -465,12 +406,12 @@ func (w *launcher) addReceiver(ctx context.Context, capability kcr.CapabilitiesR
return fmt.Errorf("failed to instantiate receiver: %w", err)
}
- w.lggr.Debugw("Enabling external access for capability", "id", fullCapID, "donID", don.Id)
- err = w.dispatcher.SetReceiver(fullCapID, don.Id, receiver)
+ w.lggr.Debugw("Enabling external access for capability", "id", capID, "donID", don.ID)
+ err = w.dispatcher.SetReceiver(capID, don.ID, receiver)
if errors.Is(err, remote.ErrReceiverExists) {
// If a receiver already exists, let's log the error for debug purposes, but
// otherwise short-circuit here. We've handled this capability in a previous iteration.
- w.lggr.Debugf("receiver already exists for cap ID %s and don ID %d: %s", fullCapID, don.Id, err)
+ w.lggr.Debugf("receiver already exists for cap ID %s and don ID %d: %s", capID, don.ID, err)
return nil
} else if err != nil {
return fmt.Errorf("failed to set receiver: %w", err)
@@ -485,9 +426,9 @@ func (w *launcher) addReceiver(ctx context.Context, capability kcr.CapabilitiesR
return nil
}
-func signersFor(don kcr.CapabilitiesRegistryDONInfo, state registrysyncer.State) ([][]byte, error) {
+func signersFor(don registrysyncer.DON, state *registrysyncer.LocalRegistry) ([][]byte, error) {
s := [][]byte{}
- for _, nodeID := range don.NodeP2PIds {
+ for _, nodeID := range don.Members {
node, ok := state.IDsToNodes[nodeID]
if !ok {
return nil, fmt.Errorf("could not find node for id %s", nodeID)
@@ -500,33 +441,3 @@ func signersFor(don kcr.CapabilitiesRegistryDONInfo, state registrysyncer.State)
return s, nil
}
-
-func toDONInfo(don kcr.CapabilitiesRegistryDONInfo) *capabilities.DON {
- peerIDs := []p2ptypes.PeerID{}
- for _, p := range don.NodeP2PIds {
- peerIDs = append(peerIDs, p)
- }
-
- return &capabilities.DON{
- ID: don.Id,
- ConfigVersion: don.ConfigCount,
- Members: peerIDs,
- F: don.F,
- }
-}
-
-func toCapabilityType(capabilityType uint8) capabilities.CapabilityType {
- switch capabilityType {
- case 0:
- return capabilities.CapabilityTypeTrigger
- case 1:
- return capabilities.CapabilityTypeAction
- case 2:
- return capabilities.CapabilityTypeConsensus
- case 3:
- return capabilities.CapabilityTypeTarget
- default:
- // Not found
- return capabilities.CapabilityType(-1)
- }
-}
diff --git a/core/capabilities/launcher_test.go b/core/capabilities/launcher_test.go
index d314be6069..fb3e6837d0 100644
--- a/core/capabilities/launcher_test.go
+++ b/core/capabilities/launcher_test.go
@@ -78,7 +78,7 @@ func TestLauncher_WiresUpExternalCapabilities(t *testing.T) {
wrapper := mocks.NewPeerWrapper(t)
wrapper.On("GetPeer").Return(peer)
- nodes := [][32]byte{
+ nodes := []ragetypes.PeerID{
pid,
randomWord(),
randomWord(),
@@ -110,37 +110,31 @@ func TestLauncher_WiresUpExternalCapabilities(t *testing.T) {
// which exposes the streams-trigger and write_chain capabilities.
// We expect a publisher to be wired up with this configuration, and
// no entries should be added to the registry.
- state := registrysyncer.State{
- IDsToDONs: map[registrysyncer.DonID]kcr.CapabilitiesRegistryDONInfo{
+ state := ®istrysyncer.LocalRegistry{
+ IDsToDONs: map[registrysyncer.DonID]registrysyncer.DON{
registrysyncer.DonID(dID): {
- Id: dID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: true,
- NodeP2PIds: nodes,
- CapabilityConfigurations: []kcr.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: triggerCapID,
- Config: []byte(""),
- },
- {
- CapabilityId: targetCapID,
- Config: []byte(""),
- },
+ DON: capabilities.DON{
+ ID: dID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: true,
+ Members: nodes,
+ },
+ CapabilityConfigurations: map[string]capabilities.CapabilityConfiguration{
+ fullTriggerCapID: {},
+ fullTargetID: {},
},
},
},
- IDsToCapabilities: map[registrysyncer.HashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{
- triggerCapID: {
- LabelledName: "streams-trigger",
- Version: "1.0.0",
- CapabilityType: 0,
+ IDsToCapabilities: map[string]registrysyncer.Capability{
+ fullTriggerCapID: {
+ ID: "streams-trigger@1.0.0",
+ CapabilityType: capabilities.CapabilityTypeTrigger,
},
- targetCapID: {
- LabelledName: "write-chain_evm_1",
- Version: "1.0.0",
- CapabilityType: 3,
+ fullTargetID: {
+ ID: "write-chain_evm_1@1.0.0",
+ CapabilityType: capabilities.CapabilityTypeTarget,
},
},
IDsToNodes: map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{
@@ -201,51 +195,48 @@ func TestSyncer_IgnoresCapabilitiesForPrivateDON(t *testing.T) {
wrapper := mocks.NewPeerWrapper(t)
wrapper.On("GetPeer").Return(peer)
- nodes := [][32]byte{
+ nodes := []ragetypes.PeerID{
pid,
randomWord(),
randomWord(),
randomWord(),
}
- triggerCapID := randomWord()
- targetCapID := randomWord()
dID := uint32(1)
+ triggerID := "streams-trigger@1.0.0"
+ hashedTriggerID := randomWord()
+ targetID := "write-chain_evm_1@1.0.0"
+ hashedTargetID := randomWord()
+
// The below state describes a Workflow DON (AcceptsWorkflows = true),
// which isn't public (IsPublic = false), but hosts the
// the streams-trigger and write_chain capabilities.
// We expect no action to be taken by the syncer.
- state := registrysyncer.State{
- IDsToDONs: map[registrysyncer.DonID]kcr.CapabilitiesRegistryDONInfo{
+ state := ®istrysyncer.LocalRegistry{
+ IDsToDONs: map[registrysyncer.DonID]registrysyncer.DON{
registrysyncer.DonID(dID): {
- Id: dID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: false,
- AcceptsWorkflows: true,
- NodeP2PIds: nodes,
- CapabilityConfigurations: []kcr.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: triggerCapID,
- Config: []byte(""),
- },
- {
- CapabilityId: targetCapID,
- Config: []byte(""),
- },
+ DON: capabilities.DON{
+ ID: dID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: false,
+ AcceptsWorkflows: true,
+ Members: nodes,
+ },
+ CapabilityConfigurations: map[string]capabilities.CapabilityConfiguration{
+ triggerID: {},
+ targetID: {},
},
},
},
- IDsToCapabilities: map[registrysyncer.HashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{
- triggerCapID: {
- LabelledName: "streams-trigger",
- Version: "1.0.0",
- CapabilityType: 0,
+ IDsToCapabilities: map[string]registrysyncer.Capability{
+ triggerID: {
+ ID: triggerID,
+ CapabilityType: capabilities.CapabilityTypeTrigger,
},
- targetCapID: {
- LabelledName: "write-chain_evm_1",
- Version: "1.0.0",
- CapabilityType: 3,
+ targetID: {
+ ID: targetID,
+ CapabilityType: capabilities.CapabilityTypeTarget,
},
},
IDsToNodes: map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{
@@ -253,25 +244,25 @@ func TestSyncer_IgnoresCapabilitiesForPrivateDON(t *testing.T) {
NodeOperatorId: 1,
Signer: randomWord(),
P2pId: nodes[0],
- HashedCapabilityIds: [][32]byte{triggerCapID, targetCapID},
+ HashedCapabilityIds: [][32]byte{hashedTriggerID, hashedTargetID},
},
nodes[1]: {
NodeOperatorId: 1,
Signer: randomWord(),
P2pId: nodes[1],
- HashedCapabilityIds: [][32]byte{triggerCapID, targetCapID},
+ HashedCapabilityIds: [][32]byte{hashedTriggerID, hashedTargetID},
},
nodes[2]: {
NodeOperatorId: 1,
Signer: randomWord(),
P2pId: nodes[2],
- HashedCapabilityIds: [][32]byte{triggerCapID, targetCapID},
+ HashedCapabilityIds: [][32]byte{hashedTriggerID, hashedTargetID},
},
nodes[3]: {
NodeOperatorId: 1,
Signer: randomWord(),
P2pId: nodes[3],
- HashedCapabilityIds: [][32]byte{triggerCapID, targetCapID},
+ HashedCapabilityIds: [][32]byte{hashedTriggerID, hashedTargetID},
},
},
}
@@ -309,14 +300,14 @@ func TestLauncher_WiresUpClientsForPublicWorkflowDON(t *testing.T) {
wrapper := mocks.NewPeerWrapper(t)
wrapper.On("GetPeer").Return(peer)
- workflowDonNodes := [][32]byte{
+ workflowDonNodes := []ragetypes.PeerID{
pid,
randomWord(),
randomWord(),
randomWord(),
}
- capabilityDonNodes := [][32]byte{
+ capabilityDonNodes := []ragetypes.PeerID{
randomWord(),
randomWord(),
randomWord(),
@@ -332,45 +323,48 @@ func TestLauncher_WiresUpClientsForPublicWorkflowDON(t *testing.T) {
// The below state describes a Workflow DON (AcceptsWorkflows = true),
// which exposes the streams-trigger and write_chain capabilities.
// We expect receivers to be wired up and both capabilities to be added to the registry.
- state := registrysyncer.State{
- IDsToDONs: map[registrysyncer.DonID]kcr.CapabilitiesRegistryDONInfo{
+ var rtc capabilities.RemoteTriggerConfig
+ rtc.ApplyDefaults()
+
+ state := ®istrysyncer.LocalRegistry{
+ IDsToDONs: map[registrysyncer.DonID]registrysyncer.DON{
registrysyncer.DonID(dID): {
- Id: dID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: true,
- NodeP2PIds: workflowDonNodes,
+ DON: capabilities.DON{
+ ID: dID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: true,
+ Members: workflowDonNodes,
+ },
},
registrysyncer.DonID(capDonID): {
- Id: capDonID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: false,
- NodeP2PIds: capabilityDonNodes,
- CapabilityConfigurations: []kcr.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: triggerCapID,
- Config: []byte(""),
+ DON: capabilities.DON{
+ ID: capDonID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: false,
+ Members: capabilityDonNodes,
+ },
+ CapabilityConfigurations: map[string]capabilities.CapabilityConfiguration{
+ fullTriggerCapID: {
+ RemoteTriggerConfig: rtc,
},
- {
- CapabilityId: targetCapID,
- Config: []byte(""),
+ fullTargetID: {
+ RemoteTriggerConfig: rtc,
},
},
},
},
- IDsToCapabilities: map[registrysyncer.HashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{
- triggerCapID: {
- LabelledName: "streams-trigger",
- Version: "1.0.0",
- CapabilityType: 0,
+ IDsToCapabilities: map[string]registrysyncer.Capability{
+ fullTriggerCapID: {
+ ID: fullTriggerCapID,
+ CapabilityType: capabilities.CapabilityTypeTrigger,
},
- targetCapID: {
- LabelledName: "write-chain_evm_1",
- Version: "1.0.0",
- CapabilityType: 3,
+ fullTargetID: {
+ ID: fullTargetID,
+ CapabilityType: capabilities.CapabilityTypeTarget,
},
},
IDsToNodes: map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{
@@ -457,14 +451,14 @@ func TestLauncher_WiresUpClientsForPublicWorkflowDONButIgnoresPrivateCapabilitie
wrapper := mocks.NewPeerWrapper(t)
wrapper.On("GetPeer").Return(peer)
- workflowDonNodes := [][32]byte{
+ workflowDonNodes := []ragetypes.PeerID{
pid,
randomWord(),
randomWord(),
randomWord(),
}
- capabilityDonNodes := [][32]byte{
+ capabilityDonNodes := []ragetypes.PeerID{
randomWord(),
randomWord(),
randomWord(),
@@ -472,6 +466,7 @@ func TestLauncher_WiresUpClientsForPublicWorkflowDONButIgnoresPrivateCapabilitie
}
fullTriggerCapID := "streams-trigger@1.0.0"
+ fullTargetID := "write-chain_evm_1@1.0.0"
triggerCapID := randomWord()
targetCapID := randomWord()
dID := uint32(1)
@@ -480,55 +475,53 @@ func TestLauncher_WiresUpClientsForPublicWorkflowDONButIgnoresPrivateCapabilitie
// The below state describes a Workflow DON (AcceptsWorkflows = true),
// which exposes the streams-trigger and write_chain capabilities.
// We expect receivers to be wired up and both capabilities to be added to the registry.
- state := registrysyncer.State{
- IDsToDONs: map[registrysyncer.DonID]kcr.CapabilitiesRegistryDONInfo{
+ state := ®istrysyncer.LocalRegistry{
+ IDsToDONs: map[registrysyncer.DonID]registrysyncer.DON{
registrysyncer.DonID(dID): {
- Id: dID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: true,
- NodeP2PIds: workflowDonNodes,
+ DON: capabilities.DON{
+ ID: dID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: true,
+ Members: workflowDonNodes,
+ },
},
registrysyncer.DonID(triggerCapDonID): {
- Id: triggerCapDonID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: false,
- NodeP2PIds: capabilityDonNodes,
- CapabilityConfigurations: []kcr.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: triggerCapID,
- Config: []byte(""),
- },
+ DON: capabilities.DON{
+ ID: triggerCapDonID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: false,
+ Members: capabilityDonNodes,
+ },
+ CapabilityConfigurations: map[string]capabilities.CapabilityConfiguration{
+ fullTriggerCapID: {},
},
},
registrysyncer.DonID(targetCapDonID): {
- Id: targetCapDonID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: false,
- AcceptsWorkflows: false,
- NodeP2PIds: capabilityDonNodes,
- CapabilityConfigurations: []kcr.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: targetCapID,
- Config: []byte(""),
- },
+ DON: capabilities.DON{
+ ID: targetCapDonID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: false,
+ AcceptsWorkflows: false,
+ Members: capabilityDonNodes,
+ },
+ CapabilityConfigurations: map[string]capabilities.CapabilityConfiguration{
+ fullTargetID: {},
},
},
},
- IDsToCapabilities: map[registrysyncer.HashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{
- triggerCapID: {
- LabelledName: "streams-trigger",
- Version: "1.0.0",
- CapabilityType: 0,
+ IDsToCapabilities: map[string]registrysyncer.Capability{
+ fullTriggerCapID: {
+ ID: fullTriggerCapID,
+ CapabilityType: capabilities.CapabilityTypeTrigger,
},
- targetCapID: {
- LabelledName: "write-chain_evm_1",
- Version: "1.0.0",
- CapabilityType: 3,
+ fullTargetID: {
+ ID: fullTargetID,
+ CapabilityType: capabilities.CapabilityTypeTarget,
},
},
IDsToNodes: map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{
@@ -596,103 +589,6 @@ func TestLauncher_WiresUpClientsForPublicWorkflowDONButIgnoresPrivateCapabilitie
require.NoError(t, err)
}
-func toPeerIDs(is [][32]byte) (out []p2ptypes.PeerID) {
- for _, i := range is {
- out = append(out, i)
- }
-
- return out
-}
-
-func TestLauncher_LocalNode(t *testing.T) {
- ctx := tests.Context(t)
- lggr := logger.TestLogger(t)
- registry := NewRegistry(lggr)
- dispatcher := remoteMocks.NewDispatcher(t)
-
- var pid ragetypes.PeerID
- err := pid.UnmarshalText([]byte("12D3KooWBCF1XT5Wi8FzfgNCqRL76Swv8TRU3TiD4QiJm8NMNX7N"))
- require.NoError(t, err)
- peer := mocks.NewPeer(t)
- peer.On("UpdateConnections", mock.Anything).Return(nil)
- peer.On("ID").Return(pid)
- wrapper := mocks.NewPeerWrapper(t)
- wrapper.On("GetPeer").Return(peer)
-
- workflowDonNodes := [][32]byte{
- pid,
- randomWord(),
- randomWord(),
- randomWord(),
- }
-
- dID := uint32(1)
- // The below state describes a Workflow DON (AcceptsWorkflows = true),
- // which exposes the streams-trigger and write_chain capabilities.
- // We expect receivers to be wired up and both capabilities to be added to the registry.
- state := registrysyncer.State{
- IDsToDONs: map[registrysyncer.DonID]kcr.CapabilitiesRegistryDONInfo{
- registrysyncer.DonID(dID): {
- Id: dID,
- ConfigCount: uint32(2),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: true,
- NodeP2PIds: workflowDonNodes,
- },
- },
- IDsToNodes: map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{
- workflowDonNodes[0]: {
- NodeOperatorId: 1,
- Signer: randomWord(),
- P2pId: workflowDonNodes[0],
- },
- workflowDonNodes[1]: {
- NodeOperatorId: 1,
- Signer: randomWord(),
- P2pId: workflowDonNodes[1],
- },
- workflowDonNodes[2]: {
- NodeOperatorId: 1,
- Signer: randomWord(),
- P2pId: workflowDonNodes[2],
- },
- workflowDonNodes[3]: {
- NodeOperatorId: 1,
- Signer: randomWord(),
- P2pId: workflowDonNodes[3],
- },
- },
- }
-
- launcher := NewLauncher(
- lggr,
- wrapper,
- dispatcher,
- registry,
- )
-
- err = launcher.Launch(ctx, state)
- require.NoError(t, err)
- defer launcher.Close()
-
- node, err := launcher.LocalNode(ctx)
- require.NoError(t, err)
-
- don := capabilities.DON{
- ID: dID,
- ConfigVersion: 2,
- Members: toPeerIDs(workflowDonNodes),
- F: 1,
- }
- expectedNode := capabilities.Node{
- PeerID: &pid,
- WorkflowDON: don,
- CapabilityDONs: []capabilities.DON{don},
- }
- assert.Equal(t, expectedNode, node)
-}
-
func TestLauncher_SucceedsEvenIfDispatcherAlreadyHasReceiver(t *testing.T) {
ctx := tests.Context(t)
lggr := logger.TestLogger(t)
@@ -716,14 +612,14 @@ func TestLauncher_SucceedsEvenIfDispatcherAlreadyHasReceiver(t *testing.T) {
))
require.NoError(t, registry.Add(ctx, mt))
- workflowDonNodes := [][32]byte{
+ workflowDonNodes := []p2ptypes.PeerID{
randomWord(),
randomWord(),
randomWord(),
randomWord(),
}
- capabilityDonNodes := [][32]byte{
+ capabilityDonNodes := []p2ptypes.PeerID{
pid,
randomWord(),
randomWord(),
@@ -736,36 +632,36 @@ func TestLauncher_SucceedsEvenIfDispatcherAlreadyHasReceiver(t *testing.T) {
// The below state describes a Capability DON (AcceptsWorkflows = true),
// which exposes the streams-trigger and write_chain capabilities.
// We expect receivers to be wired up.
- state := registrysyncer.State{
- IDsToDONs: map[registrysyncer.DonID]kcr.CapabilitiesRegistryDONInfo{
+ state := ®istrysyncer.LocalRegistry{
+ IDsToDONs: map[registrysyncer.DonID]registrysyncer.DON{
registrysyncer.DonID(dID): {
- Id: dID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: true,
- NodeP2PIds: workflowDonNodes,
+ DON: capabilities.DON{
+ ID: dID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: true,
+ Members: workflowDonNodes,
+ },
},
registrysyncer.DonID(capDonID): {
- Id: capDonID,
- ConfigCount: uint32(0),
- F: uint8(1),
- IsPublic: true,
- AcceptsWorkflows: false,
- NodeP2PIds: capabilityDonNodes,
- CapabilityConfigurations: []kcr.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: triggerCapID,
- Config: []byte(""),
- },
+ DON: capabilities.DON{
+ ID: capDonID,
+ ConfigVersion: uint32(0),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: false,
+ Members: capabilityDonNodes,
+ },
+ CapabilityConfigurations: map[string]capabilities.CapabilityConfiguration{
+ fullTriggerCapID: {},
},
},
},
- IDsToCapabilities: map[registrysyncer.HashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{
- triggerCapID: {
- LabelledName: "streams-trigger",
- Version: "1.0.0",
- CapabilityType: 0,
+ IDsToCapabilities: map[string]registrysyncer.Capability{
+ fullTriggerCapID: {
+ ID: fullTriggerCapID,
+ CapabilityType: capabilities.CapabilityTypeTrigger,
},
},
IDsToNodes: map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{
diff --git a/core/capabilities/registry.go b/core/capabilities/registry.go
index 4cca25d03c..8a99450c09 100644
--- a/core/capabilities/registry.go
+++ b/core/capabilities/registry.go
@@ -14,16 +14,42 @@ var (
ErrCapabilityAlreadyExists = errors.New("capability already exists")
)
+type metadataRegistry interface {
+ LocalNode(ctx context.Context) (capabilities.Node, error)
+ ConfigForCapability(ctx context.Context, capabilityID string, donID uint32) (capabilities.CapabilityConfiguration, error)
+}
+
// Registry is a struct for the registry of capabilities.
// Registry is safe for concurrent use.
type Registry struct {
- lggr logger.Logger
- m map[string]capabilities.BaseCapability
- mu sync.RWMutex
+ metadataRegistry metadataRegistry
+ lggr logger.Logger
+ m map[string]capabilities.BaseCapability
+ mu sync.RWMutex
+}
+
+func (r *Registry) LocalNode(ctx context.Context) (capabilities.Node, error) {
+ if r.metadataRegistry == nil {
+ return capabilities.Node{}, errors.New("metadataRegistry information not available")
+ }
+
+ return r.metadataRegistry.LocalNode(ctx)
}
-func (r *Registry) GetLocalNode(_ context.Context) (capabilities.Node, error) {
- return capabilities.Node{}, nil
+func (r *Registry) ConfigForCapability(ctx context.Context, capabilityID string, donID uint32) (capabilities.CapabilityConfiguration, error) {
+ if r.metadataRegistry == nil {
+ return capabilities.CapabilityConfiguration{}, errors.New("metadataRegistry information not available")
+ }
+
+ return r.metadataRegistry.ConfigForCapability(ctx, capabilityID, donID)
+}
+
+// SetLocalRegistry sets a local copy of the offchain registry for the registry to use.
+// This is only public for testing purposes; the only production use should be from the CapabilitiesLauncher.
+func (r *Registry) SetLocalRegistry(lr metadataRegistry) {
+ r.mu.Lock()
+ defer r.mu.Unlock()
+ r.metadataRegistry = lr
}
// Get gets a capability from the registry.
diff --git a/core/capabilities/remote/dispatcher_test.go b/core/capabilities/remote/dispatcher_test.go
index 173972375a..7ea4c2e262 100644
--- a/core/capabilities/remote/dispatcher_test.go
+++ b/core/capabilities/remote/dispatcher_test.go
@@ -8,13 +8,14 @@ import (
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
- commonMocks "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote"
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/logger"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
"github.com/smartcontractkit/chainlink/v2/core/services/p2p/types/mocks"
+
+ commonMocks "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks"
)
type testReceiver struct {
diff --git a/core/capabilities/remote/target/endtoend_test.go b/core/capabilities/remote/target/endtoend_test.go
index c01b8d99a4..9bbb53d4f6 100644
--- a/core/capabilities/remote/target/endtoend_test.go
+++ b/core/capabilities/remote/target/endtoend_test.go
@@ -371,6 +371,26 @@ type nodeDispatcher struct {
broker broker
}
+func (t *nodeDispatcher) Name() string {
+ return "nodeDispatcher"
+}
+
+func (t *nodeDispatcher) Start(ctx context.Context) error {
+ return nil
+}
+
+func (t *nodeDispatcher) Close() error {
+ return nil
+}
+
+func (t *nodeDispatcher) Ready() error {
+ return nil
+}
+
+func (t *nodeDispatcher) HealthReport() map[string]error {
+ return nil
+}
+
func (t *nodeDispatcher) Send(peerID p2ptypes.PeerID, msgBody *remotetypes.MessageBody) error {
msgBody.Version = 1
msgBody.Sender = t.callerPeerID[:]
diff --git a/core/capabilities/remote/target/request/client_request_test.go b/core/capabilities/remote/target/request/client_request_test.go
index c20c24a550..07f43dbc71 100644
--- a/core/capabilities/remote/target/request/client_request_test.go
+++ b/core/capabilities/remote/target/request/client_request_test.go
@@ -311,6 +311,26 @@ type clientRequestTestDispatcher struct {
msgs chan *types.MessageBody
}
+func (t *clientRequestTestDispatcher) Name() string {
+ return "clientRequestTestDispatcher"
+}
+
+func (t *clientRequestTestDispatcher) Start(ctx context.Context) error {
+ return nil
+}
+
+func (t *clientRequestTestDispatcher) Close() error {
+ return nil
+}
+
+func (t *clientRequestTestDispatcher) Ready() error {
+ return nil
+}
+
+func (t *clientRequestTestDispatcher) HealthReport() map[string]error {
+ return nil
+}
+
func (t *clientRequestTestDispatcher) SetReceiver(capabilityId string, donId uint32, receiver types.Receiver) error {
return nil
}
diff --git a/core/capabilities/remote/target/request/server_request_test.go b/core/capabilities/remote/target/request/server_request_test.go
index 053cba7064..a35725d6b1 100644
--- a/core/capabilities/remote/target/request/server_request_test.go
+++ b/core/capabilities/remote/target/request/server_request_test.go
@@ -190,6 +190,26 @@ type testDispatcher struct {
msgs []*types.MessageBody
}
+func (t *testDispatcher) Name() string {
+ return "testDispatcher"
+}
+
+func (t *testDispatcher) Start(ctx context.Context) error {
+ return nil
+}
+
+func (t *testDispatcher) Close() error {
+ return nil
+}
+
+func (t *testDispatcher) Ready() error {
+ return nil
+}
+
+func (t *testDispatcher) HealthReport() map[string]error {
+ return nil
+}
+
func (t *testDispatcher) SetReceiver(capabilityId string, donId uint32, receiver types.Receiver) error {
return nil
}
diff --git a/core/capabilities/remote/trigger_publisher.go b/core/capabilities/remote/trigger_publisher.go
index 7744cfb55e..35ce41118f 100644
--- a/core/capabilities/remote/trigger_publisher.go
+++ b/core/capabilities/remote/trigger_publisher.go
@@ -21,7 +21,7 @@ import (
//
// TriggerPublisher communicates with corresponding TriggerSubscribers on remote nodes.
type triggerPublisher struct {
- config *types.RemoteTriggerConfig
+ config capabilities.RemoteTriggerConfig
underlying commoncap.TriggerCapability
capInfo commoncap.CapabilityInfo
capDonInfo commoncap.DON
@@ -48,7 +48,7 @@ type pubRegState struct {
var _ types.Receiver = &triggerPublisher{}
var _ services.Service = &triggerPublisher{}
-func NewTriggerPublisher(config *types.RemoteTriggerConfig, underlying commoncap.TriggerCapability, capInfo commoncap.CapabilityInfo, capDonInfo commoncap.DON, workflowDONs map[uint32]commoncap.DON, dispatcher types.Dispatcher, lggr logger.Logger) *triggerPublisher {
+func NewTriggerPublisher(config capabilities.RemoteTriggerConfig, underlying commoncap.TriggerCapability, capInfo commoncap.CapabilityInfo, capDonInfo commoncap.DON, workflowDONs map[uint32]commoncap.DON, dispatcher types.Dispatcher, lggr logger.Logger) *triggerPublisher {
config.ApplyDefaults()
return &triggerPublisher{
config: config,
@@ -97,7 +97,7 @@ func (p *triggerPublisher) Receive(_ context.Context, msg *types.MessageBody) {
}
// NOTE: require 2F+1 by default, introduce different strategies later (KS-76)
minRequired := uint32(2*callerDon.F + 1)
- ready, payloads := p.messageCache.Ready(key, minRequired, nowMs-int64(p.config.RegistrationExpiryMs), false)
+ ready, payloads := p.messageCache.Ready(key, minRequired, nowMs-p.config.RegistrationExpiry.Milliseconds(), false)
if !ready {
p.lggr.Debugw("not ready to aggregate yet", "capabilityId", p.capInfo.ID, "workflowId", req.Metadata.WorkflowID, "minRequired", minRequired)
return
@@ -133,7 +133,7 @@ func (p *triggerPublisher) Receive(_ context.Context, msg *types.MessageBody) {
func (p *triggerPublisher) registrationCleanupLoop() {
defer p.wg.Done()
- ticker := time.NewTicker(time.Duration(p.config.RegistrationExpiryMs) * time.Millisecond)
+ ticker := time.NewTicker(p.config.RegistrationExpiry)
defer ticker.Stop()
for {
select {
@@ -144,7 +144,7 @@ func (p *triggerPublisher) registrationCleanupLoop() {
p.mu.RLock()
for key, req := range p.registrations {
callerDon := p.workflowDONs[key.callerDonId]
- ready, _ := p.messageCache.Ready(key, uint32(2*callerDon.F+1), now-int64(p.config.RegistrationExpiryMs), false)
+ ready, _ := p.messageCache.Ready(key, uint32(2*callerDon.F+1), now-p.config.RegistrationExpiry.Milliseconds(), false)
if !ready {
p.lggr.Infow("trigger registration expired", "capabilityId", p.capInfo.ID, "callerDonID", key.callerDonId, "workflowId", key.workflowId)
ctx, cancel := p.stopCh.NewCtx()
diff --git a/core/capabilities/remote/trigger_publisher_test.go b/core/capabilities/remote/trigger_publisher_test.go
index ec38b962ce..1e3000d20c 100644
--- a/core/capabilities/remote/trigger_publisher_test.go
+++ b/core/capabilities/remote/trigger_publisher_test.go
@@ -3,9 +3,11 @@ package remote_test
import (
"context"
"testing"
+ "time"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote"
@@ -40,11 +42,11 @@ func TestTriggerPublisher_Register(t *testing.T) {
}
dispatcher := remoteMocks.NewDispatcher(t)
- config := &remotetypes.RemoteTriggerConfig{
- RegistrationRefreshMs: 100,
- RegistrationExpiryMs: 100_000,
+ config := capabilities.RemoteTriggerConfig{
+ RegistrationRefresh: 100 * time.Millisecond,
+ RegistrationExpiry: 100 * time.Second,
MinResponsesToAggregate: 1,
- MessageExpiryMs: 100_000,
+ MessageExpiry: 100 * time.Second,
}
workflowDONs := map[uint32]commoncap.DON{
workflowDonInfo.ID: workflowDonInfo,
diff --git a/core/capabilities/remote/trigger_subscriber.go b/core/capabilities/remote/trigger_subscriber.go
index 28bdff9c51..0ccbf37c61 100644
--- a/core/capabilities/remote/trigger_subscriber.go
+++ b/core/capabilities/remote/trigger_subscriber.go
@@ -23,7 +23,7 @@ import (
//
// TriggerSubscriber communicates with corresponding TriggerReceivers on remote nodes.
type triggerSubscriber struct {
- config *types.RemoteTriggerConfig
+ config capabilities.RemoteTriggerConfig
capInfo commoncap.CapabilityInfo
capDonInfo capabilities.DON
capDonMembers map[p2ptypes.PeerID]struct{}
@@ -55,7 +55,7 @@ var _ services.Service = &triggerSubscriber{}
// TODO makes this configurable with a default
const defaultSendChannelBufferSize = 1000
-func NewTriggerSubscriber(config *types.RemoteTriggerConfig, capInfo commoncap.CapabilityInfo, capDonInfo capabilities.DON, localDonInfo capabilities.DON, dispatcher types.Dispatcher, aggregator types.Aggregator, lggr logger.Logger) *triggerSubscriber {
+func NewTriggerSubscriber(config capabilities.RemoteTriggerConfig, capInfo commoncap.CapabilityInfo, capDonInfo capabilities.DON, localDonInfo capabilities.DON, dispatcher types.Dispatcher, aggregator types.Aggregator, lggr logger.Logger) *triggerSubscriber {
if aggregator == nil {
lggr.Warnw("no aggregator provided, using default MODE aggregator", "capabilityId", capInfo.ID)
aggregator = NewDefaultModeAggregator(uint32(capDonInfo.F + 1))
@@ -121,7 +121,7 @@ func (s *triggerSubscriber) RegisterTrigger(ctx context.Context, request commonc
func (s *triggerSubscriber) registrationLoop() {
defer s.wg.Done()
- ticker := time.NewTicker(time.Duration(s.config.RegistrationRefreshMs) * time.Millisecond)
+ ticker := time.NewTicker(s.config.RegistrationRefresh)
defer ticker.Stop()
for {
select {
@@ -195,9 +195,9 @@ func (s *triggerSubscriber) Receive(_ context.Context, msg *types.MessageBody) {
nowMs := time.Now().UnixMilli()
s.mu.RLock()
creationTs := s.messageCache.Insert(key, sender, nowMs, msg.Payload)
- ready, payloads := s.messageCache.Ready(key, s.config.MinResponsesToAggregate, nowMs-int64(s.config.MessageExpiryMs), true)
+ ready, payloads := s.messageCache.Ready(key, s.config.MinResponsesToAggregate, nowMs-s.config.MessageExpiry.Milliseconds(), true)
s.mu.RUnlock()
- if nowMs-creationTs > int64(s.config.RegistrationExpiryMs) {
+ if nowMs-creationTs > s.config.RegistrationExpiry.Milliseconds() {
s.lggr.Warnw("received trigger event for an expired ID", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowId, "sender", sender)
continue
}
@@ -219,7 +219,7 @@ func (s *triggerSubscriber) Receive(_ context.Context, msg *types.MessageBody) {
func (s *triggerSubscriber) eventCleanupLoop() {
defer s.wg.Done()
- ticker := time.NewTicker(time.Duration(s.config.MessageExpiryMs) * time.Millisecond)
+ ticker := time.NewTicker(s.config.MessageExpiry)
defer ticker.Stop()
for {
select {
@@ -227,7 +227,7 @@ func (s *triggerSubscriber) eventCleanupLoop() {
return
case <-ticker.C:
s.mu.Lock()
- s.messageCache.DeleteOlderThan(time.Now().UnixMilli() - int64(s.config.MessageExpiryMs))
+ s.messageCache.DeleteOlderThan(time.Now().UnixMilli() - s.config.MessageExpiry.Milliseconds())
s.mu.Unlock()
}
}
diff --git a/core/capabilities/remote/trigger_subscriber_test.go b/core/capabilities/remote/trigger_subscriber_test.go
index 782b29d41f..93e962215a 100644
--- a/core/capabilities/remote/trigger_subscriber_test.go
+++ b/core/capabilities/remote/trigger_subscriber_test.go
@@ -2,10 +2,12 @@ package remote_test
import (
"testing"
+ "time"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/values"
@@ -61,11 +63,11 @@ func TestTriggerSubscriber_RegisterAndReceive(t *testing.T) {
})
// register trigger
- config := &remotetypes.RemoteTriggerConfig{
- RegistrationRefreshMs: 100,
- RegistrationExpiryMs: 100,
+ config := capabilities.RemoteTriggerConfig{
+ RegistrationRefresh: 100 * time.Millisecond,
+ RegistrationExpiry: 100 * time.Second,
MinResponsesToAggregate: 1,
- MessageExpiryMs: 100_000,
+ MessageExpiry: 100 * time.Second,
}
subscriber := remote.NewTriggerSubscriber(config, capInfo, capDonInfo, workflowDonInfo, dispatcher, nil, lggr)
require.NoError(t, subscriber.Start(ctx))
diff --git a/core/capabilities/remote/types/config.go b/core/capabilities/remote/types/config.go
deleted file mode 100644
index bb9e0fa434..0000000000
--- a/core/capabilities/remote/types/config.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package types
-
-const (
- DefaultRegistrationRefreshMs = 30_000
- DefaultRegistrationExpiryMs = 120_000
- DefaultMessageExpiryMs = 120_000
-)
-
-// NOTE: consider splitting this config into values stored in Registry (KS-118)
-// and values defined locally by Capability owners.
-func (c *RemoteTriggerConfig) ApplyDefaults() {
- if c.RegistrationRefreshMs == 0 {
- c.RegistrationRefreshMs = DefaultRegistrationRefreshMs
- }
- if c.RegistrationExpiryMs == 0 {
- c.RegistrationExpiryMs = DefaultRegistrationExpiryMs
- }
- if c.MessageExpiryMs == 0 {
- c.MessageExpiryMs = DefaultMessageExpiryMs
- }
-}
diff --git a/core/capabilities/remote/types/messages.pb.go b/core/capabilities/remote/types/messages.pb.go
index 83e17897db..f5b77b5c15 100644
--- a/core/capabilities/remote/types/messages.pb.go
+++ b/core/capabilities/remote/types/messages.pb.go
@@ -413,77 +413,6 @@ func (x *TriggerEventMetadata) GetWorkflowIds() []string {
return nil
}
-type RemoteTriggerConfig struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- RegistrationRefreshMs uint32 `protobuf:"varint,1,opt,name=registrationRefreshMs,proto3" json:"registrationRefreshMs,omitempty"`
- RegistrationExpiryMs uint32 `protobuf:"varint,2,opt,name=registrationExpiryMs,proto3" json:"registrationExpiryMs,omitempty"`
- MinResponsesToAggregate uint32 `protobuf:"varint,3,opt,name=minResponsesToAggregate,proto3" json:"minResponsesToAggregate,omitempty"`
- MessageExpiryMs uint32 `protobuf:"varint,4,opt,name=messageExpiryMs,proto3" json:"messageExpiryMs,omitempty"`
-}
-
-func (x *RemoteTriggerConfig) Reset() {
- *x = RemoteTriggerConfig{}
- if protoimpl.UnsafeEnabled {
- mi := &file_core_capabilities_remote_types_messages_proto_msgTypes[4]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *RemoteTriggerConfig) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*RemoteTriggerConfig) ProtoMessage() {}
-
-func (x *RemoteTriggerConfig) ProtoReflect() protoreflect.Message {
- mi := &file_core_capabilities_remote_types_messages_proto_msgTypes[4]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use RemoteTriggerConfig.ProtoReflect.Descriptor instead.
-func (*RemoteTriggerConfig) Descriptor() ([]byte, []int) {
- return file_core_capabilities_remote_types_messages_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *RemoteTriggerConfig) GetRegistrationRefreshMs() uint32 {
- if x != nil {
- return x.RegistrationRefreshMs
- }
- return 0
-}
-
-func (x *RemoteTriggerConfig) GetRegistrationExpiryMs() uint32 {
- if x != nil {
- return x.RegistrationExpiryMs
- }
- return 0
-}
-
-func (x *RemoteTriggerConfig) GetMinResponsesToAggregate() uint32 {
- if x != nil {
- return x.MinResponsesToAggregate
- }
- return 0
-}
-
-func (x *RemoteTriggerConfig) GetMessageExpiryMs() uint32 {
- if x != nil {
- return x.MessageExpiryMs
- }
- return 0
-}
-
var File_core_capabilities_remote_types_messages_proto protoreflect.FileDescriptor
var file_core_capabilities_remote_types_messages_proto_rawDesc = []byte{
@@ -543,32 +472,17 @@ var file_core_capabilities_remote_types_messages_proto_rawDesc = []byte{
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45,
0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c,
0x6f, 0x77, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f,
- 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x13, 0x52, 0x65,
- 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69,
- 0x67, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x4d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
- 0x52, 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
- 0x66, 0x72, 0x65, 0x73, 0x68, 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73,
- 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x4d, 0x73, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x4d, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x6d,
- 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x54, 0x6f, 0x41, 0x67, 0x67,
- 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x17, 0x6d, 0x69,
- 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x54, 0x6f, 0x41, 0x67, 0x67, 0x72,
- 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
- 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f,
- 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x4d, 0x73, 0x2a,
- 0x76, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x00,
- 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46,
- 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x50, 0x41, 0x42,
- 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10,
- 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x51,
- 0x55, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55,
- 0x54, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f,
- 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x42, 0x20, 0x5a, 0x1e, 0x63, 0x6f, 0x72, 0x65, 0x2f,
- 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x6d,
- 0x6f, 0x74, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x33,
+ 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x73, 0x2a, 0x76, 0x0a, 0x05, 0x45, 0x72, 0x72,
+ 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41,
+ 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10,
+ 0x01, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f,
+ 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x49,
+ 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x03,
+ 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x04, 0x12, 0x12, 0x0a,
+ 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10,
+ 0x05, 0x42, 0x20, 0x5a, 0x1e, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x74, 0x79,
+ 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -584,14 +498,13 @@ func file_core_capabilities_remote_types_messages_proto_rawDescGZIP() []byte {
}
var file_core_capabilities_remote_types_messages_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_core_capabilities_remote_types_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_core_capabilities_remote_types_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_core_capabilities_remote_types_messages_proto_goTypes = []any{
(Error)(0), // 0: remote.Error
(*Message)(nil), // 1: remote.Message
(*MessageBody)(nil), // 2: remote.MessageBody
(*TriggerRegistrationMetadata)(nil), // 3: remote.TriggerRegistrationMetadata
(*TriggerEventMetadata)(nil), // 4: remote.TriggerEventMetadata
- (*RemoteTriggerConfig)(nil), // 5: remote.RemoteTriggerConfig
}
var file_core_capabilities_remote_types_messages_proto_depIdxs = []int32{
0, // 0: remote.MessageBody.error:type_name -> remote.Error
@@ -658,18 +571,6 @@ func file_core_capabilities_remote_types_messages_proto_init() {
return nil
}
}
- file_core_capabilities_remote_types_messages_proto_msgTypes[4].Exporter = func(v any, i int) any {
- switch v := v.(*RemoteTriggerConfig); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
}
file_core_capabilities_remote_types_messages_proto_msgTypes[1].OneofWrappers = []any{
(*MessageBody_TriggerRegistrationMetadata)(nil),
@@ -681,7 +582,7 @@ func file_core_capabilities_remote_types_messages_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_core_capabilities_remote_types_messages_proto_rawDesc,
NumEnums: 1,
- NumMessages: 5,
+ NumMessages: 4,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/core/capabilities/remote/types/messages.proto b/core/capabilities/remote/types/messages.proto
index 4855892f9f..7726538e8d 100644
--- a/core/capabilities/remote/types/messages.proto
+++ b/core/capabilities/remote/types/messages.proto
@@ -49,10 +49,3 @@ message TriggerEventMetadata {
string trigger_event_id = 1;
repeated string workflow_ids = 2;
}
-
-message RemoteTriggerConfig {
- uint32 registrationRefreshMs = 1;
- uint32 registrationExpiryMs = 2;
- uint32 minResponsesToAggregate = 3;
- uint32 messageExpiryMs = 4;
-}
diff --git a/core/capabilities/remote/types/mocks/dispatcher.go b/core/capabilities/remote/types/mocks/dispatcher.go
index a73fa7e362..422198ffc1 100644
--- a/core/capabilities/remote/types/mocks/dispatcher.go
+++ b/core/capabilities/remote/types/mocks/dispatcher.go
@@ -3,9 +3,12 @@
package mocks
import (
- types "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
+ context "context"
+
ragep2ptypes "github.com/smartcontractkit/libocr/ragep2p/types"
mock "github.com/stretchr/testify/mock"
+
+ types "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
)
// Dispatcher is an autogenerated mock type for the Dispatcher type
@@ -21,6 +24,188 @@ func (_m *Dispatcher) EXPECT() *Dispatcher_Expecter {
return &Dispatcher_Expecter{mock: &_m.Mock}
}
+// Close provides a mock function with given fields:
+func (_m *Dispatcher) Close() error {
+ ret := _m.Called()
+
+ if len(ret) == 0 {
+ panic("no return value specified for Close")
+ }
+
+ var r0 error
+ if rf, ok := ret.Get(0).(func() error); ok {
+ r0 = rf()
+ } else {
+ r0 = ret.Error(0)
+ }
+
+ return r0
+}
+
+// Dispatcher_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
+type Dispatcher_Close_Call struct {
+ *mock.Call
+}
+
+// Close is a helper method to define mock.On call
+func (_e *Dispatcher_Expecter) Close() *Dispatcher_Close_Call {
+ return &Dispatcher_Close_Call{Call: _e.mock.On("Close")}
+}
+
+func (_c *Dispatcher_Close_Call) Run(run func()) *Dispatcher_Close_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run()
+ })
+ return _c
+}
+
+func (_c *Dispatcher_Close_Call) Return(_a0 error) *Dispatcher_Close_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *Dispatcher_Close_Call) RunAndReturn(run func() error) *Dispatcher_Close_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// HealthReport provides a mock function with given fields:
+func (_m *Dispatcher) HealthReport() map[string]error {
+ ret := _m.Called()
+
+ if len(ret) == 0 {
+ panic("no return value specified for HealthReport")
+ }
+
+ var r0 map[string]error
+ if rf, ok := ret.Get(0).(func() map[string]error); ok {
+ r0 = rf()
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(map[string]error)
+ }
+ }
+
+ return r0
+}
+
+// Dispatcher_HealthReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HealthReport'
+type Dispatcher_HealthReport_Call struct {
+ *mock.Call
+}
+
+// HealthReport is a helper method to define mock.On call
+func (_e *Dispatcher_Expecter) HealthReport() *Dispatcher_HealthReport_Call {
+ return &Dispatcher_HealthReport_Call{Call: _e.mock.On("HealthReport")}
+}
+
+func (_c *Dispatcher_HealthReport_Call) Run(run func()) *Dispatcher_HealthReport_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run()
+ })
+ return _c
+}
+
+func (_c *Dispatcher_HealthReport_Call) Return(_a0 map[string]error) *Dispatcher_HealthReport_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *Dispatcher_HealthReport_Call) RunAndReturn(run func() map[string]error) *Dispatcher_HealthReport_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// Name provides a mock function with given fields:
+func (_m *Dispatcher) Name() string {
+ ret := _m.Called()
+
+ if len(ret) == 0 {
+ panic("no return value specified for Name")
+ }
+
+ var r0 string
+ if rf, ok := ret.Get(0).(func() string); ok {
+ r0 = rf()
+ } else {
+ r0 = ret.Get(0).(string)
+ }
+
+ return r0
+}
+
+// Dispatcher_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name'
+type Dispatcher_Name_Call struct {
+ *mock.Call
+}
+
+// Name is a helper method to define mock.On call
+func (_e *Dispatcher_Expecter) Name() *Dispatcher_Name_Call {
+ return &Dispatcher_Name_Call{Call: _e.mock.On("Name")}
+}
+
+func (_c *Dispatcher_Name_Call) Run(run func()) *Dispatcher_Name_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run()
+ })
+ return _c
+}
+
+func (_c *Dispatcher_Name_Call) Return(_a0 string) *Dispatcher_Name_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *Dispatcher_Name_Call) RunAndReturn(run func() string) *Dispatcher_Name_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// Ready provides a mock function with given fields:
+func (_m *Dispatcher) Ready() error {
+ ret := _m.Called()
+
+ if len(ret) == 0 {
+ panic("no return value specified for Ready")
+ }
+
+ var r0 error
+ if rf, ok := ret.Get(0).(func() error); ok {
+ r0 = rf()
+ } else {
+ r0 = ret.Error(0)
+ }
+
+ return r0
+}
+
+// Dispatcher_Ready_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ready'
+type Dispatcher_Ready_Call struct {
+ *mock.Call
+}
+
+// Ready is a helper method to define mock.On call
+func (_e *Dispatcher_Expecter) Ready() *Dispatcher_Ready_Call {
+ return &Dispatcher_Ready_Call{Call: _e.mock.On("Ready")}
+}
+
+func (_c *Dispatcher_Ready_Call) Run(run func()) *Dispatcher_Ready_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run()
+ })
+ return _c
+}
+
+func (_c *Dispatcher_Ready_Call) Return(_a0 error) *Dispatcher_Ready_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *Dispatcher_Ready_Call) RunAndReturn(run func() error) *Dispatcher_Ready_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// RemoveReceiver provides a mock function with given fields: capabilityId, donId
func (_m *Dispatcher) RemoveReceiver(capabilityId string, donId uint32) {
_m.Called(capabilityId, donId)
@@ -150,6 +335,52 @@ func (_c *Dispatcher_SetReceiver_Call) RunAndReturn(run func(string, uint32, typ
return _c
}
+// Start provides a mock function with given fields: _a0
+func (_m *Dispatcher) Start(_a0 context.Context) error {
+ ret := _m.Called(_a0)
+
+ if len(ret) == 0 {
+ panic("no return value specified for Start")
+ }
+
+ var r0 error
+ if rf, ok := ret.Get(0).(func(context.Context) error); ok {
+ r0 = rf(_a0)
+ } else {
+ r0 = ret.Error(0)
+ }
+
+ return r0
+}
+
+// Dispatcher_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'
+type Dispatcher_Start_Call struct {
+ *mock.Call
+}
+
+// Start is a helper method to define mock.On call
+// - _a0 context.Context
+func (_e *Dispatcher_Expecter) Start(_a0 interface{}) *Dispatcher_Start_Call {
+ return &Dispatcher_Start_Call{Call: _e.mock.On("Start", _a0)}
+}
+
+func (_c *Dispatcher_Start_Call) Run(run func(_a0 context.Context)) *Dispatcher_Start_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context))
+ })
+ return _c
+}
+
+func (_c *Dispatcher_Start_Call) Return(_a0 error) *Dispatcher_Start_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *Dispatcher_Start_Call) RunAndReturn(run func(context.Context) error) *Dispatcher_Start_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// NewDispatcher creates a new instance of Dispatcher. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewDispatcher(t interface {
diff --git a/core/capabilities/remote/types/types.go b/core/capabilities/remote/types/types.go
index d15e2a2824..3629fc06fe 100644
--- a/core/capabilities/remote/types/types.go
+++ b/core/capabilities/remote/types/types.go
@@ -8,6 +8,7 @@ import (
"context"
commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)
@@ -19,6 +20,7 @@ const (
)
type Dispatcher interface {
+ services.Service
SetReceiver(capabilityId string, donId uint32, receiver Receiver) error
RemoveReceiver(capabilityId string, donId uint32)
Send(peerID p2ptypes.PeerID, msgBody *MessageBody) error
diff --git a/core/capabilities/streams/trigger_test.go b/core/capabilities/streams/trigger_test.go
index 6d8c9a27c1..cb4cfaa36b 100644
--- a/core/capabilities/streams/trigger_test.go
+++ b/core/capabilities/streams/trigger_test.go
@@ -87,7 +87,7 @@ func TestStreamsTrigger(t *testing.T) {
Members: capMembers,
F: uint8(F),
}
- config := &remotetypes.RemoteTriggerConfig{
+ config := capabilities.RemoteTriggerConfig{
MinResponsesToAggregate: uint32(F + 1),
}
subscriber := remote.NewTriggerSubscriber(config, capInfo, capDonInfo, capabilities.DON{}, nil, agg, lggr)
diff --git a/core/capabilities/targets/write_target.go b/core/capabilities/targets/write_target.go
index da2de59a8a..330f15872d 100644
--- a/core/capabilities/targets/write_target.go
+++ b/core/capabilities/targets/write_target.go
@@ -29,6 +29,7 @@ type WriteTarget struct {
cw commontypes.ChainWriter
forwarderAddress string
capabilities.CapabilityInfo
+
lggr logger.Logger
bound bool
@@ -132,7 +133,7 @@ func (cap *WriteTarget) Execute(ctx context.Context, request capabilities.Capabi
}
var transmitter common.Address
if err = cap.cr.GetLatestValue(ctx, "forwarder", "getTransmitter", primitives.Unconfirmed, queryInputs, &transmitter); err != nil {
- return nil, err
+ return nil, fmt.Errorf("failed to getTransmitter latest value: %w", err)
}
if transmitter != common.HexToAddress("0x0") {
cap.lggr.Infow("WriteTarget report already onchain - returning without a tranmission attempt", "executionID", request.Metadata.WorkflowExecutionID)
diff --git a/core/cmd/shell_local_test.go b/core/cmd/shell_local_test.go
index d1985c4287..0bea1816a8 100644
--- a/core/cmd/shell_local_test.go
+++ b/core/cmd/shell_local_test.go
@@ -11,6 +11,7 @@ import (
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities"
"github.com/smartcontractkit/chainlink/v2/common/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
@@ -44,8 +45,9 @@ import (
func genTestEVMRelayers(t *testing.T, opts legacyevm.ChainRelayExtenderConfig, ks evmrelayer.CSAETHKeystore) *chainlink.CoreRelayerChainInteroperators {
f := chainlink.RelayerFactory{
- Logger: opts.Logger,
- LoopRegistry: plugins.NewLoopRegistry(opts.Logger, opts.AppConfig.Tracing()),
+ Logger: opts.Logger,
+ LoopRegistry: plugins.NewLoopRegistry(opts.Logger, opts.AppConfig.Tracing()),
+ CapabilitiesRegistry: capabilities.NewRegistry(opts.Logger),
}
relayers, err := chainlink.NewCoreRelayerChainInteroperators(chainlink.InitEVM(testutils.Context(t), f, chainlink.EVMFactoryConfig{
diff --git a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
index 19588a8009..565e0bff3a 100644
--- a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
+++ b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
@@ -61,8 +61,8 @@ type CCIPConfigTypesOCR3ConfigWithMeta struct {
}
var CCIPConfigMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FChainMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"set\",\"type\":\"bytes32[]\"}],\"name\":\"NotASortedSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"subset\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"superset\",\"type\":\"bytes32[]\"}],\"name\":\"NotASubset\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"p2pIdsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signersLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transmittersLength\",\"type\":\"uint256\"}],\"name\":\"P2PIdsLengthNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyBootstrapP2PIds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyTransmitters\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"bootstrapP2PIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"p2pIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes[]\",\"name\":\"signers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"transmitters\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b50604051620044b7380380620044b78339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b6080516142b6620002016000396000818160f801528181610f3001526111c501526142b66000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80638318ed5d11610081578063f2fde38b1161005b578063f2fde38b1461020f578063f442c89a14610222578063fba64a7c1461023557600080fd5b80638318ed5d146101b05780638da5cb5b146101d1578063b74b2356146101ef57600080fd5b8063181f5a77116100b2578063181f5a771461013d5780634bd0473f1461018657806379ba5097146101a657600080fd5b806301ffc9a7146100ce578063020330e6146100f6575b600080fd5b6100e16100dc366004613060565b610248565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b6101796040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100ed9190613106565b61019961019436600461314a565b6102e1565b6040516100ed9190613269565b6101ae6107b1565b005b6101796101be366004613446565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff16610118565b6102026101fd366004613463565b6108b3565b6040516100ed91906134c9565b6101ae61021d366004613559565b610b34565b6101ae6102303660046135db565b610b48565b6101ae61024336600461365f565b610f18565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea7210000000000000000000000000000000000000000000000000000000014806102db57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff8216600090815260056020526040812060609183600181111561030b5761030b61317f565b600181111561031c5761031c61317f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156107a557600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff16600181111561038f5761038f61317f565b60018111156103a0576103a061317f565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916103f89061371c565b80601f01602080910402602001604051908101604052809291908181526020018280546104249061371c565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156104c957602002820191906000526020600020905b8154815260200190600101908083116104b5575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561052157602002820191906000526020600020905b81548152602001906001019080831161050d575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156105fb57838290600052602060002001805461056e9061371c565b80601f016020809104026020016040519081016040528092919081815260200182805461059a9061371c565b80156105e75780601f106105bc576101008083540402835291602001916105e7565b820191906000526020600020905b8154815290600101906020018083116105ca57829003601f168201915b50505050508152602001906001019061054f565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156106d45783829060005260206000200180546106479061371c565b80601f01602080910402602001604051908101604052809291908181526020018280546106739061371c565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b505050505081526020019060010190610628565b5050505081526020016006820180546106ec9061371c565b80601f01602080910402602001604051908101604052809291908181526020018280546107189061371c565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b505050919092525050508152600782015467ffffffffffffffff16602080830191909152600890920154604090910152908252600192909201910161034a565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b606060006108c16003610fd9565b905060006108cf848661379e565b90508315806108de5750818110155b1561091e576040805160008082526020820190925290610914565b610901612df1565b8152602001906001900390816108f95790505b50925050506102db565b600061092a85836137e4565b9050828111156109375750815b600061094383836137f7565b67ffffffffffffffff81111561095b5761095b6137b5565b60405190808252806020026020018201604052801561099457816020015b610981612df1565b8152602001906001900390816109795790505b50905060006109a36003610fe3565b9050835b83811015610b275760008282815181106109c3576109c361380a565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015610a4957602002820191906000526020600020905b815481526020019060010190808311610a35575b5050509183525050600182015460ff166020820152600282018054604090920191610a739061371c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f9061371c565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b50505091909252505050905284610b0388856137f7565b81518110610b1357610b1361380a565b6020908102919091010152506001016109a7565b5090979650505050505050565b610b3c610ff7565b610b458161107a565b50565b610b50610ff7565b60005b83811015610d3657610b97858583818110610b7057610b7061380a565b9050602002016020810190610b859190613839565b60039067ffffffffffffffff1661116f565b610c0157848482818110610bad57610bad61380a565b9050602002016020810190610bc29190613839565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161082e565b60026000868684818110610c1757610c1761380a565b9050602002016020810190610c2c9190613839565b67ffffffffffffffff1681526020810191909152604001600090812090610c538282612e39565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610c8b600283016000612e57565b5050610cc9858583818110610ca257610ca261380a565b9050602002016020810190610cb79190613839565b60039067ffffffffffffffff16611187565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610cfd57610cfd61380a565b9050602002016020810190610d129190613839565b60405167ffffffffffffffff909116815260200160405180910390a1600101610b53565b5060005b81811015610f11576000838383818110610d5657610d5661380a565b9050602002810190610d689190613854565b610d76906020810190613892565b610d7f90613a94565b80519091506000858585818110610d9857610d9861380a565b9050602002810190610daa9190613854565b610db8906020810190613839565b905060005b8251811015610df057610de8838281518110610ddb57610ddb61380a565b6020026020010151611193565b600101610dbd565b50826020015160ff16600003610e32576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120845180518693610e62928492910190612e91565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610eaf9082613b7b565b50610ec991506003905067ffffffffffffffff83166112ac565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08184604051610efb929190613c95565b60405180910390a1505050806001019050610d3a565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f87576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f9584860186613d40565b9050600080610fa3836112b8565b8151919350915015610fbb57610fbb84600084611511565b805115610fce57610fce84600183611511565b505050505050505050565b60006102db825490565b60606000610ff083611cf2565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161082e565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036110f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161082e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610ff0565b6000610ff08383611d4e565b6040517f50c946fe000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906350c946fe90602401600060405180830381865afa158015611221573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112679190810190613fb1565b60808101519091506112a8576040517f8907a4fa0000000000000000000000000000000000000000000000000000000081526004810183905260240161082e565b5050565b6000610ff08383611e48565b606080600460ff16835111156112fa576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b61137e6040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161131057505060408051600280825260608201909252919350602082015b6114166040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816113a857905050905060008060005b855181101561150457600086828151811061144e5761144e61380a565b602002602001015160000151600181111561146b5761146b61317f565b036114b8578581815181106114825761148261380a565b602002602001015185848151811061149c5761149c61380a565b6020026020010181905250826114b190614089565b92506114fc565b8581815181106114ca576114ca61380a565b60200260200101518483815181106114e4576114e461380a565b6020026020010181905250816114f990614089565b91505b600101611431565b5090835281529092909150565b63ffffffff83166000908152600560205260408120818460018111156115395761153961317f565b600181111561154a5761154a61317f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156119d357600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff1660018111156115bd576115bd61317f565b60018111156115ce576115ce61317f565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916116269061371c565b80601f01602080910402602001604051908101604052809291908181526020018280546116529061371c565b801561169f5780601f106116745761010080835404028352916020019161169f565b820191906000526020600020905b81548152906001019060200180831161168257829003601f168201915b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156116f757602002820191906000526020600020905b8154815260200190600101908083116116e3575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561174f57602002820191906000526020600020905b81548152602001906001019080831161173b575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561182957838290600052602060002001805461179c9061371c565b80601f01602080910402602001604051908101604052809291908181526020018280546117c89061371c565b80156118155780601f106117ea57610100808354040283529160200191611815565b820191906000526020600020905b8154815290600101906020018083116117f857829003601f168201915b50505050508152602001906001019061177d565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156119025783829060005260206000200180546118759061371c565b80601f01602080910402602001604051908101604052809291908181526020018280546118a19061371c565b80156118ee5780601f106118c3576101008083540402835291602001916118ee565b820191906000526020600020905b8154815290600101906020018083116118d157829003601f168201915b505050505081526020019060010190611856565b50505050815260200160068201805461191a9061371c565b80601f01602080910402602001604051908101604052809291908181526020018280546119469061371c565b80156119935780601f1061196857610100808354040283529160200191611993565b820191906000526020600020905b81548152906001019060200180831161197657829003601f168201915b505050919092525050508152600782015467ffffffffffffffff166020808301919091526008909201546040909101529082526001929092019101611578565b50505050905060006119e58251611e97565b905060006119f38451611e97565b90506119ff8282611ee9565b6000611a0e8785878686611fa5565b9050611a1a8482612391565b63ffffffff8716600090815260056020526040812090876001811115611a4257611a4261317f565b6001811115611a5357611a5361317f565b81526020019081526020016000206000611a6d9190612edc565b60005b8151811015611ce85763ffffffff8816600090815260056020526040812090886001811115611aa157611aa161317f565b6001811115611ab257611ab261317f565b8152602001908152602001600020828281518110611ad257611ad261380a565b6020908102919091018101518254600181810185556000948552929093208151805160099095029091018054929490939192849283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016908381811115611b3c57611b3c61317f565b021790555060208201518154604084015160608501517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217815560808201516001820190611c0b9082613b7b565b5060a08201518051611c27916002840191602090910190612e91565b5060c08201518051611c43916003840191602090910190612e91565b5060e08201518051611c5f916004840191602090910190612efd565b506101008201518051611c7c916005840191602090910190612efd565b506101208201516006820190611c929082613b7b565b50505060208201516007820180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff909216919091179055604090910151600890910155600101611a70565b5050505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611d4257602002820191906000526020600020905b815481526020019060010190808311611d2e575b50505050509050919050565b60008181526001830160205260408120548015611e37576000611d726001836137f7565b8554909150600090611d86906001906137f7565b9050808214611deb576000866000018281548110611da657611da661380a565b9060005260206000200154905080876000018481548110611dc957611dc961380a565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611dfc57611dfc6140c1565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506102db565b60009150506102db565b5092915050565b6000818152600183016020526040812054611e8f575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556102db565b5060006102db565b60006002821115611ed7576040517f3e4785260000000000000000000000000000000000000000000000000000000081526004810183905260240161082e565b8160028111156102db576102db61317f565b6000826002811115611efd57611efd61317f565b826002811115611f0f57611f0f61317f565b611f1991906140f0565b90508060011480611f655750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff148015611f6557506002836002811115611f6357611f6361317f565b145b15611f6f57505050565b82826040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161082e929190614120565b60606000845167ffffffffffffffff811115611fc357611fc36137b5565b604051908082528060200260200182016040528015611fec578160200160208202803683370190505b50905060008460028111156120035761200361317f565b1480156120215750600183600281111561201f5761201f61317f565b145b156120625760018160008151811061203b5761203b61380a565b602002602001019067ffffffffffffffff16908167ffffffffffffffff16815250506121ca565b60018460028111156120765761207661317f565b148015612094575060028360028111156120925761209261317f565b145b1561212b57856000815181106120ac576120ac61380a565b602002602001015160200151816000815181106120cb576120cb61380a565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050856000815181106121005761210061380a565b6020026020010151602001516001612118919061413b565b8160018151811061203b5761203b61380a565b600284600281111561213f5761213f61317f565b14801561215d5750600183600281111561215b5761215b61317f565b145b1561219457856001815181106121755761217561380a565b6020026020010151602001518160008151811061203b5761203b61380a565b83836040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161082e929190614120565b6000855167ffffffffffffffff8111156121e6576121e66137b5565b60405190808252806020026020018201604052801561229c57816020015b604080516101a081018252600060608083018281526080840183905260a0840183905260c0840183905260e084018290526101008401829052610120840182905261014084018290526101608401829052610180840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816122045790505b50905060005b8251811015612385576122cd8782815181106122c0576122c061380a565b6020026020010151612710565b60405180606001604052808883815181106122ea576122ea61380a565b602002602001015181526020018483815181106123095761230961380a565b602002602001015167ffffffffffffffff16815260200161235d8b8685815181106123365761233661380a565b60200260200101518b86815181106123505761235061380a565b6020026020010151612b16565b8152508282815181106123725761237261380a565b60209081029190910101526001016122a2565b50979650505050505050565b81518151811580156123a35750806001145b1561244557826000815181106123bb576123bb61380a565b60200260200101516020015167ffffffffffffffff1660011461243f57826000815181106123eb576123eb61380a565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001602482015260440161082e565b50505050565b8160011480156124555750806002145b1561260b578360008151811061246d5761246d61380a565b6020026020010151604001518360008151811061248c5761248c61380a565b6020026020010151604001511461251857826000815181106124b0576124b061380a565b602002602001015160400151846000815181106124cf576124cf61380a565b6020026020010151604001516040517fc7ccdd7f00000000000000000000000000000000000000000000000000000000815260040161082e929190918252602082015260400190565b8360008151811061252b5761252b61380a565b6020026020010151602001516001612543919061413b565b67ffffffffffffffff16836001815181106125605761256061380a565b60200260200101516020015167ffffffffffffffff161461243f578260018151811061258e5761258e61380a565b602002602001015160200151846000815181106125ad576125ad61380a565b60200260200101516020015160016125c5919061413b565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff92831660048201529116602482015260440161082e565b81600214801561261b5750806001145b156126de57836001815181106126335761263361380a565b602002602001015160400151836000815181106126525761265261380a565b6020026020010151604001511461243f57826000815181106126765761267661380a565b602002602001015160400151846001815181106126955761269561380a565b6020026020010151604001516040517f9e97567000000000000000000000000000000000000000000000000000000000815260040161082e929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff16600003612758576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600181111561276d5761276d61317f565b1415801561278e575060018151600181111561278b5761278b61317f565b14155b156127c5576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806080015151600003612804576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015161281f9060039067ffffffffffffffff1661116f565b6128675760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161082e565b60e081015151601f10156128a7576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61010081015151601f10156128e8576040517f645960ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208082015167ffffffffffffffff166000908152600290915260408120600101546129189060ff16600361415c565b612923906001614178565b60ff1690508082610100015151101561297a57610100820151516040517f548dd21f00000000000000000000000000000000000000000000000000000000815260048101919091526024810182905260440161082e565b816040015160ff166000036129bb576040517f39d1a4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516129cb90600361415c565b60ff168260e001515111612a0b576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160e00151518260c0015151141580612a2f5750816101000151518260c001515114155b15612a8a5760c08201515160e083015151610100840151516040517fba900f6d00000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152604482015260640161082e565b8160c00151518260a00151511115612ace576040517f8473d80700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ae08260a001518360c00151612beb565b60005b8260e0015151811015612b1157612b098360c001518281518110610ddb57610ddb61380a565b600101612ae3565b505050565b60008082602001518584600001518560800151878760a001518860c001518960e001518a61010001518b604001518c606001518d6101200151604051602001612b6a9c9b9a99989796959493929190614191565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b81511580612bf857508051155b15612c2f576040517fe249684100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c3882612d66565b612c4181612d66565b6000805b835182108015612c555750825181105b15612d2757828181518110612c6c57612c6c61380a565b6020026020010151848381518110612c8657612c8661380a565b60200260200101511115612ca457612c9d81614089565b9050612c45565b828181518110612cb657612cb661380a565b6020026020010151848381518110612cd057612cd061380a565b602002602001015103612cf157612ce682614089565b9150612c9d81614089565b83836040517fd671700c00000000000000000000000000000000000000000000000000000000815260040161082e929190614271565b835182101561243f5783836040517fd671700c00000000000000000000000000000000000000000000000000000000815260040161082e929190614271565b60015b81518110156112a85781612d7e6001836137f7565b81518110612d8e57612d8e61380a565b6020026020010151828281518110612da857612da861380a565b602002602001015111612de957816040517f1bc41b4200000000000000000000000000000000000000000000000000000000815260040161082e9190614296565b600101612d69565b6040518060400160405280600067ffffffffffffffff168152602001612e34604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610b459190612f4f565b508054612e639061371c565b6000825580601f10612e73575050565b601f016020900490600052602060002090810190610b459190612f4f565b828054828255906000526020600020908101928215612ecc579160200282015b82811115612ecc578251825591602001919060010190612eb1565b50612ed8929150612f4f565b5090565b5080546000825560090290600052602060002090810190610b459190612f64565b828054828255906000526020600020908101928215612f43579160200282015b82811115612f435782518290612f339082613b7b565b5091602001919060010190612f1d565b50612ed8929150613025565b5b80821115612ed85760008155600101612f50565b80821115612ed85780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612fa36001830182612e57565b612fb1600283016000612e39565b612fbf600383016000612e39565b612fcd600483016000613042565b612fdb600583016000613042565b612fe9600683016000612e57565b5050506007810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006008820155600901612f64565b80821115612ed85760006130398282612e57565b50600101613025565b5080546000825590600052602060002090810190610b459190613025565b60006020828403121561307257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ff057600080fd5b6000815180845260005b818110156130c8576020818501810151868301820152016130ac565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610ff060208301846130a2565b63ffffffff81168114610b4557600080fd5b803561313681613119565b919050565b80356002811061313657600080fd5b6000806040838503121561315d57600080fd5b823561316881613119565b91506131766020840161313b565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106131be576131be61317f565b9052565b60008151808452602080850194506020840160005b838110156131f3578151875295820195908201906001016131d7565b509495945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610b27577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030189526132578383516130a2565b9884019892509083019060010161321d565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613438577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151606081518186526132d782870182516131ae565b8981015160806132f28189018367ffffffffffffffff169052565b8a830151915060a0613308818a018460ff169052565b938301519360c092506133268984018667ffffffffffffffff169052565b818401519450610140915060e082818b01526133466101a08b01876130a2565b95508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0610100818c890301818d015261338588856131c2565b97508587015195506101209350818c890301848d01526133a588876131c2565b9750828701519550818c890301858d01526133c088876131fe565b975080870151955050808b8803016101608c01526133de87866131fe565b9650828601519550808b8803016101808c0152505050505061340082826130a2565b9150508882015161341c8a87018267ffffffffffffffff169052565b5090870151938701939093529386019390860190600101613292565b509098975050505050505050565b60006020828403121561345857600080fd5b8135610ff081613119565b6000806040838503121561347657600080fd5b50508035926020909101359150565b600081516060845261349a60608501826131c2565b905060ff6020840151166020850152604083015184820360408601526134c082826130a2565b95945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015613438578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff16845287015187840187905261354687850182613485565b95880195935050908601906001016134f2565b60006020828403121561356b57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610ff057600080fd5b60008083601f8401126135a157600080fd5b50813567ffffffffffffffff8111156135b957600080fd5b6020830191508360208260051b85010111156135d457600080fd5b9250929050565b600080600080604085870312156135f157600080fd5b843567ffffffffffffffff8082111561360957600080fd5b6136158883890161358f565b9096509450602087013591508082111561362e57600080fd5b5061363b8782880161358f565b95989497509550505050565b803567ffffffffffffffff8116811461313657600080fd5b6000806000806000806080878903121561367857600080fd5b863567ffffffffffffffff8082111561369057600080fd5b61369c8a838b0161358f565b909850965060208901359150808211156136b557600080fd5b818901915089601f8301126136c957600080fd5b8135818111156136d857600080fd5b8a60208285010111156136ea57600080fd5b60208301965080955050505061370260408801613647565b91506137106060880161312b565b90509295509295509295565b600181811c9082168061373057607f821691505b602082108103613769577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102db576102db61376f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b808201808211156102db576102db61376f565b818103818111156102db576102db61376f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561384b57600080fd5b610ff082613647565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261388857600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261388857600080fd5b604051610140810167ffffffffffffffff811182821017156138ea576138ea6137b5565b60405290565b60405160e0810167ffffffffffffffff811182821017156138ea576138ea6137b5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561395a5761395a6137b5565b604052919050565b600067ffffffffffffffff82111561397c5761397c6137b5565b5060051b60200190565b600082601f83011261399757600080fd5b813560206139ac6139a783613962565b613913565b8083825260208201915060208460051b8701019350868411156139ce57600080fd5b602086015b848110156139ea57803583529183019183016139d3565b509695505050505050565b803560ff8116811461313657600080fd5b600082601f830112613a1757600080fd5b813567ffffffffffffffff811115613a3157613a316137b5565b613a6260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613913565b818152846020838601011115613a7757600080fd5b816020850160208301376000918101602001919091529392505050565b600060608236031215613aa657600080fd5b6040516060810167ffffffffffffffff8282108183111715613aca57613aca6137b5565b816040528435915080821115613adf57600080fd5b613aeb36838701613986565b8352613af9602086016139f5565b60208401526040850135915080821115613b1257600080fd5b50613b1f36828601613a06565b60408301525092915050565b601f821115612b11576000816000526020600020601f850160051c81016020861015613b545750805b601f850160051c820191505b81811015613b7357828155600101613b60565b505050505050565b815167ffffffffffffffff811115613b9557613b956137b5565b613ba981613ba3845461371c565b84613b2b565b602080601f831160018114613bfc5760008415613bc65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b73565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613c4957888601518255948401946001909101908401613c2a565b5085821015613c8557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000613cb86040830184613485565b949350505050565b600082601f830112613cd157600080fd5b81356020613ce16139a783613962565b82815260059290921b84018101918181019086841115613d0057600080fd5b8286015b848110156139ea57803567ffffffffffffffff811115613d245760008081fd5b613d328986838b0101613a06565b845250918301918301613d04565b60006020808385031215613d5357600080fd5b823567ffffffffffffffff80821115613d6b57600080fd5b818501915085601f830112613d7f57600080fd5b8135613d8d6139a782613962565b81815260059190911b83018401908481019088831115613dac57600080fd5b8585015b83811015613f3a57803585811115613dc757600080fd5b8601610140818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215613dfc57600080fd5b613e046138c6565b613e0f89830161313b565b8152613e1d60408301613647565b89820152613e2d606083016139f5565b6040820152613e3e60808301613647565b606082015260a082013587811115613e5557600080fd5b613e638d8b83860101613a06565b60808301525060c082013587811115613e7b57600080fd5b613e898d8b83860101613986565b60a08301525060e082013587811115613ea157600080fd5b613eaf8d8b83860101613986565b60c0830152506101008083013588811115613ec957600080fd5b613ed78e8c83870101613cc0565b60e0840152506101208084013589811115613ef157600080fd5b613eff8f8d83880101613cc0565b8385015250610140840135915088821115613f1957600080fd5b613f278e8c84870101613a06565b9083015250845250918601918601613db0565b5098975050505050505050565b805161313681613119565b600082601f830112613f6357600080fd5b81516020613f736139a783613962565b8083825260208201915060208460051b870101935086841115613f9557600080fd5b602086015b848110156139ea5780518352918301918301613f9a565b600060208284031215613fc357600080fd5b815167ffffffffffffffff80821115613fdb57600080fd5b9083019060e08286031215613fef57600080fd5b613ff76138f0565b61400083613f47565b815261400e60208401613f47565b602082015261401f60408401613f47565b6040820152606083015160608201526080830151608082015260a08301518281111561404a57600080fd5b61405687828601613f52565b60a08301525060c08301518281111561406e57600080fd5b61407a87828601613f52565b60c08301525095945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140ba576140ba61376f565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715611e4157611e4161376f565b600381106131be576131be61317f565b6040810161412e8285614110565b610ff06020830184614110565b67ffffffffffffffff818116838216019080821115611e4157611e4161376f565b60ff8181168382160290811690818114611e4157611e4161376f565b60ff81811683821601908111156102db576102db61376f565b67ffffffffffffffff8d16815263ffffffff8c1660208201526141b7604082018c6131ae565b610180606082015260006141cf61018083018c6130a2565b67ffffffffffffffff8b16608084015282810360a08401526141f1818b6131c2565b905082810360c0840152614205818a6131c2565b905082810360e084015261421981896131fe565b905082810361010084015261422e81886131fe565b60ff8716610120850152905067ffffffffffffffff851661014084015282810361016084015261425e81856130a2565b9f9e505050505050505050505050505050565b60408152600061428460408301856131c2565b82810360208401526134c081856131c2565b602081526000610ff060208301846131c256fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FChainMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"set\",\"type\":\"bytes32[]\"}],\"name\":\"NotASortedSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"subset\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"superset\",\"type\":\"bytes32[]\"}],\"name\":\"NotASubset\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"p2pIdsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signersLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transmittersLength\",\"type\":\"uint256\"}],\"name\":\"P2PIdsLengthNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyBootstrapP2PIds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"bootstrapP2PIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"p2pIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes[]\",\"name\":\"signers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"transmitters\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60a06040523480156200001157600080fd5b506040516200446c3803806200446c8339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b60805161426b620002016000396000818160f801528181610eff015261116f015261426b6000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80638318ed5d11610081578063f2fde38b1161005b578063f2fde38b1461020f578063f442c89a14610222578063fba64a7c1461023557600080fd5b80638318ed5d146101b05780638da5cb5b146101d1578063b74b2356146101ef57600080fd5b8063181f5a77116100b2578063181f5a771461013d5780634bd0473f1461018657806379ba5097146101a657600080fd5b806301ffc9a7146100ce578063020330e6146100f6575b600080fd5b6100e16100dc366004613015565b610248565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b6101796040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100ed91906130bb565b6101996101943660046130ff565b6102e1565b6040516100ed919061321e565b6101ae6107b1565b005b6101796101be3660046133fb565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff16610118565b6102026101fd366004613418565b6108b3565b6040516100ed919061347e565b6101ae61021d36600461350e565b610b34565b6101ae610230366004613590565b610b48565b6101ae610243366004613614565b610ee7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea7210000000000000000000000000000000000000000000000000000000014806102db57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff8216600090815260056020526040812060609183600181111561030b5761030b613134565b600181111561031c5761031c613134565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156107a557600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff16600181111561038f5761038f613134565b60018111156103a0576103a0613134565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916103f8906136d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610424906136d1565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156104c957602002820191906000526020600020905b8154815260200190600101908083116104b5575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561052157602002820191906000526020600020905b81548152602001906001019080831161050d575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156105fb57838290600052602060002001805461056e906136d1565b80601f016020809104026020016040519081016040528092919081815260200182805461059a906136d1565b80156105e75780601f106105bc576101008083540402835291602001916105e7565b820191906000526020600020905b8154815290600101906020018083116105ca57829003601f168201915b50505050508152602001906001019061054f565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156106d4578382906000526020600020018054610647906136d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610673906136d1565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b505050505081526020019060010190610628565b5050505081526020016006820180546106ec906136d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610718906136d1565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b505050919092525050508152600782015467ffffffffffffffff16602080830191909152600890920154604090910152908252600192909201910161034a565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b606060006108c16003610fa2565b905060006108cf8486613753565b90508315806108de5750818110155b1561091e576040805160008082526020820190925290610914565b610901612da6565b8152602001906001900390816108f95790505b50925050506102db565b600061092a8583613799565b9050828111156109375750815b600061094383836137ac565b67ffffffffffffffff81111561095b5761095b61376a565b60405190808252806020026020018201604052801561099457816020015b610981612da6565b8152602001906001900390816109795790505b50905060006109a36003610fac565b9050835b83811015610b275760008282815181106109c3576109c36137bf565b60209081029190910181015160408051808201825267ffffffffffffffff831680825260009081526002855282902082518154608081880283018101909552606082018181529597509295860194909391928492849190840182828015610a4957602002820191906000526020600020905b815481526020019060010190808311610a35575b5050509183525050600182015460ff166020820152600282018054604090920191610a73906136d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f906136d1565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b50505091909252505050905284610b0388856137ac565b81518110610b1357610b136137bf565b6020908102919091010152506001016109a7565b5090979650505050505050565b610b3c610fc0565b610b4581611043565b50565b610b50610fc0565b60005b83811015610d3657610b97858583818110610b7057610b706137bf565b9050602002016020810190610b8591906137ee565b60039067ffffffffffffffff16611138565b610c0157848482818110610bad57610bad6137bf565b9050602002016020810190610bc291906137ee565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161082e565b60026000868684818110610c1757610c176137bf565b9050602002016020810190610c2c91906137ee565b67ffffffffffffffff1681526020810191909152604001600090812090610c538282612dee565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610c8b600283016000612e0c565b5050610cc9858583818110610ca257610ca26137bf565b9050602002016020810190610cb791906137ee565b60039067ffffffffffffffff16611150565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610cfd57610cfd6137bf565b9050602002016020810190610d1291906137ee565b60405167ffffffffffffffff909116815260200160405180910390a1600101610b53565b5060005b81811015610ee0576000838383818110610d5657610d566137bf565b9050602002810190610d689190613809565b610d76906020810190613847565b610d7f90613a49565b90506000848484818110610d9557610d956137bf565b9050602002810190610da79190613809565b610db59060208101906137ee565b9050610dc4826000015161115c565b816020015160ff16600003610e05576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120835180518593610e35928492910190612e46565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610e829082613b30565b50610e9c91506003905067ffffffffffffffff83166112a8565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08183604051610ece929190613c4a565b60405180910390a15050600101610d3a565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610f56576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f6d610f6886880188613cf5565b6112b4565b8151919350915015610f8557610f858360008461150d565b805115610f9857610f988360018361150d565b5050505050505050565b60006102db825490565b60606000610fb983611ce4565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611041576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161082e565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036110c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161082e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610fb9565b6000610fb98383611d40565b60005b81518110156112a45760008019167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166350c946fe8484815181106111bb576111bb6137bf565b60200260200101516040518263ffffffff1660e01b81526004016111e191815260200190565b600060405180830381865afa1580156111fe573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112449190810190613f66565b608001510361129c5781818151811061125f5761125f6137bf565b60200260200101516040517f8907a4fa00000000000000000000000000000000000000000000000000000000815260040161082e91815260200190565b60010161115f565b5050565b6000610fb98383611e3a565b606080600460ff16835111156112f6576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b61137a6040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161130c57505060408051600280825260608201909252919350602082015b6114126040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816113a457905050905060008060005b855181101561150057600086828151811061144a5761144a6137bf565b602002602001015160000151600181111561146757611467613134565b036114b45785818151811061147e5761147e6137bf565b6020026020010151858481518110611498576114986137bf565b6020026020010181905250826114ad9061403e565b92506114f8565b8581815181106114c6576114c66137bf565b60200260200101518483815181106114e0576114e06137bf565b6020026020010181905250816114f59061403e565b91505b60010161142d565b5090835281529092909150565b63ffffffff831660009081526005602052604081208184600181111561153557611535613134565b600181111561154657611546613134565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156119cf57600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff1660018111156115b9576115b9613134565b60018111156115ca576115ca613134565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191611622906136d1565b80601f016020809104026020016040519081016040528092919081815260200182805461164e906136d1565b801561169b5780601f106116705761010080835404028352916020019161169b565b820191906000526020600020905b81548152906001019060200180831161167e57829003601f168201915b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156116f357602002820191906000526020600020905b8154815260200190600101908083116116df575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561174b57602002820191906000526020600020905b815481526020019060010190808311611737575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015611825578382906000526020600020018054611798906136d1565b80601f01602080910402602001604051908101604052809291908181526020018280546117c4906136d1565b80156118115780601f106117e657610100808354040283529160200191611811565b820191906000526020600020905b8154815290600101906020018083116117f457829003601f168201915b505050505081526020019060010190611779565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156118fe578382906000526020600020018054611871906136d1565b80601f016020809104026020016040519081016040528092919081815260200182805461189d906136d1565b80156118ea5780601f106118bf576101008083540402835291602001916118ea565b820191906000526020600020905b8154815290600101906020018083116118cd57829003601f168201915b505050505081526020019060010190611852565b505050508152602001600682018054611916906136d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611942906136d1565b801561198f5780601f106119645761010080835404028352916020019161198f565b820191906000526020600020905b81548152906001019060200180831161197257829003601f168201915b505050919092525050508152600782015467ffffffffffffffff166020808301919091526008909201546040909101529082526001929092019101611574565b50505050905060006119e18251611e89565b905060006119ef8451611e89565b90506119fb8282611edb565b6000611a0a8785878686611f97565b9050611a168482612383565b63ffffffff8716600090815260056020526040812090876001811115611a3e57611a3e613134565b6001811115611a4f57611a4f613134565b81526020019081526020016000206000611a699190612e91565b60005b8151811015610f985763ffffffff8816600090815260056020526040812090886001811115611a9d57611a9d613134565b6001811115611aae57611aae613134565b8152602001908152602001600020828281518110611ace57611ace6137bf565b6020908102919091018101518254600181810185556000948552929093208151805160099095029091018054929490939192849283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016908381811115611b3857611b38613134565b021790555060208201518154604084015160608501517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217815560808201516001820190611c079082613b30565b5060a08201518051611c23916002840191602090910190612e46565b5060c08201518051611c3f916003840191602090910190612e46565b5060e08201518051611c5b916004840191602090910190612eb2565b506101008201518051611c78916005840191602090910190612eb2565b506101208201516006820190611c8e9082613b30565b50505060208201516007820180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff909216919091179055604090910151600890910155600101611a6c565b606081600001805480602002602001604051908101604052809291908181526020018280548015611d3457602002820191906000526020600020905b815481526020019060010190808311611d20575b50505050509050919050565b60008181526001830160205260408120548015611e29576000611d646001836137ac565b8554909150600090611d78906001906137ac565b9050808214611ddd576000866000018281548110611d9857611d986137bf565b9060005260206000200154905080876000018481548110611dbb57611dbb6137bf565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611dee57611dee614076565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506102db565b60009150506102db565b5092915050565b6000818152600183016020526040812054611e81575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556102db565b5060006102db565b60006002821115611ec9576040517f3e4785260000000000000000000000000000000000000000000000000000000081526004810183905260240161082e565b8160028111156102db576102db613134565b6000826002811115611eef57611eef613134565b826002811115611f0157611f01613134565b611f0b91906140a5565b90508060011480611f575750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff148015611f5757506002836002811115611f5557611f55613134565b145b15611f6157505050565b82826040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161082e9291906140d5565b60606000845167ffffffffffffffff811115611fb557611fb561376a565b604051908082528060200260200182016040528015611fde578160200160208202803683370190505b5090506000846002811115611ff557611ff5613134565b1480156120135750600183600281111561201157612011613134565b145b156120545760018160008151811061202d5761202d6137bf565b602002602001019067ffffffffffffffff16908167ffffffffffffffff16815250506121bc565b600184600281111561206857612068613134565b1480156120865750600283600281111561208457612084613134565b145b1561211d578560008151811061209e5761209e6137bf565b602002602001015160200151816000815181106120bd576120bd6137bf565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050856000815181106120f2576120f26137bf565b602002602001015160200151600161210a91906140f0565b8160018151811061202d5761202d6137bf565b600284600281111561213157612131613134565b14801561214f5750600183600281111561214d5761214d613134565b145b156121865785600181518110612167576121676137bf565b6020026020010151602001518160008151811061202d5761202d6137bf565b83836040517f0a6b675b00000000000000000000000000000000000000000000000000000000815260040161082e9291906140d5565b6000855167ffffffffffffffff8111156121d8576121d861376a565b60405190808252806020026020018201604052801561228e57816020015b604080516101a081018252600060608083018281526080840183905260a0840183905260c0840183905260e084018290526101008401829052610120840182905261014084018290526101608401829052610180840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816121f65790505b50905060005b8251811015612377576122bf8782815181106122b2576122b26137bf565b6020026020010151612702565b60405180606001604052808883815181106122dc576122dc6137bf565b602002602001015181526020018483815181106122fb576122fb6137bf565b602002602001015167ffffffffffffffff16815260200161234f8b868581518110612328576123286137bf565b60200260200101518b8681518110612342576123426137bf565b6020026020010151612acb565b815250828281518110612364576123646137bf565b6020908102919091010152600101612294565b50979650505050505050565b81518151811580156123955750806001145b1561243757826000815181106123ad576123ad6137bf565b60200260200101516020015167ffffffffffffffff1660011461243157826000815181106123dd576123dd6137bf565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001602482015260440161082e565b50505050565b8160011480156124475750806002145b156125fd578360008151811061245f5761245f6137bf565b6020026020010151604001518360008151811061247e5761247e6137bf565b6020026020010151604001511461250a57826000815181106124a2576124a26137bf565b602002602001015160400151846000815181106124c1576124c16137bf565b6020026020010151604001516040517fc7ccdd7f00000000000000000000000000000000000000000000000000000000815260040161082e929190918252602082015260400190565b8360008151811061251d5761251d6137bf565b602002602001015160200151600161253591906140f0565b67ffffffffffffffff1683600181518110612552576125526137bf565b60200260200101516020015167ffffffffffffffff16146124315782600181518110612580576125806137bf565b6020026020010151602001518460008151811061259f5761259f6137bf565b60200260200101516020015160016125b791906140f0565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff92831660048201529116602482015260440161082e565b81600214801561260d5750806001145b156126d05783600181518110612625576126256137bf565b60200260200101516040015183600081518110612644576126446137bf565b602002602001015160400151146124315782600081518110612668576126686137bf565b60200260200101516040015184600181518110612687576126876137bf565b6020026020010151604001516040517f9e97567000000000000000000000000000000000000000000000000000000000815260040161082e929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff1660000361274a576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600181111561275f5761275f613134565b14158015612780575060018151600181111561277d5761277d613134565b14155b156127b7576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60808101515115806127f4575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b1561282b576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516128469060039067ffffffffffffffff16611138565b61288e5760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161082e565b60208082015167ffffffffffffffff166000908152600290915260408120600101546128be9060ff166003614111565b6128c990600161412d565b60ff1690508082610100015151101561292057610100820151516040517f548dd21f00000000000000000000000000000000000000000000000000000000815260048101919091526024810182905260440161082e565b60e082015151610100811115612962576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260c00151518114158061297c5750826101000151518114155b156129d75760c08301515160e084015151610100850151516040517fba900f6d00000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152604482015260640161082e565b826040015160ff16600003612a18576040517f39d1a4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040830151612a28906003614111565b60ff168111612a63576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260c00151518360a00151511115612aa7576040517f8473d80700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ab98360a001518460c00151612ba0565b612ac68360c0015161115c565b505050565b60008082602001518584600001518560800151878760a001518860c001518960e001518a61010001518b604001518c606001518d6101200151604051602001612b1f9c9b9a99989796959493929190614146565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b81511580612bad57508051155b15612be4576040517fe249684100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bed82612d1b565b612bf681612d1b565b6000805b835182108015612c0a5750825181105b15612cdc57828181518110612c2157612c216137bf565b6020026020010151848381518110612c3b57612c3b6137bf565b60200260200101511115612c5957612c528161403e565b9050612bfa565b828181518110612c6b57612c6b6137bf565b6020026020010151848381518110612c8557612c856137bf565b602002602001015103612ca657612c9b8261403e565b9150612c528161403e565b83836040517fd671700c00000000000000000000000000000000000000000000000000000000815260040161082e929190614226565b83518210156124315783836040517fd671700c00000000000000000000000000000000000000000000000000000000815260040161082e929190614226565b60015b81518110156112a45781612d336001836137ac565b81518110612d4357612d436137bf565b6020026020010151828281518110612d5d57612d5d6137bf565b602002602001015111612d9e57816040517f1bc41b4200000000000000000000000000000000000000000000000000000000815260040161082e919061424b565b600101612d1e565b6040518060400160405280600067ffffffffffffffff168152602001612de9604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610b459190612f04565b508054612e18906136d1565b6000825580601f10612e28575050565b601f016020900490600052602060002090810190610b459190612f04565b828054828255906000526020600020908101928215612e81579160200282015b82811115612e81578251825591602001919060010190612e66565b50612e8d929150612f04565b5090565b5080546000825560090290600052602060002090810190610b459190612f19565b828054828255906000526020600020908101928215612ef8579160200282015b82811115612ef85782518290612ee89082613b30565b5091602001919060010190612ed2565b50612e8d929150612fda565b5b80821115612e8d5760008155600101612f05565b80821115612e8d5780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612f586001830182612e0c565b612f66600283016000612dee565b612f74600383016000612dee565b612f82600483016000612ff7565b612f90600583016000612ff7565b612f9e600683016000612e0c565b5050506007810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006008820155600901612f19565b80821115612e8d576000612fee8282612e0c565b50600101612fda565b5080546000825590600052602060002090810190610b459190612fda565b60006020828403121561302757600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610fb957600080fd5b6000815180845260005b8181101561307d57602081850181015186830182015201613061565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610fb96020830184613057565b63ffffffff81168114610b4557600080fd5b80356130eb816130ce565b919050565b8035600281106130eb57600080fd5b6000806040838503121561311257600080fd5b823561311d816130ce565b915061312b602084016130f0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061317357613173613134565b9052565b60008151808452602080850194506020840160005b838110156131a85781518752958201959082019060010161318c565b509495945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610b27577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301895261320c838351613057565b988401989250908301906001016131d2565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156133ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc089840301855281516060815181865261328c8287018251613163565b8981015160806132a78189018367ffffffffffffffff169052565b8a830151915060a06132bd818a018460ff169052565b938301519360c092506132db8984018667ffffffffffffffff169052565b818401519450610140915060e082818b01526132fb6101a08b0187613057565b95508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0610100818c890301818d015261333a8885613177565b97508587015195506101209350818c890301848d015261335a8887613177565b9750828701519550818c890301858d015261337588876131b3565b975080870151955050808b8803016101608c015261339387866131b3565b9650828601519550808b8803016101808c015250505050506133b58282613057565b915050888201516133d18a87018267ffffffffffffffff169052565b5090870151938701939093529386019390860190600101613247565b509098975050505050505050565b60006020828403121561340d57600080fd5b8135610fb9816130ce565b6000806040838503121561342b57600080fd5b50508035926020909101359150565b600081516060845261344f6060850182613177565b905060ff6020840151166020850152604083015184820360408601526134758282613057565b95945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156133ed578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff1684528701518784018790526134fb8785018261343a565b95880195935050908601906001016134a7565b60006020828403121561352057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610fb957600080fd5b60008083601f84011261355657600080fd5b50813567ffffffffffffffff81111561356e57600080fd5b6020830191508360208260051b850101111561358957600080fd5b9250929050565b600080600080604085870312156135a657600080fd5b843567ffffffffffffffff808211156135be57600080fd5b6135ca88838901613544565b909650945060208701359150808211156135e357600080fd5b506135f087828801613544565b95989497509550505050565b803567ffffffffffffffff811681146130eb57600080fd5b6000806000806000806080878903121561362d57600080fd5b863567ffffffffffffffff8082111561364557600080fd5b6136518a838b01613544565b9098509650602089013591508082111561366a57600080fd5b818901915089601f83011261367e57600080fd5b81358181111561368d57600080fd5b8a602082850101111561369f57600080fd5b6020830196508095505050506136b7604088016135fc565b91506136c5606088016130e0565b90509295509295509295565b600181811c908216806136e557607f821691505b60208210810361371e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102db576102db613724565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b808201808211156102db576102db613724565b818103818111156102db576102db613724565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561380057600080fd5b610fb9826135fc565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261383d57600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261383d57600080fd5b604051610140810167ffffffffffffffff8111828210171561389f5761389f61376a565b60405290565b60405160e0810167ffffffffffffffff8111828210171561389f5761389f61376a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561390f5761390f61376a565b604052919050565b600067ffffffffffffffff8211156139315761393161376a565b5060051b60200190565b600082601f83011261394c57600080fd5b8135602061396161395c83613917565b6138c8565b8083825260208201915060208460051b87010193508684111561398357600080fd5b602086015b8481101561399f5780358352918301918301613988565b509695505050505050565b803560ff811681146130eb57600080fd5b600082601f8301126139cc57600080fd5b813567ffffffffffffffff8111156139e6576139e661376a565b613a1760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016138c8565b818152846020838601011115613a2c57600080fd5b816020850160208301376000918101602001919091529392505050565b600060608236031215613a5b57600080fd5b6040516060810167ffffffffffffffff8282108183111715613a7f57613a7f61376a565b816040528435915080821115613a9457600080fd5b613aa03683870161393b565b8352613aae602086016139aa565b60208401526040850135915080821115613ac757600080fd5b50613ad4368286016139bb565b60408301525092915050565b601f821115612ac6576000816000526020600020601f850160051c81016020861015613b095750805b601f850160051c820191505b81811015613b2857828155600101613b15565b505050505050565b815167ffffffffffffffff811115613b4a57613b4a61376a565b613b5e81613b5884546136d1565b84613ae0565b602080601f831160018114613bb15760008415613b7b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b28565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613bfe57888601518255948401946001909101908401613bdf565b5085821015613c3a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000613c6d604083018461343a565b949350505050565b600082601f830112613c8657600080fd5b81356020613c9661395c83613917565b82815260059290921b84018101918181019086841115613cb557600080fd5b8286015b8481101561399f57803567ffffffffffffffff811115613cd95760008081fd5b613ce78986838b01016139bb565b845250918301918301613cb9565b60006020808385031215613d0857600080fd5b823567ffffffffffffffff80821115613d2057600080fd5b818501915085601f830112613d3457600080fd5b8135613d4261395c82613917565b81815260059190911b83018401908481019088831115613d6157600080fd5b8585015b83811015613eef57803585811115613d7c57600080fd5b8601610140818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215613db157600080fd5b613db961387b565b613dc48983016130f0565b8152613dd2604083016135fc565b89820152613de2606083016139aa565b6040820152613df3608083016135fc565b606082015260a082013587811115613e0a57600080fd5b613e188d8b838601016139bb565b60808301525060c082013587811115613e3057600080fd5b613e3e8d8b8386010161393b565b60a08301525060e082013587811115613e5657600080fd5b613e648d8b8386010161393b565b60c0830152506101008083013588811115613e7e57600080fd5b613e8c8e8c83870101613c75565b60e0840152506101208084013589811115613ea657600080fd5b613eb48f8d83880101613c75565b8385015250610140840135915088821115613ece57600080fd5b613edc8e8c848701016139bb565b9083015250845250918601918601613d65565b5098975050505050505050565b80516130eb816130ce565b600082601f830112613f1857600080fd5b81516020613f2861395c83613917565b8083825260208201915060208460051b870101935086841115613f4a57600080fd5b602086015b8481101561399f5780518352918301918301613f4f565b600060208284031215613f7857600080fd5b815167ffffffffffffffff80821115613f9057600080fd5b9083019060e08286031215613fa457600080fd5b613fac6138a5565b613fb583613efc565b8152613fc360208401613efc565b6020820152613fd460408401613efc565b6040820152606083015160608201526080830151608082015260a083015182811115613fff57600080fd5b61400b87828601613f07565b60a08301525060c08301518281111561402357600080fd5b61402f87828601613f07565b60c08301525095945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361406f5761406f613724565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715611e3357611e33613724565b6003811061317357613173613134565b604081016140e382856140c5565b610fb960208301846140c5565b67ffffffffffffffff818116838216019080821115611e3357611e33613724565b60ff8181168382160290811690818114611e3357611e33613724565b60ff81811683821601908111156102db576102db613724565b67ffffffffffffffff8d16815263ffffffff8c16602082015261416c604082018c613163565b6101806060820152600061418461018083018c613057565b67ffffffffffffffff8b16608084015282810360a08401526141a6818b613177565b905082810360c08401526141ba818a613177565b905082810360e08401526141ce81896131b3565b90508281036101008401526141e381886131b3565b60ff8716610120850152905067ffffffffffffffff85166101408401528281036101608401526142138185613057565b9f9e505050505050505050505050505050565b6040815260006142396040830185613177565b82810360208401526134758185613177565b602081526000610fb9602083018461317756fea164736f6c6343000818000a",
}
var CCIPConfigABI = CCIPConfigMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
index 807a932da6..d8f616053a 100644
--- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
+++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
@@ -155,7 +155,7 @@ type KeystoneFeedsPermissionHandlerPermission struct {
var FeeQuoterMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chain\",\"type\":\"uint64\"}],\"name\":\"ChainNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"rampTokenAmounts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processPoolReturnData\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b506040516200775238038062007752833981016040819052620000349162001834565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a5a565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b26565b5050505050505062001ae5565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001953565b60209081029190910101519050620002f560028262000e5f565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001953565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000e7f565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001953565b6020026020010151600b62000e7f60201b90919060201c565b1562000499578281815181106200045b576200045b62001953565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001953565b6020026020010151600b62000e9660201b90919060201c565b156200053b57818181518110620004fd57620004fd62001953565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001953565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001953565b6020026020010151905060008383815181106200065f576200065f62001953565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061016081015163ffffffff16155b80620006ba57506101e08101516001600160e01b031916630a04b54b60e21b14155b80620006da5750806060015163ffffffff1681610160015163ffffffff16115b15620007055760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160881b900460e01b6001600160e01b03191690036200078557816001600160401b03167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb7248260405162000777919062001969565b60405180910390a2620007c9565b816001600160401b03167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab2082604051620007c0919062001969565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000a7e5762000a7e62001953565b6020026020010151600001519050600083838151811062000aa35762000aa362001953565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a5d565b60005b825181101562000d9957600083828151811062000b4a5762000b4a62001953565b6020026020010151905060008160000151905060005b82602001515181101562000d8a5760008360200151828151811062000b895762000b8962001953565b602002602001015160200151905060008460200151838151811062000bb25762000bb262001953565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c115760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000d77908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b60565b50505080600101905062000b29565b5060005b81518110156200054457600082828151811062000dbe5762000dbe62001953565b6020026020010151600001519050600083838151811062000de35762000de362001953565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000d9d565b600062000e76836001600160a01b03841662000ead565b90505b92915050565b600062000e76836001600160a01b03841662000fb1565b600062000e76836001600160a01b03841662001003565b6000818152600183016020526040812054801562000fa657600062000ed460018362001aad565b855490915060009062000eea9060019062001aad565b905081811462000f5657600086600001828154811062000f0e5762000f0e62001953565b906000526020600020015490508087600001848154811062000f345762000f3462001953565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f6a5762000f6a62001acf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000e79565b600091505062000e79565b600081815260018301602052604081205462000ffa5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000e79565b50600062000e79565b6000818152600183016020526040812054801562000fa65760006200102a60018362001aad565b8554909150600090620010409060019062001aad565b905080821462000f5657600086600001828154811062000f0e5762000f0e62001953565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200109f576200109f62001064565b60405290565b60405160c081016001600160401b03811182821017156200109f576200109f62001064565b60405161020081016001600160401b03811182821017156200109f576200109f62001064565b604051601f8201601f191681016001600160401b03811182821017156200111b576200111b62001064565b604052919050565b80516001600160a01b03811681146200113b57600080fd5b919050565b805163ffffffff811681146200113b57600080fd5b6000606082840312156200116857600080fd5b604051606081016001600160401b03811182821017156200118d576200118d62001064565b604052825190915081906001600160601b0381168114620011ad57600080fd5b8152620011bd6020840162001123565b6020820152620011d06040840162001140565b60408201525092915050565b60006001600160401b03821115620011f857620011f862001064565b5060051b60200190565b600082601f8301126200121457600080fd5b815160206200122d6200122783620011dc565b620010f0565b8083825260208201915060208460051b8701019350868411156200125057600080fd5b602086015b848110156200127757620012698162001123565b835291830191830162001255565b509695505050505050565b600082601f8301126200129457600080fd5b81516020620012a76200122783620011dc565b82815260609283028501820192828201919087851115620012c757600080fd5b8387015b858110156200135a5780890382811215620012e65760008081fd5b620012f06200107a565b620012fb8362001123565b8152604080601f1984011215620013125760008081fd5b6200131c6200107a565b92506200132b88850162001123565b835283015160ff81168114620013415760008081fd5b82880152808701919091528452928401928101620012cb565b5090979650505050505050565b80516001600160401b03811681146200113b57600080fd5b805161ffff811681146200113b57600080fd5b805180151581146200113b57600080fd5b600082601f830112620013b557600080fd5b81516020620013c86200122783620011dc565b82815260059290921b84018101918181019086841115620013e857600080fd5b8286015b84811015620012775780516001600160401b03808211156200140d57600080fd5b908801906040601f19838c0381018213156200142857600080fd5b620014326200107a565b6200143f89860162001367565b815282850151848111156200145357600080fd5b8086019550508c603f8601126200146957600080fd5b8885015193506200147e6200122785620011dc565b84815260e09094028501830193898101908e8611156200149d57600080fd5b958401955b858710156200157657868f0360e0811215620014bd57600080fd5b620014c76200107a565b620014d28962001123565b815260c08683011215620014e557600080fd5b620014ef620010a5565b9150620014fe8d8a0162001140565b82526200150d878a0162001140565b8d8301526200151f60608a016200137f565b878301526200153160808a0162001140565b60608301526200154460a08a0162001140565b60808301526200155760c08a0162001392565b60a0830152808d0191909152825260e09690960195908a0190620014a2565b828b015250875250505092840192508301620013ec565b600082601f8301126200159f57600080fd5b81516020620015b26200122783620011dc565b82815260069290921b84018101918181019086841115620015d257600080fd5b8286015b84811015620012775760408189031215620015f15760008081fd5b620015fb6200107a565b620016068262001123565b81526200161585830162001367565b81860152835291830191604001620015d6565b80516001600160e01b0319811681146200113b57600080fd5b600082601f8301126200165357600080fd5b81516020620016666200122783620011dc565b82815261022092830285018201928282019190878511156200168757600080fd5b8387015b858110156200135a5780890382811215620016a65760008081fd5b620016b06200107a565b620016bb8362001367565b815261020080601f1984011215620016d35760008081fd5b620016dd620010ca565b9250620016ec88850162001392565b83526040620016fd8186016200137f565b8985015260606200171081870162001140565b82860152608091506200172582870162001140565b9085015260a06200173886820162001140565b8286015260c091506200174d8287016200137f565b9085015260e06200176086820162001140565b828601526101009150620017768287016200137f565b908501526101206200178a8682016200137f565b828601526101409150620017a08287016200137f565b90850152610160620017b486820162001140565b828601526101809150620017ca82870162001140565b908501526101a0620017de86820162001367565b828601526101c09150620017f482870162001140565b908501526101e06200180886820162001392565b828601526200181983870162001628565b9085015250508087019190915284529284019281016200168b565b6000806000806000806000610120888a0312156200185157600080fd5b6200185d898962001155565b60608901519097506001600160401b03808211156200187b57600080fd5b620018898b838c0162001202565b975060808a0151915080821115620018a057600080fd5b620018ae8b838c0162001202565b965060a08a0151915080821115620018c557600080fd5b620018d38b838c0162001282565b955060c08a0151915080821115620018ea57600080fd5b620018f88b838c01620013a3565b945060e08a01519150808211156200190f57600080fd5b6200191d8b838c016200158d565b93506101008a01519150808211156200193557600080fd5b50620019448a828b0162001641565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610200810160208301516200198a602084018261ffff169052565b506040830151620019a3604084018263ffffffff169052565b506060830151620019bc606084018263ffffffff169052565b506080830151620019d5608084018263ffffffff169052565b5060a0830151620019ec60a084018261ffff169052565b5060c083015162001a0560c084018263ffffffff169052565b5060e083015162001a1c60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a080850151909116908301526101c0808401511515908301526101e0928301516001600160e01b031916929091019190915290565b8181038181111562000e7957634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615c1362001b3f600039600081816102ef0152818161220b01526122740152600081816102b301528181611917015261197701526000818161027f015281816119a00152611a100152615c136000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c806379ba509711610104578063a69c64c0116100a2578063d02641a011610071578063d02641a014610a81578063d8694ccd14610a94578063f2fde38b14610aa7578063ffdb4b3714610aba57600080fd5b8063a69c64c014610997578063bf78e03f146109aa578063c4276bfc14610a57578063cdc73d5114610a7957600080fd5b806382b49eb0116100de57806382b49eb0146107d95780638da5cb5b1461094957806391a2749a146109715780639ea600261461098457600080fd5b806379ba5097146107ab5780637afac322146107b3578063805f2132146107c657600080fd5b8063407e1086116101715780634ab35b0b1161014b5780634ab35b0b14610441578063514e8cff146104815780636def4ce714610524578063770e2dc41461079857600080fd5b8063407e1086146103fb57806341ed29e71461040e57806345ac924d1461042157600080fd5b8063085318f8116101ad578063085318f814610368578063181f5a77146103885780632451a627146103d15780633937306f146103e657600080fd5b806241e5be146101d3578063061877e3146101f957806306285c6914610252575b600080fd5b6101e66101e13660046142ca565b610b02565b6040519081526020015b60405180910390f35b610239610207366004614306565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101f0565b61031c604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101f0565b61037b61037636600461437e565b610b70565b6040516101f09190614490565b6103c46040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101f09190614512565b6103d9610ee2565b6040516101f09190614525565b6103f96103f436600461457f565b610ef3565b005b6103f9610409366004614721565b6111a8565b6103f961041c366004614853565b6111bc565b61043461042f36600461498e565b6111fe565b6040516101f091906149d0565b61045461044f366004614306565b6112c9565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101f0565b61051761048f366004614a4b565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101f09190614a66565b61078b610532366004614a4b565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161020081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a085015271010000000000000000000000000000000000808404881660c086015275010000000000000000000000000000000000000000008404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c0100000000000000000000000086049094166101a0820152700100000000000000000000000000000000850490911615156101c08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b166101e082015290565b6040516101f09190614aa1565b6103f96107a6366004614cb8565b6112d4565b6103f96112e6565b6103f96107c1366004614fd2565b6113e3565b6103f96107d4366004615078565b6113f5565b6108e96107e73660046150e4565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101f09190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f0565b6103f961097f36600461510e565b6118dd565b6103f96109923660046151cf565b6118ee565b6103f96109a53660046153dc565b6118ff565b610a236109b8366004614306565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526007825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101f0565b610a6a610a653660046154a1565b611910565b6040516101f093929190615510565b6103d9611b06565b610517610a8f366004614306565b611b12565b6101e6610aa2366004615531565b611c0e565b6103f9610ab5366004614306565b612126565b610acd610ac8366004615586565b612137565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101f0565b6000610b0d826122c2565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b34856122c2565b610b5c907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856155df565b610b6691906155f6565b90505b9392505050565b67ffffffffffffffff8086166000908152600960205260409020600101546060917101000000000000000000000000000000000090910460e01b908590811115610bbc57610bbc6145ba565b604051908082528060200260200182016040528015610bef57816020015b6060815260200190600190039081610bda5790505b50915060005b85811015610ed7576000858583818110610c1157610c11615631565b610c279260206040909202019081019150614306565b90506000888884818110610c3d57610c3d615631565b9050602002810190610c4f9190615660565b610c5d90604081019061569e565b9150506020811115610d125767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115610d12576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b610d82848a8a86818110610d2857610d28615631565b9050602002810190610d3a9190615660565b610d4890602081019061569e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061235c92505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b0100000000000000000000000000000000000000000000000000000090049091169190610e815781610e87565b82606001515b6040805163ffffffff8316602082015291925001604051602081830303815290604052888781518110610ebc57610ebc615631565b60200260200101819052505050505050806001019050610bf5565b505095945050505050565b6060610eee60026123b3565b905090565b610efb6123c0565b6000610f078280615703565b9050905060005b81811015611051576000610f228480615703565b83818110610f3257610f32615631565b905060400201803603810190610f489190615797565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a926110409290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610f0e565b5060006110616020840184615703565b9050905060005b818110156111a257600061107f6020860186615703565b8381811061108f5761108f615631565b9050604002018036038101906110a591906157d4565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e926111919290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101611068565b50505050565b6111b0612405565b6111b981612486565b50565b6111c4612405565b60005b81518110156111fa576111f28282815181106111e5576111e5615631565b6020026020010151612584565b6001016111c7565b5050565b60608160008167ffffffffffffffff81111561121c5761121c6145ba565b60405190808252806020026020018201604052801561126157816020015b604080518082019091526000808252602082015281526020019060019003908161123a5790505b50905060005b828110156112be5761129986868381811061128457611284615631565b9050602002016020810190610a8f9190614306565b8282815181106112ab576112ab615631565b6020908102919091010152600101611267565b509150505b92915050565b60006112c3826122c2565b6112dc612405565b6111fa8282612756565b60015473ffffffffffffffffffffffffffffffffffffffff163314611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610d09565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6113eb612405565b6111fa8282612b63565b600080600061143987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612caa92505050565b92509250925061144b33838584612cc5565b6000611459858701876157f7565b905060005b81518110156118d25760006007600084848151811061147f5761147f615631565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081205474010000000000000000000000000000000000000000900460ff169150819003611540578282815181106114e9576114e9615631565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d09565b600061158960128386868151811061155a5761155a615631565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612e1d565b9050600660008585815181106115a1576115a1615631565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff1684848151811061161357611613615631565b60200260200101516040015163ffffffff16101561171d5783838151811061163d5761163d615631565b60200260200101516000015184848151811061165b5761165b615631565b6020026020010151604001516006600087878151811061167d5761167d615631565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610d09565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200185858151811061175e5761175e615631565b60200260200101516040015163ffffffff168152506006600086868151811061178957611789615631565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055835184908490811061182157611821615631565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a8286868151811061187757611877615631565b6020026020010151604001516040516118c09291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a2505060010161145e565b505050505050505050565b6118e5612405565b6111b981612ee3565b6118f6612405565b6111b98161306f565b611907612405565b6111b981613515565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036119705785925061199e565b61199b87877f0000000000000000000000000000000000000000000000000000000000000000610b02565b92505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16831115611a3d576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018490526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610d09565b67ffffffffffffffff881660009081526009602052604081206001015463ffffffff1690611a6c8787846135ff565b9050806020015193508484611af3836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b9450945094505050955095509592505050565b6060610eee600b6123b3565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8281166000908152600760209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff169082015290611c0557505073ffffffffffffffffffffffffffffffffffffffff166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b610b69816137a8565b67ffffffffffffffff8083166000908152600960209081526040808320815161020081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a086015271010000000000000000000000000000000000808504881660c087015275010000000000000000000000000000000000000000008504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c0100000000000000000000000088049094166101a0830152700100000000000000000000000000000000870490931615156101c08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b166101e0840152909190611e28576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610d09565b611e43611e3b6080850160608601614306565b600b90613937565b611ea257611e576080840160608501614306565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d09565b6000611eb16040850185615703565b9150611f0d905082611ec6602087018761569e565b905083611ed3888061569e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061396692505050565b6000600881611f226080880160608901614306565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081205467ffffffffffffffff16915080611f71611f6b6080890160608a01614306565b89612137565b9092509050600080808615611fb757611fab888c611f9560808e0160608f01614306565b888e8060400190611fa69190615703565b613a10565b91945092509050611fd7565b6101a0880151611fd49063ffffffff16662386f26fc100006155df565b92505b61010088015160009061ffff161561201b57612018896dffffffffffffffffffffffffffff607088901c1661200f60208f018f61569e565b90508b86613ce8565b90505b61018089015160009067ffffffffffffffff1661204461203e60808f018f61569e565b8d613d98565b600001518563ffffffff168c60a0015161ffff168f8060200190612068919061569e565b6120739291506155df565b8d6080015163ffffffff1661208891906158be565b61209291906158be565b61209c91906158be565b6120b6906dffffffffffffffffffffffffffff89166155df565b6120c091906155df565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff871682826120f767ffffffffffffffff8c16896155df565b61210191906158be565b61210b91906158be565b61211591906155f6565b9d9c50505050505050505050505050565b61212e612405565b6111b981613e59565b67ffffffffffffffff811660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16918101829052829182036121ef576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610d09565b6000816020015163ffffffff164261220791906158d1565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff168111156122a8576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610d09565b6122b1866122c2565b9151919350909150505b9250929050565b6000806122ce83611b12565b9050806020015163ffffffff1660001480612306575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612355576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610d09565b5192915050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016111fa576123ae81613f4e565b505050565b60606000610b6983614001565b6123cb600233613937565b612403576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610d09565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612403576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610d09565b60005b81518110156111fa5760008282815181106124a6576124a6615631565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050612489565b600061263d82600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a39061274a908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b60005b8251811015612a7f57600083828151811061277657612776615631565b6020026020010151905060008160000151905060005b826020015151811015612a71576000836020015182815181106127b1576127b1615631565b60200260200101516020015190506000846020015183815181106127d7576127d7615631565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101561285a5760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610d09565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590612a5f908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010161278c565b505050806001019050612759565b5060005b81518110156123ae576000828281518110612aa057612aa0615631565b60200260200101516000015190506000838381518110612ac257612ac2615631565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612a83565b60005b8251811015612c0657612b9c838281518110612b8457612b84615631565b6020026020010151600b61405d90919063ffffffff16565b15612bfe57828181518110612bb357612bb3615631565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101612b66565b5060005b81518110156123ae57612c40828281518110612c2857612c28615631565b6020026020010151600b61407f90919063ffffffff16565b15612ca257818181518110612c5757612c57615631565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101612c0a565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff16612e16576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610d09565b5050505050565b600080612e2a84866158e4565b9050600060248260ff161115612e6157612e456024836158fd565b612e5090600a615a36565b612e5a90856155f6565b9050612e84565b612e6c8260246158fd565b612e7790600a615a36565b612e8190856155df565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612eda576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b602081015160005b8151811015612f7e576000828281518110612f0857612f08615631565b60200260200101519050612f268160026140a190919063ffffffff16565b15612f755760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101612eeb565b50815160005b81518110156111a2576000828281518110612fa157612fa1615631565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613011576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301c60028261405d565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101612f84565b60005b81518110156111fa57600082828151811061308f5761308f615631565b6020026020010151905060008383815181106130ad576130ad615631565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806130e6575061016081015163ffffffff16155b8061313857506101e08101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806131575750806060015163ffffffff1681610160015163ffffffff16115b1561319a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d09565b67ffffffffffffffff821660009081526009602052604081206001015471010000000000000000000000000000000000900460e01b7fffffffff0000000000000000000000000000000000000000000000000000000016900361323e578167ffffffffffffffff167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb724826040516132319190614aa1565b60405180910390a2613281565b8167ffffffffffffffff167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab20826040516132789190614aa1565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050613072565b60005b81518110156111fa57600082828151811061353557613535615631565b6020026020010151600001519050600083838151811061355757613557615631565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a25050600101613518565b6040805180820190915260008082526020820152600083900361364057506040805180820190915267ffffffffffffffff8216815260006020820152610b69565b600061364c8486615a45565b9050600061365d8560048189615a8b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016136fa57808060200190518101906136f19190615ab5565b92505050610b69565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601613776576040518060400160405280828060200190518101906137629190615ae1565b815260006020909101529250610b69915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138369190615b14565b5050509150506000811215613877576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138f68373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138eb9190615b64565b866020015184612e1d565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff4216602082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b69565b836040015163ffffffff168311156139bf5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610d09565b836020015161ffff16821115613a01576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a2846101e001518261235c565b6000808083815b81811015613cda576000878783818110613a3357613a33615631565b905060400201803603810190613a499190615b81565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613b69576101208d0151613b369061ffff16662386f26fc100006155df565b613b4090886158be565b96508c610140015186613b539190615bba565b9550613b60602086615bba565b94505050613cd2565b604081015160009061ffff1615613c225760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613bc5578351613bbe906122c2565b9050613bc8565b508a5b620186a0836040015161ffff16613c0a8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140c390919063ffffffff16565b613c1491906155df565b613c1e91906155f6565b9150505b6060820151613c319088615bba565b9650816080015186613c439190615bba565b8251909650600090613c629063ffffffff16662386f26fc100006155df565b905080821015613c8157613c76818a6158be565b985050505050613cd2565b6000836020015163ffffffff16662386f26fc10000613ca091906155df565b905080831115613cc057613cb4818b6158be565b99505050505050613cd2565b613cca838b6158be565b995050505050505b600101613a17565b505096509650969350505050565b60008063ffffffff8316613cfe610160866155df565b613d0a876101c06158be565b613d1491906158be565b613d1e91906158be565b905060008760c0015163ffffffff168860e0015161ffff1683613d4191906155df565b613d4b91906158be565b61010089015190915061ffff16613d726dffffffffffffffffffffffffffff8916836155df565b613d7c91906155df565b613d8c90655af3107a40006155df565b98975050505050505050565b60408051808201909152600080825260208201526000613dc4858585610160015163ffffffff166135ff565b9050826060015163ffffffff1681600001511115613e0e576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101c001518015613e2257508060200151155b15610b66576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610d09565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008151602014613f8d57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610d099190614512565b600082806020019051810190613fa39190615ae1565b905073ffffffffffffffffffffffffffffffffffffffff811180613fc8575061040081105b156112c357826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610d099190614512565b60608160000180548060200260200160405190810160405280929190818152602001828054801561405157602002820191906000526020600020905b81548152602001906001019080831161403d575b50505050509050919050565b6000610b698373ffffffffffffffffffffffffffffffffffffffff8416614100565b6000610b698373ffffffffffffffffffffffffffffffffffffffff841661414f565b6000610b698373ffffffffffffffffffffffffffffffffffffffff8416614249565b6000670de0b6b3a76400006140f6837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166155df565b610b6991906155f6565b6000818152600183016020526040812054614147575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556112c3565b5060006112c3565b600081815260018301602052604081205480156142385760006141736001836158d1565b8554909150600090614187906001906158d1565b90508082146141ec5760008660000182815481106141a7576141a7615631565b90600052602060002001549050808760000184815481106141ca576141ca615631565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806141fd576141fd615bd7565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506112c3565b60009150506112c3565b5092915050565b6000818152600183016020526040812054801561423857600061426d6001836158d1565b8554909150600090614281906001906158d1565b90508181146141ec5760008660000182815481106141a7576141a7615631565b803573ffffffffffffffffffffffffffffffffffffffff811681146142c557600080fd5b919050565b6000806000606084860312156142df57600080fd5b6142e8846142a1565b9250602084013591506142fd604085016142a1565b90509250925092565b60006020828403121561431857600080fd5b610b69826142a1565b803567ffffffffffffffff811681146142c557600080fd5b60008083601f84011261434b57600080fd5b50813567ffffffffffffffff81111561436357600080fd5b6020830191508360208260051b85010111156122bb57600080fd5b60008060008060006060868803121561439657600080fd5b61439f86614321565b9450602086013567ffffffffffffffff808211156143bc57600080fd5b6143c889838a01614339565b909650945060408801359150808211156143e157600080fd5b818801915088601f8301126143f557600080fd5b81358181111561440457600080fd5b8960208260061b850101111561441957600080fd5b9699959850939650602001949392505050565b6000815180845260005b8181101561445257602081850181015186830182015201614436565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015614505577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526144f385835161442c565b945092850192908501906001016144b9565b5092979650505050505050565b602081526000610b69602083018461442c565b6020808252825182820181905260009190848201906040850190845b8181101561457357835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614541565b50909695505050505050565b60006020828403121561459157600080fd5b813567ffffffffffffffff8111156145a857600080fd5b820160408185031215610b6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561460c5761460c6145ba565b60405290565b60405160a0810167ffffffffffffffff8111828210171561460c5761460c6145ba565b60405160c0810167ffffffffffffffff8111828210171561460c5761460c6145ba565b604051610200810167ffffffffffffffff8111828210171561460c5761460c6145ba565b6040516060810167ffffffffffffffff8111828210171561460c5761460c6145ba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156146e6576146e66145ba565b604052919050565b600067ffffffffffffffff821115614708576147086145ba565b5060051b60200190565b60ff811681146111b957600080fd5b6000602080838503121561473457600080fd5b823567ffffffffffffffff81111561474b57600080fd5b8301601f8101851361475c57600080fd5b803561476f61476a826146ee565b61469f565b8181526060918202830184019184820191908884111561478e57600080fd5b938501935b8385101561482e57848903818112156147ac5760008081fd5b6147b46145e9565b6147bd876142a1565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156147f15760008081fd5b6147f96145e9565b92506148068989016142a1565b835287013561481481614712565b828901528088019190915283529384019391850191614793565b50979650505050505050565b80151581146111b957600080fd5b80356142c58161483a565b6000602080838503121561486657600080fd5b823567ffffffffffffffff81111561487d57600080fd5b8301601f8101851361488e57600080fd5b803561489c61476a826146ee565b81815260a091820283018401918482019190888411156148bb57600080fd5b938501935b8385101561482e5780858a0312156148d85760008081fd5b6148e0614612565b6148e9866142a1565b8152868601357fffffffffffffffffffff000000000000000000000000000000000000000000008116811461491e5760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146149575760008081fd5b9082015260606149688782016142a1565b9082015260808681013561497b8161483a565b90820152835293840193918501916148c0565b600080602083850312156149a157600080fd5b823567ffffffffffffffff8111156149b857600080fd5b6149c485828601614339565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614a3e57614a2e84835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b92840192908501906001016149ed565b5091979650505050505050565b600060208284031215614a5d57600080fd5b610b6982614321565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff1690820152604081016112c3565b81511515815261020081016020830151614ac1602084018261ffff169052565b506040830151614ad9604084018263ffffffff169052565b506060830151614af1606084018263ffffffff169052565b506080830151614b09608084018263ffffffff169052565b5060a0830151614b1f60a084018261ffff169052565b5060c0830151614b3760c084018263ffffffff169052565b5060e0830151614b4d60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a080850151909116908301526101c0808401511515908301526101e0808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff811681146142c557600080fd5b803561ffff811681146142c557600080fd5b600082601f830112614c3157600080fd5b81356020614c4161476a836146ee565b82815260069290921b84018101918181019086841115614c6057600080fd5b8286015b84811015614cad5760408189031215614c7d5760008081fd5b614c856145e9565b614c8e82614321565b8152614c9b8583016142a1565b81860152835291830191604001614c64565b509695505050505050565b60008060408385031215614ccb57600080fd5b67ffffffffffffffff83351115614ce157600080fd5b83601f843585010112614cf357600080fd5b614d0361476a84358501356146ee565b8335840180358083526020808401939260059290921b90910101861015614d2957600080fd5b602085358601015b85358601803560051b01602001811015614f365767ffffffffffffffff81351115614d5b57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a03011215614d9457600080fd5b614d9c6145e9565b614da860208301614321565b815267ffffffffffffffff60408301351115614dc357600080fd5b88603f604084013584010112614dd857600080fd5b614dee61476a60206040850135850101356146ee565b6020604084810135850182810135808552928401939260e00201018b1015614e1557600080fd5b6040808501358501015b6040858101358601602081013560e0020101811015614f175760e0818d031215614e4857600080fd5b614e506145e9565b614e59826142a1565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215614e8d57600080fd5b614e95614635565b614ea160208401614bfa565b8152614eaf60408401614bfa565b6020820152614ec060608401614c0e565b6040820152614ed160808401614bfa565b6060820152614ee260a08401614bfa565b6080820152614ef460c084013561483a565b60c083013560a0820152602082810191909152908452929092019160e001614e1f565b5080602084015250508085525050602083019250602081019050614d31565b5092505067ffffffffffffffff60208401351115614f5357600080fd5b614f638460208501358501614c20565b90509250929050565b600082601f830112614f7d57600080fd5b81356020614f8d61476a836146ee565b8083825260208201915060208460051b870101935086841115614faf57600080fd5b602086015b84811015614cad57614fc5816142a1565b8352918301918301614fb4565b60008060408385031215614fe557600080fd5b823567ffffffffffffffff80821115614ffd57600080fd5b61500986838701614f6c565b9350602085013591508082111561501f57600080fd5b5061502c85828601614f6c565b9150509250929050565b60008083601f84011261504857600080fd5b50813567ffffffffffffffff81111561506057600080fd5b6020830191508360208285010111156122bb57600080fd5b6000806000806040858703121561508e57600080fd5b843567ffffffffffffffff808211156150a657600080fd5b6150b288838901615036565b909650945060208701359150808211156150cb57600080fd5b506150d887828801615036565b95989497509550505050565b600080604083850312156150f757600080fd5b61510083614321565b9150614f63602084016142a1565b60006020828403121561512057600080fd5b813567ffffffffffffffff8082111561513857600080fd5b908301906040828603121561514c57600080fd5b6151546145e9565b82358281111561516357600080fd5b61516f87828601614f6c565b82525060208301358281111561518457600080fd5b61519087828601614f6c565b60208301525095945050505050565b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146142c557600080fd5b600060208083850312156151e257600080fd5b823567ffffffffffffffff8111156151f957600080fd5b8301601f8101851361520a57600080fd5b803561521861476a826146ee565b818152610220918202830184019184820191908884111561523857600080fd5b938501935b8385101561482e57848903818112156152565760008081fd5b61525e6145e9565b61526787614321565b8152610200807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08401121561529c5760008081fd5b6152a4614658565b92506152b1898901614848565b835260406152c0818a01614c0e565b8a85015260606152d1818b01614bfa565b82860152608091506152e4828b01614bfa565b9085015260a06152f58a8201614bfa565b8286015260c09150615308828b01614c0e565b9085015260e06153198a8201614bfa565b82860152610100915061532d828b01614c0e565b9085015261012061533f8a8201614c0e565b828601526101409150615353828b01614c0e565b908501526101606153658a8201614bfa565b828601526101809150615379828b01614bfa565b908501526101a061538b8a8201614321565b828601526101c0915061539f828b01614bfa565b908501526101e06153b18a8201614848565b828601526153c0838b0161519f565b908501525050808801919091528352938401939185019161523d565b600060208083850312156153ef57600080fd5b823567ffffffffffffffff81111561540657600080fd5b8301601f8101851361541757600080fd5b803561542561476a826146ee565b81815260069190911b8201830190838101908783111561544457600080fd5b928401925b8284101561549657604084890312156154625760008081fd5b61546a6145e9565b615473856142a1565b8152615480868601614321565b8187015282526040939093019290840190615449565b979650505050505050565b6000806000806000608086880312156154b957600080fd5b6154c286614321565b94506154d0602087016142a1565b935060408601359250606086013567ffffffffffffffff8111156154f357600080fd5b6154ff88828901615036565b969995985093965092949392505050565b8381528215156020820152606060408201526000612eda606083018461442c565b6000806040838503121561554457600080fd5b61554d83614321565b9150602083013567ffffffffffffffff81111561556957600080fd5b830160a0818603121561557b57600080fd5b809150509250929050565b6000806040838503121561559957600080fd5b6155a2836142a1565b9150614f6360208401614321565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176112c3576112c36155b0565b60008261562c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261569457600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156d357600080fd5b83018035915067ffffffffffffffff8211156156ee57600080fd5b6020019150368190038213156122bb57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261573857600080fd5b83018035915067ffffffffffffffff82111561575357600080fd5b6020019150600681901b36038213156122bb57600080fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146142c557600080fd5b6000604082840312156157a957600080fd5b6157b16145e9565b6157ba836142a1565b81526157c86020840161576b565b60208201529392505050565b6000604082840312156157e657600080fd5b6157ee6145e9565b6157ba83614321565b6000602080838503121561580a57600080fd5b823567ffffffffffffffff81111561582157600080fd5b8301601f8101851361583257600080fd5b803561584061476a826146ee565b8181526060918202830184019184820191908884111561585f57600080fd5b938501935b8385101561482e5780858a03121561587c5760008081fd5b61588461467c565b61588d866142a1565b815261589a87870161576b565b8782015260406158ab818801614bfa565b9082015283529384019391850191615864565b808201808211156112c3576112c36155b0565b818103818111156112c3576112c36155b0565b60ff81811683821601908111156112c3576112c36155b0565b60ff82811682821603908111156112c3576112c36155b0565b600181815b8085111561596f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615955576159556155b0565b8085161561596257918102915b93841c939080029061591b565b509250929050565b600082615986575060016112c3565b81615993575060006112c3565b81600181146159a957600281146159b3576159cf565b60019150506112c3565b60ff8411156159c4576159c46155b0565b50506001821b6112c3565b5060208310610133831016604e8410600b84101617156159f2575081810a6112c3565b6159fc8383615916565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a2e57615a2e6155b0565b029392505050565b6000610b6960ff841683615977565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614bf25760049490940360031b84901b1690921692915050565b60008085851115615a9b57600080fd5b83861115615aa857600080fd5b5050820193919092039150565b600060408284031215615ac757600080fd5b615acf6145e9565b8251815260208301516157c88161483a565b600060208284031215615af357600080fd5b5051919050565b805169ffffffffffffffffffff811681146142c557600080fd5b600080600080600060a08688031215615b2c57600080fd5b615b3586615afa565b9450602086015193506040860151925060608601519150615b5860808701615afa565b90509295509295909350565b600060208284031215615b7657600080fd5b8151610b6981614712565b600060408284031215615b9357600080fd5b615b9b6145e9565b615ba4836142a1565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614242576142426155b0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ Bin: "0x60e06040523480156200001157600080fd5b506040516200774438038062007744833981016040819052620000349162001834565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a5a565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b26565b5050505050505062001ae5565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001953565b60209081029190910101519050620002f560028262000e5f565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001953565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000e7f565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001953565b6020026020010151600b62000e7f60201b90919060201c565b1562000499578281815181106200045b576200045b62001953565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001953565b6020026020010151600b62000e9660201b90919060201c565b156200053b57818181518110620004fd57620004fd62001953565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001953565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001953565b6020026020010151905060008383815181106200065f576200065f62001953565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061016081015163ffffffff16155b80620006ba57506101e08101516001600160e01b031916630a04b54b60e21b14155b80620006da5750806060015163ffffffff1681610160015163ffffffff16115b15620007055760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160881b900460e01b6001600160e01b03191690036200078557816001600160401b03167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb7248260405162000777919062001969565b60405180910390a2620007c9565b816001600160401b03167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab2082604051620007c0919062001969565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000a7e5762000a7e62001953565b6020026020010151600001519050600083838151811062000aa35762000aa362001953565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a5d565b60005b825181101562000d9957600083828151811062000b4a5762000b4a62001953565b6020026020010151905060008160000151905060005b82602001515181101562000d8a5760008360200151828151811062000b895762000b8962001953565b602002602001015160200151905060008460200151838151811062000bb25762000bb262001953565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c115760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000d77908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b60565b50505080600101905062000b29565b5060005b81518110156200054457600082828151811062000dbe5762000dbe62001953565b6020026020010151600001519050600083838151811062000de35762000de362001953565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000d9d565b600062000e76836001600160a01b03841662000ead565b90505b92915050565b600062000e76836001600160a01b03841662000fb1565b600062000e76836001600160a01b03841662001003565b6000818152600183016020526040812054801562000fa657600062000ed460018362001aad565b855490915060009062000eea9060019062001aad565b905081811462000f5657600086600001828154811062000f0e5762000f0e62001953565b906000526020600020015490508087600001848154811062000f345762000f3462001953565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f6a5762000f6a62001acf565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000e79565b600091505062000e79565b600081815260018301602052604081205462000ffa5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000e79565b50600062000e79565b6000818152600183016020526040812054801562000fa65760006200102a60018362001aad565b8554909150600090620010409060019062001aad565b905080821462000f5657600086600001828154811062000f0e5762000f0e62001953565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200109f576200109f62001064565b60405290565b60405160c081016001600160401b03811182821017156200109f576200109f62001064565b60405161020081016001600160401b03811182821017156200109f576200109f62001064565b604051601f8201601f191681016001600160401b03811182821017156200111b576200111b62001064565b604052919050565b80516001600160a01b03811681146200113b57600080fd5b919050565b805163ffffffff811681146200113b57600080fd5b6000606082840312156200116857600080fd5b604051606081016001600160401b03811182821017156200118d576200118d62001064565b604052825190915081906001600160601b0381168114620011ad57600080fd5b8152620011bd6020840162001123565b6020820152620011d06040840162001140565b60408201525092915050565b60006001600160401b03821115620011f857620011f862001064565b5060051b60200190565b600082601f8301126200121457600080fd5b815160206200122d6200122783620011dc565b620010f0565b8083825260208201915060208460051b8701019350868411156200125057600080fd5b602086015b848110156200127757620012698162001123565b835291830191830162001255565b509695505050505050565b600082601f8301126200129457600080fd5b81516020620012a76200122783620011dc565b82815260609283028501820192828201919087851115620012c757600080fd5b8387015b858110156200135a5780890382811215620012e65760008081fd5b620012f06200107a565b620012fb8362001123565b8152604080601f1984011215620013125760008081fd5b6200131c6200107a565b92506200132b88850162001123565b835283015160ff81168114620013415760008081fd5b82880152808701919091528452928401928101620012cb565b5090979650505050505050565b80516001600160401b03811681146200113b57600080fd5b805161ffff811681146200113b57600080fd5b805180151581146200113b57600080fd5b600082601f830112620013b557600080fd5b81516020620013c86200122783620011dc565b82815260059290921b84018101918181019086841115620013e857600080fd5b8286015b84811015620012775780516001600160401b03808211156200140d57600080fd5b908801906040601f19838c0381018213156200142857600080fd5b620014326200107a565b6200143f89860162001367565b815282850151848111156200145357600080fd5b8086019550508c603f8601126200146957600080fd5b8885015193506200147e6200122785620011dc565b84815260e09094028501830193898101908e8611156200149d57600080fd5b958401955b858710156200157657868f0360e0811215620014bd57600080fd5b620014c76200107a565b620014d28962001123565b815260c08683011215620014e557600080fd5b620014ef620010a5565b9150620014fe8d8a0162001140565b82526200150d878a0162001140565b8d8301526200151f60608a016200137f565b878301526200153160808a0162001140565b60608301526200154460a08a0162001140565b60808301526200155760c08a0162001392565b60a0830152808d0191909152825260e09690960195908a0190620014a2565b828b015250875250505092840192508301620013ec565b600082601f8301126200159f57600080fd5b81516020620015b26200122783620011dc565b82815260069290921b84018101918181019086841115620015d257600080fd5b8286015b84811015620012775760408189031215620015f15760008081fd5b620015fb6200107a565b620016068262001123565b81526200161585830162001367565b81860152835291830191604001620015d6565b80516001600160e01b0319811681146200113b57600080fd5b600082601f8301126200165357600080fd5b81516020620016666200122783620011dc565b82815261022092830285018201928282019190878511156200168757600080fd5b8387015b858110156200135a5780890382811215620016a65760008081fd5b620016b06200107a565b620016bb8362001367565b815261020080601f1984011215620016d35760008081fd5b620016dd620010ca565b9250620016ec88850162001392565b83526040620016fd8186016200137f565b8985015260606200171081870162001140565b82860152608091506200172582870162001140565b9085015260a06200173886820162001140565b8286015260c091506200174d8287016200137f565b9085015260e06200176086820162001140565b828601526101009150620017768287016200137f565b908501526101206200178a8682016200137f565b828601526101409150620017a08287016200137f565b90850152610160620017b486820162001140565b828601526101809150620017ca82870162001140565b908501526101a0620017de86820162001367565b828601526101c09150620017f482870162001140565b908501526101e06200180886820162001392565b828601526200181983870162001628565b9085015250508087019190915284529284019281016200168b565b6000806000806000806000610120888a0312156200185157600080fd5b6200185d898962001155565b60608901519097506001600160401b03808211156200187b57600080fd5b620018898b838c0162001202565b975060808a0151915080821115620018a057600080fd5b620018ae8b838c0162001202565b965060a08a0151915080821115620018c557600080fd5b620018d38b838c0162001282565b955060c08a0151915080821115620018ea57600080fd5b620018f88b838c01620013a3565b945060e08a01519150808211156200190f57600080fd5b6200191d8b838c016200158d565b93506101008a01519150808211156200193557600080fd5b50620019448a828b0162001641565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610200810160208301516200198a602084018261ffff169052565b506040830151620019a3604084018263ffffffff169052565b506060830151620019bc606084018263ffffffff169052565b506080830151620019d5608084018263ffffffff169052565b5060a0830151620019ec60a084018261ffff169052565b5060c083015162001a0560c084018263ffffffff169052565b5060e083015162001a1c60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a080850151909116908301526101c0808401511515908301526101e0928301516001600160e01b031916929091019190915290565b8181038181111562000e7957634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615c0562001b3f600039600081816102ef015281816121fd01526122660152600081816102b301528181611917015261197701526000818161027f015281816119a00152611a100152615c056000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c806379ba509711610104578063a69c64c0116100a2578063d02641a011610071578063d02641a014610a81578063d8694ccd14610a94578063f2fde38b14610aa7578063ffdb4b3714610aba57600080fd5b8063a69c64c014610997578063bf78e03f146109aa578063c4276bfc14610a57578063cdc73d5114610a7957600080fd5b806382b49eb0116100de57806382b49eb0146107d95780638da5cb5b1461094957806391a2749a146109715780639ea600261461098457600080fd5b806379ba5097146107ab5780637afac322146107b3578063805f2132146107c657600080fd5b8063407e1086116101715780634ab35b0b1161014b5780634ab35b0b14610441578063514e8cff146104815780636def4ce714610524578063770e2dc41461079857600080fd5b8063407e1086146103fb57806341ed29e71461040e57806345ac924d1461042157600080fd5b8063085318f8116101ad578063085318f814610368578063181f5a77146103885780632451a627146103d15780633937306f146103e657600080fd5b806241e5be146101d3578063061877e3146101f957806306285c6914610252575b600080fd5b6101e66101e13660046142bc565b610b02565b6040519081526020015b60405180910390f35b6102396102073660046142f8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101f0565b61031c604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101f0565b61037b610376366004614370565b610b70565b6040516101f09190614482565b6103c46040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101f09190614504565b6103d9610ee2565b6040516101f09190614517565b6103f96103f4366004614571565b610ef3565b005b6103f9610409366004614713565b6111a8565b6103f961041c366004614845565b6111bc565b61043461042f366004614980565b6111fe565b6040516101f091906149c2565b61045461044f3660046142f8565b6112c9565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101f0565b61051761048f366004614a3d565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101f09190614a58565b61078b610532366004614a3d565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161020081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a085015271010000000000000000000000000000000000808404881660c086015275010000000000000000000000000000000000000000008404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c0100000000000000000000000086049094166101a0820152700100000000000000000000000000000000850490911615156101c08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b166101e082015290565b6040516101f09190614a93565b6103f96107a6366004614caa565b6112d4565b6103f96112e6565b6103f96107c1366004614fc4565b6113e3565b6103f96107d436600461506a565b6113f5565b6108e96107e73660046150d6565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101f09190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f0565b6103f961097f366004615100565b6118dd565b6103f96109923660046151c1565b6118ee565b6103f96109a53660046153ce565b6118ff565b610a236109b83660046142f8565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526007825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101f0565b610a6a610a65366004615493565b611910565b6040516101f093929190615502565b6103d9611b06565b610517610a8f3660046142f8565b611b12565b6101e6610aa2366004615523565b611c0e565b6103f9610ab53660046142f8565b612118565b610acd610ac8366004615578565b612129565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101f0565b6000610b0d826122b4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b34856122b4565b610b5c907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856155d1565b610b6691906155e8565b90505b9392505050565b67ffffffffffffffff8086166000908152600960205260409020600101546060917101000000000000000000000000000000000090910460e01b908590811115610bbc57610bbc6145ac565b604051908082528060200260200182016040528015610bef57816020015b6060815260200190600190039081610bda5790505b50915060005b85811015610ed7576000858583818110610c1157610c11615623565b610c2792602060409092020190810191506142f8565b90506000888884818110610c3d57610c3d615623565b9050602002810190610c4f9190615652565b610c5d906040810190615690565b9150506020811115610d125767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115610d12576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b610d82848a8a86818110610d2857610d28615623565b9050602002810190610d3a9190615652565b610d48906020810190615690565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061234e92505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b0100000000000000000000000000000000000000000000000000000090049091169190610e815781610e87565b82606001515b6040805163ffffffff8316602082015291925001604051602081830303815290604052888781518110610ebc57610ebc615623565b60200260200101819052505050505050806001019050610bf5565b505095945050505050565b6060610eee60026123a5565b905090565b610efb6123b2565b6000610f0782806156f5565b9050905060005b81811015611051576000610f2284806156f5565b83818110610f3257610f32615623565b905060400201803603810190610f489190615789565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a926110409290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610f0e565b50600061106160208401846156f5565b9050905060005b818110156111a257600061107f60208601866156f5565b8381811061108f5761108f615623565b9050604002018036038101906110a591906157c6565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e926111919290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101611068565b50505050565b6111b06123f7565b6111b981612478565b50565b6111c46123f7565b60005b81518110156111fa576111f28282815181106111e5576111e5615623565b6020026020010151612576565b6001016111c7565b5050565b60608160008167ffffffffffffffff81111561121c5761121c6145ac565b60405190808252806020026020018201604052801561126157816020015b604080518082019091526000808252602082015281526020019060019003908161123a5790505b50905060005b828110156112be5761129986868381811061128457611284615623565b9050602002016020810190610a8f91906142f8565b8282815181106112ab576112ab615623565b6020908102919091010152600101611267565b509150505b92915050565b60006112c3826122b4565b6112dc6123f7565b6111fa8282612748565b60015473ffffffffffffffffffffffffffffffffffffffff163314611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610d09565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6113eb6123f7565b6111fa8282612b55565b600080600061143987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612c9c92505050565b92509250925061144b33838584612cb7565b6000611459858701876157e9565b905060005b81518110156118d25760006007600084848151811061147f5761147f615623565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081205474010000000000000000000000000000000000000000900460ff169150819003611540578282815181106114e9576114e9615623565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d09565b600061158960128386868151811061155a5761155a615623565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612e0f565b9050600660008585815181106115a1576115a1615623565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff1684848151811061161357611613615623565b60200260200101516040015163ffffffff16101561171d5783838151811061163d5761163d615623565b60200260200101516000015184848151811061165b5761165b615623565b6020026020010151604001516006600087878151811061167d5761167d615623565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610d09565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200185858151811061175e5761175e615623565b60200260200101516040015163ffffffff168152506006600086868151811061178957611789615623565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055835184908490811061182157611821615623565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a8286868151811061187757611877615623565b6020026020010151604001516040516118c09291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a2505060010161145e565b505050505050505050565b6118e56123f7565b6111b981612ed5565b6118f66123f7565b6111b981613061565b6119076123f7565b6111b981613507565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036119705785925061199e565b61199b87877f0000000000000000000000000000000000000000000000000000000000000000610b02565b92505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16831115611a3d576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018490526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610d09565b67ffffffffffffffff881660009081526009602052604081206001015463ffffffff1690611a6c8787846135f1565b9050806020015193508484611af3836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b9450945094505050955095509592505050565b6060610eee600b6123a5565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8281166000908152600760209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff169082015290611c0557505073ffffffffffffffffffffffffffffffffffffffff166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b610b698161379a565b67ffffffffffffffff8083166000908152600960209081526040808320815161020081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a086015271010000000000000000000000000000000000808504881660c087015275010000000000000000000000000000000000000000008504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c0100000000000000000000000088049094166101a0830152700100000000000000000000000000000000870490931615156101c08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b166101e0840152909190611e28576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610d09565b611e43611e3b60808501606086016142f8565b600b90613929565b611ea257611e5760808401606085016142f8565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d09565b6000611eb160408501856156f5565b9150611f0d905082611ec66020870187615690565b905083611ed38880615690565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061395892505050565b600080611f29611f2360808801606089016142f8565b88612129565b9092509050600080808515611f6c57611f60878b611f4d60808d0160608e016142f8565b88611f5b60408f018f6156f5565b613a02565b91945092509050611f8c565b6101a0870151611f899063ffffffff16662386f26fc100006155d1565b92505b61010087015160009061ffff1615611fd057611fcd886dffffffffffffffffffffffffffff607088901c16611fc460208e018e615690565b90508a86613cda565b90505b61018088015160009067ffffffffffffffff16611ff9611ff360808e018e615690565b8c613d8a565b600001518563ffffffff168b60a0015161ffff168e806020019061201d9190615690565b6120289291506155d1565b8c6080015163ffffffff1661203d91906158b0565b61204791906158b0565b61205191906158b0565b61206b906dffffffffffffffffffffffffffff89166155d1565b61207591906155d1565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f60600160208101906120af91906142f8565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020546120ea9067ffffffffffffffff16896155d1565b6120f491906158b0565b6120fe91906158b0565b61210891906155e8565b9c9b505050505050505050505050565b6121206123f7565b6111b981613e4b565b67ffffffffffffffff811660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16918101829052829182036121e1576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610d09565b6000816020015163ffffffff16426121f991906158c3565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681111561229a576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610d09565b6122a3866122b4565b9151919350909150505b9250929050565b6000806122c083611b12565b9050806020015163ffffffff16600014806122f8575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612347576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610d09565b5192915050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016111fa576123a081613f40565b505050565b60606000610b6983613ff3565b6123bd600233613929565b6123f5576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610d09565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146123f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610d09565b60005b81518110156111fa57600082828151811061249857612498615623565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a250505080600101905061247b565b600061262f82600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a39061273c908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b60005b8251811015612a7157600083828151811061276857612768615623565b6020026020010151905060008160000151905060005b826020015151811015612a63576000836020015182815181106127a3576127a3615623565b60200260200101516020015190506000846020015183815181106127c9576127c9615623565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101561284c5760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610d09565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590612a51908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010161277e565b50505080600101905061274b565b5060005b81518110156123a0576000828281518110612a9257612a92615623565b60200260200101516000015190506000838381518110612ab457612ab4615623565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612a75565b60005b8251811015612bf857612b8e838281518110612b7657612b76615623565b6020026020010151600b61404f90919063ffffffff16565b15612bf057828181518110612ba557612ba5615623565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101612b58565b5060005b81518110156123a057612c32828281518110612c1a57612c1a615623565b6020026020010151600b61407190919063ffffffff16565b15612c9457818181518110612c4957612c49615623565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101612bfc565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff16612e08576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610d09565b5050505050565b600080612e1c84866158d6565b9050600060248260ff161115612e5357612e376024836158ef565b612e4290600a615a28565b612e4c90856155e8565b9050612e76565b612e5e8260246158ef565b612e6990600a615a28565b612e7390856155d1565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612ecc576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b95945050505050565b602081015160005b8151811015612f70576000828281518110612efa57612efa615623565b60200260200101519050612f1881600261409390919063ffffffff16565b15612f675760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101612edd565b50815160005b81518110156111a2576000828281518110612f9357612f93615623565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613003576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61300e60028261404f565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101612f76565b60005b81518110156111fa57600082828151811061308157613081615623565b60200260200101519050600083838151811061309f5761309f615623565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806130d8575061016081015163ffffffff16155b8061312a57506101e08101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806131495750806060015163ffffffff1681610160015163ffffffff16115b1561318c576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610d09565b67ffffffffffffffff821660009081526009602052604081206001015471010000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003613230578167ffffffffffffffff167fd31c671936387b2f84ed402b553bd50c0e9c20408ea4e91a836d77b8180fb724826040516132239190614a93565b60405180910390a2613273565b8167ffffffffffffffff167f1edd6f3553cfa16f10b95b195abae3a1cfca4783de4843f95d674b1e1df5ab208260405161326a9190614a93565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548160ff0219169083151502179055506101e08201518160010160116101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050613064565b60005b81518110156111fa57600082828151811061352757613527615623565b6020026020010151600001519050600083838151811061354957613549615623565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010161350a565b6040805180820190915260008082526020820152600083900361363257506040805180820190915267ffffffffffffffff8216815260006020820152610b69565b600061363e8486615a37565b9050600061364f8560048189615a7d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016136ec57808060200190518101906136e39190615aa7565b92505050610b69565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601613768576040518060400160405280828060200190518101906137549190615ad3565b815260006020909101529250610b69915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613804573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138289190615b06565b5050509150506000811215613869576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138e88373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138dd9190615b56565b866020015184612e0f565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff4216602082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b69565b836040015163ffffffff168311156139b15760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610d09565b836020015161ffff168211156139f3576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111a2846101e001518261234e565b6000808083815b81811015613ccc576000878783818110613a2557613a25615623565b905060400201803603810190613a3b9190615b73565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613b5b576101208d0151613b289061ffff16662386f26fc100006155d1565b613b3290886158b0565b96508c610140015186613b459190615bac565b9550613b52602086615bac565b94505050613cc4565b604081015160009061ffff1615613c145760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613bb7578351613bb0906122b4565b9050613bba565b508a5b620186a0836040015161ffff16613bfc8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140b590919063ffffffff16565b613c0691906155d1565b613c1091906155e8565b9150505b6060820151613c239088615bac565b9650816080015186613c359190615bac565b8251909650600090613c549063ffffffff16662386f26fc100006155d1565b905080821015613c7357613c68818a6158b0565b985050505050613cc4565b6000836020015163ffffffff16662386f26fc10000613c9291906155d1565b905080831115613cb257613ca6818b6158b0565b99505050505050613cc4565b613cbc838b6158b0565b995050505050505b600101613a09565b505096509650969350505050565b60008063ffffffff8316613cf0610160866155d1565b613cfc876101c06158b0565b613d0691906158b0565b613d1091906158b0565b905060008760c0015163ffffffff168860e0015161ffff1683613d3391906155d1565b613d3d91906158b0565b61010089015190915061ffff16613d646dffffffffffffffffffffffffffff8916836155d1565b613d6e91906155d1565b613d7e90655af3107a40006155d1565b98975050505050505050565b60408051808201909152600080825260208201526000613db6858585610160015163ffffffff166135f1565b9050826060015163ffffffff1681600001511115613e00576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101c001518015613e1457508060200151155b15610b66576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613eca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610d09565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008151602014613f7f57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610d099190614504565b600082806020019051810190613f959190615ad3565b905073ffffffffffffffffffffffffffffffffffffffff811180613fba575061040081105b156112c357826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610d099190614504565b60608160000180548060200260200160405190810160405280929190818152602001828054801561404357602002820191906000526020600020905b81548152602001906001019080831161402f575b50505050509050919050565b6000610b698373ffffffffffffffffffffffffffffffffffffffff84166140f2565b6000610b698373ffffffffffffffffffffffffffffffffffffffff8416614141565b6000610b698373ffffffffffffffffffffffffffffffffffffffff841661423b565b6000670de0b6b3a76400006140e8837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166155d1565b610b6991906155e8565b6000818152600183016020526040812054614139575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556112c3565b5060006112c3565b6000818152600183016020526040812054801561422a5760006141656001836158c3565b8554909150600090614179906001906158c3565b90508082146141de57600086600001828154811061419957614199615623565b90600052602060002001549050808760000184815481106141bc576141bc615623565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806141ef576141ef615bc9565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506112c3565b60009150506112c3565b5092915050565b6000818152600183016020526040812054801561422a57600061425f6001836158c3565b8554909150600090614273906001906158c3565b90508181146141de57600086600001828154811061419957614199615623565b803573ffffffffffffffffffffffffffffffffffffffff811681146142b757600080fd5b919050565b6000806000606084860312156142d157600080fd5b6142da84614293565b9250602084013591506142ef60408501614293565b90509250925092565b60006020828403121561430a57600080fd5b610b6982614293565b803567ffffffffffffffff811681146142b757600080fd5b60008083601f84011261433d57600080fd5b50813567ffffffffffffffff81111561435557600080fd5b6020830191508360208260051b85010111156122ad57600080fd5b60008060008060006060868803121561438857600080fd5b61439186614313565b9450602086013567ffffffffffffffff808211156143ae57600080fd5b6143ba89838a0161432b565b909650945060408801359150808211156143d357600080fd5b818801915088601f8301126143e757600080fd5b8135818111156143f657600080fd5b8960208260061b850101111561440b57600080fd5b9699959850939650602001949392505050565b6000815180845260005b8181101561444457602081850181015186830182015201614428565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156144f7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526144e585835161441e565b945092850192908501906001016144ab565b5092979650505050505050565b602081526000610b69602083018461441e565b6020808252825182820181905260009190848201906040850190845b8181101561456557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614533565b50909695505050505050565b60006020828403121561458357600080fd5b813567ffffffffffffffff81111561459a57600080fd5b820160408185031215610b6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156145fe576145fe6145ac565b60405290565b60405160a0810167ffffffffffffffff811182821017156145fe576145fe6145ac565b60405160c0810167ffffffffffffffff811182821017156145fe576145fe6145ac565b604051610200810167ffffffffffffffff811182821017156145fe576145fe6145ac565b6040516060810167ffffffffffffffff811182821017156145fe576145fe6145ac565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156146d8576146d86145ac565b604052919050565b600067ffffffffffffffff8211156146fa576146fa6145ac565b5060051b60200190565b60ff811681146111b957600080fd5b6000602080838503121561472657600080fd5b823567ffffffffffffffff81111561473d57600080fd5b8301601f8101851361474e57600080fd5b803561476161475c826146e0565b614691565b8181526060918202830184019184820191908884111561478057600080fd5b938501935b83851015614820578489038181121561479e5760008081fd5b6147a66145db565b6147af87614293565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156147e35760008081fd5b6147eb6145db565b92506147f8898901614293565b835287013561480681614704565b828901528088019190915283529384019391850191614785565b50979650505050505050565b80151581146111b957600080fd5b80356142b78161482c565b6000602080838503121561485857600080fd5b823567ffffffffffffffff81111561486f57600080fd5b8301601f8101851361488057600080fd5b803561488e61475c826146e0565b81815260a091820283018401918482019190888411156148ad57600080fd5b938501935b838510156148205780858a0312156148ca5760008081fd5b6148d2614604565b6148db86614293565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146149105760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146149495760008081fd5b90820152606061495a878201614293565b9082015260808681013561496d8161482c565b90820152835293840193918501916148b2565b6000806020838503121561499357600080fd5b823567ffffffffffffffff8111156149aa57600080fd5b6149b68582860161432b565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614a3057614a2084835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b92840192908501906001016149df565b5091979650505050505050565b600060208284031215614a4f57600080fd5b610b6982614313565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff1690820152604081016112c3565b81511515815261020081016020830151614ab3602084018261ffff169052565b506040830151614acb604084018263ffffffff169052565b506060830151614ae3606084018263ffffffff169052565b506080830151614afb608084018263ffffffff169052565b5060a0830151614b1160a084018261ffff169052565b5060c0830151614b2960c084018263ffffffff169052565b5060e0830151614b3f60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a080850151909116908301526101c0808401511515908301526101e0808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff811681146142b757600080fd5b803561ffff811681146142b757600080fd5b600082601f830112614c2357600080fd5b81356020614c3361475c836146e0565b82815260069290921b84018101918181019086841115614c5257600080fd5b8286015b84811015614c9f5760408189031215614c6f5760008081fd5b614c776145db565b614c8082614313565b8152614c8d858301614293565b81860152835291830191604001614c56565b509695505050505050565b60008060408385031215614cbd57600080fd5b67ffffffffffffffff83351115614cd357600080fd5b83601f843585010112614ce557600080fd5b614cf561475c84358501356146e0565b8335840180358083526020808401939260059290921b90910101861015614d1b57600080fd5b602085358601015b85358601803560051b01602001811015614f285767ffffffffffffffff81351115614d4d57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a03011215614d8657600080fd5b614d8e6145db565b614d9a60208301614313565b815267ffffffffffffffff60408301351115614db557600080fd5b88603f604084013584010112614dca57600080fd5b614de061475c60206040850135850101356146e0565b6020604084810135850182810135808552928401939260e00201018b1015614e0757600080fd5b6040808501358501015b6040858101358601602081013560e0020101811015614f095760e0818d031215614e3a57600080fd5b614e426145db565b614e4b82614293565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215614e7f57600080fd5b614e87614627565b614e9360208401614bec565b8152614ea160408401614bec565b6020820152614eb260608401614c00565b6040820152614ec360808401614bec565b6060820152614ed460a08401614bec565b6080820152614ee660c084013561482c565b60c083013560a0820152602082810191909152908452929092019160e001614e11565b5080602084015250508085525050602083019250602081019050614d23565b5092505067ffffffffffffffff60208401351115614f4557600080fd5b614f558460208501358501614c12565b90509250929050565b600082601f830112614f6f57600080fd5b81356020614f7f61475c836146e0565b8083825260208201915060208460051b870101935086841115614fa157600080fd5b602086015b84811015614c9f57614fb781614293565b8352918301918301614fa6565b60008060408385031215614fd757600080fd5b823567ffffffffffffffff80821115614fef57600080fd5b614ffb86838701614f5e565b9350602085013591508082111561501157600080fd5b5061501e85828601614f5e565b9150509250929050565b60008083601f84011261503a57600080fd5b50813567ffffffffffffffff81111561505257600080fd5b6020830191508360208285010111156122ad57600080fd5b6000806000806040858703121561508057600080fd5b843567ffffffffffffffff8082111561509857600080fd5b6150a488838901615028565b909650945060208701359150808211156150bd57600080fd5b506150ca87828801615028565b95989497509550505050565b600080604083850312156150e957600080fd5b6150f283614313565b9150614f5560208401614293565b60006020828403121561511257600080fd5b813567ffffffffffffffff8082111561512a57600080fd5b908301906040828603121561513e57600080fd5b6151466145db565b82358281111561515557600080fd5b61516187828601614f5e565b82525060208301358281111561517657600080fd5b61518287828601614f5e565b60208301525095945050505050565b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146142b757600080fd5b600060208083850312156151d457600080fd5b823567ffffffffffffffff8111156151eb57600080fd5b8301601f810185136151fc57600080fd5b803561520a61475c826146e0565b818152610220918202830184019184820191908884111561522a57600080fd5b938501935b8385101561482057848903818112156152485760008081fd5b6152506145db565b61525987614313565b8152610200807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08401121561528e5760008081fd5b61529661464a565b92506152a389890161483a565b835260406152b2818a01614c00565b8a85015260606152c3818b01614bec565b82860152608091506152d6828b01614bec565b9085015260a06152e78a8201614bec565b8286015260c091506152fa828b01614c00565b9085015260e061530b8a8201614bec565b82860152610100915061531f828b01614c00565b908501526101206153318a8201614c00565b828601526101409150615345828b01614c00565b908501526101606153578a8201614bec565b82860152610180915061536b828b01614bec565b908501526101a061537d8a8201614313565b828601526101c09150615391828b01614bec565b908501526101e06153a38a820161483a565b828601526153b2838b01615191565b908501525050808801919091528352938401939185019161522f565b600060208083850312156153e157600080fd5b823567ffffffffffffffff8111156153f857600080fd5b8301601f8101851361540957600080fd5b803561541761475c826146e0565b81815260069190911b8201830190838101908783111561543657600080fd5b928401925b8284101561548857604084890312156154545760008081fd5b61545c6145db565b61546585614293565b8152615472868601614313565b818701528252604093909301929084019061543b565b979650505050505050565b6000806000806000608086880312156154ab57600080fd5b6154b486614313565b94506154c260208701614293565b935060408601359250606086013567ffffffffffffffff8111156154e557600080fd5b6154f188828901615028565b969995985093965092949392505050565b8381528215156020820152606060408201526000612ecc606083018461441e565b6000806040838503121561553657600080fd5b61553f83614313565b9150602083013567ffffffffffffffff81111561555b57600080fd5b830160a0818603121561556d57600080fd5b809150509250929050565b6000806040838503121561558b57600080fd5b61559483614293565b9150614f5560208401614313565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176112c3576112c36155a2565b60008261561e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261568657600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156c557600080fd5b83018035915067ffffffffffffffff8211156156e057600080fd5b6020019150368190038213156122ad57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261572a57600080fd5b83018035915067ffffffffffffffff82111561574557600080fd5b6020019150600681901b36038213156122ad57600080fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146142b757600080fd5b60006040828403121561579b57600080fd5b6157a36145db565b6157ac83614293565b81526157ba6020840161575d565b60208201529392505050565b6000604082840312156157d857600080fd5b6157e06145db565b6157ac83614313565b600060208083850312156157fc57600080fd5b823567ffffffffffffffff81111561581357600080fd5b8301601f8101851361582457600080fd5b803561583261475c826146e0565b8181526060918202830184019184820191908884111561585157600080fd5b938501935b838510156148205780858a03121561586e5760008081fd5b61587661466e565b61587f86614293565b815261588c87870161575d565b87820152604061589d818801614bec565b9082015283529384019391850191615856565b808201808211156112c3576112c36155a2565b818103818111156112c3576112c36155a2565b60ff81811683821601908111156112c3576112c36155a2565b60ff82811682821603908111156112c3576112c36155a2565b600181815b8085111561596157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615947576159476155a2565b8085161561595457918102915b93841c939080029061590d565b509250929050565b600082615978575060016112c3565b81615985575060006112c3565b816001811461599b57600281146159a5576159c1565b60019150506112c3565b60ff8411156159b6576159b66155a2565b50506001821b6112c3565b5060208310610133831016604e8410600b84101617156159e4575081810a6112c3565b6159ee8383615908565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a2057615a206155a2565b029392505050565b6000610b6960ff841683615969565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015614be45760049490940360031b84901b1690921692915050565b60008085851115615a8d57600080fd5b83861115615a9a57600080fd5b5050820193919092039150565b600060408284031215615ab957600080fd5b615ac16145db565b8251815260208301516157ba8161482c565b600060208284031215615ae557600080fd5b5051919050565b805169ffffffffffffffffffff811681146142b757600080fd5b600080600080600060a08688031215615b1e57600080fd5b615b2786615aec565b9450602086015193506040860151925060608601519150615b4a60808701615aec565b90509295509295909350565b600060208284031215615b6857600080fd5b8151610b6981614704565b600060408284031215615b8557600080fd5b615b8d6145db565b615b9683614293565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614234576142346155a2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var FeeQuoterABI = FeeQuoterMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go b/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go
index d51e398b43..285aaaa338 100644
--- a/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go
+++ b/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go
@@ -59,7 +59,7 @@ type MultiOCR3BaseOracle struct {
var MultiOCR3HelperMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"AfterConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"oracleAddress\",\"type\":\"address\"}],\"name\":\"getOracle\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"},{\"internalType\":\"enumMultiOCR3Base.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"structMultiOCR3Base.Oracle\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"setTransmitOcrPluginType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmitWithSignatures\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"transmitWithoutSignatures\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b503380600081620000695760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200009c576200009c81620000a9565b5050466080525062000154565b336001600160a01b03821603620001035760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b608051611db66200017760003960008181610efc0152610f480152611db66000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637ac0aa1a11610076578063c673e5841161005b578063c673e584146101c5578063f2fde38b146101e5578063f716f99f146101f857600080fd5b80637ac0aa1a1461015b5780638da5cb5b1461019d57600080fd5b806334a9c92e116100a757806334a9c92e1461012057806344e65e551461014057806379ba50971461015357600080fd5b8063181f5a77146100c357806326bf9d261461010b575b600080fd5b604080518082018252601981527f4d756c74694f4352334261736548656c70657220312e302e300000000000000060208201529051610102919061153c565b60405180910390f35b61011e610119366004611603565b61020b565b005b61013361012e366004611691565b61023a565b60405161010291906116f3565b61011e61014e366004611766565b6102ca565b61011e61034d565b61011e610169366004611819565b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b6101d86101d3366004611819565b61044f565b604051610102919061188d565b61011e6101f3366004611920565b6105c7565b61011e610206366004611a8c565b6105db565b604080516000808252602082019092526004549091506102349060ff168585858580600061061d565b50505050565b6040805180820182526000808252602080830182905260ff86811683526003825284832073ffffffffffffffffffffffffffffffffffffffff871684528252918490208451808601909552805480841686529394939092918401916101009091041660028111156102ad576102ad6116c4565b60028111156102be576102be6116c4565b90525090505b92915050565b60045460408051602080880282810182019093528782526103439360ff16928c928c928c928c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a925061061d915050565b5050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146103d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6104926040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561054857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161051d575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156105b757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161058c575b5050505050815250509050919050565b6105cf6109a1565b6105d881610a24565b50565b6105e36109a1565b60005b81518110156106195761061182828151811061060457610604611bf5565b6020026020010151610b19565b6001016105e6565b5050565b60ff8781166000908152600260209081526040808320815160808101835281548152600190910154808616938201939093526101008304851691810191909152620100009091049092161515606083015287359061067c8760a4611c53565b90508260600151156106c4578451610695906020611c66565b86516106a2906020611c66565b6106ad9060a0611c53565b6106b79190611c53565b6106c19082611c53565b90505b368114610706576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016103ca565b508151811461074e5781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016103ca565b610756610ef9565b60ff808a16600090815260036020908152604080832033845282528083208151808301909252805480861683529394919390928401916101009091041660028111156107a4576107a46116c4565b60028111156107b5576107b56116c4565b90525090506002816020015160028111156107d2576107d26116c4565b1480156108335750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff168154811061080e5761080e611bf5565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b610869576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081606001511561094b576020820151610884906001611c7d565b60ff168551146108c0576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518551146108fb576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000878760405161090d929190611c96565b604051908190038120610924918b90602001611ca6565b6040516020818303038152906040528051906020012090506109498a82888888610f7a565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016103ca565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016103ca565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003610b5d5760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cba565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003610bca57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055610c1f565b6060840151600182015460ff6201000090910416151590151514610c1f576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016103ca565b60a08401518051601f60ff82161115610c675760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cba565b610cda8585600301805480602002602001604051908101604052809291908181526020018280548015610cd057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ca5575b50505050506111b2565b856060015115610e4857610d558585600201805480602002602001604051908101604052809291908181526020018280548015610cd05760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ca55750505050506111b2565b60808601518051610d6f906002870190602084019061147e565b5080516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841690810291909117909155601f1015610de85760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cba565b6040880151610df8906003611cd4565b60ff168160ff1611610e395760036040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cba565b610e458783600161124a565b50505b610e548583600261124a565b8151610e69906003860190602085019061147e565b506040868101516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793610ee0938a939260028b01929190611cf7565b60405180910390a1610ef185611445565b505050505050565b467f000000000000000000000000000000000000000000000000000000000000000014610a22576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016103ca565b610f82611508565b835160005b81811015610343576000600188868460208110610fa657610fa6611bf5565b610fb391901a601b611c7d565b898581518110610fc557610fc5611bf5565b6020026020010151898681518110610fdf57610fdf611bf5565b60200260200101516040516000815260200160405260405161101d949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561103f573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff8516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156110cb576110cb6116c4565b60028111156110dc576110dc6116c4565b90525090506001816020015160028111156110f9576110f96116c4565b14611130576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f811061114757611147611bf5565b602002015115611183576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f811061119e5761119e611bf5565b911515602090920201525050600101610f87565b60005b81518110156112455760ff8316600090815260036020526040812083519091908490849081106111e7576111e7611bf5565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556001016111b5565b505050565b60005b82518160ff161015610234576000838260ff168151811061127057611270611bf5565b602002602001015190506000600281111561128d5761128d6116c4565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205461010090041660028111156112d9576112d96116c4565b146113135760046040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611cba565b73ffffffffffffffffffffffffffffffffffffffff8116611360576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff168152602001846002811115611386576113866116c4565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561142b5761142b6116c4565b0217905550905050508061143e90611d8a565b905061124d565b60405160ff821681527f897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b539060200160405180910390a150565b8280548282559060005260206000209081019282156114f8579160200282015b828111156114f857825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061149e565b50611504929150611527565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b808211156115045760008155600101611528565b60006020808352835180602085015260005b8181101561156a5785810183015185820160400152820161154e565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b80606081018310156102c457600080fd5b60008083601f8401126115cc57600080fd5b50813567ffffffffffffffff8111156115e457600080fd5b6020830191508360208285010111156115fc57600080fd5b9250929050565b60008060006080848603121561161857600080fd5b61162285856115a9565b9250606084013567ffffffffffffffff81111561163e57600080fd5b61164a868287016115ba565b9497909650939450505050565b803560ff8116811461166857600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461166857600080fd5b600080604083850312156116a457600080fd5b6116ad83611657565b91506116bb6020840161166d565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815160ff1681526020820151604082019060038110611714576117146116c4565b8060208401525092915050565b60008083601f84011261173357600080fd5b50813567ffffffffffffffff81111561174b57600080fd5b6020830191508360208260051b85010111156115fc57600080fd5b60008060008060008060008060e0898b03121561178257600080fd5b61178c8a8a6115a9565b9750606089013567ffffffffffffffff808211156117a957600080fd5b6117b58c838d016115ba565b909950975060808b01359150808211156117ce57600080fd5b6117da8c838d01611721565b909750955060a08b01359150808211156117f357600080fd5b506118008b828c01611721565b999c989b50969995989497949560c00135949350505050565b60006020828403121561182b57600080fd5b61183482611657565b9392505050565b60008151808452602080850194506020840160005b8381101561188257815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611850565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a08401526118dc60e084018261183b565b905060408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160c0850152611917828261183b565b95945050505050565b60006020828403121561193257600080fd5b6118348261166d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561198d5761198d61193b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156119da576119da61193b565b604052919050565b600067ffffffffffffffff8211156119fc576119fc61193b565b5060051b60200190565b8035801515811461166857600080fd5b600082601f830112611a2757600080fd5b81356020611a3c611a37836119e2565b611993565b8083825260208201915060208460051b870101935086841115611a5e57600080fd5b602086015b84811015611a8157611a748161166d565b8352918301918301611a63565b509695505050505050565b60006020808385031215611a9f57600080fd5b823567ffffffffffffffff80821115611ab757600080fd5b818501915085601f830112611acb57600080fd5b8135611ad9611a37826119e2565b81815260059190911b83018401908481019088831115611af857600080fd5b8585015b83811015611be857803585811115611b1357600080fd5b860160c0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215611b485760008081fd5b611b5061196a565b8882013581526040611b63818401611657565b8a8301526060611b74818501611657565b8284015260809150611b87828501611a06565b9083015260a08381013589811115611b9f5760008081fd5b611bad8f8d83880101611a16565b838501525060c0840135915088821115611bc75760008081fd5b611bd58e8c84870101611a16565b9083015250845250918601918601611afc565b5098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156102c4576102c4611c24565b80820281158282048414176102c4576102c4611c24565b60ff81811683821601908111156102c4576102c4611c24565b8183823760009101908152919050565b828152606082602083013760800192915050565b6020810160058310611cce57611cce6116c4565b91905290565b60ff8181168382160290811690818114611cf057611cf0611c24565b5092915050565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015611d5e57845473ffffffffffffffffffffffffffffffffffffffff1683526001948501949284019201611d2c565b50508481036060860152611d72818861183b565b935050505060ff831660808301529695505050505050565b600060ff821660ff8103611da057611da0611c24565b6001019291505056fea164736f6c6343000818000a",
+ Bin: "0x60a06040523480156200001157600080fd5b503380600081620000695760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200009c576200009c81620000a9565b5050466080525062000154565b336001600160a01b03821603620001035760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b608051611d386200017760003960008181610ef00152610f3c0152611d386000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637ac0aa1a11610076578063c673e5841161005b578063c673e584146101c5578063f2fde38b146101e5578063f716f99f146101f857600080fd5b80637ac0aa1a1461015b5780638da5cb5b1461019d57600080fd5b806334a9c92e116100a757806334a9c92e1461012057806344e65e551461014057806379ba50971461015357600080fd5b8063181f5a77146100c357806326bf9d261461010b575b600080fd5b604080518082018252601981527f4d756c74694f4352334261736548656c70657220312e302e30000000000000006020820152905161010291906114dd565b60405180910390f35b61011e6101193660046115a4565b61020b565b005b61013361012e366004611632565b61023a565b6040516101029190611694565b61011e61014e366004611707565b6102ca565b61011e61034d565b61011e6101693660046117ba565b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b6101d86101d33660046117ba565b61044f565b604051610102919061182e565b61011e6101f33660046118c1565b6105c7565b61011e610206366004611a2d565b6105db565b604080516000808252602082019092526004549091506102349060ff168585858580600061061d565b50505050565b6040805180820182526000808252602080830182905260ff86811683526003825284832073ffffffffffffffffffffffffffffffffffffffff871684528252918490208451808601909552805480841686529394939092918401916101009091041660028111156102ad576102ad611665565b60028111156102be576102be611665565b90525090505b92915050565b60045460408051602080880282810182019093528782526103439360ff16928c928c928c928c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a925061061d915050565b5050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146103d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6104926040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561054857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161051d575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156105b757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161058c575b5050505050815250509050919050565b6105cf6109a1565b6105d881610a24565b50565b6105e36109a1565b60005b81518110156106195761061182828151811061060457610604611b96565b6020026020010151610b19565b6001016105e6565b5050565b60ff8781166000908152600260209081526040808320815160808101835281548152600190910154808616938201939093526101008304851691810191909152620100009091049092161515606083015287359061067c8760a4611bf4565b90508260600151156106c4578451610695906020611c07565b86516106a2906020611c07565b6106ad9060a0611bf4565b6106b79190611bf4565b6106c19082611bf4565b90505b368114610706576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016103ca565b508151811461074e5781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016103ca565b610756610eed565b60ff808a16600090815260036020908152604080832033845282528083208151808301909252805480861683529394919390928401916101009091041660028111156107a4576107a4611665565b60028111156107b5576107b5611665565b90525090506002816020015160028111156107d2576107d2611665565b1480156108335750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff168154811061080e5761080e611b96565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b610869576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081606001511561094b576020820151610884906001611c1e565b60ff168551146108c0576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518551146108fb576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000878760405161090d929190611c37565b604051908190038120610924918b90602001611c47565b6040516020818303038152906040528051906020012090506109498a82888888610f6e565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016103ca565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016103ca565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003610b5d5760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003610bca57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055610c1f565b6060840151600182015460ff6201000090910416151590151514610c1f576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016103ca565b60a084015180516101001015610c645760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b610cd78484600301805480602002602001604051908101604052809291908181526020018280548015610ccd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ca2575b505050505061117e565b846060015115610e3d57610d528484600201805480602002602001604051908101604052809291908181526020018280548015610ccd5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ca257505050505061117e565b608085015180516101001015610d975760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b6040860151610da7906003611c75565b60ff16815111610de65760036040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841602179055610e2e906002860190602084019061143e565b50610e3b85826001611216565b505b610e4984826002611216565b8051610e5e906003850190602084019061143e565b506040858101516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793610ed59389939260028a01929190611c98565b60405180910390a1610ee684611405565b5050505050565b467f000000000000000000000000000000000000000000000000000000000000000014610a22576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016103ca565b8251600090815b81811015610343576000600188868460208110610f9457610f94611b96565b610fa191901a601b611c1e565b898581518110610fb357610fb3611b96565b6020026020010151898681518110610fcd57610fcd611b96565b60200260200101516040516000815260200160405260405161100b949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561102d573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff8516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156110b9576110b9611665565b60028111156110ca576110ca611665565b90525090506001816020015160028111156110e7576110e7611665565b1461111e576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b851615611161576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050610f75565b60005b81518110156112115760ff8316600090815260036020526040812083519091908490849081106111b3576111b3611b96565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055600101611181565b505050565b60005b825181101561023457600083828151811061123657611236611b96565b602002602001015190506000600281111561125357611253611665565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054610100900416600281111561129f5761129f611665565b146112d95760046040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016103ca9190611c5b565b73ffffffffffffffffffffffffffffffffffffffff8116611326576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561134c5761134c611665565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156113f1576113f1611665565b021790555090505050806001019050611219565b60405160ff821681527f897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b539060200160405180910390a150565b8280548282559060005260206000209081019282156114b8579160200282015b828111156114b857825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061145e565b506114c49291506114c8565b5090565b5b808211156114c457600081556001016114c9565b60006020808352835180602085015260005b8181101561150b578581018301518582016040015282016114ef565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b80606081018310156102c457600080fd5b60008083601f84011261156d57600080fd5b50813567ffffffffffffffff81111561158557600080fd5b60208301915083602082850101111561159d57600080fd5b9250929050565b6000806000608084860312156115b957600080fd5b6115c3858561154a565b9250606084013567ffffffffffffffff8111156115df57600080fd5b6115eb8682870161155b565b9497909650939450505050565b803560ff8116811461160957600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461160957600080fd5b6000806040838503121561164557600080fd5b61164e836115f8565b915061165c6020840161160e565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815160ff16815260208201516040820190600381106116b5576116b5611665565b8060208401525092915050565b60008083601f8401126116d457600080fd5b50813567ffffffffffffffff8111156116ec57600080fd5b6020830191508360208260051b850101111561159d57600080fd5b60008060008060008060008060e0898b03121561172357600080fd5b61172d8a8a61154a565b9750606089013567ffffffffffffffff8082111561174a57600080fd5b6117568c838d0161155b565b909950975060808b013591508082111561176f57600080fd5b61177b8c838d016116c2565b909750955060a08b013591508082111561179457600080fd5b506117a18b828c016116c2565b999c989b50969995989497949560c00135949350505050565b6000602082840312156117cc57600080fd5b6117d5826115f8565b9392505050565b60008151808452602080850194506020840160005b8381101561182357815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016117f1565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a084015261187d60e08401826117dc565b905060408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160c08501526118b882826117dc565b95945050505050565b6000602082840312156118d357600080fd5b6117d58261160e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561192e5761192e6118dc565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561197b5761197b6118dc565b604052919050565b600067ffffffffffffffff82111561199d5761199d6118dc565b5060051b60200190565b8035801515811461160957600080fd5b600082601f8301126119c857600080fd5b813560206119dd6119d883611983565b611934565b8083825260208201915060208460051b8701019350868411156119ff57600080fd5b602086015b84811015611a2257611a158161160e565b8352918301918301611a04565b509695505050505050565b60006020808385031215611a4057600080fd5b823567ffffffffffffffff80821115611a5857600080fd5b818501915085601f830112611a6c57600080fd5b8135611a7a6119d882611983565b81815260059190911b83018401908481019088831115611a9957600080fd5b8585015b83811015611b8957803585811115611ab457600080fd5b860160c0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215611ae95760008081fd5b611af161190b565b8882013581526040611b048184016115f8565b8a8301526060611b158185016115f8565b8284015260809150611b288285016119a7565b9083015260a08381013589811115611b405760008081fd5b611b4e8f8d838801016119b7565b838501525060c0840135915088821115611b685760008081fd5b611b768e8c848701016119b7565b9083015250845250918601918601611a9d565b5098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156102c4576102c4611bc5565b80820281158282048414176102c4576102c4611bc5565b60ff81811683821601908111156102c4576102c4611bc5565b8183823760009101908152919050565b828152606082602083013760800192915050565b6020810160058310611c6f57611c6f611665565b91905290565b60ff8181168382160290811690818114611c9157611c91611bc5565b5092915050565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015611cff57845473ffffffffffffffffffffffffffffffffffffffff1683526001948501949284019201611ccd565b50508481036060860152611d1381886117dc565b935050505060ff83166080830152969550505050505056fea164736f6c6343000818000a",
}
var MultiOCR3HelperABI = MultiOCR3HelperMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go
index 65795e0626..b491a4f39d 100644
--- a/core/gethwrappers/ccip/generated/offramp/offramp.go
+++ b/core/gethwrappers/ccip/generated/offramp/offramp.go
@@ -165,7 +165,7 @@ type OffRampUnblessedRoot struct {
var OffRampMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x6101206040523480156200001257600080fd5b5060405162006c4a38038062006c4a8339810160408190526200003591620008c7565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003c1565b50505062000c67565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b031916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b60005b815181101562000666576000828281518110620003e557620003e562000a1d565b60200260200101519050600081602001519050806001600160401b0316600003620004235760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166200044c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600660205260408120600181018054919291620004789062000a33565b80601f0160208091040260200160405190810160405280929190818152602001828054620004a69062000a33565b8015620004f75780601f10620004cb57610100808354040283529160200191620004f7565b820191906000526020600020905b815481529060010190602001808311620004d957829003601f168201915b5050505050905060008460600151905081516000036200059e57805160000362000534576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000544828262000ac4565b508254600160a81b600160e81b031916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005d9565b8080519060200120828051906020012014620005d95760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906200064d90869062000b90565b60405180910390a25050505050806001019050620003c4565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620006a557620006a56200066a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006d657620006d66200066a565b604052919050565b80516001600160401b0381168114620006f657600080fd5b919050565b6001600160a01b03811681146200071157600080fd5b50565b805163ffffffff81168114620006f657600080fd5b6000601f83601f8401126200073d57600080fd5b825160206001600160401b03808311156200075c576200075c6200066a565b8260051b6200076d838201620006ab565b93845286810183019383810190898611156200078857600080fd5b84890192505b85831015620008ba57825184811115620007a85760008081fd5b89016080601f19828d038101821315620007c25760008081fd5b620007cc62000680565b88840151620007db81620006fb565b81526040620007ec858201620006de565b8a8301526060808601518015158114620008065760008081fd5b838301529385015193898511156200081e5760008081fd5b84860195508f603f8701126200083657600094508485fd5b8a8601519450898511156200084f576200084f6200066a565b620008608b858f88011601620006ab565b93508484528f82868801011115620008785760008081fd5b60005b8581101562000898578681018301518582018d01528b016200087b565b5060009484018b0194909452509182015283525091840191908401906200078e565b9998505050505050505050565b6000806000838503610140811215620008df57600080fd5b6080811215620008ee57600080fd5b620008f862000680565b6200090386620006de565b815260208601516200091581620006fb565b602082015260408601516200092a81620006fb565b604082015260608601516200093f81620006fb565b6060820152935060a0607f19820112156200095957600080fd5b5060405160a081016001600160401b0380821183831017156200098057620009806200066a565b81604052608087015191506200099682620006fb565b818352620009a760a0880162000714565b6020840152620009ba60c0880162000714565b6040840152620009cd60e0880162000714565b60608401526101008701519150620009e582620006fb565b608083018290526101208701519294508083111562000a0357600080fd5b505062000a138682870162000729565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4857607f821691505b60208210810362000a6957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000abf576000816000526020600020601f850160051c8101602086101562000a9a5750805b601f850160051c820191505b8181101562000abb5782815560010162000aa6565b5050505b505050565b81516001600160401b0381111562000ae05762000ae06200066a565b62000af88162000af1845462000a33565b8462000a6f565b602080601f83116001811462000b30576000841562000b175750858301515b600019600386901b1c1916600185901b17855562000abb565b600085815260208120601f198616915b8281101562000b615788860151825594840194600190910190840162000b40565b508582101562000b805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000be58162000a33565b8060a089015260c0600183166000811462000c09576001811462000c265762000c58565b60ff19841660c08b015260c083151560051b8b0101945062000c58565b85600052602060002060005b8481101562000c4f5781548c820185015290880190890162000c32565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615f7462000cd6600039600081816102660152612a010152600081816102370152612f1d0152600081816102080152818161142b015261196d0152600081816101d801526125f00152600081816117f3015261183f0152615f746000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806385572ffb116100d8578063ccd37ba31161008c578063f2fde38b11610066578063f2fde38b14610583578063f716f99f14610596578063ff888fb1146105a957600080fd5b8063ccd37ba31461050b578063d2a15d3514610550578063e9d68a8e1461056357600080fd5b8063991a5018116100bd578063991a5018146104c5578063a80036b4146104d8578063c673e584146104eb57600080fd5b806385572ffb1461049c5780638da5cb5b146104aa57600080fd5b8063311cd5131161012f5780635e36480c116101145780635e36480c146103785780637437ff9f1461039857806379ba50971461049457600080fd5b8063311cd513146103495780633f4b04aa1461035c57600080fd5b806306285c691161016057806306285c69146101a4578063181f5a77146102ed5780632d04ab761461033657600080fd5b806304666f9c1461017c57806305d938b514610191575b600080fd5b61018f61018a3660046140d8565b6105cc565b005b61018f61019f366004614764565b6105e0565b61029660408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102e49190815167ffffffffffffffff1681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103296040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102e491906148df565b61018f61034436600461498a565b610785565b61018f610357366004614a3d565b610b5c565b60095460405167ffffffffffffffff90911681526020016102e4565b61038b610386366004614a91565b610bc5565b6040516102e49190614aee565b6104376040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526004546001600160a01b03808216835263ffffffff600160a01b83048116602085015278010000000000000000000000000000000000000000000000008304811694840194909452600160e01b9091049092166060820152600554909116608082015290565b6040516102e49190600060a0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b61018f610c1b565b61018f610177366004614afc565b6000546040516001600160a01b0390911681526020016102e4565b61018f6104d3366004614b4b565b610cd9565b61018f6104e6366004614bbf565b610cea565b6104fe6104f9366004614c2c565b61105d565b6040516102e49190614c8c565b610542610519366004614d01565b67ffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102e4565b61018f61055e366004614d2b565b6111bb565b610576610571366004614da0565b611275565b6040516102e49190614dbb565b61018f610591366004614e09565b611382565b61018f6105a4366004614e8e565b611393565b6105bc6105b7366004614fcc565b6113d5565b60405190151581526020016102e4565b6105d4611496565b6105dd816114f2565b50565b6105e86117f0565b815181518114610624576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561077557600084828151811061064357610643614fe5565b6020026020010151905060008160200151519050600085848151811061066b5761066b614fe5565b60200260200101519050805182146106af576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156107665760008282815181106106ce576106ce614fe5565b602002602001015190508060001461075d57846020015182815181106106f6576106f6614fe5565b60200260200101516080015181101561075d5784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064015b60405180910390fd5b506001016106b2565b50505050806001019050610627565b506107808383611871565b505050565b60006107938789018961516b565b805151519091501515806107ac57508051602001515115155b156108ac5760095460208a01359067ffffffffffffffff8083169116101561086b576009805467ffffffffffffffff191667ffffffffffffffff83161790556004805483516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921692633937306f92610834929101615393565b600060405180830381600087803b15801561084e57600080fd5b505af1158015610862573d6000803e3d6000fd5b505050506108aa565b8160200151516000036108aa576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b816020015151811015610aa5576000826020015182815181106108d4576108d4614fe5565b602002602001015190506000816000015190506108f081611921565b60006108fb82611a23565b602084015151815491925067ffffffffffffffff908116600160a81b9092041614158061093f575060208084015190810151905167ffffffffffffffff9182169116115b1561097f57825160208401516040517feefb0cac0000000000000000000000000000000000000000000000000000000081526107549291906004016153a6565b6040830151806109bb576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff16600090815260086020908152604080832084845290915290205415610a2e5783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101829052604401610754565b6020808501510151610a419060016153f1565b82547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b67ffffffffffffffff9283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016108af565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d81604051610ad59190615419565b60405180910390a1610b5160008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611a8a915050565b505050505050505050565b610b9c610b6b828401846154b6565b6040805160008082526020820190925290610b96565b6060815260200190600190039081610b815790505b50611871565b604080516000808252602082019092529050610bbf600185858585866000611a8a565b50505050565b6000610bd3600160046154eb565b6002610be0608085615514565b67ffffffffffffffff16610bf4919061553b565b610bfe8585611e01565b901c166003811115610c1257610c12614ac4565b90505b92915050565b6001546001600160a01b03163314610c755760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610754565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ce1611496565b6105dd81611e48565b333014610d23576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610d60565b6040805180820190915260008082526020820152815260200190600190039081610d395790505b5060a08501515190915015610d9457610d918460a00151856020015186606001518760000151602001518787611fae565b90505b6040805160a0810182528551518152855160209081015167ffffffffffffffff1681830152808701518351600094840192610dd09291016148df565b60408051601f19818403018152918152908252878101516020830152018390526005549091506001600160a01b03168015610edd576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a190610e4a9085906004016155f4565b600060405180830381600087803b158015610e6457600080fd5b505af1925050508015610e75575060015b610edd573d808015610ea3576040519150601f19603f3d011682016040523d82523d6000602084013e610ea8565b606091505b50806040517f09c2532500000000000000000000000000000000000000000000000000000000815260040161075491906148df565b604086015151158015610ef257506080860151155b80610f09575060608601516001600160a01b03163b155b80610f4957506060860151610f47906001600160a01b03167f85572ffb000000000000000000000000000000000000000000000000000000006120cd565b155b15610f5657505050505050565b855160209081015167ffffffffffffffff1660009081526006909152604080822054608089015160608a015192517f3cf9798300000000000000000000000000000000000000000000000000000000815284936001600160a01b0390931692633cf9798392610fce9289926113889291600401615607565b6000604051808303816000875af1158015610fed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110159190810190615643565b50915091508161105357806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161075491906148df565b5050505050505050565b6110a06040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561114957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161112b575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156111ab57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161118d575b5050505050815250509050919050565b6111c3611496565b60005b818110156107805760008383838181106111e2576111e2614fe5565b9050604002018036038101906111f891906156d9565b905061120781602001516113d5565b61126c57805167ffffffffffffffff1660009081526008602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b506001016111c6565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b90920490921694830194909452600184018054939492939184019161130290615712565b80601f016020809104026020016040519081016040528092919081815260200182805461132e90615712565b80156111ab5780601f10611350576101008083540402835291602001916111ab565b820191906000526020600020905b81548152906001019060200180831161135e57505050919092525091949350505050565b61138a611496565b6105dd816120e9565b61139b611496565b60005b81518110156113d1576113c98282815181106113bc576113bc614fe5565b602002602001015161219f565b60010161139e565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c15919061574c565b6000546001600160a01b031633146114f05760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610754565b565b60005b81518110156113d157600082828151811061151257611512614fe5565b602002602001015190506000816020015190508067ffffffffffffffff16600003611569576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81516001600160a01b0316611591576040516342bcdf7f60e11b815260040160405180910390fd5b67ffffffffffffffff811660009081526006602052604081206001810180549192916115bc90615712565b80601f01602080910402602001604051908101604052809291908181526020018280546115e890615712565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b5050505050905060008460600151905081516000036116ed578051600003611670576040516342bcdf7f60e11b815260040160405180910390fd5b6001830161167e82826157b1565b5082547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b17835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611740565b8080519060200120828051906020012014611740576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610754565b604080860151845487516001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19921515600160a01b02929092167fffffffffffffffffffffff000000000000000000000000000000000000000000909116171784555167ffffffffffffffff8516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906117d8908690615871565b60405180910390a250505050508060010190506114f5565b467f0000000000000000000000000000000000000000000000000000000000000000146114f0576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610754565b81516000036118ab576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b845181101561191a576119128582815181106118e0576118e0614fe5565b60200260200101518461190c578583815181106118ff576118ff614fe5565b60200260200101516124e3565b836124e3565b6001016118c2565b5050505050565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e0919061574c565b156105dd576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610754565b67ffffffffffffffff811660009081526006602052604081208054600160a01b900460ff16610c15576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610754565b60ff87811660009081526002602090815260408083208151608081018352815481526001909101548086169382019390935261010083048516918101919091526201000090910490921615156060830152873590611ae98760a461593f565b9050826060015115611b31578451611b0290602061553b565b8651611b0f90602061553b565b611b1a9060a061593f565b611b24919061593f565b611b2e908261593f565b90505b368114611b73576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610754565b5081518114611bbb5781516040517f93df584c000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610754565b611bc36117f0565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611c1157611c11614ac4565b6002811115611c2257611c22614ac4565b9052509050600281602001516002811115611c3f57611c3f614ac4565b148015611c935750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611c7b57611c7b614fe5565b6000918252602090912001546001600160a01b031633145b611cc9576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611dab576020820151611ce4906001615952565b60ff16855114611d20576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611d5b576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611d6d92919061596b565b604051908190038120611d84918b9060200161597b565b604051602081830303815290604052805190602001209050611da98a82888888612caf565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b67ffffffffffffffff8216600090815260076020526040812081611e2660808561598f565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b80516001600160a01b0316611e70576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a17600160a01b63ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff1916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b6060865167ffffffffffffffff811115611fca57611fca613eef565b60405190808252806020026020018201604052801561200f57816020015b6040805180820190915260008082526020820152815260200190600190039081611fe85790505b50905060005b87518110156120c15761209c88828151811061203357612033614fe5565b602002602001015188888888888781811061205057612050614fe5565b905060200281019061206291906159b6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ebc92505050565b8282815181106120ae576120ae614fe5565b6020908102919091010152600101612015565b505b9695505050505050565b60006120d883613261565b8015610c125750610c1283836132c5565b336001600160a01b038216036121415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610754565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff166000036121ca576000604051631b3fab5160e11b81526004016107549190615a1b565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361223757606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff90921691909117905561228c565b6060840151600182015460ff620100009091041615159015151461228c576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff84166004820152602401610754565b60a08401518051601f60ff821611156122bb576001604051631b3fab5160e11b81526004016107549190615a1b565b612321858560030180548060200260200160405190810160405280929190818152602001828054801561231757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122f9575b5050505050613380565b8560600151156124505761238f8585600201805480602002602001604051908101604052809291908181526020018280548015612317576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116122f9575050505050613380565b608086015180516123a99060028701906020840190613e49565b5080516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841690810291909117909155601f1015612409576002604051631b3fab5160e11b81526004016107549190615a1b565b6040880151612419906003615a35565b60ff168160ff1611612441576003604051631b3fab5160e11b81526004016107549190615a1b565b61244d878360016133e9565b50505b61245c858360026133e9565b81516124719060038601906020850190613e49565b5060408681015160018501805460ff191660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936124ca938a939260028b01929190615a51565b60405180910390a16124db85613569565b505050505050565b81516124ee81611921565b60006124f982611a23565b602085015151909150600081900361253c576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846040015151811461257a576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561259557612595613eef565b6040519080825280602002602001820160405280156125be578160200160208202803683370190505b50905060005b82811015612733576000876020015182815181106125e4576125e4614fe5565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff161461267757805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610754565b61270d8186600101805461268a90615712565b80601f01602080910402602001604051908101604052809291908181526020018280546126b690615712565b80156127035780601f106126d857610100808354040283529160200191612703565b820191906000526020600020905b8154815290600101906020018083116126e657829003601f168201915b5050505050613585565b83838151811061271f5761271f614fe5565b6020908102919091010152506001016125c4565b50600061274a858389606001518a608001516136a7565b905080600003612792576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610754565b8551151560005b84811015610b515760005a905060008a6020015183815181106127be576127be614fe5565b6020026020010151905060006127dc8a836000015160600151610bc5565b905060008160038111156127f2576127f2614ac4565b148061280f5750600381600381111561280d5761280d614ac4565b145b612867578151606001516040805167ffffffffffffffff808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c91015b60405180910390a1505050612ca7565b841561293757600454600090600160a01b900463ffffffff1661288a88426154eb565b11905080806128aa575060038260038111156128a8576128a8614ac4565b145b6128ec576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c166004820152602401610754565b8b85815181106128fe576128fe614fe5565b6020026020010151600014612931578b858151811061291f5761291f614fe5565b60200260200101518360800181815250505b50612998565b600081600381111561294b5761294b614ac4565b14612998578151606001516040805167ffffffffffffffff808e16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209101612857565b81516080015167ffffffffffffffff1615612a875760008160038111156129c1576129c1614ac4565b03612a875781516080015160208301516040517fe0e03cae0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612a38928f929190600401615afd565b6020604051808303816000875af1158015612a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7b919061574c565b612a8757505050612ca7565b60008c604001518581518110612a9f57612a9f614fe5565b6020026020010151905080518360a001515114612b03578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808e1660048301529091166024820152604401610754565b612b178b84600001516060015160016136fd565b600080612b2485846137a5565b91509150612b3b8d866000015160600151846136fd565b8715612bab576003826003811115612b5557612b55614ac4565b03612bab576000846003811115612b6e57612b6e614ac4565b14612bab578451516040517f2b11b8d900000000000000000000000000000000000000000000000000000000815261075491908390600401615b2a565b6002826003811115612bbf57612bbf614ac4565b14612c19576003826003811115612bd857612bd8614ac4565b14612c19578451606001516040517f926c5a3e000000000000000000000000000000000000000000000000000000008152610754918f918590600401615b43565b84600001516000015185600001516060015167ffffffffffffffff168e67ffffffffffffffff167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8b81518110612c7357612c73614fe5565b602002602001015186865a612c88908e6154eb565b604051612c989493929190615b69565b60405180910390a45050505050505b600101612799565b612cb7613ebb565b835160005b81811015611053576000600188868460208110612cdb57612cdb614fe5565b612ce891901a601b615952565b898581518110612cfa57612cfa614fe5565b6020026020010151898681518110612d1457612d14614fe5565b602002602001015160405160008152602001604052604051612d52949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612d74573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b03851683528152858220858701909652855480841686529397509095509293928401916101009004166002811115612dd557612dd5614ac4565b6002811115612de657612de6614ac4565b9052509050600181602001516002811115612e0357612e03614ac4565b14612e3a576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f8110612e5157612e51614fe5565b602002015115612e8d576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f8110612ea857612ea8614fe5565b911515602090920201525050600101612cbc565b60408051808201909152600080825260208201526000612edf876020015161386f565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f889190615ba0565b90506001600160a01b0381161580612fd05750612fce6001600160a01b0382167faff2afbf000000000000000000000000000000000000000000000000000000006120cd565b155b15613012576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610754565b60045460009081906130349089908690600160e01b900463ffffffff16613915565b9150915060008060006131016040518061010001604052808e81526020018c67ffffffffffffffff1681526020018d6001600160a01b031681526020018f606001518152602001896001600160a01b031681526020018f6000015181526020018f6040015181526020018b8152506040516024016130b29190615bbd565b60408051601f198184030181529190526020810180516001600160e01b03167f390775370000000000000000000000000000000000000000000000000000000017905287866113886084613a43565b9250925092508261314057816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161075491906148df565b81516020146131885781516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610754565b60008280602001905181019061319e9190615c8a565b9050866001600160a01b03168c6001600160a01b0316146132335760006131cf8d8a6131ca868a6154eb565b613915565b509050868110806131e95750816131e688836154eb565b14155b15613231576040517fa966e21f000000000000000000000000000000000000000000000000000000008152600481018390526024810188905260448101829052606401610754565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b600061328d827f01ffc9a7000000000000000000000000000000000000000000000000000000006132c5565b8015610c1557506132be827fffffffff000000000000000000000000000000000000000000000000000000006132c5565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d91506000519050828015613369575060208210155b80156133755750600081115b979650505050505050565b60005b81518110156107805760ff8316600090815260036020526040812083519091908490849081106133b5576133b5614fe5565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101613383565b60005b82518160ff161015610bbf576000838260ff168151811061340f5761340f614fe5565b602002602001015190506000600281111561342c5761342c614ac4565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561346b5761346b614ac4565b1461348c576004604051631b3fab5160e11b81526004016107549190615a1b565b6001600160a01b0381166134cc576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156134f2576134f2614ac4565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561354f5761354f614ac4565b0217905550905050508061356290615ca3565b90506133ec565b60ff81166105dd576009805467ffffffffffffffff1916905550565b8151602080820151604092830151925160009384936135cb937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615cc2565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d015195015195976136149794969395929491939101615cf5565b604051602081830303815290604052805190602001208560400151805190602001208660a0015160405160200161364b9190615e07565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b6000806136b5858585613b69565b90506136c0816113d5565b6136ce5760009150506136f5565b67ffffffffffffffff86166000908152600860209081526040808320938352929052205490505b949350505050565b6000600261370c608085615514565b67ffffffffffffffff16613720919061553b565b9050600061372e8585611e01565b90508161373d600160046154eb565b901b19168183600381111561375457613754614ac4565b67ffffffffffffffff871660009081526007602052604081209190921b9290921791829161378360808861598f565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fa80036b4000000000000000000000000000000000000000000000000000000008152600090606090309063a80036b4906137e99087908790600401615e67565b600060405180830381600087803b15801561380357600080fd5b505af1925050508015613814575060015b613853573d808015613842576040519150601f19603f3d011682016040523d82523d6000602084013e613847565b606091505b50600392509050613868565b50506040805160208101909152600081526002905b9250929050565b600081516020146138ae57816040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161075491906148df565b6000828060200190518101906138c49190615c8a565b90506001600160a01b038111806138dc575061040081105b15610c1557826040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161075491906148df565b600080600080600061398f8860405160240161394091906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03167f70a082310000000000000000000000000000000000000000000000000000000017905288886113886084613a43565b925092509250826139ce57816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161075491906148df565b6020825114613a165781516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610754565b81806020019051810190613a2a9190615c8a565b613a3482886154eb565b94509450505050935093915050565b6000606060008361ffff1667ffffffffffffffff811115613a6657613a66613eef565b6040519080825280601f01601f191660200182016040528015613a90576020820181803683370190505b509150863b613ac3577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613af6577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613b2f577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613b525750835b808352806000602085013e50955095509592505050565b8251825160009190818303613baa576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613bbe57506101018111155b613bdb576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613c05576040516309bde33960e01b815260040160405180910390fd5b80600003613c325786600081518110613c2057613c20614fe5565b60200260200101519350505050613e01565b60008167ffffffffffffffff811115613c4d57613c4d613eef565b604051908082528060200260200182016040528015613c76578160200160208202803683370190505b50905060008080805b85811015613da05760006001821b8b811603613cda5788851015613cc3578c5160018601958e918110613cb457613cb4614fe5565b60200260200101519050613cfc565b8551600185019487918110613cb457613cb4614fe5565b8b5160018401938d918110613cf157613cf1614fe5565b602002602001015190505b600089861015613d2c578d5160018701968f918110613d1d57613d1d614fe5565b60200260200101519050613d4e565b8651600186019588918110613d4357613d43614fe5565b602002602001015190505b82851115613d6f576040516309bde33960e01b815260040160405180910390fd5b613d798282613e08565b878481518110613d8b57613d8b614fe5565b60209081029190910101525050600101613c7f565b506001850382148015613db257508683145b8015613dbd57508581145b613dda576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613def57613def614fe5565b60200260200101519750505050505050505b9392505050565b6000818310613e2057613e1b8284613e26565b610c12565b610c1283835b604080516001602082015290810183905260608101829052600090608001613689565b828054828255906000526020600020908101928215613eab579160200282015b82811115613eab578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190613e69565b50613eb7929150613eda565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115613eb75760008155600101613edb565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613f2857613f28613eef565b60405290565b60405160a0810167ffffffffffffffff81118282101715613f2857613f28613eef565b60405160c0810167ffffffffffffffff81118282101715613f2857613f28613eef565b6040805190810167ffffffffffffffff81118282101715613f2857613f28613eef565b6040516060810167ffffffffffffffff81118282101715613f2857613f28613eef565b604051601f8201601f1916810167ffffffffffffffff81118282101715613fe357613fe3613eef565b604052919050565b600067ffffffffffffffff82111561400557614005613eef565b5060051b60200190565b6001600160a01b03811681146105dd57600080fd5b803567ffffffffffffffff8116811461403c57600080fd5b919050565b80151581146105dd57600080fd5b803561403c81614041565b600067ffffffffffffffff82111561407457614074613eef565b50601f01601f191660200190565b600082601f83011261409357600080fd5b81356140a66140a18261405a565b613fba565b8181528460208386010111156140bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156140eb57600080fd5b823567ffffffffffffffff8082111561410357600080fd5b818501915085601f83011261411757600080fd5b81356141256140a182613feb565b81815260059190911b8301840190848101908883111561414457600080fd5b8585015b838110156141ea578035858111156141605760008081fd5b86016080818c03601f19018113156141785760008081fd5b614180613f05565b8983013561418d8161400f565b8152604061419c848201614024565b8b8301526060808501356141af81614041565b838301529284013592898411156141c857600091508182fd5b6141d68f8d86880101614082565b908301525085525050918601918601614148565b5098975050505050505050565b600060a0828403121561420957600080fd5b614211613f2e565b90508135815261422360208301614024565b602082015261423460408301614024565b604082015261424560608301614024565b606082015261425660808301614024565b608082015292915050565b803561403c8161400f565b600082601f83011261427d57600080fd5b8135602061428d6140a183613feb565b82815260059290921b840181019181810190868411156142ac57600080fd5b8286015b848110156120c157803567ffffffffffffffff808211156142d15760008081fd5b818901915060a080601f19848d030112156142ec5760008081fd5b6142f4613f2e565b87840135838111156143065760008081fd5b6143148d8a83880101614082565b8252506040808501358481111561432b5760008081fd5b6143398e8b83890101614082565b8a84015250606080860135858111156143525760008081fd5b6143608f8c838a0101614082565b838501525060809150818601358184015250828501359250838311156143865760008081fd5b6143948d8a85880101614082565b9082015286525050509183019183016142b0565b600061014082840312156143bb57600080fd5b6143c3613f51565b90506143cf83836141f7565b815260a082013567ffffffffffffffff808211156143ec57600080fd5b6143f885838601614082565b602084015260c084013591508082111561441157600080fd5b61441d85838601614082565b604084015261442e60e08501614261565b6060840152610100840135608084015261012084013591508082111561445357600080fd5b506144608482850161426c565b60a08301525092915050565b600082601f83011261447d57600080fd5b8135602061448d6140a183613feb565b82815260059290921b840181019181810190868411156144ac57600080fd5b8286015b848110156120c157803567ffffffffffffffff8111156144d05760008081fd5b6144de8986838b01016143a8565b8452509183019183016144b0565b600082601f8301126144fd57600080fd5b8135602061450d6140a183613feb565b82815260059290921b8401810191818101908684111561452c57600080fd5b8286015b848110156120c157803567ffffffffffffffff8082111561455057600080fd5b818901915089603f83011261456457600080fd5b858201356145746140a182613feb565b81815260059190911b830160400190878101908c83111561459457600080fd5b604085015b838110156145cd578035858111156145b057600080fd5b6145bf8f6040838a0101614082565b845250918901918901614599565b50875250505092840192508301614530565b600082601f8301126145f057600080fd5b813560206146006140a183613feb565b8083825260208201915060208460051b87010193508684111561462257600080fd5b602086015b848110156120c15780358352918301918301614627565b600082601f83011261464f57600080fd5b8135602061465f6140a183613feb565b82815260059290921b8401810191818101908684111561467e57600080fd5b8286015b848110156120c157803567ffffffffffffffff808211156146a35760008081fd5b818901915060a080601f19848d030112156146be5760008081fd5b6146c6613f2e565b6146d1888501614024565b8152604080850135848111156146e75760008081fd5b6146f58e8b8389010161446c565b8a840152506060808601358581111561470e5760008081fd5b61471c8f8c838a01016144ec565b83850152506080915081860135858111156147375760008081fd5b6147458f8c838a01016145df565b9184019190915250919093013590830152508352918301918301614682565b600080604080848603121561477857600080fd5b833567ffffffffffffffff8082111561479057600080fd5b61479c8783880161463e565b94506020915081860135818111156147b357600080fd5b8601601f810188136147c457600080fd5b80356147d26140a182613feb565b81815260059190911b8201840190848101908a8311156147f157600080fd5b8584015b8381101561487d5780358681111561480d5760008081fd5b8501603f81018d1361481f5760008081fd5b8781013561482f6140a182613feb565b81815260059190911b82018a0190898101908f83111561484f5760008081fd5b928b01925b8284101561486d5783358252928a0192908a0190614854565b86525050509186019186016147f5565b50809750505050505050509250929050565b60005b838110156148aa578181015183820152602001614892565b50506000910152565b600081518084526148cb81602086016020860161488f565b601f01601f19169290920160200192915050565b602081526000610c1260208301846148b3565b8060608101831015610c1557600080fd5b60008083601f84011261491557600080fd5b50813567ffffffffffffffff81111561492d57600080fd5b60208301915083602082850101111561386857600080fd5b60008083601f84011261495757600080fd5b50813567ffffffffffffffff81111561496f57600080fd5b6020830191508360208260051b850101111561386857600080fd5b60008060008060008060008060e0898b0312156149a657600080fd5b6149b08a8a6148f2565b9750606089013567ffffffffffffffff808211156149cd57600080fd5b6149d98c838d01614903565b909950975060808b01359150808211156149f257600080fd5b6149fe8c838d01614945565b909750955060a08b0135915080821115614a1757600080fd5b50614a248b828c01614945565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215614a5257600080fd5b614a5c85856148f2565b9250606084013567ffffffffffffffff811115614a7857600080fd5b614a8486828701614903565b9497909650939450505050565b60008060408385031215614aa457600080fd5b614aad83614024565b9150614abb60208401614024565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614aea57614aea614ac4565b9052565b60208101610c158284614ada565b600060208284031215614b0e57600080fd5b813567ffffffffffffffff811115614b2557600080fd5b820160a08185031215613e0157600080fd5b803563ffffffff8116811461403c57600080fd5b600060a08284031215614b5d57600080fd5b614b65613f2e565b8235614b708161400f565b8152614b7e60208401614b37565b6020820152614b8f60408401614b37565b6040820152614ba060608401614b37565b60608201526080830135614bb38161400f565b60808201529392505050565b600080600060408486031215614bd457600080fd5b833567ffffffffffffffff80821115614bec57600080fd5b614bf8878388016143a8565b94506020860135915080821115614c0e57600080fd5b50614a8486828701614945565b803560ff8116811461403c57600080fd5b600060208284031215614c3e57600080fd5b610c1282614c1b565b60008151808452602080850194506020840160005b83811015614c815781516001600160a01b031687529582019590820190600101614c5c565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614cdb60e0840182614c47565b90506040840151601f198483030160c0850152614cf88282614c47565b95945050505050565b60008060408385031215614d1457600080fd5b614d1d83614024565b946020939093013593505050565b60008060208385031215614d3e57600080fd5b823567ffffffffffffffff80821115614d5657600080fd5b818501915085601f830112614d6a57600080fd5b813581811115614d7957600080fd5b8660208260061b8501011115614d8e57600080fd5b60209290920196919550909350505050565b600060208284031215614db257600080fd5b610c1282614024565b602081526001600160a01b03825116602082015260208201511515604082015267ffffffffffffffff6040830151166060820152600060608301516080808401526136f560a08401826148b3565b600060208284031215614e1b57600080fd5b8135613e018161400f565b600082601f830112614e3757600080fd5b81356020614e476140a183613feb565b8083825260208201915060208460051b870101935086841115614e6957600080fd5b602086015b848110156120c1578035614e818161400f565b8352918301918301614e6e565b60006020808385031215614ea157600080fd5b823567ffffffffffffffff80821115614eb957600080fd5b818501915085601f830112614ecd57600080fd5b8135614edb6140a182613feb565b81815260059190911b83018401908481019088831115614efa57600080fd5b8585015b838110156141ea57803585811115614f1557600080fd5b860160c0818c03601f19011215614f2c5760008081fd5b614f34613f51565b8882013581526040614f47818401614c1b565b8a8301526060614f58818501614c1b565b8284015260809150614f6b82850161404f565b9083015260a08381013589811115614f835760008081fd5b614f918f8d83880101614e26565b838501525060c0840135915088821115614fab5760008081fd5b614fb98e8c84870101614e26565b9083015250845250918601918601614efe565b600060208284031215614fde57600080fd5b5035919050565b634e487b7160e01b600052603260045260246000fd5b80356001600160e01b038116811461403c57600080fd5b600082601f83011261502357600080fd5b813560206150336140a183613feb565b82815260069290921b8401810191818101908684111561505257600080fd5b8286015b848110156120c1576040818903121561506f5760008081fd5b615077613f74565b61508082614024565b815261508d858301614ffb565b81860152835291830191604001615056565b600082601f8301126150b057600080fd5b813560206150c06140a183613feb565b82815260079290921b840181019181810190868411156150df57600080fd5b8286015b848110156120c15780880360808112156150fd5760008081fd5b615105613f97565b61510e83614024565b8152604080601f19840112156151245760008081fd5b61512c613f74565b9250615139878501614024565b8352615146818501614024565b83880152818701929092526060830135918101919091528352918301916080016150e3565b6000602080838503121561517e57600080fd5b823567ffffffffffffffff8082111561519657600080fd5b818501915060408083880312156151ac57600080fd5b6151b4613f74565b8335838111156151c357600080fd5b84016040818a0312156151d557600080fd5b6151dd613f74565b8135858111156151ec57600080fd5b8201601f81018b136151fd57600080fd5b803561520b6140a182613feb565b81815260069190911b8201890190898101908d83111561522a57600080fd5b928a01925b8284101561527a5787848f0312156152475760008081fd5b61524f613f74565b843561525a8161400f565b8152615267858d01614ffb565b818d0152825292870192908a019061522f565b84525050508187013593508484111561529257600080fd5b61529e8a858401615012565b81880152825250838501359150828211156152b857600080fd5b6152c48883860161509f565b85820152809550505050505092915050565b805160408084528151848201819052600092602091908201906060870190855b8181101561532d57835180516001600160a01b031684528501516001600160e01b03168584015292840192918501916001016152f6565b50508583015187820388850152805180835290840192506000918401905b80831015615387578351805167ffffffffffffffff1683528501516001600160e01b03168583015292840192600192909201919085019061534b565b50979650505050505050565b602081526000610c1260208301846152d6565b67ffffffffffffffff8316815260608101613e016020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115615412576154126153db565b5092915050565b60006020808352606084516040808487015261543860608701836152d6565b87850151878203601f19016040890152805180835290860193506000918601905b808310156141ea57845167ffffffffffffffff81511683528781015161549889850182805167ffffffffffffffff908116835260209182015116910152565b50840151828701529386019360019290920191608090910190615459565b6000602082840312156154c857600080fd5b813567ffffffffffffffff8111156154df57600080fd5b6136f58482850161463e565b81810381811115610c1557610c156153db565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff8084168061552f5761552f6154fe565b92169190910692915050565b8082028115828204841417610c1557610c156153db565b805182526000602067ffffffffffffffff81840151168185015260408084015160a0604087015261558660a08701826148b3565b90506060850151868203606088015261559f82826148b3565b608087810151898303918a01919091528051808352908601935060009250908501905b8083101561538757835180516001600160a01b03168352860151868301529285019260019290920191908401906155c2565b602081526000610c126020830184615552565b60808152600061561a6080830187615552565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561565857600080fd5b835161566381614041565b602085015190935067ffffffffffffffff81111561568057600080fd5b8401601f8101861361569157600080fd5b805161569f6140a18261405a565b8181528760208385010111156156b457600080fd5b6156c582602083016020860161488f565b809450505050604084015190509250925092565b6000604082840312156156eb57600080fd5b6156f3613f74565b6156fc83614024565b8152602083013560208201528091505092915050565b600181811c9082168061572657607f821691505b60208210810361574657634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561575e57600080fd5b8151613e0181614041565b601f821115610780576000816000526020600020601f850160051c810160208610156157925750805b601f850160051c820191505b818110156124db5782815560010161579e565b815167ffffffffffffffff8111156157cb576157cb613eef565b6157df816157d98454615712565b84615769565b602080601f83116001811461581457600084156157fc5750858301515b600019600386901b1c1916600185901b1785556124db565b600085815260208120601f198616915b8281101561584357888601518255948401946001909101908401615824565b50858210156158615787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835283546001600160a01b038116602085015260ff8160a01c161515604085015267ffffffffffffffff8160a81c166060850152506001808501608080860152600081546158c381615712565b8060a089015260c060018316600081146158e4576001811461590057615930565b60ff19841660c08b015260c083151560051b8b01019450615930565b85600052602060002060005b848110156159275781548c820185015290880190890161590c565b8b0160c0019550505b50929998505050505050505050565b80820180821115610c1557610c156153db565b60ff8181168382160190811115610c1557610c156153db565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff808416806159aa576159aa6154fe565b92169190910492915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126159eb57600080fd5b83018035915067ffffffffffffffff821115615a0657600080fd5b60200191503681900382131561386857600080fd5b6020810160058310615a2f57615a2f614ac4565b91905290565b60ff8181168382160290811690818114615412576154126153db565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615aa95784546001600160a01b031683526001948501949284019201615a84565b50508481036060860152865180825290820192508187019060005b81811015615ae95782516001600160a01b031685529383019391830191600101615ac4565b50505060ff851660808501525090506120c3565b600067ffffffffffffffff808616835280851660208401525060606040830152614cf860608301846148b3565b8281526040602082015260006136f560408301846148b3565b67ffffffffffffffff848116825283166020820152606081016136f56040830184614ada565b848152615b796020820185614ada565b608060408201526000615b8f60808301856148b3565b905082606083015295945050505050565b600060208284031215615bb257600080fd5b8151613e018161400f565b6020815260008251610100806020850152615bdc6101208501836148b3565b91506020850151615bf9604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615c3360a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615c5084836148b3565b935060c08701519150808685030160e0870152615c6d84836148b3565b935060e08701519150808685030183870152506120c383826148b3565b600060208284031215615c9c57600080fd5b5051919050565b600060ff821660ff8103615cb957615cb96153db565b60010192915050565b848152600067ffffffffffffffff8086166020840152808516604084015250608060608301526120c360808301846148b3565b86815260c060208201526000615d0e60c08301886148b3565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b84811015615dfa57601f19868403018952815160a08151818652615d8b828701826148b3565b9150508582015185820387870152615da382826148b3565b91505060408083015186830382880152615dbd83826148b3565b92505050606080830151818701525060808083015192508582038187015250615de681836148b3565b9a86019a9450505090830190600101615d65565b5090979650505050505050565b602081526000610c126020830184615d48565b60008282518085526020808601955060208260051b8401016020860160005b84811015615dfa57601f19868403018952615e558383516148b3565b98840198925090830190600101615e39565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e0850152615ecf6101808501836148b3565b915060408601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08086850301610100870152615f0c84836148b3565b935060608801519150615f2b6101208701836001600160a01b03169052565b60808801518387015260a0880151925080868503016101608701525050615f528282615d48565b9150508281036020840152614cf88185615e1a56fea164736f6c6343000818000a",
+ Bin: "0x6101206040523480156200001257600080fd5b5060405162006bcd38038062006bcd8339810160408190526200003591620008c7565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003c1565b50505062000c67565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b031916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b60005b815181101562000666576000828281518110620003e557620003e562000a1d565b60200260200101519050600081602001519050806001600160401b0316600003620004235760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166200044c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600660205260408120600181018054919291620004789062000a33565b80601f0160208091040260200160405190810160405280929190818152602001828054620004a69062000a33565b8015620004f75780601f10620004cb57610100808354040283529160200191620004f7565b820191906000526020600020905b815481529060010190602001808311620004d957829003601f168201915b5050505050905060008460600151905081516000036200059e57805160000362000534576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000544828262000ac4565b508254600160a81b600160e81b031916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005d9565b8080519060200120828051906020012014620005d95760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906200064d90869062000b90565b60405180910390a25050505050806001019050620003c4565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620006a557620006a56200066a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006d657620006d66200066a565b604052919050565b80516001600160401b0381168114620006f657600080fd5b919050565b6001600160a01b03811681146200071157600080fd5b50565b805163ffffffff81168114620006f657600080fd5b6000601f83601f8401126200073d57600080fd5b825160206001600160401b03808311156200075c576200075c6200066a565b8260051b6200076d838201620006ab565b93845286810183019383810190898611156200078857600080fd5b84890192505b85831015620008ba57825184811115620007a85760008081fd5b89016080601f19828d038101821315620007c25760008081fd5b620007cc62000680565b88840151620007db81620006fb565b81526040620007ec858201620006de565b8a8301526060808601518015158114620008065760008081fd5b838301529385015193898511156200081e5760008081fd5b84860195508f603f8701126200083657600094508485fd5b8a8601519450898511156200084f576200084f6200066a565b620008608b858f88011601620006ab565b93508484528f82868801011115620008785760008081fd5b60005b8581101562000898578681018301518582018d01528b016200087b565b5060009484018b0194909452509182015283525091840191908401906200078e565b9998505050505050505050565b6000806000838503610140811215620008df57600080fd5b6080811215620008ee57600080fd5b620008f862000680565b6200090386620006de565b815260208601516200091581620006fb565b602082015260408601516200092a81620006fb565b604082015260608601516200093f81620006fb565b6060820152935060a0607f19820112156200095957600080fd5b5060405160a081016001600160401b0380821183831017156200098057620009806200066a565b81604052608087015191506200099682620006fb565b818352620009a760a0880162000714565b6020840152620009ba60c0880162000714565b6040840152620009cd60e0880162000714565b60608401526101008701519150620009e582620006fb565b608083018290526101208701519294508083111562000a0357600080fd5b505062000a138682870162000729565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4857607f821691505b60208210810362000a6957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000abf576000816000526020600020601f850160051c8101602086101562000a9a5750805b601f850160051c820191505b8181101562000abb5782815560010162000aa6565b5050505b505050565b81516001600160401b0381111562000ae05762000ae06200066a565b62000af88162000af1845462000a33565b8462000a6f565b602080601f83116001811462000b30576000841562000b175750858301515b600019600386901b1c1916600185901b17855562000abb565b600085815260208120601f198616915b8281101562000b615788860151825594840194600190910190840162000b40565b508582101562000b805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000be58162000a33565b8060a089015260c0600183166000811462000c09576001811462000c265762000c58565b60ff19841660c08b015260c083151560051b8b0101945062000c58565b85600052602060002060005b8481101562000c4f5781548c820185015290880190890162000c32565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615ef762000cd66000396000818161026601526129ee0152600081816102370152612ee20152600081816102080152818161142b015261196d0152600081816101d801526126690152600081816117f3015261183f0152615ef76000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806385572ffb116100d8578063ccd37ba31161008c578063f2fde38b11610066578063f2fde38b14610583578063f716f99f14610596578063ff888fb1146105a957600080fd5b8063ccd37ba31461050b578063d2a15d3514610550578063e9d68a8e1461056357600080fd5b8063991a5018116100bd578063991a5018146104c5578063a80036b4146104d8578063c673e584146104eb57600080fd5b806385572ffb1461049c5780638da5cb5b146104aa57600080fd5b8063311cd5131161012f5780635e36480c116101145780635e36480c146103785780637437ff9f1461039857806379ba50971461049457600080fd5b8063311cd513146103495780633f4b04aa1461035c57600080fd5b806306285c691161016057806306285c69146101a4578063181f5a77146102ed5780632d04ab761461033657600080fd5b806304666f9c1461017c57806305d938b514610191575b600080fd5b61018f61018a366004614072565b6105cc565b005b61018f61019f3660046146fe565b6105e0565b61029660408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102e49190815167ffffffffffffffff1681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103296040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102e49190614879565b61018f610344366004614924565b610785565b61018f6103573660046149d7565b610b5c565b60095460405167ffffffffffffffff90911681526020016102e4565b61038b610386366004614a2b565b610bc5565b6040516102e49190614a88565b6104376040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526004546001600160a01b03808216835263ffffffff600160a01b83048116602085015278010000000000000000000000000000000000000000000000008304811694840194909452600160e01b9091049092166060820152600554909116608082015290565b6040516102e49190600060a0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b61018f610c1b565b61018f610177366004614a96565b6000546040516001600160a01b0390911681526020016102e4565b61018f6104d3366004614ae5565b610cd9565b61018f6104e6366004614b59565b610cea565b6104fe6104f9366004614bc6565b61105d565b6040516102e49190614c26565b610542610519366004614c9b565b67ffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102e4565b61018f61055e366004614cc5565b6111bb565b610576610571366004614d3a565b611275565b6040516102e49190614d55565b61018f610591366004614da3565b611382565b61018f6105a4366004614e28565b611393565b6105bc6105b7366004614f66565b6113d5565b60405190151581526020016102e4565b6105d4611496565b6105dd816114f2565b50565b6105e86117f0565b815181518114610624576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561077557600084828151811061064357610643614f7f565b6020026020010151905060008160200151519050600085848151811061066b5761066b614f7f565b60200260200101519050805182146106af576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156107665760008282815181106106ce576106ce614f7f565b602002602001015190508060001461075d57846020015182815181106106f6576106f6614f7f565b60200260200101516080015181101561075d5784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064015b60405180910390fd5b506001016106b2565b50505050806001019050610627565b506107808383611871565b505050565b600061079387890189615105565b805151519091501515806107ac57508051602001515115155b156108ac5760095460208a01359067ffffffffffffffff8083169116101561086b576009805467ffffffffffffffff191667ffffffffffffffff83161790556004805483516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921692633937306f9261083492910161532d565b600060405180830381600087803b15801561084e57600080fd5b505af1158015610862573d6000803e3d6000fd5b505050506108aa565b8160200151516000036108aa576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b816020015151811015610aa5576000826020015182815181106108d4576108d4614f7f565b602002602001015190506000816000015190506108f081611921565b60006108fb82611a23565b602084015151815491925067ffffffffffffffff908116600160a81b9092041614158061093f575060208084015190810151905167ffffffffffffffff9182169116115b1561097f57825160208401516040517feefb0cac000000000000000000000000000000000000000000000000000000008152610754929190600401615340565b6040830151806109bb576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff16600090815260086020908152604080832084845290915290205415610a2e5783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101829052604401610754565b6020808501510151610a4190600161538b565b82547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b67ffffffffffffffff9283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016108af565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d81604051610ad591906153b3565b60405180910390a1610b5160008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611a8a915050565b505050505050505050565b610b9c610b6b82840184615450565b6040805160008082526020820190925290610b96565b6060815260200190600190039081610b815790505b50611871565b604080516000808252602082019092529050610bbf600185858585866000611a8a565b50505050565b6000610bd360016004615485565b6002610be06080856154ae565b67ffffffffffffffff16610bf491906154d5565b610bfe8585611e01565b901c166003811115610c1257610c12614a5e565b90505b92915050565b6001546001600160a01b03163314610c755760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610754565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ce1611496565b6105dd81611e48565b333014610d23576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610d60565b6040805180820190915260008082526020820152815260200190600190039081610d395790505b5060a08501515190915015610d9457610d918460a00151856020015186606001518760000151602001518787611fae565b90505b6040805160a0810182528551518152855160209081015167ffffffffffffffff1681830152808701518351600094840192610dd0929101614879565b60408051601f19818403018152918152908252878101516020830152018390526005549091506001600160a01b03168015610edd576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a190610e4a90859060040161558e565b600060405180830381600087803b158015610e6457600080fd5b505af1925050508015610e75575060015b610edd573d808015610ea3576040519150601f19603f3d011682016040523d82523d6000602084013e610ea8565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016107549190614879565b604086015151158015610ef257506080860151155b80610f09575060608601516001600160a01b03163b155b80610f4957506060860151610f47906001600160a01b03167f85572ffb000000000000000000000000000000000000000000000000000000006120cd565b155b15610f5657505050505050565b855160209081015167ffffffffffffffff1660009081526006909152604080822054608089015160608a015192517f3cf9798300000000000000000000000000000000000000000000000000000000815284936001600160a01b0390931692633cf9798392610fce92899261138892916004016155a1565b6000604051808303816000875af1158015610fed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101591908101906155dd565b50915091508161105357806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107549190614879565b5050505050505050565b6110a06040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561114957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161112b575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156111ab57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161118d575b5050505050815250509050919050565b6111c3611496565b60005b818110156107805760008383838181106111e2576111e2614f7f565b9050604002018036038101906111f89190615673565b905061120781602001516113d5565b61126c57805167ffffffffffffffff1660009081526008602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b506001016111c6565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b909204909216948301949094526001840180549394929391840191611302906156ac565b80601f016020809104026020016040519081016040528092919081815260200182805461132e906156ac565b80156111ab5780601f10611350576101008083540402835291602001916111ab565b820191906000526020600020905b81548152906001019060200180831161135e57505050919092525091949350505050565b61138a611496565b6105dd816120e9565b61139b611496565b60005b81518110156113d1576113c98282815181106113bc576113bc614f7f565b602002602001015161219f565b60010161139e565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1591906156e6565b6000546001600160a01b031633146114f05760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610754565b565b60005b81518110156113d157600082828151811061151257611512614f7f565b602002602001015190506000816020015190508067ffffffffffffffff16600003611569576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81516001600160a01b0316611591576040516342bcdf7f60e11b815260040160405180910390fd5b67ffffffffffffffff811660009081526006602052604081206001810180549192916115bc906156ac565b80601f01602080910402602001604051908101604052809291908181526020018280546115e8906156ac565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b5050505050905060008460600151905081516000036116ed578051600003611670576040516342bcdf7f60e11b815260040160405180910390fd5b6001830161167e8282615753565b5082547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b17835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611740565b8080519060200120828051906020012014611740576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610754565b604080860151845487516001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19921515600160a01b02929092167fffffffffffffffffffffff000000000000000000000000000000000000000000909116171784555167ffffffffffffffff8516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906117d8908690615813565b60405180910390a250505050508060010190506114f5565b467f0000000000000000000000000000000000000000000000000000000000000000146114f0576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610754565b81516000036118ab576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b845181101561191a576119128582815181106118e0576118e0614f7f565b60200260200101518461190c578583815181106118ff576118ff614f7f565b60200260200101516124d0565b836124d0565b6001016118c2565b5050505050565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e091906156e6565b156105dd576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610754565b67ffffffffffffffff811660009081526006602052604081208054600160a01b900460ff16610c15576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610754565b60ff87811660009081526002602090815260408083208151608081018352815481526001909101548086169382019390935261010083048516918101919091526201000090910490921615156060830152873590611ae98760a46158e1565b9050826060015115611b31578451611b029060206154d5565b8651611b0f9060206154d5565b611b1a9060a06158e1565b611b2491906158e1565b611b2e90826158e1565b90505b368114611b73576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610754565b5081518114611bbb5781516040517f93df584c000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610754565b611bc36117f0565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611c1157611c11614a5e565b6002811115611c2257611c22614a5e565b9052509050600281602001516002811115611c3f57611c3f614a5e565b148015611c935750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611c7b57611c7b614f7f565b6000918252602090912001546001600160a01b031633145b611cc9576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611dab576020820151611ce49060016158f4565b60ff16855114611d20576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611d5b576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611d6d92919061590d565b604051908190038120611d84918b9060200161591d565b604051602081830303815290604052805190602001209050611da98a82888888612c9c565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b67ffffffffffffffff8216600090815260076020526040812081611e26608085615931565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b80516001600160a01b0316611e70576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a17600160a01b63ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff1916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b6060865167ffffffffffffffff811115611fca57611fca613e89565b60405190808252806020026020018201604052801561200f57816020015b6040805180820190915260008082526020820152815260200190600190039081611fe85790505b50905060005b87518110156120c15761209c88828151811061203357612033614f7f565b602002602001015188888888888781811061205057612050614f7f565b90506020028101906120629190615958565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e8192505050565b8282815181106120ae576120ae614f7f565b6020908102919091010152600101612015565b505b9695505050505050565b60006120d883613226565b8015610c125750610c12838361328a565b336001600160a01b038216036121415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610754565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff166000036121ca576000604051631b3fab5160e11b815260040161075491906159bd565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361223757606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff90921691909117905561228c565b6060840151600182015460ff620100009091041615159015151461228c576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff84166004820152602401610754565b60a0840151805161010010156122b8576001604051631b3fab5160e11b815260040161075491906159bd565b61231e848460030180548060200260200160405190810160405280929190818152602001828054801561231457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122f6575b5050505050613345565b8460600151156124455761238c8484600201805480602002602001604051908101604052809291908181526020018280548015612314576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116122f6575050505050613345565b6080850151805161010010156123b8576002604051631b3fab5160e11b815260040161075491906159bd565b60408601516123c89060036159d7565b60ff168151116123ee576003604051631b3fab5160e11b815260040161075491906159bd565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff8416021790556124369060028601906020840190613e02565b50612443858260016133ae565b505b612451848260026133ae565b80516124669060038501906020840190613e02565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936124bf9389939260028a019291906159f3565b60405180910390a161191a84613522565b81516124db81611921565b60006124e682611a23565b60010180546124f4906156ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612520906156ac565b801561256d5780601f106125425761010080835404028352916020019161256d565b820191906000526020600020905b81548152906001019060200180831161255057829003601f168201915b505050602087015151929350505060008190036125b5576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84604001515181146125f3576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561260e5761260e613e89565b604051908082528060200260200182016040528015612637578160200160208202803683370190505b50905060005b828110156127205760008760200151828151811061265d5761265d614f7f565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff16146126f057805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610754565b6126fa818661353e565b83838151811061270c5761270c614f7f565b60209081029190910101525060010161263d565b506000612737858389606001518a60800151613660565b90508060000361277f576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610754565b8551151560005b84811015610b515760005a905060008a6020015183815181106127ab576127ab614f7f565b6020026020010151905060006127c98a836000015160600151610bc5565b905060008160038111156127df576127df614a5e565b14806127fc575060038160038111156127fa576127fa614a5e565b145b612854578151606001516040805167ffffffffffffffff808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c91015b60405180910390a1505050612c94565b841561292457600454600090600160a01b900463ffffffff166128778842615485565b11905080806128975750600382600381111561289557612895614a5e565b145b6128d9576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c166004820152602401610754565b8b85815181106128eb576128eb614f7f565b602002602001015160001461291e578b858151811061290c5761290c614f7f565b60200260200101518360800181815250505b50612985565b600081600381111561293857612938614a5e565b14612985578151606001516040805167ffffffffffffffff808e16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209101612844565b81516080015167ffffffffffffffff1615612a745760008160038111156129ae576129ae614a5e565b03612a745781516080015160208301516040517fe0e03cae0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612a25928f929190600401615a9f565b6020604051808303816000875af1158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6891906156e6565b612a7457505050612c94565b60008c604001518581518110612a8c57612a8c614f7f565b6020026020010151905080518360a001515114612af0578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808e1660048301529091166024820152604401610754565b612b048b84600001516060015160016136b6565b600080612b11858461375e565b91509150612b288d866000015160600151846136b6565b8715612b98576003826003811115612b4257612b42614a5e565b03612b98576000846003811115612b5b57612b5b614a5e565b14612b98578451516040517f2b11b8d900000000000000000000000000000000000000000000000000000000815261075491908390600401615acc565b6002826003811115612bac57612bac614a5e565b14612c06576003826003811115612bc557612bc5614a5e565b14612c06578451606001516040517f926c5a3e000000000000000000000000000000000000000000000000000000008152610754918f918590600401615ae5565b84600001516000015185600001516060015167ffffffffffffffff168e67ffffffffffffffff167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8b81518110612c6057612c60614f7f565b602002602001015186865a612c75908e615485565b604051612c859493929190615b0b565b60405180910390a45050505050505b600101612786565b8251600090815b81811015611053576000600188868460208110612cc257612cc2614f7f565b612ccf91901a601b6158f4565b898581518110612ce157612ce1614f7f565b6020026020010151898681518110612cfb57612cfb614f7f565b602002602001015160405160008152602001604052604051612d39949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612d5b573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b03851683528152858220858701909652855480841686529397509095509293928401916101009004166002811115612dbc57612dbc614a5e565b6002811115612dcd57612dcd614a5e565b9052509050600181602001516002811115612dea57612dea614a5e565b14612e21576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b851615612e64576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050612ca3565b60408051808201909152600080825260208201526000612ea48760200151613828565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190615b42565b90506001600160a01b0381161580612f955750612f936001600160a01b0382167faff2afbf000000000000000000000000000000000000000000000000000000006120cd565b155b15612fd7576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610754565b6004546000908190612ff99089908690600160e01b900463ffffffff166138ce565b9150915060008060006130c66040518061010001604052808e81526020018c67ffffffffffffffff1681526020018d6001600160a01b031681526020018f606001518152602001896001600160a01b031681526020018f6000015181526020018f6040015181526020018b8152506040516024016130779190615b5f565b60408051601f198184030181529190526020810180516001600160e01b03167f3907753700000000000000000000000000000000000000000000000000000000179052878661138860846139fc565b9250925092508261310557816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107549190614879565b815160201461314d5781516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610754565b6000828060200190518101906131639190615c2c565b9050866001600160a01b03168c6001600160a01b0316146131f85760006131948d8a61318f868a615485565b6138ce565b509050868110806131ae5750816131ab8883615485565b14155b156131f6576040517fa966e21f000000000000000000000000000000000000000000000000000000008152600481018390526024810188905260448101829052606401610754565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b6000613252827f01ffc9a70000000000000000000000000000000000000000000000000000000061328a565b8015610c155750613283827fffffffff0000000000000000000000000000000000000000000000000000000061328a565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d9150600051905082801561332e575060208210155b801561333a5750600081115b979650505050505050565b60005b81518110156107805760ff83166000908152600360205260408120835190919084908490811061337a5761337a614f7f565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101613348565b60005b8251811015610bbf5760008382815181106133ce576133ce614f7f565b60200260200101519050600060028111156133eb576133eb614a5e565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561342a5761342a614a5e565b1461344b576004604051631b3fab5160e11b815260040161075491906159bd565b6001600160a01b03811661348b576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156134b1576134b1614a5e565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561350e5761350e614a5e565b0217905550905050508060010190506133b1565b60ff81166105dd576009805467ffffffffffffffff1916905550565b815160208082015160409283015192516000938493613584937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615c45565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d015195015195976135cd9794969395929491939101615c78565b604051602081830303815290604052805190602001208560400151805190602001208660a001516040516020016136049190615d8a565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b60008061366e858585613b22565b9050613679816113d5565b6136875760009150506136ae565b67ffffffffffffffff86166000908152600860209081526040808320938352929052205490505b949350505050565b600060026136c56080856154ae565b67ffffffffffffffff166136d991906154d5565b905060006136e78585611e01565b9050816136f660016004615485565b901b19168183600381111561370d5761370d614a5e565b67ffffffffffffffff871660009081526007602052604081209190921b9290921791829161373c608088615931565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fa80036b4000000000000000000000000000000000000000000000000000000008152600090606090309063a80036b4906137a29087908790600401615dea565b600060405180830381600087803b1580156137bc57600080fd5b505af19250505080156137cd575060015b61380c573d8080156137fb576040519150601f19603f3d011682016040523d82523d6000602084013e613800565b606091505b50600392509050613821565b50506040805160208101909152600081526002905b9250929050565b6000815160201461386757816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016107549190614879565b60008280602001905181019061387d9190615c2c565b90506001600160a01b03811180613895575061040081105b15610c1557826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016107549190614879565b6000806000806000613948886040516024016138f991906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03167f70a0823100000000000000000000000000000000000000000000000000000000179052888861138860846139fc565b9250925092508261398757816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107549190614879565b60208251146139cf5781516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610754565b818060200190518101906139e39190615c2c565b6139ed8288615485565b94509450505050935093915050565b6000606060008361ffff1667ffffffffffffffff811115613a1f57613a1f613e89565b6040519080825280601f01601f191660200182016040528015613a49576020820181803683370190505b509150863b613a7c577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613aaf577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613ae8577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613b0b5750835b808352806000602085013e50955095509592505050565b8251825160009190818303613b63576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613b7757506101018111155b613b94576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613bbe576040516309bde33960e01b815260040160405180910390fd5b80600003613beb5786600081518110613bd957613bd9614f7f565b60200260200101519350505050613dba565b60008167ffffffffffffffff811115613c0657613c06613e89565b604051908082528060200260200182016040528015613c2f578160200160208202803683370190505b50905060008080805b85811015613d595760006001821b8b811603613c935788851015613c7c578c5160018601958e918110613c6d57613c6d614f7f565b60200260200101519050613cb5565b8551600185019487918110613c6d57613c6d614f7f565b8b5160018401938d918110613caa57613caa614f7f565b602002602001015190505b600089861015613ce5578d5160018701968f918110613cd657613cd6614f7f565b60200260200101519050613d07565b8651600186019588918110613cfc57613cfc614f7f565b602002602001015190505b82851115613d28576040516309bde33960e01b815260040160405180910390fd5b613d328282613dc1565b878481518110613d4457613d44614f7f565b60209081029190910101525050600101613c38565b506001850382148015613d6b57508683145b8015613d7657508581145b613d93576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613da857613da8614f7f565b60200260200101519750505050505050505b9392505050565b6000818310613dd957613dd48284613ddf565b610c12565b610c1283835b604080516001602082015290810183905260608101829052600090608001613642565b828054828255906000526020600020908101928215613e64579160200282015b82811115613e64578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190613e22565b50613e70929150613e74565b5090565b5b80821115613e705760008155600101613e75565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613ec257613ec2613e89565b60405290565b60405160a0810167ffffffffffffffff81118282101715613ec257613ec2613e89565b60405160c0810167ffffffffffffffff81118282101715613ec257613ec2613e89565b6040805190810167ffffffffffffffff81118282101715613ec257613ec2613e89565b6040516060810167ffffffffffffffff81118282101715613ec257613ec2613e89565b604051601f8201601f1916810167ffffffffffffffff81118282101715613f7d57613f7d613e89565b604052919050565b600067ffffffffffffffff821115613f9f57613f9f613e89565b5060051b60200190565b6001600160a01b03811681146105dd57600080fd5b803567ffffffffffffffff81168114613fd657600080fd5b919050565b80151581146105dd57600080fd5b8035613fd681613fdb565b600067ffffffffffffffff82111561400e5761400e613e89565b50601f01601f191660200190565b600082601f83011261402d57600080fd5b813561404061403b82613ff4565b613f54565b81815284602083860101111561405557600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561408557600080fd5b823567ffffffffffffffff8082111561409d57600080fd5b818501915085601f8301126140b157600080fd5b81356140bf61403b82613f85565b81815260059190911b830184019084810190888311156140de57600080fd5b8585015b83811015614184578035858111156140fa5760008081fd5b86016080818c03601f19018113156141125760008081fd5b61411a613e9f565b8983013561412781613fa9565b81526040614136848201613fbe565b8b83015260608085013561414981613fdb565b8383015292840135928984111561416257600091508182fd5b6141708f8d8688010161401c565b9083015250855250509186019186016140e2565b5098975050505050505050565b600060a082840312156141a357600080fd5b6141ab613ec8565b9050813581526141bd60208301613fbe565b60208201526141ce60408301613fbe565b60408201526141df60608301613fbe565b60608201526141f060808301613fbe565b608082015292915050565b8035613fd681613fa9565b600082601f83011261421757600080fd5b8135602061422761403b83613f85565b82815260059290921b8401810191818101908684111561424657600080fd5b8286015b848110156120c157803567ffffffffffffffff8082111561426b5760008081fd5b818901915060a080601f19848d030112156142865760008081fd5b61428e613ec8565b87840135838111156142a05760008081fd5b6142ae8d8a8388010161401c565b825250604080850135848111156142c55760008081fd5b6142d38e8b8389010161401c565b8a84015250606080860135858111156142ec5760008081fd5b6142fa8f8c838a010161401c565b838501525060809150818601358184015250828501359250838311156143205760008081fd5b61432e8d8a8588010161401c565b90820152865250505091830191830161424a565b6000610140828403121561435557600080fd5b61435d613eeb565b90506143698383614191565b815260a082013567ffffffffffffffff8082111561438657600080fd5b6143928583860161401c565b602084015260c08401359150808211156143ab57600080fd5b6143b78583860161401c565b60408401526143c860e085016141fb565b606084015261010084013560808401526101208401359150808211156143ed57600080fd5b506143fa84828501614206565b60a08301525092915050565b600082601f83011261441757600080fd5b8135602061442761403b83613f85565b82815260059290921b8401810191818101908684111561444657600080fd5b8286015b848110156120c157803567ffffffffffffffff81111561446a5760008081fd5b6144788986838b0101614342565b84525091830191830161444a565b600082601f83011261449757600080fd5b813560206144a761403b83613f85565b82815260059290921b840181019181810190868411156144c657600080fd5b8286015b848110156120c157803567ffffffffffffffff808211156144ea57600080fd5b818901915089603f8301126144fe57600080fd5b8582013561450e61403b82613f85565b81815260059190911b830160400190878101908c83111561452e57600080fd5b604085015b838110156145675780358581111561454a57600080fd5b6145598f6040838a010161401c565b845250918901918901614533565b508752505050928401925083016144ca565b600082601f83011261458a57600080fd5b8135602061459a61403b83613f85565b8083825260208201915060208460051b8701019350868411156145bc57600080fd5b602086015b848110156120c157803583529183019183016145c1565b600082601f8301126145e957600080fd5b813560206145f961403b83613f85565b82815260059290921b8401810191818101908684111561461857600080fd5b8286015b848110156120c157803567ffffffffffffffff8082111561463d5760008081fd5b818901915060a080601f19848d030112156146585760008081fd5b614660613ec8565b61466b888501613fbe565b8152604080850135848111156146815760008081fd5b61468f8e8b83890101614406565b8a84015250606080860135858111156146a85760008081fd5b6146b68f8c838a0101614486565b83850152506080915081860135858111156146d15760008081fd5b6146df8f8c838a0101614579565b918401919091525091909301359083015250835291830191830161461c565b600080604080848603121561471257600080fd5b833567ffffffffffffffff8082111561472a57600080fd5b614736878388016145d8565b945060209150818601358181111561474d57600080fd5b8601601f8101881361475e57600080fd5b803561476c61403b82613f85565b81815260059190911b8201840190848101908a83111561478b57600080fd5b8584015b83811015614817578035868111156147a75760008081fd5b8501603f81018d136147b95760008081fd5b878101356147c961403b82613f85565b81815260059190911b82018a0190898101908f8311156147e95760008081fd5b928b01925b828410156148075783358252928a0192908a01906147ee565b865250505091860191860161478f565b50809750505050505050509250929050565b60005b8381101561484457818101518382015260200161482c565b50506000910152565b60008151808452614865816020860160208601614829565b601f01601f19169290920160200192915050565b602081526000610c12602083018461484d565b8060608101831015610c1557600080fd5b60008083601f8401126148af57600080fd5b50813567ffffffffffffffff8111156148c757600080fd5b60208301915083602082850101111561382157600080fd5b60008083601f8401126148f157600080fd5b50813567ffffffffffffffff81111561490957600080fd5b6020830191508360208260051b850101111561382157600080fd5b60008060008060008060008060e0898b03121561494057600080fd5b61494a8a8a61488c565b9750606089013567ffffffffffffffff8082111561496757600080fd5b6149738c838d0161489d565b909950975060808b013591508082111561498c57600080fd5b6149988c838d016148df565b909750955060a08b01359150808211156149b157600080fd5b506149be8b828c016148df565b999c989b50969995989497949560c00135949350505050565b6000806000608084860312156149ec57600080fd5b6149f6858561488c565b9250606084013567ffffffffffffffff811115614a1257600080fd5b614a1e8682870161489d565b9497909650939450505050565b60008060408385031215614a3e57600080fd5b614a4783613fbe565b9150614a5560208401613fbe565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614a8457614a84614a5e565b9052565b60208101610c158284614a74565b600060208284031215614aa857600080fd5b813567ffffffffffffffff811115614abf57600080fd5b820160a08185031215613dba57600080fd5b803563ffffffff81168114613fd657600080fd5b600060a08284031215614af757600080fd5b614aff613ec8565b8235614b0a81613fa9565b8152614b1860208401614ad1565b6020820152614b2960408401614ad1565b6040820152614b3a60608401614ad1565b60608201526080830135614b4d81613fa9565b60808201529392505050565b600080600060408486031215614b6e57600080fd5b833567ffffffffffffffff80821115614b8657600080fd5b614b9287838801614342565b94506020860135915080821115614ba857600080fd5b50614a1e868287016148df565b803560ff81168114613fd657600080fd5b600060208284031215614bd857600080fd5b610c1282614bb5565b60008151808452602080850194506020840160005b83811015614c1b5781516001600160a01b031687529582019590820190600101614bf6565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614c7560e0840182614be1565b90506040840151601f198483030160c0850152614c928282614be1565b95945050505050565b60008060408385031215614cae57600080fd5b614cb783613fbe565b946020939093013593505050565b60008060208385031215614cd857600080fd5b823567ffffffffffffffff80821115614cf057600080fd5b818501915085601f830112614d0457600080fd5b813581811115614d1357600080fd5b8660208260061b8501011115614d2857600080fd5b60209290920196919550909350505050565b600060208284031215614d4c57600080fd5b610c1282613fbe565b602081526001600160a01b03825116602082015260208201511515604082015267ffffffffffffffff6040830151166060820152600060608301516080808401526136ae60a084018261484d565b600060208284031215614db557600080fd5b8135613dba81613fa9565b600082601f830112614dd157600080fd5b81356020614de161403b83613f85565b8083825260208201915060208460051b870101935086841115614e0357600080fd5b602086015b848110156120c1578035614e1b81613fa9565b8352918301918301614e08565b60006020808385031215614e3b57600080fd5b823567ffffffffffffffff80821115614e5357600080fd5b818501915085601f830112614e6757600080fd5b8135614e7561403b82613f85565b81815260059190911b83018401908481019088831115614e9457600080fd5b8585015b8381101561418457803585811115614eaf57600080fd5b860160c0818c03601f19011215614ec65760008081fd5b614ece613eeb565b8882013581526040614ee1818401614bb5565b8a8301526060614ef2818501614bb5565b8284015260809150614f05828501613fe9565b9083015260a08381013589811115614f1d5760008081fd5b614f2b8f8d83880101614dc0565b838501525060c0840135915088821115614f455760008081fd5b614f538e8c84870101614dc0565b9083015250845250918601918601614e98565b600060208284031215614f7857600080fd5b5035919050565b634e487b7160e01b600052603260045260246000fd5b80356001600160e01b0381168114613fd657600080fd5b600082601f830112614fbd57600080fd5b81356020614fcd61403b83613f85565b82815260069290921b84018101918181019086841115614fec57600080fd5b8286015b848110156120c157604081890312156150095760008081fd5b615011613f0e565b61501a82613fbe565b8152615027858301614f95565b81860152835291830191604001614ff0565b600082601f83011261504a57600080fd5b8135602061505a61403b83613f85565b82815260079290921b8401810191818101908684111561507957600080fd5b8286015b848110156120c15780880360808112156150975760008081fd5b61509f613f31565b6150a883613fbe565b8152604080601f19840112156150be5760008081fd5b6150c6613f0e565b92506150d3878501613fbe565b83526150e0818501613fbe565b838801528187019290925260608301359181019190915283529183019160800161507d565b6000602080838503121561511857600080fd5b823567ffffffffffffffff8082111561513057600080fd5b8185019150604080838803121561514657600080fd5b61514e613f0e565b83358381111561515d57600080fd5b84016040818a03121561516f57600080fd5b615177613f0e565b81358581111561518657600080fd5b8201601f81018b1361519757600080fd5b80356151a561403b82613f85565b81815260069190911b8201890190898101908d8311156151c457600080fd5b928a01925b828410156152145787848f0312156151e15760008081fd5b6151e9613f0e565b84356151f481613fa9565b8152615201858d01614f95565b818d0152825292870192908a01906151c9565b84525050508187013593508484111561522c57600080fd5b6152388a858401614fac565b818801528252508385013591508282111561525257600080fd5b61525e88838601615039565b85820152809550505050505092915050565b805160408084528151848201819052600092602091908201906060870190855b818110156152c757835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615290565b50508583015187820388850152805180835290840192506000918401905b80831015615321578351805167ffffffffffffffff1683528501516001600160e01b0316858301529284019260019290920191908501906152e5565b50979650505050505050565b602081526000610c126020830184615270565b67ffffffffffffffff8316815260608101613dba6020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156153ac576153ac615375565b5092915050565b6000602080835260608451604080848701526153d26060870183615270565b87850151878203601f19016040890152805180835290860193506000918601905b8083101561418457845167ffffffffffffffff81511683528781015161543289850182805167ffffffffffffffff908116835260209182015116910152565b508401518287015293860193600192909201916080909101906153f3565b60006020828403121561546257600080fd5b813567ffffffffffffffff81111561547957600080fd5b6136ae848285016145d8565b81810381811115610c1557610c15615375565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff808416806154c9576154c9615498565b92169190910692915050565b8082028115828204841417610c1557610c15615375565b805182526000602067ffffffffffffffff81840151168185015260408084015160a0604087015261552060a087018261484d565b905060608501518682036060880152615539828261484d565b608087810151898303918a01919091528051808352908601935060009250908501905b8083101561532157835180516001600160a01b031683528601518683015292850192600192909201919084019061555c565b602081526000610c1260208301846154ec565b6080815260006155b460808301876154ec565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b6000806000606084860312156155f257600080fd5b83516155fd81613fdb565b602085015190935067ffffffffffffffff81111561561a57600080fd5b8401601f8101861361562b57600080fd5b805161563961403b82613ff4565b81815287602083850101111561564e57600080fd5b61565f826020830160208601614829565b809450505050604084015190509250925092565b60006040828403121561568557600080fd5b61568d613f0e565b61569683613fbe565b8152602083013560208201528091505092915050565b600181811c908216806156c057607f821691505b6020821081036156e057634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156156f857600080fd5b8151613dba81613fdb565b601f821115610780576000816000526020600020601f850160051c8101602086101561572c5750805b601f850160051c820191505b8181101561574b57828155600101615738565b505050505050565b815167ffffffffffffffff81111561576d5761576d613e89565b6157818161577b84546156ac565b84615703565b602080601f8311600181146157b6576000841561579e5750858301515b600019600386901b1c1916600185901b17855561574b565b600085815260208120601f198616915b828110156157e5578886015182559484019460019091019084016157c6565b50858210156158035787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835283546001600160a01b038116602085015260ff8160a01c161515604085015267ffffffffffffffff8160a81c16606085015250600180850160808086015260008154615865816156ac565b8060a089015260c0600183166000811461588657600181146158a2576158d2565b60ff19841660c08b015260c083151560051b8b010194506158d2565b85600052602060002060005b848110156158c95781548c82018501529088019089016158ae565b8b0160c0019550505b50929998505050505050505050565b80820180821115610c1557610c15615375565b60ff8181168382160190811115610c1557610c15615375565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff8084168061594c5761594c615498565b92169190910492915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261598d57600080fd5b83018035915067ffffffffffffffff8211156159a857600080fd5b60200191503681900382131561382157600080fd5b60208101600583106159d1576159d1614a5e565b91905290565b60ff81811683821602908116908181146153ac576153ac615375565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615a4b5784546001600160a01b031683526001948501949284019201615a26565b50508481036060860152865180825290820192508187019060005b81811015615a8b5782516001600160a01b031685529383019391830191600101615a66565b50505060ff851660808501525090506120c3565b600067ffffffffffffffff808616835280851660208401525060606040830152614c92606083018461484d565b8281526040602082015260006136ae604083018461484d565b67ffffffffffffffff848116825283166020820152606081016136ae6040830184614a74565b848152615b1b6020820185614a74565b608060408201526000615b31608083018561484d565b905082606083015295945050505050565b600060208284031215615b5457600080fd5b8151613dba81613fa9565b6020815260008251610100806020850152615b7e61012085018361484d565b91506020850151615b9b604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615bd560a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615bf2848361484d565b935060c08701519150808685030160e0870152615c0f848361484d565b935060e08701519150808685030183870152506120c3838261484d565b600060208284031215615c3e57600080fd5b5051919050565b848152600067ffffffffffffffff8086166020840152808516604084015250608060608301526120c3608083018461484d565b86815260c060208201526000615c9160c083018861484d565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b84811015615d7d57601f19868403018952815160a08151818652615d0e8287018261484d565b9150508582015185820387870152615d26828261484d565b91505060408083015186830382880152615d40838261484d565b92505050606080830151818701525060808083015192508582038187015250615d69818361484d565b9a86019a9450505090830190600101615ce8565b5090979650505050505050565b602081526000610c126020830184615ccb565b60008282518085526020808601955060208260051b8401016020860160005b84811015615d7d57601f19868403018952615dd883835161484d565b98840198925090830190600101615dbc565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e0850152615e5261018085018361484d565b915060408601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08086850301610100870152615e8f848361484d565b935060608801519150615eae6101208701836001600160a01b03169052565b60808801518387015260a0880151925080868503016101608701525050615ed58282615ccb565b9150508281036020840152614c928185615d9d56fea164736f6c6343000818000a",
}
var OffRampABI = OffRampMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go
index dd2428a143..bd07c18f3a 100644
--- a/core/gethwrappers/ccip/generated/onramp/onramp.go
+++ b/core/gethwrappers/ccip/generated/onramp/onramp.go
@@ -98,7 +98,7 @@ type OnRampStaticConfig struct {
var OnRampMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"name\":\"AllowListAdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"}],\"name\":\"DestChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"}],\"name\":\"FeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\"}],\"internalType\":\"structOnRamp.AllowListConfigArgs[]\",\"name\":\"allowListConfigArgsItems\",\"type\":\"tuple[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowListEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"contractIRouter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowListAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b506040516200407338038062004073833981016040819052620000359162000665565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d8162000390565b5050506200079f565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060408101516001600160a01b0316155b1562000273576040516306b7c75960e31b815260040160405180910390fd5b8051600280546001600160a01b03199081166001600160a01b0393841617909155602080840180516003805485169186169190911790556040808601805160048054871691881691909117905560608088018051600580549098169089161790965582516080808201855280516001600160401b031680835260a080518b16848a0190815260c080518d16868a0190815260e080518f169789019788528a5195865292518e169b85019b909b5299518c169783019790975292518a169381019390935289518916908301529351871693810193909352518516928201929092529151909216918101919091527f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e32906101000160405180910390a150565b60005b8151811015620004cf576000828281518110620003b457620003b462000789565b602002602001015190506000838381518110620003d557620003d562000789565b6020026020010151600001519050806001600160401b03166000036200041a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a250505080600101905062000393565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200050e576200050e620004d3565b60405290565b604080519081016001600160401b03811182821017156200050e576200050e620004d3565b604051601f8201601f191681016001600160401b0381118282101715620005645762000564620004d3565b604052919050565b80516001600160401b03811681146200058457600080fd5b919050565b6001600160a01b03811681146200059f57600080fd5b50565b600082601f830112620005b457600080fd5b815160206001600160401b03821115620005d257620005d2620004d3565b620005e2818360051b0162000539565b82815260069290921b840181019181810190868411156200060257600080fd5b8286015b848110156200065a5760408189031215620006215760008081fd5b6200062b62000514565b62000636826200056c565b815284820151620006478162000589565b8186015283529183019160400162000606565b509695505050505050565b60008060008385036101208112156200067d57600080fd5b60808112156200068c57600080fd5b62000696620004e9565b620006a1866200056c565b81526020860151620006b38162000589565b60208201526040860151620006c88162000589565b60408201526060860151620006dd8162000589565b606082015293506080607f1982011215620006f757600080fd5b5062000702620004e9565b6080850151620007128162000589565b815260a0850151620007248162000589565b602082015260c0850151620007398162000589565b604082015260e08501516200074e8162000589565b60608201526101008501519092506001600160401b038111156200077157600080fd5b6200077f86828701620005a2565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e05161385b620008186000396000818161022c01528181610c790152611beb0152600081816101f0015281816112480152611bc40152600081816101b4015281816105de0152611b9a0152600081816101840152818161116e015281816116930152611b6d015261385b6000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806379ba5097116100b2578063a6f3ab6c11610081578063df0aa9e911610066578063df0aa9e91461052d578063f2fde38b14610540578063fbca3b741461055357600080fd5b8063a6f3ab6c146104cd578063d77d5ed0146104e057600080fd5b806379ba50971461045b5780638da5cb5b146104635780639041be3d14610481578063972b4612146104ad57600080fd5b806334adf4941161010957806348a98aa4116100ee57806348a98aa4146103045780636def4ce71461033c5780637437ff9f146103db57600080fd5b806334adf494146102e95780633a019940146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e6101493660046126e0565b610566565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161027691906127a3565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b6040516102769190612868565b6102db6102d6366004612893565b61057a565b604051908152602001610276565b61014e6102f73660046128e3565b610733565b61014e610a06565b610317610312366004612958565b610c31565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b61039f61034a366004612991565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61044e604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260025473ffffffffffffffffffffffffffffffffffffffff908116825260035481166020830152600454811692820192909252600554909116606082015290565b60405161027691906129ae565b61014e610ce6565b60005473ffffffffffffffffffffffffffffffffffffffff16610317565b61049461048f366004612991565b610de3565b60405167ffffffffffffffff9091168152602001610276565b6104c06104bb366004612991565b610e0c565b60405161027691906129f7565b61014e6104db366004612a61565b610e34565b6103176104ee366004612991565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db61053b366004612ac8565b610e45565b61014e61054e366004612b34565b611748565b6104c0610561366004612991565b611759565b61056e61178d565b61057781611810565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106499190612b5f565b15610691576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906106e99086908690600401612c90565b602060405180830381865afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190612dd9565b90505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107a35760055473ffffffffffffffffffffffffffffffffffffffff1633146107a3576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a015760008383838181106107c2576107c2612df2565b90506020028101906107d49190612e21565b6107dd90612ed2565b805167ffffffffffffffff1660009081526006602090815260409091209082015181547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000009115801592909202178255919250906109545760005b8260400151518110156108fd5760008360400151828151811061086757610867612df2565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108e65783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610688565b6108f36001840182611987565b5050600101610842565b506040820151511561095457816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161094b91906129f7565b60405180910390a25b60005b8260600151518110156109a0576109978360600151828151811061097d5761097d612df2565b6020026020010151836001016119a990919063ffffffff16565b50600101610957565b50606082015151156109f757816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158683606001516040516109ee91906129f7565b60405180910390a25b50506001016107a6565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610a75573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610abb9190810190612f65565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a01576000838281518110610af757610af7612df2565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b969190612dd9565b90508015610c2757610bbf73ffffffffffffffffffffffffffffffffffffffff831685836119cb565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610c1e91815260200190565b60405180910390a35b5050600101610ada565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190612ff4565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610688565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff808216600090815260066020526040812054909161072d91166001613040565b67ffffffffffffffff8116600090815260066020526040902060609061072d90600101611a58565b610e3c61178d565b61057781611a6c565b67ffffffffffffffff8416600090815260066020526040812073ffffffffffffffffffffffffffffffffffffffff8316610eab576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff1615610f1c57610ece6001820184611c4e565b610f1c576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610688565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610f79576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff16801561101f576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e50690610fec908a908a90600401612c90565b600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b506002546000908190819073ffffffffffffffffffffffffffffffffffffffff1663c4276bfc8a61105660808c0160608d01612b34565b8a61106460808e018e613061565b6040518663ffffffff1660e01b81526004016110849594939291906130c6565b600060405180830381865afa1580156110a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110e7919081019061318e565b919450925090506110fe6080890160608a01612b34565b73ffffffffffffffffffffffffffffffffffffffff167f075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f8460405161114591815260200190565b60405180910390a2604080516101a081019091526000610100820181815267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166101208501528c811661014085015287549293928392916101608401918a9187916111ba91166131e8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001866112ba576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8f16600482015273ffffffffffffffffffffffffffffffffffffffff8c811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af1158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b5919061320f565b6112bd565b60005b67ffffffffffffffff1681525081526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018a80602001906112fb9190613061565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161133f8b80613061565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161138660808c018c613061565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016113d060808c0160608d01612b34565b73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018a8060400190611401919061322c565b905067ffffffffffffffff81111561141b5761141b6125ba565b60405190808252806020026020018201604052801561147e57816020015b61146b6040518060a0016040528060608152602001606081526020016060815260200160008152602001606081525090565b8152602001906001900390816114395790505b509052905060005b61149360408b018b61322c565b9050811015611542576115196114ac60408c018c61322c565b838181106114bc576114bc612df2565b9050604002018036038101906114d29190613294565b8c6114dd8d80613061565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e9250611c7d915050565b8260e00151828151811061152f5761152f612df2565b6020908102919091010152600101611486565b5060025460e082015160009173ffffffffffffffffffffffffffffffffffffffff169063085318f8908d9061157a60408f018f61322c565b6040518563ffffffff1660e01b815260040161159994939291906133ab565b600060405180830381865afa1580156115b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115fc91908101906133e1565b905060005b8260e00151518110156116555781818151811061162057611620612df2565b60200260200101518360e00151828151811061163e5761163e612df2565b602090810291909101015160800152600101611601565b506080808301849052604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908d16606082015230918101919091526116ef90839060a00160405160208183030381529060405280519060200120611fa3565b82515260405167ffffffffffffffff8c16907fcae3d9f68a9ed33d0a770e9bcc6fc25d4041dd6391e6cd8015546547a3c931409061172e908590613492565b60405180910390a25051519450505050505b949350505050565b61175061178d565b610577816120a3565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610688565b565b60005b815181101561198357600082828151811061183057611830612df2565b60200260200101519050600083838151811061184e5761184e612df2565b60200260200101516000015190508067ffffffffffffffff166000036118ac576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610688565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611813565b5050565b600061072a8373ffffffffffffffffffffffffffffffffffffffff8416612198565b600061072a8373ffffffffffffffffffffffffffffffffffffffff84166121e7565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a019084906122e1565b60606000611a65836123ed565b9392505050565b805173ffffffffffffffffffffffffffffffffffffffff161580611aa85750604081015173ffffffffffffffffffffffffffffffffffffffff16155b15611adf576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600280547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff93841617909155602080840151600380548416918516919091179055604080850151600480548516918616919091179055606080860151600580549095169086161790935580516080810182527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681527f00000000000000000000000000000000000000000000000000000000000000008516928101929092527f00000000000000000000000000000000000000000000000000000000000000008416828201527f00000000000000000000000000000000000000000000000000000000000000009093169181019190915290517f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e3291611c439184906135e0565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561072a565b611caf6040518060a0016040528060608152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611ced576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cfd858760000151610c31565b905073ffffffffffffffffffffffffffffffffffffffff81161580611dcd57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcb9190612b5f565b155b15611e1f5785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610688565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611ebe919061367f565b6000604051808303816000875af1158015611edd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f2391908101906136f5565b6040805160a0810190915273ffffffffffffffffffffffffffffffffffffffff841660c08201529091508060e0810160405160208183030381529060405281526020018260000151815260200182602001518152602001886020015181526020016040518060200160405280600081525081525092505050949350505050565b60008060001b82846020015185606001518660000151606001518760000151608001518860a001518960c00151604051602001611fe596959493929190613786565b604051602081830303815290604052805190602001208560400151805190602001208660e0015160405160200161201c91906137e7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808c0151805190840120928501989098529183019590955260608201939093529384015260a083015260c082015260e00160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603612122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610688565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546121df5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561072d565b50600061072d565b600081815260018301602052604081205480156122d057600061220b6001836137fa565b855490915060009061221f906001906137fa565b905080821461228457600086600001828154811061223f5761223f612df2565b906000526020600020015490508087600001848154811061226257612262612df2565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806122955761229561380d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061072d565b600091505061072d565b5092915050565b6000612343826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124499092919063ffffffff16565b805190915015610a0157808060200190518101906123619190612b5f565b610a01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610688565b60608160000180548060200260200160405190810160405280929190818152602001828054801561243d57602002820191906000526020600020905b815481526020019060010190808311612429575b50505050509050919050565b60606117408484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161247d919061383c565b60006040518083038185875af1925050503d80600081146124ba576040519150601f19603f3d011682016040523d82523d6000602084013e6124bf565b606091505b50915091506124d0878383876124db565b979650505050505050565b6060831561257157825160000361256a5773ffffffffffffffffffffffffffffffffffffffff85163b61256a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610688565b5081611740565b61174083838151156125865781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106889190612868565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561260c5761260c6125ba565b60405290565b6040516080810167ffffffffffffffff8111828210171561260c5761260c6125ba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561267c5761267c6125ba565b604052919050565b600067ffffffffffffffff82111561269e5761269e6125ba565b5060051b60200190565b67ffffffffffffffff8116811461057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461057757600080fd5b600060208083850312156126f357600080fd5b823567ffffffffffffffff81111561270a57600080fd5b8301601f8101851361271b57600080fd5b803561272e61272982612684565b612635565b81815260069190911b8201830190838101908783111561274d57600080fd5b928401925b828410156124d0576040848903121561276b5760008081fd5b6127736125e9565b843561277e816126a8565b81528486013561278d816126be565b8187015282526040939093019290840190612752565b6080810161072d828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156128155781810151838201526020016127fd565b50506000910152565b600081518084526128368160208601602086016127fa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061072a602083018461281e565b600060a0828403121561288d57600080fd5b50919050565b600080604083850312156128a657600080fd5b82356128b1816126a8565b9150602083013567ffffffffffffffff8111156128cd57600080fd5b6128d98582860161287b565b9150509250929050565b600080602083850312156128f657600080fd5b823567ffffffffffffffff8082111561290e57600080fd5b818501915085601f83011261292257600080fd5b81358181111561293157600080fd5b8660208260051b850101111561294657600080fd5b60209290920196919550909350505050565b6000806040838503121561296b57600080fd5b8235612976816126a8565b91506020830135612986816126be565b809150509250929050565b6000602082840312156129a357600080fd5b8135611a65816126a8565b6080810161072d8284805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015182169084015260408083015182169084015260609182015116910152565b6020808252825182820181905260009190848201906040850190845b81811015612a4557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612a13565b50909695505050505050565b8035612a5c816126be565b919050565b600060808284031215612a7357600080fd5b612a7b612612565b8235612a86816126be565b81526020830135612a96816126be565b60208201526040830135612aa9816126be565b60408201526060830135612abc816126be565b60608201529392505050565b60008060008060808587031215612ade57600080fd5b8435612ae9816126a8565b9350602085013567ffffffffffffffff811115612b0557600080fd5b612b118782880161287b565b935050604085013591506060850135612b29816126be565b939692955090935050565b600060208284031215612b4657600080fd5b8135611a65816126be565b801515811461057757600080fd5b600060208284031215612b7157600080fd5b8151611a6581612b51565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612bb157600080fd5b830160208101925035905067ffffffffffffffff811115612bd157600080fd5b803603821315612be057600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612c85578135612c53816126be565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612c40565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612cb18485612b7c565b60a06040860152612cc660e086018284612be7565b915050612cd66020860186612b7c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612d0c848385612be7565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612d4557600080fd5b60209288019283019235915084821115612d5e57600080fd5b8160061b3603831315612d7057600080fd5b80878503016080880152612d85848385612c30565b9450612d9360608901612a51565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612dbe6080890189612b7c565b94509250808786030160c088015250506124d0838383612be7565b600060208284031215612deb57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612e5557600080fd5b9190910192915050565b600082601f830112612e7057600080fd5b81356020612e8061272983612684565b8083825260208201915060208460051b870101935086841115612ea257600080fd5b602086015b84811015612ec7578035612eba816126be565b8352918301918301612ea7565b509695505050505050565b600060808236031215612ee457600080fd5b612eec612612565b8235612ef7816126a8565b81526020830135612f0781612b51565b6020820152604083013567ffffffffffffffff80821115612f2757600080fd5b612f3336838701612e5f565b60408401526060850135915080821115612f4c57600080fd5b50612f5936828601612e5f565b60608301525092915050565b60006020808385031215612f7857600080fd5b825167ffffffffffffffff811115612f8f57600080fd5b8301601f81018513612fa057600080fd5b8051612fae61272982612684565b81815260059190911b82018301908381019087831115612fcd57600080fd5b928401925b828410156124d0578351612fe5816126be565b82529284019290840190612fd2565b60006020828403121561300657600080fd5b8151611a65816126be565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156122da576122da613011565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261309657600080fd5b83018035915067ffffffffffffffff8211156130b157600080fd5b602001915036819003821315612be057600080fd5b67ffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201528360408201526080606082015260006124d0608083018486612be7565b600082601f83011261311d57600080fd5b815167ffffffffffffffff811115613137576131376125ba565b61316860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612635565b81815284602083860101111561317d57600080fd5b6117408260208301602087016127fa565b6000806000606084860312156131a357600080fd5b8351925060208401516131b581612b51565b604085015190925067ffffffffffffffff8111156131d257600080fd5b6131de8682870161310c565b9150509250925092565b600067ffffffffffffffff80831681810361320557613205613011565b6001019392505050565b60006020828403121561322157600080fd5b8151611a65816126a8565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261326157600080fd5b83018035915067ffffffffffffffff82111561327c57600080fd5b6020019150600681901b3603821315612be057600080fd5b6000604082840312156132a657600080fd5b6132ae6125e9565b82356132b9816126be565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b8481101561339e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a0815181865261332f8287018261281e565b9150508582015185820387870152613347828261281e565b91505060408083015186830382880152613361838261281e565b9250505060608083015181870152506080808301519250858203818701525061338a818361281e565b9a86019a94505050908301906001016132eb565b5090979650505050505050565b67ffffffffffffffff851681526060602082015260006133ce60608301866132ce565b82810360408401526124d0818587612c30565b600060208083850312156133f457600080fd5b825167ffffffffffffffff8082111561340c57600080fd5b818501915085601f83011261342057600080fd5b815161342e61272982612684565b81815260059190911b8301840190848101908883111561344d57600080fd5b8585015b83811015613485578051858111156134695760008081fd5b6134778b89838a010161310c565b845250918601918601613451565b5098975050505050505050565b602081526134e360208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161350c60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101808060e08501526135296101a085018361281e565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08086850301610100870152613566848361281e565b9350608087015191508086850301610120870152613584848361281e565b935060a087015191506135b061014087018373ffffffffffffffffffffffffffffffffffffffff169052565b60c087015161016087015260e08701519150808685030183870152506135d683826132ce565b9695505050505050565b6101008101613638828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff90811660808401526020840151811660a08401526040840151811660c084015260608401511660e0830152611a65565b602081526000825160a0602084015261369b60c084018261281e565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561370757600080fd5b815167ffffffffffffffff8082111561371f57600080fd5b908301906040828603121561373357600080fd5b61373b6125e9565b82518281111561374a57600080fd5b6137568782860161310c565b82525060208301518281111561376b57600080fd5b6137778782860161310c565b60208301525095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835260c060208401526137b660c084018961281e565b67ffffffffffffffff97881660408501529590961660608301525091909316608082015260a0019190915292915050565b60208152600061072a60208301846132ce565b8181038181111561072d5761072d613011565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612e558184602087016127fa56fea164736f6c6343000818000a",
+ Bin: "0x6101006040523480156200001257600080fd5b506040516200402938038062004029833981016040819052620000359162000665565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000186565b505083516001600160401b031615905080620000e6575060208301516001600160a01b0316155b80620000fd575060408301516001600160a01b0316155b8062000114575060608301516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e052620001728262000231565b6200017d8162000390565b5050506200079f565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316158062000254575060408101516001600160a01b0316155b1562000273576040516306b7c75960e31b815260040160405180910390fd5b8051600280546001600160a01b03199081166001600160a01b0393841617909155602080840180516003805485169186169190911790556040808601805160048054871691881691909117905560608088018051600580549098169089161790965582516080808201855280516001600160401b031680835260a080518b16848a0190815260c080518d16868a0190815260e080518f169789019788528a5195865292518e169b85019b909b5299518c169783019790975292518a169381019390935289518916908301529351871693810193909352518516928201929092529151909216918101919091527f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e32906101000160405180910390a150565b60005b8151811015620004cf576000828281518110620003b457620003b462000789565b602002602001015190506000838381518110620003d557620003d562000789565b6020026020010151600001519050806001600160401b03166000036200041a5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000083565b6001600160401b03818116600081815260066020908152604091829020868201518154600160481b600160e81b0319811669010000000000000000006001600160a01b03909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a250505080600101905062000393565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200050e576200050e620004d3565b60405290565b604080519081016001600160401b03811182821017156200050e576200050e620004d3565b604051601f8201601f191681016001600160401b0381118282101715620005645762000564620004d3565b604052919050565b80516001600160401b03811681146200058457600080fd5b919050565b6001600160a01b03811681146200059f57600080fd5b50565b600082601f830112620005b457600080fd5b815160206001600160401b03821115620005d257620005d2620004d3565b620005e2818360051b0162000539565b82815260069290921b840181019181810190868411156200060257600080fd5b8286015b848110156200065a5760408189031215620006215760008081fd5b6200062b62000514565b62000636826200056c565b815284820151620006478162000589565b8186015283529183019160400162000606565b509695505050505050565b60008060008385036101208112156200067d57600080fd5b60808112156200068c57600080fd5b62000696620004e9565b620006a1866200056c565b81526020860151620006b38162000589565b60208201526040860151620006c88162000589565b60408201526060860151620006dd8162000589565b606082015293506080607f1982011215620006f757600080fd5b5062000702620004e9565b6080850151620007128162000589565b815260a0850151620007248162000589565b602082015260c0850151620007398162000589565b604082015260e08501516200074e8162000589565b60608201526101008501519092506001600160401b038111156200077157600080fd5b6200077f86828701620005a2565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051613811620008186000396000818161022c01528181610c790152611ba10152600081816101f0015281816112480152611b7a0152600081816101b4015281816105de0152611b500152600081816101840152818161116e0152818161164b0152611b2301526138116000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806379ba5097116100b2578063a6f3ab6c11610081578063df0aa9e911610066578063df0aa9e91461052d578063f2fde38b14610540578063fbca3b741461055357600080fd5b8063a6f3ab6c146104cd578063d77d5ed0146104e057600080fd5b806379ba50971461045b5780638da5cb5b146104635780639041be3d14610481578063972b4612146104ad57600080fd5b806334adf4941161010957806348a98aa4116100ee57806348a98aa4146103045780636def4ce71461033c5780637437ff9f146103db57600080fd5b806334adf494146102e95780633a019940146102fc57600080fd5b80630242cf601461013b57806306285c6914610150578063181f5a771461027f57806320487ded146102c8575b600080fd5b61014e610149366004612696565b610566565b005b61026960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102769190612759565b60405180910390f35b6102bb6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b604051610276919061281e565b6102db6102d6366004612849565b61057a565b604051908152602001610276565b61014e6102f7366004612899565b610733565b61014e610a06565b61031761031236600461290e565b610c31565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610276565b61039f61034a366004612947565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610276565b61044e604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260025473ffffffffffffffffffffffffffffffffffffffff908116825260035481166020830152600454811692820192909252600554909116606082015290565b6040516102769190612964565b61014e610ce6565b60005473ffffffffffffffffffffffffffffffffffffffff16610317565b61049461048f366004612947565b610de3565b60405167ffffffffffffffff9091168152602001610276565b6104c06104bb366004612947565b610e0c565b60405161027691906129ad565b61014e6104db366004612a17565b610e34565b6103176104ee366004612947565b67ffffffffffffffff166000908152600660205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6102db61053b366004612a7e565b610e45565b61014e61054e366004612aea565b6116fe565b6104c0610561366004612947565b61170f565b61056e611743565b610577816117c6565b50565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106499190612b15565b15610691576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906106e99086908690600401612c46565b602060405180830381865afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190612d8f565b90505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107a35760055473ffffffffffffffffffffffffffffffffffffffff1633146107a3576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610a015760008383838181106107c2576107c2612da8565b90506020028101906107d49190612dd7565b6107dd90612e88565b805167ffffffffffffffff1660009081526006602090815260409091209082015181547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000009115801592909202178255919250906109545760005b8260400151518110156108fd5760008360400151828151811061086757610867612da8565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108e65783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610688565b6108f3600184018261193d565b5050600101610842565b506040820151511561095457816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281836040015160405161094b91906129ad565b60405180910390a25b60005b8260600151518110156109a0576109978360600151828151811061097d5761097d612da8565b60200260200101518360010161195f90919063ffffffff16565b50600101610957565b50606082015151156109f757816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158683606001516040516109ee91906129ad565b60405180910390a25b50506001016107a6565b505050565b600254604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610a75573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610abb9190810190612f1b565b60045490915073ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610a01576000838281518110610af757610af7612da8565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b969190612d8f565b90508015610c2757610bbf73ffffffffffffffffffffffffffffffffffffffff83168583611981565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610c1e91815260200190565b60405180910390a35b5050600101610ada565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190612faa565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610688565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff808216600090815260066020526040812054909161072d91166001612ff6565b67ffffffffffffffff8116600090815260066020526040902060609061072d90600101611a0e565b610e3c611743565b61057781611a22565b67ffffffffffffffff8416600090815260066020526040812073ffffffffffffffffffffffffffffffffffffffff8316610eab576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff1615610f1c57610ece6001820184611c04565b610f1c576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610688565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610f79576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff16801561101f576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e50690610fec908a908a90600401612c46565b600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b506002546000908190819073ffffffffffffffffffffffffffffffffffffffff1663c4276bfc8a61105660808c0160608d01612aea565b8a61106460808e018e613017565b6040518663ffffffff1660e01b815260040161108495949392919061307c565b600060405180830381865afa1580156110a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110e79190810190613144565b919450925090506110fe6080890160608a01612aea565b73ffffffffffffffffffffffffffffffffffffffff167f075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f8460405161114591815260200190565b60405180910390a2604080516101a081019091526000610100820181815267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166101208501528c811661014085015287549293928392916101608401918a9187916111ba911661319e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001866112ba576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8f16600482015273ffffffffffffffffffffffffffffffffffffffff8c811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af1158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b591906131c5565b6112bd565b60005b67ffffffffffffffff1681525081526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018a80602001906112fb9190613017565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161133f8b80613017565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020810184905260400161139060808c0160608d01612aea565b73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018a80604001906113c191906131e2565b905067ffffffffffffffff8111156113db576113db612570565b60405190808252806020026020018201604052801561143e57816020015b61142b6040518060a0016040528060608152602001606081526020016060815260200160008152602001606081525090565b8152602001906001900390816113f95790505b509052905060005b61145360408b018b6131e2565b9050811015611502576114d961146c60408c018c6131e2565b8381811061147c5761147c612da8565b905060400201803603810190611492919061324a565b8c61149d8d80613017565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e9250611c33915050565b8260e0015182815181106114ef576114ef612da8565b6020908102919091010152600101611446565b5060025460e082015160009173ffffffffffffffffffffffffffffffffffffffff169063085318f8908d9061153a60408f018f6131e2565b6040518563ffffffff1660e01b81526004016115599493929190613361565b600060405180830381865afa158015611576573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115bc9190810190613397565b905060005b8260e0015151811015611615578181815181106115e0576115e0612da8565b60200260200101518360e0015182815181106115fe576115fe612da8565b6020908102919091010151608001526001016115c1565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c1660608201523060808201526116a590839060a00160405160208183030381529060405280519060200120611f59565b82515260405167ffffffffffffffff8c16907fcae3d9f68a9ed33d0a770e9bcc6fc25d4041dd6391e6cd8015546547a3c93140906116e4908590613448565b60405180910390a25051519450505050505b949350505050565b611706611743565b61057781612059565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146117c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610688565b565b60005b81518110156119395760008282815181106117e6576117e6612da8565b60200260200101519050600083838151811061180457611804612da8565b60200260200101516000015190508067ffffffffffffffff16600003611862576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610688565b67ffffffffffffffff8181166000818152600660209081526040918290208682015181547fffffff0000000000000000000000000000000000000000ffffffffffffffffff8116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff909316928302908117808555865192891691909816178152928301526801000000000000000090940460ff161515918101919091527fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a25050508060010190506117c9565b5050565b600061072a8373ffffffffffffffffffffffffffffffffffffffff841661214e565b600061072a8373ffffffffffffffffffffffffffffffffffffffff841661219d565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a01908490612297565b60606000611a1b836123a3565b9392505050565b805173ffffffffffffffffffffffffffffffffffffffff161580611a5e5750604081015173ffffffffffffffffffffffffffffffffffffffff16155b15611a95576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600280547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff93841617909155602080840151600380548416918516919091179055604080850151600480548516918616919091179055606080860151600580549095169086161790935580516080810182527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681527f00000000000000000000000000000000000000000000000000000000000000008516928101929092527f00000000000000000000000000000000000000000000000000000000000000008416828201527f00000000000000000000000000000000000000000000000000000000000000009093169181019190915290517f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e3291611bf9918490613596565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561072a565b611c656040518060a0016040528060608152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611ca3576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cb3858760000151610c31565b905073ffffffffffffffffffffffffffffffffffffffff81161580611d8357506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d819190612b15565b155b15611dd55785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610688565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611e749190613635565b6000604051808303816000875af1158015611e93573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ed991908101906136ab565b6040805160a0810190915273ffffffffffffffffffffffffffffffffffffffff841660c08201529091508060e0810160405160208183030381529060405281526020018260000151815260200182602001518152602001886020015181526020016040518060200160405280600081525081525092505050949350505050565b60008060001b82846020015185606001518660000151606001518760000151608001518860a001518960c00151604051602001611f9b9695949392919061373c565b604051602081830303815290604052805190602001208560400151805190602001208660e00151604051602001611fd2919061379d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808c0151805190840120928501989098529183019590955260608201939093529384015260a083015260c082015260e00160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff8216036120d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610688565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546121955750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561072d565b50600061072d565b600081815260018301602052604081205480156122865760006121c16001836137b0565b85549091506000906121d5906001906137b0565b905080821461223a5760008660000182815481106121f5576121f5612da8565b906000526020600020015490508087600001848154811061221857612218612da8565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061224b5761224b6137c3565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061072d565b600091505061072d565b5092915050565b60006122f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123ff9092919063ffffffff16565b805190915015610a0157808060200190518101906123179190612b15565b610a01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610688565b6060816000018054806020026020016040519081016040528092919081815260200182805480156123f357602002820191906000526020600020905b8154815260200190600101908083116123df575b50505050509050919050565b60606116f68484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161243391906137f2565b60006040518083038185875af1925050503d8060008114612470576040519150601f19603f3d011682016040523d82523d6000602084013e612475565b606091505b509150915061248687838387612491565b979650505050505050565b606083156125275782516000036125205773ffffffffffffffffffffffffffffffffffffffff85163b612520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610688565b50816116f6565b6116f6838381511561253c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610688919061281e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156125c2576125c2612570565b60405290565b6040516080810167ffffffffffffffff811182821017156125c2576125c2612570565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561263257612632612570565b604052919050565b600067ffffffffffffffff82111561265457612654612570565b5060051b60200190565b67ffffffffffffffff8116811461057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461057757600080fd5b600060208083850312156126a957600080fd5b823567ffffffffffffffff8111156126c057600080fd5b8301601f810185136126d157600080fd5b80356126e46126df8261263a565b6125eb565b81815260069190911b8201830190838101908783111561270357600080fd5b928401925b8284101561248657604084890312156127215760008081fd5b61272961259f565b84356127348161265e565b81528486013561274381612674565b8187015282526040939093019290840190612708565b6080810161072d828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156127cb5781810151838201526020016127b3565b50506000910152565b600081518084526127ec8160208601602086016127b0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061072a60208301846127d4565b600060a0828403121561284357600080fd5b50919050565b6000806040838503121561285c57600080fd5b82356128678161265e565b9150602083013567ffffffffffffffff81111561288357600080fd5b61288f85828601612831565b9150509250929050565b600080602083850312156128ac57600080fd5b823567ffffffffffffffff808211156128c457600080fd5b818501915085601f8301126128d857600080fd5b8135818111156128e757600080fd5b8660208260051b85010111156128fc57600080fd5b60209290920196919550909350505050565b6000806040838503121561292157600080fd5b823561292c8161265e565b9150602083013561293c81612674565b809150509250929050565b60006020828403121561295957600080fd5b8135611a1b8161265e565b6080810161072d8284805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015182169084015260408083015182169084015260609182015116910152565b6020808252825182820181905260009190848201906040850190845b818110156129fb57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016129c9565b50909695505050505050565b8035612a1281612674565b919050565b600060808284031215612a2957600080fd5b612a316125c8565b8235612a3c81612674565b81526020830135612a4c81612674565b60208201526040830135612a5f81612674565b60408201526060830135612a7281612674565b60608201529392505050565b60008060008060808587031215612a9457600080fd5b8435612a9f8161265e565b9350602085013567ffffffffffffffff811115612abb57600080fd5b612ac787828801612831565b935050604085013591506060850135612adf81612674565b939692955090935050565b600060208284031215612afc57600080fd5b8135611a1b81612674565b801515811461057757600080fd5b600060208284031215612b2757600080fd5b8151611a1b81612b07565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612b6757600080fd5b830160208101925035905067ffffffffffffffff811115612b8757600080fd5b803603821315612b9657600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612c3b578135612c0981612674565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612bf6565b509495945050505050565b600067ffffffffffffffff808516835260406020840152612c678485612b32565b60a06040860152612c7c60e086018284612b9d565b915050612c8c6020860186612b32565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612cc2848385612b9d565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612cfb57600080fd5b60209288019283019235915084821115612d1457600080fd5b8160061b3603831315612d2657600080fd5b80878503016080880152612d3b848385612be6565b9450612d4960608901612a07565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612d746080890189612b32565b94509250808786030160c08801525050612486838383612b9d565b600060208284031215612da157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612e0b57600080fd5b9190910192915050565b600082601f830112612e2657600080fd5b81356020612e366126df8361263a565b8083825260208201915060208460051b870101935086841115612e5857600080fd5b602086015b84811015612e7d578035612e7081612674565b8352918301918301612e5d565b509695505050505050565b600060808236031215612e9a57600080fd5b612ea26125c8565b8235612ead8161265e565b81526020830135612ebd81612b07565b6020820152604083013567ffffffffffffffff80821115612edd57600080fd5b612ee936838701612e15565b60408401526060850135915080821115612f0257600080fd5b50612f0f36828601612e15565b60608301525092915050565b60006020808385031215612f2e57600080fd5b825167ffffffffffffffff811115612f4557600080fd5b8301601f81018513612f5657600080fd5b8051612f646126df8261263a565b81815260059190911b82018301908381019087831115612f8357600080fd5b928401925b82841015612486578351612f9b81612674565b82529284019290840190612f88565b600060208284031215612fbc57600080fd5b8151611a1b81612674565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561229057612290612fc7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261304c57600080fd5b83018035915067ffffffffffffffff82111561306757600080fd5b602001915036819003821315612b9657600080fd5b67ffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152608060608201526000612486608083018486612b9d565b600082601f8301126130d357600080fd5b815167ffffffffffffffff8111156130ed576130ed612570565b61311e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016125eb565b81815284602083860101111561313357600080fd5b6116f68260208301602087016127b0565b60008060006060848603121561315957600080fd5b83519250602084015161316b81612b07565b604085015190925067ffffffffffffffff81111561318857600080fd5b613194868287016130c2565b9150509250925092565b600067ffffffffffffffff8083168181036131bb576131bb612fc7565b6001019392505050565b6000602082840312156131d757600080fd5b8151611a1b8161265e565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261321757600080fd5b83018035915067ffffffffffffffff82111561323257600080fd5b6020019150600681901b3603821315612b9657600080fd5b60006040828403121561325c57600080fd5b61326461259f565b823561326f81612674565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b84811015613354577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a081518186526132e5828701826127d4565b91505085820151858203878701526132fd82826127d4565b9150506040808301518683038288015261331783826127d4565b9250505060608083015181870152506080808301519250858203818701525061334081836127d4565b9a86019a94505050908301906001016132a1565b5090979650505050505050565b67ffffffffffffffff851681526060602082015260006133846060830186613284565b8281036040840152612486818587612be6565b600060208083850312156133aa57600080fd5b825167ffffffffffffffff808211156133c257600080fd5b818501915085601f8301126133d657600080fd5b81516133e46126df8261263a565b81815260059190911b8301840190848101908883111561340357600080fd5b8585015b8381101561343b5780518581111561341f5760008081fd5b61342d8b89838a01016130c2565b845250918601918601613407565b5098975050505050505050565b6020815261349960208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b600060208301516134c260c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101808060e08501526134df6101a08501836127d4565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030161010087015261351c84836127d4565b935060808701519150808685030161012087015261353a84836127d4565b935060a0870151915061356661014087018373ffffffffffffffffffffffffffffffffffffffff169052565b60c087015161016087015260e087015191508086850301838701525061358c8382613284565b9695505050505050565b61010081016135ee828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff90811660808401526020840151811660a08401526040840151811660c084015260608401511660e0830152611a1b565b602081526000825160a0602084015261365160c08401826127d4565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b6000602082840312156136bd57600080fd5b815167ffffffffffffffff808211156136d557600080fd5b90830190604082860312156136e957600080fd5b6136f161259f565b82518281111561370057600080fd5b61370c878286016130c2565b82525060208301518281111561372157600080fd5b61372d878286016130c2565b60208301525095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835260c0602084015261376c60c08401896127d4565b67ffffffffffffffff97881660408501529590961660608301525091909316608082015260a0019190915292915050565b60208152600061072a6020830184613284565b8181038181111561072d5761072d612fc7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612e0b8184602087016127b056fea164736f6c6343000818000a",
}
var OnRampABI = OnRampMetaData.ABI
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index ab28247364..04a70551b6 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -4,14 +4,14 @@ burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMint
burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 717c079d5d13300cf3c3ee871c6e5bf9af904411f204fb081a9f3b263cca1391
burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6333d0314d0bd29e75ea5e05fe62a4516ade0c6db91c30b6f93645035db52ed8
burn_with_from_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPoolAndProxy/BurnWithFromMintTokenPoolAndProxy.bin 08ed1235dda921ce8841b26aa18d0c0f36db4884779dd7670857159801b6d597
-ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin 213d4adc8634671aea16fb4207989375b1aac919b04d608f4767c29592affbf5
+ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin 02da0d657b0835cf89f39ba790a96cab4595d27e16ebb7242a40dcec67e9da56
ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin d8d70fe111bacc7702c7c263f8c4733dcb2fff77e52c9f60c30d303731bc97c1
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin 274d87db70b643e00ab0a7e7845bb4b791f3b613bfc87708d33fc5a8369e2a41
commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin f7128dcc2ee6dbcbc976288abcc16970ffb19b59412c5202ef6b259d2007f801
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b0d77babbe635cd6ba04c2af049badc9e9d28a4b6ed6bb75f830ad902a618beb
evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 5c02c2b167946b3467636ff2bb58594cb4652fc63d8bdfee2488ed562e2a3e50
-fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 920b7a293165fe8306fbed0cafd866bafc5943e8759486f7803bfbbd40309b6b
+fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 7fcb78bfc6f050c9d3bd3396a29fa58c6eceec3be6f9f6e807212e816f881a4c
lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin e6a8ec9e8faccb1da7d90e0f702ed72975964f97dc3222b54cfcca0a0ba3fea2
lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin e632b08be0fbd1d013e8b3a9d75293d0d532b83071c531ff2be1deec1fa48ec1
maybe_revert_message_receiver: ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin d73956c26232ebcc4a5444429fa99cbefed960e323be9b5a24925885c2e477d5
@@ -20,11 +20,11 @@ mock_usdc_token_messenger: ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMesse
mock_usdc_token_transmitter: ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.bin be0dbc3e475741ea0b7a54ec2b935a321b428baa9f4ce18180a87fb38bb87de2
mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin 518e19efa2ff52b0fefd8e597b05765317ee7638189bfe34ca43de2f6599faf4
multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 0b541232e49727e947dc164eadf35963c66e67576f21baa0ecaa06a8833148ed
-multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin aa299e0c2659d53aad4eace4d66be0e734b1366008593669cf30361ff529da6a
+multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 6b56e0114a4d50797d30a34aecc2641ef340451d0c3fcb9d729bba4df2435122
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487
-offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin a3b8a9644f0d450dbf53d3371555dcc4084fb2eaf138a3797ef5cf73ed665bae
-onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 1ae9e3ebefc56d0382308c67c4ec066cdf3fa3eed2d31af8015d5d8db67f9c90
+offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 263df151d037af19cc412a051efb82993b0ccdde0184c598e3669f1326ab4ce9
+onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 93ad9efaf8789baf7133a5db803b20d05b4771bf25f57a438cb7e5a8111fb472
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b
price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2
registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 75be86323c227917a9bbc3f799d7ed02f92db546653a36db30ed0ebe64461353
diff --git a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go
index 2f98ae1623..aa8cf0bd86 100644
--- a/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go
+++ b/core/gethwrappers/functions/generated/functions_allow_list/functions_allow_list.go
@@ -36,15 +36,15 @@ type TermsOfServiceAllowListConfig struct {
}
var TermsOfServiceAllowListMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"initialAllowedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"initialBlockedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUsage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientIsBlocked\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"AddedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"BlockedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"UnblockedAccess\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"name\":\"acceptTermsOfService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"blockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAllowedSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"allowedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getBlockedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"blockedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"getMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isBlockedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"unblockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60806040523480156200001157600080fd5b5060405162001a1e38038062001a1e8339810160408190526200003491620004d9565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620001d4565b505050620000d2836200027f60201b60201c565b60005b8251811015620001255762000111838281518110620000f857620000f8620005a8565b602002602001015160026200030660201b90919060201c565b506200011d81620005be565b9050620000d5565b5060005b8151811015620001ca57620001658282815181106200014c576200014c620005a8565b602002602001015160026200032660201b90919060201c565b156200018457604051638129bbcd60e01b815260040160405180910390fd5b620001b68282815181106200019d576200019d620005a8565b602002602001015160046200030660201b90919060201c565b50620001c281620005be565b905062000129565b50505050620005e6565b336001600160a01b038216036200022e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6200028962000349565b805160068054602080850180516001600160a81b0319909316941515610100600160a81b03198116959095176101006001600160a01b039485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910160405180910390a150565b60006200031d836001600160a01b038416620003a7565b90505b92915050565b6001600160a01b038116600090815260018301602052604081205415156200031d565b6000546001600160a01b03163314620003a55760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b6000818152600183016020526040812054620003f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000320565b50600062000320565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200042757600080fd5b919050565b600082601f8301126200043e57600080fd5b815160206001600160401b03808311156200045d576200045d620003f9565b8260051b604051601f19603f83011681018181108482111715620004855762000485620003f9565b604052938452858101830193838101925087851115620004a457600080fd5b83870191505b84821015620004ce57620004be826200040f565b83529183019190830190620004aa565b979650505050505050565b60008060008385036080811215620004f057600080fd5b6040811215620004ff57600080fd5b50604080519081016001600160401b038082118383101715620005265762000526620003f9565b816040528651915081151582146200053d57600080fd5b8183526200054e602088016200040f565b60208401526040870151929550808311156200056957600080fd5b62000577888489016200042c565b945060608701519250808311156200058e57600080fd5b50506200059e868287016200042c565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620005df57634e487b7160e01b600052601160045260246000fd5b5060010190565b61142880620005f66000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063817ef62e116100b2578063a39b06e311610081578063c3f909d411610066578063c3f909d4146102c3578063cc7ebf4914610322578063f2fde38b1461032a57600080fd5b8063a39b06e314610237578063a5e1d61d146102b057600080fd5b8063817ef62e146101e157806382184c7b146101e957806389f9a2c4146101fc5780638da5cb5b1461020f57600080fd5b80633908c4d4116100ee5780633908c4d41461018e57806347663acb146101a35780636b14daf8146101b657806379ba5097146101d957600080fd5b806301a05958146101205780630a8c9c2414610146578063181f5a771461016657806320229a861461017b575b600080fd5b61012861033d565b60405167ffffffffffffffff90911681526020015b60405180910390f35b610159610154366004610fc4565b61034e565b60405161013d9190610ff7565b61016e6104aa565b60405161013d9190611051565b610159610189366004610fc4565b6104c6565b6101a161019c3660046110e1565b61062c565b005b6101a16101b1366004611142565b6108d7565b6101c96101c436600461115d565b610938565b604051901515815260200161013d565b6101a1610962565b610159610a64565b6101a16101f7366004611142565b610a70565b6101a161020a36600461120f565b610ad6565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013d565b6102a2610245366004611298565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160405160208183030381529060405280519060200120905092915050565b60405190815260200161013d565b6101c96102be366004611142565b610b91565b60408051808201825260008082526020918201528151808301835260065460ff8116151580835273ffffffffffffffffffffffffffffffffffffffff61010090920482169284019283528451908152915116918101919091520161013d565b610128610bb1565b6101a1610338366004611142565b610bbd565b60006103496004610bd1565b905090565b60608167ffffffffffffffff168367ffffffffffffffff16118061038557506103776002610bd1565b8267ffffffffffffffff1610155b156103bc576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103c683836112f1565b6103d1906001611312565b67ffffffffffffffff1667ffffffffffffffff8111156103f3576103f36111e0565b60405190808252806020026020018201604052801561041c578160200160208202803683370190505b50905060005b61042c84846112f1565b67ffffffffffffffff1681116104a25761045b6104538267ffffffffffffffff8716611333565b600290610bdb565b82828151811061046d5761046d611346565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261049b81611375565b9050610422565b505b92915050565b6040518060600160405280602c81526020016113f0602c913981565b60608167ffffffffffffffff168367ffffffffffffffff1611806104fd57506104ef6004610bd1565b8267ffffffffffffffff1610155b8061050f575061050d6004610bd1565b155b15610546576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61055083836112f1565b61055b906001611312565b67ffffffffffffffff1667ffffffffffffffff81111561057d5761057d6111e0565b6040519080825280602002602001820160405280156105a6578160200160208202803683370190505b50905060005b6105b684846112f1565b67ffffffffffffffff1681116104a2576105e56105dd8267ffffffffffffffff8716611333565b600490610bdb565b8282815181106105f7576105f7611346565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261062581611375565b90506105ac565b610637600485610be7565b1561066e576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606087811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529188901b16603483015282516028818403018152604890920190925280519101206000906040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206006546000855291840180845281905260ff8616928401929092526060830187905260808301869052909250610100900473ffffffffffffffffffffffffffffffffffffffff169060019060a0016020604051602081039080840390855afa1580156107a2573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16146107f9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff861614158061083e57503373ffffffffffffffffffffffffffffffffffffffff87161480159061083e5750333b155b15610875576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610880600286610c16565b156108cf5760405173ffffffffffffffffffffffffffffffffffffffff861681527f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49060200160405180910390a15b505050505050565b6108df610c38565b6108ea600482610cbb565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f28bbd0761309a99e8fb5e5d02ada0b7b2db2e5357531ff5dbfc205c3f5b6592b906020015b60405180910390a150565b60065460009060ff1661094d5750600161095b565b610958600285610be7565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60606103496002610cdd565b610a78610c38565b610a83600282610cbb565b50610a8f600482610c16565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f337cd0f3f594112b6d830afb510072d3b08556b446514f73b8109162fd1151e19060200161092d565b610ade610c38565b805160068054602080850180517fffffffffffffffffffffff0000000000000000000000000000000000000000009093169415157fffffffffffffffffffffff0000000000000000000000000000000000000000ff81169590951761010073ffffffffffffffffffffffffffffffffffffffff9485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910161092d565b60065460009060ff16610ba657506000919050565b6104a4600483610be7565b60006103496002610bd1565b610bc5610c38565b610bce81610cea565b50565b60006104a4825490565b600061095b8383610ddf565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561095b565b600061095b8373ffffffffffffffffffffffffffffffffffffffff8416610e09565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109df565b565b600061095b8373ffffffffffffffffffffffffffffffffffffffff8416610e58565b6060600061095b83610f4b565b3373ffffffffffffffffffffffffffffffffffffffff821603610d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109df565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110610df657610df6611346565b9060005260206000200154905092915050565b6000818152600183016020526040812054610e50575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a4565b5060006104a4565b60008181526001830160205260408120548015610f41576000610e7c6001836113ad565b8554909150600090610e90906001906113ad565b9050818114610ef5576000866000018281548110610eb057610eb0611346565b9060005260206000200154905080876000018481548110610ed357610ed3611346565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610f0657610f066113c0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a4565b60009150506104a4565b606081600001805480602002602001604051908101604052809291908181526020018280548015610f9b57602002820191906000526020600020905b815481526020019060010190808311610f87575b50505050509050919050565b803567ffffffffffffffff81168114610fbf57600080fd5b919050565b60008060408385031215610fd757600080fd5b610fe083610fa7565b9150610fee60208401610fa7565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561104557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611013565b50909695505050505050565b600060208083528351808285015260005b8181101561107e57858101830151858201604001528201611062565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610fbf57600080fd5b600080600080600060a086880312156110f957600080fd5b611102866110bd565b9450611110602087016110bd565b93506040860135925060608601359150608086013560ff8116811461113457600080fd5b809150509295509295909350565b60006020828403121561115457600080fd5b61095b826110bd565b60008060006040848603121561117257600080fd5b61117b846110bd565b9250602084013567ffffffffffffffff8082111561119857600080fd5b818601915086601f8301126111ac57600080fd5b8135818111156111bb57600080fd5b8760208285010111156111cd57600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006040828403121561122157600080fd5b6040516040810181811067ffffffffffffffff8211171561126b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528235801515811461127e57600080fd5b815261128c602084016110bd565b60208201529392505050565b600080604083850312156112ab57600080fd5b6112b4836110bd565b9150610fee602084016110bd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156104a2576104a26112c2565b67ffffffffffffffff8181168382160190808211156104a2576104a26112c2565b808201808211156104a4576104a46112c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036113a6576113a66112c2565b5060010190565b818103818111156104a4576104a46112c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e312e30a164736f6c6343000813000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"initialAllowedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"initialBlockedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"previousToSContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidUsage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoPreviousToSContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientIsBlocked\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"AddedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"BlockedAccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"UnblockedAccess\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"name\":\"acceptTermsOfService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"blockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAllowedSenders\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allowedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"allowedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockedSendersCount\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxStart\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockedSenderIdxEnd\",\"type\":\"uint64\"}],\"name\":\"getBlockedSendersInRange\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"blockedSenders\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"acceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"getMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"hasAccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isBlockedSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"previousSendersToAdd\",\"type\":\"address[]\"}],\"name\":\"migratePreviouslyAllowedSenders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"unblockSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"signerPublicKey\",\"type\":\"address\"}],\"internalType\":\"structTermsOfServiceAllowListConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x60806040523480156200001157600080fd5b5060405162001d5338038062001d53833981016040819052620000349162000525565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620001f5565b505050620000d284620002a060201b60201c565b60005b8351811015620001255762000111848281518110620000f857620000f8620005eb565b602002602001015160036200032760201b90919060201c565b506200011d8162000601565b9050620000d5565b5060005b8251811015620001ca57620001658382815181106200014c576200014c620005eb565b602002602001015160036200034760201b90919060201c565b156200018457604051638129bbcd60e01b815260040160405180910390fd5b620001b68382815181106200019d576200019d620005eb565b602002602001015160056200032760201b90919060201c565b50620001c28162000601565b905062000129565b50600280546001600160a01b0319166001600160a01b03929092169190911790555062000629915050565b336001600160a01b038216036200024f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620002aa6200036a565b805160078054602080850180516001600160a81b0319909316941515610100600160a81b03198116959095176101006001600160a01b039485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910160405180910390a150565b60006200033e836001600160a01b038416620003c8565b90505b92915050565b6001600160a01b038116600090815260018301602052604081205415156200033e565b6000546001600160a01b03163314620003c65760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b6000818152600183016020526040812054620004115750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000341565b50600062000341565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200045557620004556200041a565b60405290565b80516001600160a01b03811681146200047357600080fd5b919050565b600082601f8301126200048a57600080fd5b815160206001600160401b0380831115620004a957620004a96200041a565b8260051b604051601f19603f83011681018181108482111715620004d157620004d16200041a565b604052938452858101830193838101925087851115620004f057600080fd5b83870191505b848210156200051a576200050a826200045b565b83529183019190830190620004f6565b979650505050505050565b60008060008084860360a08112156200053d57600080fd5b60408112156200054c57600080fd5b506200055762000430565b855180151581146200056857600080fd5b815262000578602087016200045b565b602082015260408601519094506001600160401b03808211156200059b57600080fd5b620005a98883890162000478565b94506060870151915080821115620005c057600080fd5b50620005cf8782880162000478565b925050620005e0608086016200045b565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b6000600182016200062257634e487b7160e01b600052601160045260246000fd5b5060010190565b61171a80620006396000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c8063817ef62e116100b2578063a39b06e311610081578063c3f909d411610066578063c3f909d4146102f1578063cc7ebf4914610350578063f2fde38b1461035857600080fd5b8063a39b06e314610265578063a5e1d61d146102de57600080fd5b8063817ef62e1461020f57806382184c7b1461021757806389f9a2c41461022a5780638da5cb5b1461023d57600080fd5b80633908c4d4116101095780634e10a5b3116100ee5780634e10a5b3146101d15780636b14daf8146101e457806379ba50971461020757600080fd5b80633908c4d4146101a957806347663acb146101be57600080fd5b806301a059581461013b5780630a8c9c2414610161578063181f5a771461018157806320229a8614610196575b600080fd5b61014361036b565b60405167ffffffffffffffff90911681526020015b60405180910390f35b61017461016f3660046111bb565b61037c565b60405161015891906111ee565b6101896104d8565b6040516101589190611248565b6101746101a43660046111bb565b6104f4565b6101bc6101b73660046112d8565b61065a565b005b6101bc6101cc366004611339565b610905565b6101bc6101df3660046113d2565b610966565b6101f76101f236600461147f565b610b2f565b6040519015158152602001610158565b6101bc610b59565b610174610c5b565b6101bc610225366004611339565b610c67565b6101bc610238366004611510565b610ccd565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610158565b6102d061027336600461156d565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015260009060480160405160208183030381529060405280519060200120905092915050565b604051908152602001610158565b6101f76102ec366004611339565b610d88565b60408051808201825260008082526020918201528151808301835260075460ff8116151580835273ffffffffffffffffffffffffffffffffffffffff610100909204821692840192835284519081529151169181019190915201610158565b610143610da8565b6101bc610366366004611339565b610db4565b60006103776005610dc8565b905090565b60608167ffffffffffffffff168367ffffffffffffffff1611806103b357506103a56003610dc8565b8267ffffffffffffffff1610155b156103ea576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103f483836115c6565b6103ff9060016115e7565b67ffffffffffffffff1667ffffffffffffffff81111561042157610421611354565b60405190808252806020026020018201604052801561044a578160200160208202803683370190505b50905060005b61045a84846115c6565b67ffffffffffffffff1681116104d0576104896104818267ffffffffffffffff8716611608565b600390610dd2565b82828151811061049b5761049b61161b565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526104c98161164a565b9050610450565b505b92915050565b6040518060600160405280602c81526020016116e2602c913981565b60608167ffffffffffffffff168367ffffffffffffffff16118061052b575061051d6005610dc8565b8267ffffffffffffffff1610155b8061053d575061053b6005610dc8565b155b15610574576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61057e83836115c6565b6105899060016115e7565b67ffffffffffffffff1667ffffffffffffffff8111156105ab576105ab611354565b6040519080825280602002602001820160405280156105d4578160200160208202803683370190505b50905060005b6105e484846115c6565b67ffffffffffffffff1681116104d05761061361060b8267ffffffffffffffff8716611608565b600590610dd2565b8282815181106106255761062561161b565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526106538161164a565b90506105da565b610665600585610dde565b1561069c576040517f62b7a34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606087811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529188901b16603483015282516028818403018152604890920190925280519101206000906040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206007546000855291840180845281905260ff8616928401929092526060830187905260808301869052909250610100900473ffffffffffffffffffffffffffffffffffffffff169060019060a0016020604051602081039080840390855afa1580156107d0573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614610827576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff861614158061086c57503373ffffffffffffffffffffffffffffffffffffffff87161480159061086c5750333b155b156108a3576040517f381cfcbd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ae600386610e0d565b156108fd5760405173ffffffffffffffffffffffffffffffffffffffff861681527f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49060200160405180910390a15b505050505050565b61090d610e2f565b610918600582610eb2565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f28bbd0761309a99e8fb5e5d02ada0b7b2db2e5357531ff5dbfc205c3f5b6592b906020015b60405180910390a150565b61096e610e2f565b60025473ffffffffffffffffffffffffffffffffffffffff166109bd576040517fb25f406700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1660005b8251811015610b2a578173ffffffffffffffffffffffffffffffffffffffff16636b14daf8848381518110610a1057610a1061161b565b6020908102919091010151604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9092166004830152602482015260006044820152606401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab59190611682565b15610b1a57610ae7838281518110610acf57610acf61161b565b60200260200101516005610dde90919063ffffffff16565b610b1a57610b18838281518110610b0057610b0061161b565b60200260200101516003610e0d90919063ffffffff16565b505b610b238161164a565b90506109d9565b505050565b60075460009060ff16610b4457506001610b52565b610b4f600385610dde565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60606103776003610ed4565b610c6f610e2f565b610c7a600382610eb2565b50610c86600582610e0d565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527f337cd0f3f594112b6d830afb510072d3b08556b446514f73b8109162fd1151e19060200161095b565b610cd5610e2f565b805160078054602080850180517fffffffffffffffffffffff0000000000000000000000000000000000000000009093169415157fffffffffffffffffffffff0000000000000000000000000000000000000000ff81169590951761010073ffffffffffffffffffffffffffffffffffffffff9485160217909355604080519485529251909116908301527f0d22b8a99f411b3dd338c961284f608489ca0dab9cdad17366a343c361bcf80a910161095b565b60075460009060ff16610d9d57506000919050565b6104d2600583610dde565b60006103776003610dc8565b610dbc610e2f565b610dc581610ee1565b50565b60006104d2825490565b6000610b528383610fd6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b52565b6000610b528373ffffffffffffffffffffffffffffffffffffffff8416611000565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610bd6565b565b6000610b528373ffffffffffffffffffffffffffffffffffffffff841661104f565b60606000610b5283611142565b3373ffffffffffffffffffffffffffffffffffffffff821603610f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610bd6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110610fed57610fed61161b565b9060005260206000200154905092915050565b6000818152600183016020526040812054611047575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104d2565b5060006104d2565b6000818152600183016020526040812054801561113857600061107360018361169f565b85549091506000906110879060019061169f565b90508181146110ec5760008660000182815481106110a7576110a761161b565b90600052602060002001549050808760000184815481106110ca576110ca61161b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806110fd576110fd6116b2565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104d2565b60009150506104d2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561119257602002820191906000526020600020905b81548152602001906001019080831161117e575b50505050509050919050565b803567ffffffffffffffff811681146111b657600080fd5b919050565b600080604083850312156111ce57600080fd5b6111d78361119e565b91506111e56020840161119e565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561123c57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161120a565b50909695505050505050565b600060208083528351808285015260005b8181101561127557858101830151858201604001528201611259565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146111b657600080fd5b600080600080600060a086880312156112f057600080fd5b6112f9866112b4565b9450611307602087016112b4565b93506040860135925060608601359150608086013560ff8116811461132b57600080fd5b809150509295509295909350565b60006020828403121561134b57600080fd5b610b52826112b4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113ca576113ca611354565b604052919050565b600060208083850312156113e557600080fd5b823567ffffffffffffffff808211156113fd57600080fd5b818501915085601f83011261141157600080fd5b81358181111561142357611423611354565b8060051b9150611434848301611383565b818152918301840191848101908884111561144e57600080fd5b938501935b8385101561147357611464856112b4565b82529385019390850190611453565b98975050505050505050565b60008060006040848603121561149457600080fd5b61149d846112b4565b9250602084013567ffffffffffffffff808211156114ba57600080fd5b818601915086601f8301126114ce57600080fd5b8135818111156114dd57600080fd5b8760208285010111156114ef57600080fd5b6020830194508093505050509250925092565b8015158114610dc557600080fd5b60006040828403121561152257600080fd5b6040516040810181811067ffffffffffffffff8211171561154557611545611354565b604052823561155381611502565b8152611561602084016112b4565b60208201529392505050565b6000806040838503121561158057600080fd5b611589836112b4565b91506111e5602084016112b4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156104d0576104d0611597565b67ffffffffffffffff8181168382160190808211156104d0576104d0611597565b808201808211156104d2576104d2611597565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361167b5761167b611597565b5060010190565b60006020828403121561169457600080fd5b8151610b5281611502565b818103818111156104d2576104d2611597565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe46756e6374696f6e73205465726d73206f66205365727669636520416c6c6f77204c6973742076312e312e31a164736f6c6343000813000a",
}
var TermsOfServiceAllowListABI = TermsOfServiceAllowListMetaData.ABI
var TermsOfServiceAllowListBin = TermsOfServiceAllowListMetaData.Bin
-func DeployTermsOfServiceAllowList(auth *bind.TransactOpts, backend bind.ContractBackend, config TermsOfServiceAllowListConfig, initialAllowedSenders []common.Address, initialBlockedSenders []common.Address) (common.Address, *types.Transaction, *TermsOfServiceAllowList, error) {
+func DeployTermsOfServiceAllowList(auth *bind.TransactOpts, backend bind.ContractBackend, config TermsOfServiceAllowListConfig, initialAllowedSenders []common.Address, initialBlockedSenders []common.Address, previousToSContract common.Address) (common.Address, *types.Transaction, *TermsOfServiceAllowList, error) {
parsed, err := TermsOfServiceAllowListMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -53,7 +53,7 @@ func DeployTermsOfServiceAllowList(auth *bind.TransactOpts, backend bind.Contrac
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TermsOfServiceAllowListBin), backend, config, initialAllowedSenders, initialBlockedSenders)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TermsOfServiceAllowListBin), backend, config, initialAllowedSenders, initialBlockedSenders, previousToSContract)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -454,6 +454,18 @@ func (_TermsOfServiceAllowList *TermsOfServiceAllowListTransactorSession) BlockS
return _TermsOfServiceAllowList.Contract.BlockSender(&_TermsOfServiceAllowList.TransactOpts, sender)
}
+func (_TermsOfServiceAllowList *TermsOfServiceAllowListTransactor) MigratePreviouslyAllowedSenders(opts *bind.TransactOpts, previousSendersToAdd []common.Address) (*types.Transaction, error) {
+ return _TermsOfServiceAllowList.contract.Transact(opts, "migratePreviouslyAllowedSenders", previousSendersToAdd)
+}
+
+func (_TermsOfServiceAllowList *TermsOfServiceAllowListSession) MigratePreviouslyAllowedSenders(previousSendersToAdd []common.Address) (*types.Transaction, error) {
+ return _TermsOfServiceAllowList.Contract.MigratePreviouslyAllowedSenders(&_TermsOfServiceAllowList.TransactOpts, previousSendersToAdd)
+}
+
+func (_TermsOfServiceAllowList *TermsOfServiceAllowListTransactorSession) MigratePreviouslyAllowedSenders(previousSendersToAdd []common.Address) (*types.Transaction, error) {
+ return _TermsOfServiceAllowList.Contract.MigratePreviouslyAllowedSenders(&_TermsOfServiceAllowList.TransactOpts, previousSendersToAdd)
+}
+
func (_TermsOfServiceAllowList *TermsOfServiceAllowListTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
return _TermsOfServiceAllowList.contract.Transact(opts, "transferOwnership", to)
}
@@ -1307,6 +1319,8 @@ type TermsOfServiceAllowListInterface interface {
BlockSender(opts *bind.TransactOpts, sender common.Address) (*types.Transaction, error)
+ MigratePreviouslyAllowedSenders(opts *bind.TransactOpts, previousSendersToAdd []common.Address) (*types.Transaction, error)
+
TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
UnblockSender(opts *bind.TransactOpts, sender common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 83ea4d13b6..5153e4055f 100644
--- a/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/functions/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -1,6 +1,6 @@
GETH_VERSION: 1.13.8
functions: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRequest.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsRequest.bin 3c972870b0afeb6d73a29ebb182f24956a2cebb127b21c4f867d1ecf19a762db
-functions_allow_list: ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.bin 268de8b3c061b53a1a2a1ccc0149eff68545959e29cd41b5f2e9f5dab19075cf
+functions_allow_list: ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.abi ../../../contracts/solc/v0.8.19/functions/v1_X/TermsOfServiceAllowList.bin 6581a3e82c8a6b5532addb8278ff520d18f38c2be4ac07ed0ad9ccc2e6825e48
functions_billing_registry_events_mock: ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsBillingRegistryEventsMock.abi ../../../contracts/solc/v0.8.6/functions/v0_0_0/FunctionsBillingRegistryEventsMock.bin 50deeb883bd9c3729702be335c0388f9d8553bab4be5e26ecacac496a89e2b77
functions_client: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClient.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClient.bin 2368f537a04489c720a46733f8596c4fc88a31062ecfa966d05f25dd98608aca
functions_client_example: ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClientExample.abi ../../../contracts/solc/v0.8.19/functions/v1_X/FunctionsClientExample.bin abf32e69f268f40e8530eb8d8e96bf310b798a4c0049a58022d9d2fb527b601b
diff --git a/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go b/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go
index bb92001085..c345a86569 100644
--- a/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go
+++ b/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go
@@ -87,7 +87,7 @@ type CapabilitiesRegistryNodeParams struct {
var CapabilitiesRegistryMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityIsDeprecated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"CapabilityRequiredByDON\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"DONDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONNode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"nodeCount\",\"type\":\"uint256\"}],\"name\":\"InvalidFaultTolerance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotSupportCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfCapabilitiesDON\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfWorkflowDON\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilitiesRegistry.Capability[]\",\"name\":\"capabilities\",\"type\":\"tuple[]\"}],\"name\":\"addCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"deprecateCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isDeprecated\",\"type\":\"bool\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isDeprecated\",\"type\":\"bool\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getCapabilityConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.DONInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.DONInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeInfo\",\"name\":\"nodeInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeOperators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"name\":\"updateDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6150f680620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635e65e309116100ee5780638da5cb5b11610097578063d8bc7b6811610071578063d8bc7b68146103f6578063ddbe4f8214610409578063e29581aa1461041e578063f2fde38b1461043357600080fd5b80638da5cb5b1461039b5780639cb7c5f4146103c3578063d59a79f6146103e357600080fd5b806373ac22b4116100c857806373ac22b41461036d57806379ba50971461038057806386fa42461461038857600080fd5b80635e65e3091461033257806366acaa3314610345578063715f52951461035a57600080fd5b8063235374051161015b578063398f377311610135578063398f3773146102cb5780633f2a13c9146102de57806350c946fe146102ff5780635d83d9671461031f57600080fd5b80632353740514610285578063275459f2146102a55780632c01a1e8146102b857600080fd5b80631d05394c1161018c5780631d05394c1461023b578063214502431461025057806322bdbcbc1461026557600080fd5b80630fe5800a146101b357806312570011146101d9578063181f5a77146101fc575b600080fd5b6101c66101c1366004613e8b565b610446565b6040519081526020015b60405180910390f35b6101ec6101e7366004613eef565b61047a565b60405190151581526020016101d0565b604080518082018252601a81527f4361706162696c6974696573526567697374727920312e302e30000000000000602082015290516101d09190613f76565b61024e610249366004613fce565b610487565b005b61025861069c565b6040516101d09190614150565b6102786102733660046141eb565b6107f9565b6040516101d09190614243565b6102986102933660046141eb565b6108e6565b6040516101d09190614256565b61024e6102b3366004613fce565b61092a565b61024e6102c6366004613fce565b610a01565b61024e6102d9366004613fce565b610c9d565b6102f16102ec366004614269565b610e5c565b6040516101d0929190614293565b61031261030d366004613eef565b611048565b6040516101d09190614358565b61024e61032d366004613fce565b611122565b61024e610340366004613fce565b611217565b61034d61193f565b6040516101d0919061436b565b61024e610368366004613fce565b611b22565b61024e61037b366004613fce565b611bd4565b61024e6120a2565b61024e6103963660046143e0565b61219f565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d0565b6103d66103d1366004613eef565b6124df565b6040516101d0919061452f565b61024e6103f1366004614561565b61271a565b61024e610404366004614616565b6127e3565b6104116128ad565b6040516101d091906146bb565b6104266129a1565b6040516101d09190614730565b61024e6104413660046147c9565b612aaa565b6000828260405160200161045b929190614293565b6040516020818303038152906040528051906020012090505b92915050565b6000610474600583612abe565b61048f612ad9565b60005b818110156106975760008383838181106104ae576104ae6147e4565b90506020020160208101906104c391906141eb565b63ffffffff8181166000908152600d60209081526040808320805464010000000081049095168085526001820190935290832094955093909290916a010000000000000000000090910460ff16905b61051b83612b5c565b8110156105bb57811561057157600c60006105368584612b66565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556105b3565b6105b18663ffffffff16600c60006105928588612b6690919063ffffffff16565b8152602001908152602001600020600401612b7290919063ffffffff16565b505b600101610512565b508354640100000000900463ffffffff16600003610612576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff861660048201526024015b60405180910390fd5b63ffffffff85166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505050806001019050610492565b505050565b600e54606090640100000000900463ffffffff1660006106bd600183614842565b63ffffffff1667ffffffffffffffff8111156106db576106db613d25565b60405190808252806020026020018201604052801561076257816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816106f95790505b509050600060015b8363ffffffff168163ffffffff1610156107d65763ffffffff8082166000908152600d602052604090205416156107ce576107a481612b7e565b8383815181106107b6576107b66147e4565b6020026020010181905250816107cb9061485f565b91505b60010161076a565b506107e2600184614842565b63ffffffff1681146107f2578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff168352600181018054919284019161085d90614897565b80601f016020809104026020016040519081016040528092919081815260200182805461088990614897565b80156108d65780601f106108ab576101008083540402835291602001916108d6565b820191906000526020600020905b8154815290600101906020018083116108b957829003601f168201915b5050505050815250509050919050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c081019190915261047482612b7e565b610932612ad9565b60005b63ffffffff811682111561069757600083838363ffffffff1681811061095d5761095d6147e4565b905060200201602081019061097291906141eb565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559192506109bd6001830182613cb8565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a2506109fa816148ea565b9050610935565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c97576000848483818110610a3b57610a3b6147e4565b602090810292909201356000818152600c90935260409092206001810154929350919050610a98576040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260048101839052602401610609565b6000610aa682600401612b5c565b1115610afb57610ab96004820184612b66565b6040517f60a6d89800000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101839052604401610609565b805468010000000000000000900463ffffffff1615610b635780546040517f60b9df730000000000000000000000000000000000000000000000000000000081526801000000000000000090910463ffffffff16600482015260248101839052604401610609565b83158015610b9d5750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610bd6576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b6001810154610be790600790612b72565b506002810154610bf990600990612b72565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815560018101829055600281018290559060048201818181610c4e8282613cf2565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610c8591815260200190565b60405180910390a15050600101610a1f565b50505050565b610ca5612ad9565b60005b81811015610697576000838383818110610cc457610cc46147e4565b9050602002810190610cd6919061490d565b610cdf9061494b565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d30576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610dbc9082614a05565b5050600e8054909150600090610dd79063ffffffff166148ea565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610e4a9190613f76565b60405180910390a35050600101610ca8565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610eae90614897565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90614897565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b5050506000888152600260208190526040909120015492935060609262010000900473ffffffffffffffffffffffffffffffffffffffff1615915061103a905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526201000090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015610ff1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110379190810190614b1f565b90505b9093509150505b9250929050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526040805160e0810182526000848152600c6020908152838220805463ffffffff8082168652640100000000820481168487018190526801000000000000000090920416858701526001820154606086015260028201546080860152835260030190529190912060a08201906110f790612e49565b815260200161111a600c6000868152602001908152602001600020600401612e49565b905292915050565b61112a612ad9565b60005b81811015610697576000838383818110611149576111496147e4565b905060200201359050611166816003612abe90919063ffffffff16565b61119f576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610609565b6111aa600582612e56565b6111e3576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610609565b60405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a25060010161112d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c97576000848483818110611251576112516147e4565b90506020028101906112639190614b8d565b61126c90614bc1565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916112c290614897565b80601f01602080910402602001604051908101604052809291908181526020018280546112ee90614897565b801561133b5780601f106113105761010080835404028352916020019161133b565b820191906000526020600020905b81548152906001019060200180831161131e57829003601f168201915b50505050508152505090508315801561136b5750805173ffffffffffffffffffffffffffffffffffffffff163314155b156113a4576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b6040808301516000908152600c6020522060018101546113f85782604001516040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260040161060991815260200190565b6020830151611433576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810154602084015181146114b457602084015161145490600790612abe565b1561148b576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084015160018301556114a0600782612b72565b5060208401516114b290600790612e56565b505b606084015180516000036114f657806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b8254600090849060049061151790640100000000900463ffffffff166148ea565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060005b82518110156115fc5761156f838281518110611557576115576147e4565b60200260200101516003612abe90919063ffffffff16565b6115a757826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b6115f38382815181106115bc576115bc6147e4565b60200260200101518660030160008563ffffffff1663ffffffff168152602001908152602001600020612e5690919063ffffffff16565b50600101611539565b50835468010000000000000000900463ffffffff16801561175d5763ffffffff8082166000908152600d60209081526040808320805464010000000090049094168352600190930181528282206002018054845181840281018401909552808552929392909183018282801561169157602002820191906000526020600020905b81548152602001906001019080831161167d575b5050505050905060005b815181101561175a576116f08282815181106116b9576116b96147e4565b60200260200101518860030160008763ffffffff1663ffffffff168152602001908152602001600020612abe90919063ffffffff16565b61175257818181518110611706576117066147e4565b6020026020010151836040517f03dcd86200000000000000000000000000000000000000000000000000000000815260040161060992919091825263ffffffff16602082015260400190565b60010161169b565b50505b600061176b86600401612e49565b905060005b81518163ffffffff1610156118b1576000828263ffffffff1681518110611799576117996147e4565b60209081029190910181015163ffffffff8082166000908152600d8452604080822080546401000000009004909316825260019092018452818120600201805483518187028101870190945280845293955090939192909183018282801561182057602002820191906000526020600020905b81548152602001906001019080831161180c575b5050505050905060005b815181101561189d5761187f828281518110611848576118486147e4565b60200260200101518b60030160008a63ffffffff1663ffffffff168152602001908152602001600020612abe90919063ffffffff16565b61189557818181518110611706576117066147e4565b60010161182a565b505050806118aa906148ea565b9050611770565b50875186547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff90911690811787556040808a0151600289018190556020808c01518351928352908201527f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a25050505050505050806001019050611235565b600e5460609063ffffffff166000611958600183614842565b63ffffffff1667ffffffffffffffff81111561197657611976613d25565b6040519080825280602002602001820160405280156119bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816119945790505b509050600060015b8363ffffffff168163ffffffff161015611b0c5763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611b045763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611a5890614897565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8490614897565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b505050505081525050838381518110611aec57611aec6147e4565b602002602001018190525081611b019061485f565b91505b6001016119c4565b50600e546107e29060019063ffffffff16614842565b611b2a612ad9565b60005b81811015610697576000838383818110611b4957611b496147e4565b9050602002810190611b5b9190614cd8565b611b6490614d1b565b90506000611b7a82600001518360200151610446565b9050611b87600382612e56565b611bc0576040517febf5255100000000000000000000000000000000000000000000000000000000815260048101829052602401610609565b611bca8183612e62565b5050600101611b2d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c97576000848483818110611c0e57611c0e6147e4565b9050602002810190611c209190614b8d565b611c2990614bc1565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff168252600181018054959650939491939092840191611c7f90614897565b80601f0160208091040260200160405190810160405280929190818152602001828054611cab90614897565b8015611cf85780601f10611ccd57610100808354040283529160200191611cf8565b820191906000526020600020905b815481529060010190602001808311611cdb57829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611d5e5781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152602401610609565b83158015611d835750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611dbc576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b6040808301516000908152600c60205220600181015415611e115782604001516040517f5461848300000000000000000000000000000000000000000000000000000000815260040161060991815260200190565b6040830151611e545782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161060991815260200190565b60208301511580611e7157506020830151611e7190600790612abe565b15611ea8576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611eea57806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b81548290600490611f0890640100000000900463ffffffff166148ea565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b8251811015611fde57611f51838281518110611557576115576147e4565b611f8957826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b611fd5838281518110611f9e57611f9e6147e4565b60200260200101518560030160008563ffffffff1663ffffffff168152602001908152602001600020612e5690919063ffffffff16565b50600101611f33565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff918216178455604086015160028501556020860151600185018190556120349160079190612e5616565b50604085015161204690600990612e56565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a25050505050806001019050611bf2565b60015473ffffffffffffffffffffffffffffffffffffffff163314612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610609565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b8281146121e2576040517fab8b67c60000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610609565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b848110156124d757600086868381811061221a5761221a6147e4565b905060200201602081019061222f91906141eb565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff1661229e576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610609565b60008686858181106122b2576122b26147e4565b90506020028101906122c4919061490d565b6122cd9061494b565b805190915073ffffffffffffffffffffffffffffffffffffffff1661231e576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061235b57503373ffffffffffffffffffffffffffffffffffffffff861614155b15612394576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b8051825473ffffffffffffffffffffffffffffffffffffffff908116911614158061241057506020808201516040516123cd9201613f76565b60405160208183030381529060405280519060200120826001016040516020016123f79190614dc1565b6040516020818303038152906040528051906020012014155b156124c957805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020810151600183019061246a9082614a05565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a2883602001516040516124c09190613f76565b60405180910390a35b5050508060010190506121fe565b505050505050565b6125206040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b6040805160e0810182528381526000848152600260209081529290208054919283019161254c90614897565b80601f016020809104026020016040519081016040528092919081815260200182805461257890614897565b80156125c55780601f1061259a576101008083540402835291602001916125c5565b820191906000526020600020905b8154815290600101906020018083116125a857829003601f168201915b505050505081526020016002600085815260200190815260200160002060010180546125f090614897565b80601f016020809104026020016040519081016040528092919081815260200182805461261c90614897565b80156126695780601f1061263e57610100808354040283529160200191612669565b820191906000526020600020905b81548152906001019060200180831161264c57829003601f168201915b50505091835250506000848152600260208181526040909220015491019060ff16600381111561269b5761269b61444c565b815260008481526002602081815260409092200154910190610100900460ff1660018111156126cc576126cc61444c565b81526000848152600260208181526040928390209091015462010000900473ffffffffffffffffffffffffffffffffffffffff169083015201612710600585612abe565b1515905292915050565b612722612ad9565b63ffffffff8089166000908152600d6020526040812054640100000000900490911690819003612786576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff8a166004820152602401610609565b6127d8888888886040518060a001604052808f63ffffffff168152602001876127ae906148ea565b97508763ffffffff1681526020018a1515815260200189151581526020018860ff168152506130f6565b505050505050505050565b6127eb612ad9565b600e805460009164010000000090910463ffffffff1690600461280d836148ea565b82546101009290920a63ffffffff81810219909316918316021790915581166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001684179055815160a08101835292835260019083015286151590820152841515606082015260ff841660808201529091506128a39089908990899089906130f6565b5050505050505050565b606060006128bb6003612e49565b90506000815167ffffffffffffffff8111156128d9576128d9613d25565b60405190808252806020026020018201604052801561294b57816020015b6129386040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b8152602001906001900390816128f75790505b50905060005b82518110156107f25761297c83828151811061296f5761296f6147e4565b60200260200101516124df565b82828151811061298e5761298e6147e4565b6020908102919091010152600101612951565b606060006129af6009612e49565b90506000815167ffffffffffffffff8111156129cd576129cd613d25565b604051908082528060200260200182016040528015612a5457816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816129eb5790505b50905060005b82518110156107f257612a85838281518110612a7857612a786147e4565b6020026020010151611048565b828281518110612a9757612a976147e4565b6020908102919091010152600101612a5a565b612ab2612ad9565b612abb8161391a565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610609565b565b6000610474825490565b6000612ad28383613a0f565b6000612ad28383613a39565b6040805160e0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840181905260c084015263ffffffff8581168352600d8252848320805464010000000090049091168084526001909101825284832060028101805487518186028101860190985280885295969295919493909190830182828015612c2f57602002820191906000526020600020905b815481526020019060010190808311612c1b575b505050505090506000815167ffffffffffffffff811115612c5257612c52613d25565b604051908082528060200260200182016040528015612c9857816020015b604080518082019091526000815260606020820152815260200190600190039081612c705790505b50905060005b8151811015612db0576040518060400160405280848381518110612cc457612cc46147e4565b60200260200101518152602001856003016000868581518110612ce957612ce96147e4565b602002602001015181526020019081526020016000208054612d0a90614897565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3690614897565b8015612d835780601f10612d5857610100808354040283529160200191612d83565b820191906000526020600020905b815481529060010190602001808311612d6657829003601f168201915b5050505050815250828281518110612d9d57612d9d6147e4565b6020908102919091010152600101612c9e565b506040805160e08101825263ffffffff8089166000818152600d6020818152868320548086168752948b168187015260ff680100000000000000008604811697870197909752690100000000000000000085048716151560608701529290915290526a010000000000000000000090049091161515608082015260a08101612e3785612e49565b81526020019190915295945050505050565b60606000612ad283613b2c565b6000612ad28383613b88565b608081015173ffffffffffffffffffffffffffffffffffffffff1615612fb057608081015173ffffffffffffffffffffffffffffffffffffffff163b1580612f5b575060808101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015612f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f599190614e6f565b155b15612fb05760808101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610609565b600082815260026020526040902081518291908190612fcf9082614a05565b5060208201516001820190612fe49082614a05565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360038111156130265761302661444c565b021790555060608201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600181111561306d5761306d61444c565b0217905550608091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b805163ffffffff9081166000908152600d602090815260408083208286015190941683526001909301905220608082015160ff161580613148575060808201518590613143906001614e8c565b60ff16115b156131915760808201516040517f25b4d61800000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101869052604401610609565b6001826020015163ffffffff16111561327957815163ffffffff166000908152600d6020908152604082209084015160019182019183916131d29190614842565b63ffffffff1663ffffffff168152602001908152602001600020905060005b6131fa82612b5c565b81101561327657613229846000015163ffffffff16600c60006105928587600001612b6690919063ffffffff16565b50600c60006132388484612b66565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556001016131f1565b50505b60005b858110156134b3576132a9878783818110613299576132996147e4565b8592602090910201359050612e56565b61330a5782518787838181106132c1576132c16147e4565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610609565b82606001511561346157825163ffffffff16600c6000898985818110613332576133326147e4565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff16148015906133ac5750600c600088888481811061337d5761337d6147e4565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff1615155b1561340e5782518787838181106133c5576133c56147e4565b6040517f60b9df7300000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610609565b8251600c6000898985818110613426576134266147e4565b90506020020135815260200190815260200160002060000160086101000a81548163ffffffff021916908363ffffffff1602179055506134ab565b82516134a99063ffffffff16600c60008a8a86818110613483576134836147e4565b905060200201358152602001908152602001600020600401612e5690919063ffffffff16565b505b60010161327c565b5060005b8381101561378f57368585838181106134d2576134d26147e4565b90506020028101906134e4919061490d565b90506134f260038235612abe565b61352b576040517fe181733f00000000000000000000000000000000000000000000000000000000815281356004820152602401610609565b61353760058235612abe565b15613571576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815281356004820152602401610609565b803560009081526003840160205260408120805461358e90614897565b905011156135da5783516040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015281356024820152604401610609565b60005b878110156136e4576136818235600c60008c8c86818110613600576136006147e4565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110613630576136306147e4565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001908152602001600020612abe90919063ffffffff16565b6136dc57888882818110613697576136976147e4565b6040517fa7e792500000000000000000000000000000000000000000000000000000000081526020909102929092013560048301525082356024820152604401610609565b6001016135dd565b506002830180546001810182556000918252602091829020833591015561370d90820182614ea5565b8235600090815260038601602052604090209161372b919083614f0a565b50835160208086015161378692918435908c908c9061374c90880188614ea5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613bd792505050565b506001016134b7565b50604080830151835163ffffffff9081166000908152600d602090815284822080549415156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff90951694909417909355606086015186518316825284822080549115156a0100000000000000000000027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff9092169190911790556080860151865183168252848220805460ff9290921668010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909216919091179055918501805186518316845292849020805493909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9093169290921790558351905191517ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c15817036519261390a929163ffffffff92831681529116602082015260400190565b60405180910390a1505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610609565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110613a2657613a266147e4565b9060005260206000200154905092915050565b60008181526001830160205260408120548015613b22576000613a5d600183615025565b8554909150600090613a7190600190615025565b9050818114613ad6576000866000018281548110613a9157613a916147e4565b9060005260206000200154905080876000018481548110613ab457613ab46147e4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613ae757613ae7615038565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610474565b6000915050610474565b606081600001805480602002602001604051908101604052809291908181526020018280548015613b7c57602002820191906000526020600020905b815481526020019060010190808311613b68575b50505050509050919050565b6000818152600183016020526040812054613bcf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610474565b506000610474565b6000848152600260208190526040909120015462010000900473ffffffffffffffffffffffffffffffffffffffff16156124d757600084815260026020819052604091829020015490517ffba64a7c0000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c90613c7e908690869086908b908d90600401615067565b600060405180830381600087803b158015613c9857600080fd5b505af1158015613cac573d6000803e3d6000fd5b50505050505050505050565b508054613cc490614897565b6000825580601f10613cd4575050565b601f016020900490600052602060002090810190612abb9190613d0c565b5080546000825590600052602060002090810190612abb91905b5b80821115613d215760008155600101613d0d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613d7757613d77613d25565b60405290565b60405160a0810167ffffffffffffffff81118282101715613d7757613d77613d25565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613de757613de7613d25565b604052919050565b600067ffffffffffffffff821115613e0957613e09613d25565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613e4657600080fd5b8135613e59613e5482613def565b613da0565b818152846020838601011115613e6e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215613e9e57600080fd5b823567ffffffffffffffff80821115613eb657600080fd5b613ec286838701613e35565b93506020850135915080821115613ed857600080fd5b50613ee585828601613e35565b9150509250929050565b600060208284031215613f0157600080fd5b5035919050565b60005b83811015613f23578181015183820152602001613f0b565b50506000910152565b60008151808452613f44816020860160208601613f08565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612ad26020830184613f2c565b60008083601f840112613f9b57600080fd5b50813567ffffffffffffffff811115613fb357600080fd5b6020830191508360208260051b850101111561104157600080fd5b60008060208385031215613fe157600080fd5b823567ffffffffffffffff811115613ff857600080fd5b61400485828601613f89565b90969095509350505050565b60008151808452602080850194506020840160005b8381101561404157815187529582019590820190600101614025565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b848110156140c9578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051845284015160408585018190526140b581860183613f2c565b9a86019a9450505090830190600101614069565b5090979650505050505050565b600063ffffffff8083511684528060208401511660208501525060ff604083015116604084015260608201511515606084015260808201511515608084015260a082015160e060a085015261412e60e0850182614010565b905060c083015184820360c0860152614147828261404c565b95945050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526141b38583516140d6565b94509285019290850190600101614179565b5092979650505050505050565b803563ffffffff811681146141e657600080fd5b919050565b6000602082840312156141fd57600080fd5b612ad2826141d2565b73ffffffffffffffffffffffffffffffffffffffff8151168252600060208201516040602085015261423b6040850182613f2c565b949350505050565b602081526000612ad26020830184614206565b602081526000612ad260208301846140d6565b6000806040838503121561427c57600080fd5b614285836141d2565b946020939093013593505050565b6040815260006142a66040830185613f2c565b82810360208401526141478185613f2c565b600063ffffffff808351168452602081818501511681860152816040850151166040860152606084015160608601526080840151608086015260a0840151915060e060a086015261430c60e0860183614010565b60c08581015187830391880191909152805180835290830193506000918301905b8083101561434d578451825293830193600192909201919083019061432d565b509695505050505050565b602081526000612ad260208301846142b8565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526143ce858351614206565b94509285019290850190600101614394565b600080600080604085870312156143f657600080fd5b843567ffffffffffffffff8082111561440e57600080fd5b61441a88838901613f89565b9096509450602087013591508082111561443357600080fd5b5061444087828801613f89565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b805182526000602082015160e0602085015261449a60e0850182613f2c565b9050604083015184820360408601526144b38282613f2c565b9150506060830151600481106144cb576144cb61444c565b60608501526080830151600281106144e5576144e561444c565b8060808601525060a083015161451360a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161452760c086018215159052565b509392505050565b602081526000612ad2602083018461447b565b8015158114612abb57600080fd5b803560ff811681146141e657600080fd5b60008060008060008060008060c0898b03121561457d57600080fd5b614586896141d2565b9750602089013567ffffffffffffffff808211156145a357600080fd5b6145af8c838d01613f89565b909950975060408b01359150808211156145c857600080fd5b506145d58b828c01613f89565b90965094505060608901356145e981614542565b925060808901356145f981614542565b915061460760a08a01614550565b90509295985092959890939650565b600080600080600080600060a0888a03121561463157600080fd5b873567ffffffffffffffff8082111561464957600080fd5b6146558b838c01613f89565b909950975060208a013591508082111561466e57600080fd5b5061467b8a828b01613f89565b909650945050604088013561468f81614542565b9250606088013561469f81614542565b91506146ad60808901614550565b905092959891949750929550565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261471e85835161447b565b945092850192908501906001016146e4565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526147938583516142b8565b94509285019290850190600101614759565b803573ffffffffffffffffffffffffffffffffffffffff811681146141e657600080fd5b6000602082840312156147db57600080fd5b612ad2826147a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff8281168282160390808211156107f2576107f2614813565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361489057614890614813565b5060010190565b600181811c908216806148ab57607f821691505b6020821081036148e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600063ffffffff80831681810361490357614903614813565b6001019392505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261494157600080fd5b9190910192915050565b60006040823603121561495d57600080fd5b6040516040810167ffffffffffffffff828210818311171561498157614981613d25565b8160405261498e856147a5565b835260208501359150808211156149a457600080fd5b506149b136828601613e35565b60208301525092915050565b601f821115610697576000816000526020600020601f850160051c810160208610156149e65750805b601f850160051c820191505b818110156124d7578281556001016149f2565b815167ffffffffffffffff811115614a1f57614a1f613d25565b614a3381614a2d8454614897565b846149bd565b602080601f831160018114614a865760008415614a505750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556124d7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614ad357888601518255948401946001909101908401614ab4565b5085821015614b0f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614b3157600080fd5b815167ffffffffffffffff811115614b4857600080fd5b8201601f81018413614b5957600080fd5b8051614b67613e5482613def565b818152856020838501011115614b7c57600080fd5b614147826020830160208601613f08565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261494157600080fd5b600060808236031215614bd357600080fd5b614bdb613d54565b614be4836141d2565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff80821115614c1557600080fd5b9085019036601f830112614c2857600080fd5b813581811115614c3a57614c3a613d25565b8060051b9150614c4b848301613da0565b8181529183018401918481019036841115614c6557600080fd5b938501935b83851015614c8357843582529385019390850190614c6a565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614ccc57835183529284019291840191600101614cb0565b50909695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261494157600080fd5b8035600281106141e657600080fd5b600060a08236031215614d2d57600080fd5b614d35613d7d565b823567ffffffffffffffff80821115614d4d57600080fd5b614d5936838701613e35565b83526020850135915080821115614d6f57600080fd5b50614d7c36828601613e35565b602083015250604083013560048110614d9457600080fd5b6040820152614da560608401614d0c565b6060820152614db6608084016147a5565b608082015292915050565b6000602080835260008454614dd581614897565b8060208701526040600180841660008114614df75760018114614e3157614e61565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851660408a0152604084151560051b8a01019550614e61565b89600052602060002060005b85811015614e585781548b8201860152908301908801614e3d565b8a016040019650505b509398975050505050505050565b600060208284031215614e8157600080fd5b8151612ad281614542565b60ff818116838216019081111561047457610474614813565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614eda57600080fd5b83018035915067ffffffffffffffff821115614ef557600080fd5b60200191503681900382131561104157600080fd5b67ffffffffffffffff831115614f2257614f22613d25565b614f3683614f308354614897565b836149bd565b6000601f841160018114614f885760008515614f525750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561501e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614fd75786850135825560209485019460019092019101614fb7565b5086821015615012577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561047457610474614813565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156150a057600080fd5b8560051b808860a0850137820182810360a090810160208501526150c690820187613f2c565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000818000a",
+ Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6150f680620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635e65e309116100ee5780638da5cb5b11610097578063d8bc7b6811610071578063d8bc7b68146103f6578063ddbe4f8214610409578063e29581aa1461041e578063f2fde38b1461043357600080fd5b80638da5cb5b1461039b5780639cb7c5f4146103c3578063d59a79f6146103e357600080fd5b806373ac22b4116100c857806373ac22b41461036d57806379ba50971461038057806386fa42461461038857600080fd5b80635e65e3091461033257806366acaa3314610345578063715f52951461035a57600080fd5b8063235374051161015b578063398f377311610135578063398f3773146102cb5780633f2a13c9146102de57806350c946fe146102ff5780635d83d9671461031f57600080fd5b80632353740514610285578063275459f2146102a55780632c01a1e8146102b857600080fd5b80631d05394c1161018c5780631d05394c1461023b578063214502431461025057806322bdbcbc1461026557600080fd5b80630fe5800a146101b357806312570011146101d9578063181f5a77146101fc575b600080fd5b6101c66101c1366004613e8b565b610446565b6040519081526020015b60405180910390f35b6101ec6101e7366004613eef565b61047a565b60405190151581526020016101d0565b604080518082018252601a81527f4361706162696c6974696573526567697374727920312e302e30000000000000602082015290516101d09190613f76565b61024e610249366004613fce565b610487565b005b61025861069c565b6040516101d09190614150565b6102786102733660046141eb565b6107f9565b6040516101d09190614243565b6102986102933660046141eb565b6108e6565b6040516101d09190614256565b61024e6102b3366004613fce565b61092a565b61024e6102c6366004613fce565b610a01565b61024e6102d9366004613fce565b610c9d565b6102f16102ec366004614269565b610e5c565b6040516101d0929190614293565b61031261030d366004613eef565b611048565b6040516101d09190614358565b61024e61032d366004613fce565b611122565b61024e610340366004613fce565b611217565b61034d61193f565b6040516101d0919061436b565b61024e610368366004613fce565b611b22565b61024e61037b366004613fce565b611bd4565b61024e6120a2565b61024e6103963660046143e0565b61219f565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d0565b6103d66103d1366004613eef565b6124df565b6040516101d0919061452f565b61024e6103f1366004614561565b61271a565b61024e610404366004614616565b6127e3565b6104116128ad565b6040516101d091906146bb565b6104266129a1565b6040516101d09190614730565b61024e6104413660046147c9565b612aaa565b6000828260405160200161045b929190614293565b6040516020818303038152906040528051906020012090505b92915050565b6000610474600583612abe565b61048f612ad9565b60005b818110156106975760008383838181106104ae576104ae6147e4565b90506020020160208101906104c391906141eb565b63ffffffff8181166000908152600d60209081526040808320805464010000000081049095168085526001820190935290832094955093909290916a010000000000000000000090910460ff16905b61051b83612b5c565b8110156105bb57811561057157600c60006105368584612b66565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556105b3565b6105b18663ffffffff16600c60006105928588612b6690919063ffffffff16565b8152602001908152602001600020600401612b7290919063ffffffff16565b505b600101610512565b508354640100000000900463ffffffff16600003610612576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff861660048201526024015b60405180910390fd5b63ffffffff85166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505050806001019050610492565b505050565b600e54606090640100000000900463ffffffff1660006106bd600183614842565b63ffffffff1667ffffffffffffffff8111156106db576106db613d25565b60405190808252806020026020018201604052801561076257816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816106f95790505b509050600060015b8363ffffffff168163ffffffff1610156107d65763ffffffff8082166000908152600d602052604090205416156107ce576107a481612b7e565b8383815181106107b6576107b66147e4565b6020026020010181905250816107cb9061485f565b91505b60010161076a565b506107e2600184614842565b63ffffffff1681146107f2578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff168352600181018054919284019161085d90614897565b80601f016020809104026020016040519081016040528092919081815260200182805461088990614897565b80156108d65780601f106108ab576101008083540402835291602001916108d6565b820191906000526020600020905b8154815290600101906020018083116108b957829003601f168201915b5050505050815250509050919050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c081019190915261047482612b7e565b610932612ad9565b60005b63ffffffff811682111561069757600083838363ffffffff1681811061095d5761095d6147e4565b905060200201602081019061097291906141eb565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559192506109bd6001830182613cb8565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a2506109fa816148ea565b9050610935565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c97576000848483818110610a3b57610a3b6147e4565b602090810292909201356000818152600c90935260409092206001810154929350919050610a98576040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260048101839052602401610609565b6000610aa682600401612b5c565b1115610afb57610ab96004820184612b66565b6040517f60a6d89800000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101839052604401610609565b805468010000000000000000900463ffffffff1615610b635780546040517f60b9df730000000000000000000000000000000000000000000000000000000081526801000000000000000090910463ffffffff16600482015260248101839052604401610609565b83158015610b9d5750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610bd6576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b6001810154610be790600790612b72565b506002810154610bf990600990612b72565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815560018101829055600281018290559060048201818181610c4e8282613cf2565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610c8591815260200190565b60405180910390a15050600101610a1f565b50505050565b610ca5612ad9565b60005b81811015610697576000838383818110610cc457610cc46147e4565b9050602002810190610cd6919061490d565b610cdf9061494b565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d30576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610dbc9082614a05565b5050600e8054909150600090610dd79063ffffffff166148ea565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610e4a9190613f76565b60405180910390a35050600101610ca8565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610eae90614897565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90614897565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b5050506000888152600260208190526040909120015492935060609262010000900473ffffffffffffffffffffffffffffffffffffffff1615915061103a905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526201000090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015610ff1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110379190810190614b1f565b90505b9093509150505b9250929050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526040805160e0810182526000848152600c6020908152838220805463ffffffff8082168652640100000000820481168487018190526801000000000000000090920416858701526001820154606086015260028201546080860152835260030190529190912060a08201906110f790612e49565b815260200161111a600c6000868152602001908152602001600020600401612e49565b905292915050565b61112a612ad9565b60005b81811015610697576000838383818110611149576111496147e4565b905060200201359050611166816003612abe90919063ffffffff16565b61119f576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610609565b6111aa600582612e56565b6111e3576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610609565b60405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a25060010161112d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c97576000848483818110611251576112516147e4565b90506020028101906112639190614b8d565b61126c90614bc1565b6040808201516000908152600c6020908152828220805463ffffffff168352600b82528383208451808601909552805473ffffffffffffffffffffffffffffffffffffffff16855260018101805496975091959394939092840191906112d190614897565b80601f01602080910402602001604051908101604052809291908181526020018280546112fd90614897565b801561134a5780601f1061131f5761010080835404028352916020019161134a565b820191906000526020600020905b81548152906001019060200180831161132d57829003601f168201915b50505091909252505050600183015490915061139a5782604001516040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260040161060991815260200190565b841580156113bf5750805173ffffffffffffffffffffffffffffffffffffffff163314155b156113f8576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b6020830151611433576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001820154602084015181146114b457602084015161145490600790612abe565b1561148b576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084015160018401556114a0600782612b72565b5060208401516114b290600790612e56565b505b606084015180516000036114f657806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b8354600090859060049061151790640100000000900463ffffffff166148ea565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060005b82518110156115fc5761156f838281518110611557576115576147e4565b60200260200101516003612abe90919063ffffffff16565b6115a757826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b6115f38382815181106115bc576115bc6147e4565b60200260200101518760030160008563ffffffff1663ffffffff168152602001908152602001600020612e5690919063ffffffff16565b50600101611539565b50845468010000000000000000900463ffffffff16801561175d5763ffffffff8082166000908152600d60209081526040808320805464010000000090049094168352600190930181528282206002018054845181840281018401909552808552929392909183018282801561169157602002820191906000526020600020905b81548152602001906001019080831161167d575b5050505050905060005b815181101561175a576116f08282815181106116b9576116b96147e4565b60200260200101518960030160008763ffffffff1663ffffffff168152602001908152602001600020612abe90919063ffffffff16565b61175257818181518110611706576117066147e4565b6020026020010151836040517f03dcd86200000000000000000000000000000000000000000000000000000000815260040161060992919091825263ffffffff16602082015260400190565b60010161169b565b50505b600061176b87600401612e49565b905060005b81518163ffffffff1610156118b1576000828263ffffffff1681518110611799576117996147e4565b60209081029190910181015163ffffffff8082166000908152600d8452604080822080546401000000009004909316825260019092018452818120600201805483518187028101870190945280845293955090939192909183018282801561182057602002820191906000526020600020905b81548152602001906001019080831161180c575b5050505050905060005b815181101561189d5761187f828281518110611848576118486147e4565b60200260200101518c60030160008a63ffffffff1663ffffffff168152602001908152602001600020612abe90919063ffffffff16565b61189557818181518110611706576117066147e4565b60010161182a565b505050806118aa906148ea565b9050611770565b50875187547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff90911690811788556040808a015160028a018190556020808c01518351928352908201527f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a25050505050505050806001019050611235565b600e5460609063ffffffff166000611958600183614842565b63ffffffff1667ffffffffffffffff81111561197657611976613d25565b6040519080825280602002602001820160405280156119bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816119945790505b509050600060015b8363ffffffff168163ffffffff161015611b0c5763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611b045763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611a5890614897565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8490614897565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b505050505081525050838381518110611aec57611aec6147e4565b602002602001018190525081611b019061485f565b91505b6001016119c4565b50600e546107e29060019063ffffffff16614842565b611b2a612ad9565b60005b81811015610697576000838383818110611b4957611b496147e4565b9050602002810190611b5b9190614cd8565b611b6490614d1b565b90506000611b7a82600001518360200151610446565b9050611b87600382612e56565b611bc0576040517febf5255100000000000000000000000000000000000000000000000000000000815260048101829052602401610609565b611bca8183612e62565b5050600101611b2d565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c97576000848483818110611c0e57611c0e6147e4565b9050602002810190611c209190614b8d565b611c2990614bc1565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff168252600181018054959650939491939092840191611c7f90614897565b80601f0160208091040260200160405190810160405280929190818152602001828054611cab90614897565b8015611cf85780601f10611ccd57610100808354040283529160200191611cf8565b820191906000526020600020905b815481529060010190602001808311611cdb57829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611d5e5781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152602401610609565b83158015611d835750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611dbc576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b6040808301516000908152600c60205220600181015415611e115782604001516040517f5461848300000000000000000000000000000000000000000000000000000000815260040161060991815260200190565b6040830151611e545782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161060991815260200190565b60208301511580611e7157506020830151611e7190600790612abe565b15611ea8576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611eea57806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b81548290600490611f0890640100000000900463ffffffff166148ea565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b8251811015611fde57611f51838281518110611557576115576147e4565b611f8957826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106099190614c94565b611fd5838281518110611f9e57611f9e6147e4565b60200260200101518560030160008563ffffffff1663ffffffff168152602001908152602001600020612e5690919063ffffffff16565b50600101611f33565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff918216178455604086015160028501556020860151600185018190556120349160079190612e5616565b50604085015161204690600990612e56565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a25050505050806001019050611bf2565b60015473ffffffffffffffffffffffffffffffffffffffff163314612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610609565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b8281146121e2576040517fab8b67c60000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610609565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b848110156124d757600086868381811061221a5761221a6147e4565b905060200201602081019061222f91906141eb565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff1661229e576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610609565b60008686858181106122b2576122b26147e4565b90506020028101906122c4919061490d565b6122cd9061494b565b805190915073ffffffffffffffffffffffffffffffffffffffff1661231e576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815473ffffffffffffffffffffffffffffffffffffffff16331480159061235b57503373ffffffffffffffffffffffffffffffffffffffff861614155b15612394576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610609565b8051825473ffffffffffffffffffffffffffffffffffffffff908116911614158061241057506020808201516040516123cd9201613f76565b60405160208183030381529060405280519060200120826001016040516020016123f79190614dc1565b6040516020818303038152906040528051906020012014155b156124c957805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020810151600183019061246a9082614a05565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a2883602001516040516124c09190613f76565b60405180910390a35b5050508060010190506121fe565b505050505050565b6125206040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b6040805160e0810182528381526000848152600260209081529290208054919283019161254c90614897565b80601f016020809104026020016040519081016040528092919081815260200182805461257890614897565b80156125c55780601f1061259a576101008083540402835291602001916125c5565b820191906000526020600020905b8154815290600101906020018083116125a857829003601f168201915b505050505081526020016002600085815260200190815260200160002060010180546125f090614897565b80601f016020809104026020016040519081016040528092919081815260200182805461261c90614897565b80156126695780601f1061263e57610100808354040283529160200191612669565b820191906000526020600020905b81548152906001019060200180831161264c57829003601f168201915b50505091835250506000848152600260208181526040909220015491019060ff16600381111561269b5761269b61444c565b815260008481526002602081815260409092200154910190610100900460ff1660018111156126cc576126cc61444c565b81526000848152600260208181526040928390209091015462010000900473ffffffffffffffffffffffffffffffffffffffff169083015201612710600585612abe565b1515905292915050565b612722612ad9565b63ffffffff8089166000908152600d6020526040812054640100000000900490911690819003612786576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff8a166004820152602401610609565b6127d8888888886040518060a001604052808f63ffffffff168152602001876127ae906148ea565b97508763ffffffff1681526020018a1515815260200189151581526020018860ff168152506130f6565b505050505050505050565b6127eb612ad9565b600e805460009164010000000090910463ffffffff1690600461280d836148ea565b82546101009290920a63ffffffff81810219909316918316021790915581166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001684179055815160a08101835292835260019083015286151590820152841515606082015260ff841660808201529091506128a39089908990899089906130f6565b5050505050505050565b606060006128bb6003612e49565b90506000815167ffffffffffffffff8111156128d9576128d9613d25565b60405190808252806020026020018201604052801561294b57816020015b6129386040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b8152602001906001900390816128f75790505b50905060005b82518110156107f25761297c83828151811061296f5761296f6147e4565b60200260200101516124df565b82828151811061298e5761298e6147e4565b6020908102919091010152600101612951565b606060006129af6009612e49565b90506000815167ffffffffffffffff8111156129cd576129cd613d25565b604051908082528060200260200182016040528015612a5457816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816129eb5790505b50905060005b82518110156107f257612a85838281518110612a7857612a786147e4565b6020026020010151611048565b828281518110612a9757612a976147e4565b6020908102919091010152600101612a5a565b612ab2612ad9565b612abb8161391a565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610609565b565b6000610474825490565b6000612ad28383613a0f565b6000612ad28383613a39565b6040805160e0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840181905260c084015263ffffffff8581168352600d8252848320805464010000000090049091168084526001909101825284832060028101805487518186028101860190985280885295969295919493909190830182828015612c2f57602002820191906000526020600020905b815481526020019060010190808311612c1b575b505050505090506000815167ffffffffffffffff811115612c5257612c52613d25565b604051908082528060200260200182016040528015612c9857816020015b604080518082019091526000815260606020820152815260200190600190039081612c705790505b50905060005b8151811015612db0576040518060400160405280848381518110612cc457612cc46147e4565b60200260200101518152602001856003016000868581518110612ce957612ce96147e4565b602002602001015181526020019081526020016000208054612d0a90614897565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3690614897565b8015612d835780601f10612d5857610100808354040283529160200191612d83565b820191906000526020600020905b815481529060010190602001808311612d6657829003601f168201915b5050505050815250828281518110612d9d57612d9d6147e4565b6020908102919091010152600101612c9e565b506040805160e08101825263ffffffff8089166000818152600d6020818152868320548086168752948b168187015260ff680100000000000000008604811697870197909752690100000000000000000085048716151560608701529290915290526a010000000000000000000090049091161515608082015260a08101612e3785612e49565b81526020019190915295945050505050565b60606000612ad283613b2c565b6000612ad28383613b88565b608081015173ffffffffffffffffffffffffffffffffffffffff1615612fb057608081015173ffffffffffffffffffffffffffffffffffffffff163b1580612f5b575060808101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015612f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f599190614e6f565b155b15612fb05760808101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610609565b600082815260026020526040902081518291908190612fcf9082614a05565b5060208201516001820190612fe49082614a05565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360038111156130265761302661444c565b021790555060608201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600181111561306d5761306d61444c565b0217905550608091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b805163ffffffff9081166000908152600d602090815260408083208286015190941683526001909301905220608082015160ff161580613148575060808201518590613143906001614e8c565b60ff16115b156131915760808201516040517f25b4d61800000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101869052604401610609565b6001826020015163ffffffff16111561327957815163ffffffff166000908152600d6020908152604082209084015160019182019183916131d29190614842565b63ffffffff1663ffffffff168152602001908152602001600020905060005b6131fa82612b5c565b81101561327657613229846000015163ffffffff16600c60006105928587600001612b6690919063ffffffff16565b50600c60006132388484612b66565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556001016131f1565b50505b60005b858110156134b3576132a9878783818110613299576132996147e4565b8592602090910201359050612e56565b61330a5782518787838181106132c1576132c16147e4565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610609565b82606001511561346157825163ffffffff16600c6000898985818110613332576133326147e4565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff16148015906133ac5750600c600088888481811061337d5761337d6147e4565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff1615155b1561340e5782518787838181106133c5576133c56147e4565b6040517f60b9df7300000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610609565b8251600c6000898985818110613426576134266147e4565b90506020020135815260200190815260200160002060000160086101000a81548163ffffffff021916908363ffffffff1602179055506134ab565b82516134a99063ffffffff16600c60008a8a86818110613483576134836147e4565b905060200201358152602001908152602001600020600401612e5690919063ffffffff16565b505b60010161327c565b5060005b8381101561378f57368585838181106134d2576134d26147e4565b90506020028101906134e4919061490d565b90506134f260038235612abe565b61352b576040517fe181733f00000000000000000000000000000000000000000000000000000000815281356004820152602401610609565b61353760058235612abe565b15613571576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815281356004820152602401610609565b803560009081526003840160205260408120805461358e90614897565b905011156135da5783516040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015281356024820152604401610609565b60005b878110156136e4576136818235600c60008c8c86818110613600576136006147e4565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110613630576136306147e4565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001908152602001600020612abe90919063ffffffff16565b6136dc57888882818110613697576136976147e4565b6040517fa7e792500000000000000000000000000000000000000000000000000000000081526020909102929092013560048301525082356024820152604401610609565b6001016135dd565b506002830180546001810182556000918252602091829020833591015561370d90820182614ea5565b8235600090815260038601602052604090209161372b919083614f0a565b50835160208086015161378692918435908c908c9061374c90880188614ea5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613bd792505050565b506001016134b7565b50604080830151835163ffffffff9081166000908152600d602090815284822080549415156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff90951694909417909355606086015186518316825284822080549115156a0100000000000000000000027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff9092169190911790556080860151865183168252848220805460ff9290921668010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909216919091179055918501805186518316845292849020805493909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9093169290921790558351905191517ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c15817036519261390a929163ffffffff92831681529116602082015260400190565b60405180910390a1505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610609565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110613a2657613a266147e4565b9060005260206000200154905092915050565b60008181526001830160205260408120548015613b22576000613a5d600183615025565b8554909150600090613a7190600190615025565b9050818114613ad6576000866000018281548110613a9157613a916147e4565b9060005260206000200154905080876000018481548110613ab457613ab46147e4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613ae757613ae7615038565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610474565b6000915050610474565b606081600001805480602002602001604051908101604052809291908181526020018280548015613b7c57602002820191906000526020600020905b815481526020019060010190808311613b68575b50505050509050919050565b6000818152600183016020526040812054613bcf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610474565b506000610474565b6000848152600260208190526040909120015462010000900473ffffffffffffffffffffffffffffffffffffffff16156124d757600084815260026020819052604091829020015490517ffba64a7c0000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c90613c7e908690869086908b908d90600401615067565b600060405180830381600087803b158015613c9857600080fd5b505af1158015613cac573d6000803e3d6000fd5b50505050505050505050565b508054613cc490614897565b6000825580601f10613cd4575050565b601f016020900490600052602060002090810190612abb9190613d0c565b5080546000825590600052602060002090810190612abb91905b5b80821115613d215760008155600101613d0d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613d7757613d77613d25565b60405290565b60405160a0810167ffffffffffffffff81118282101715613d7757613d77613d25565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613de757613de7613d25565b604052919050565b600067ffffffffffffffff821115613e0957613e09613d25565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613e4657600080fd5b8135613e59613e5482613def565b613da0565b818152846020838601011115613e6e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215613e9e57600080fd5b823567ffffffffffffffff80821115613eb657600080fd5b613ec286838701613e35565b93506020850135915080821115613ed857600080fd5b50613ee585828601613e35565b9150509250929050565b600060208284031215613f0157600080fd5b5035919050565b60005b83811015613f23578181015183820152602001613f0b565b50506000910152565b60008151808452613f44816020860160208601613f08565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612ad26020830184613f2c565b60008083601f840112613f9b57600080fd5b50813567ffffffffffffffff811115613fb357600080fd5b6020830191508360208260051b850101111561104157600080fd5b60008060208385031215613fe157600080fd5b823567ffffffffffffffff811115613ff857600080fd5b61400485828601613f89565b90969095509350505050565b60008151808452602080850194506020840160005b8381101561404157815187529582019590820190600101614025565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b848110156140c9578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051845284015160408585018190526140b581860183613f2c565b9a86019a9450505090830190600101614069565b5090979650505050505050565b600063ffffffff8083511684528060208401511660208501525060ff604083015116604084015260608201511515606084015260808201511515608084015260a082015160e060a085015261412e60e0850182614010565b905060c083015184820360c0860152614147828261404c565b95945050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526141b38583516140d6565b94509285019290850190600101614179565b5092979650505050505050565b803563ffffffff811681146141e657600080fd5b919050565b6000602082840312156141fd57600080fd5b612ad2826141d2565b73ffffffffffffffffffffffffffffffffffffffff8151168252600060208201516040602085015261423b6040850182613f2c565b949350505050565b602081526000612ad26020830184614206565b602081526000612ad260208301846140d6565b6000806040838503121561427c57600080fd5b614285836141d2565b946020939093013593505050565b6040815260006142a66040830185613f2c565b82810360208401526141478185613f2c565b600063ffffffff808351168452602081818501511681860152816040850151166040860152606084015160608601526080840151608086015260a0840151915060e060a086015261430c60e0860183614010565b60c08581015187830391880191909152805180835290830193506000918301905b8083101561434d578451825293830193600192909201919083019061432d565b509695505050505050565b602081526000612ad260208301846142b8565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526143ce858351614206565b94509285019290850190600101614394565b600080600080604085870312156143f657600080fd5b843567ffffffffffffffff8082111561440e57600080fd5b61441a88838901613f89565b9096509450602087013591508082111561443357600080fd5b5061444087828801613f89565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b805182526000602082015160e0602085015261449a60e0850182613f2c565b9050604083015184820360408601526144b38282613f2c565b9150506060830151600481106144cb576144cb61444c565b60608501526080830151600281106144e5576144e561444c565b8060808601525060a083015161451360a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161452760c086018215159052565b509392505050565b602081526000612ad2602083018461447b565b8015158114612abb57600080fd5b803560ff811681146141e657600080fd5b60008060008060008060008060c0898b03121561457d57600080fd5b614586896141d2565b9750602089013567ffffffffffffffff808211156145a357600080fd5b6145af8c838d01613f89565b909950975060408b01359150808211156145c857600080fd5b506145d58b828c01613f89565b90965094505060608901356145e981614542565b925060808901356145f981614542565b915061460760a08a01614550565b90509295985092959890939650565b600080600080600080600060a0888a03121561463157600080fd5b873567ffffffffffffffff8082111561464957600080fd5b6146558b838c01613f89565b909950975060208a013591508082111561466e57600080fd5b5061467b8a828b01613f89565b909650945050604088013561468f81614542565b9250606088013561469f81614542565b91506146ad60808901614550565b905092959891949750929550565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261471e85835161447b565b945092850192908501906001016146e4565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156141c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526147938583516142b8565b94509285019290850190600101614759565b803573ffffffffffffffffffffffffffffffffffffffff811681146141e657600080fd5b6000602082840312156147db57600080fd5b612ad2826147a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff8281168282160390808211156107f2576107f2614813565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361489057614890614813565b5060010190565b600181811c908216806148ab57607f821691505b6020821081036148e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600063ffffffff80831681810361490357614903614813565b6001019392505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261494157600080fd5b9190910192915050565b60006040823603121561495d57600080fd5b6040516040810167ffffffffffffffff828210818311171561498157614981613d25565b8160405261498e856147a5565b835260208501359150808211156149a457600080fd5b506149b136828601613e35565b60208301525092915050565b601f821115610697576000816000526020600020601f850160051c810160208610156149e65750805b601f850160051c820191505b818110156124d7578281556001016149f2565b815167ffffffffffffffff811115614a1f57614a1f613d25565b614a3381614a2d8454614897565b846149bd565b602080601f831160018114614a865760008415614a505750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556124d7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614ad357888601518255948401946001909101908401614ab4565b5085821015614b0f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614b3157600080fd5b815167ffffffffffffffff811115614b4857600080fd5b8201601f81018413614b5957600080fd5b8051614b67613e5482613def565b818152856020838501011115614b7c57600080fd5b614147826020830160208601613f08565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261494157600080fd5b600060808236031215614bd357600080fd5b614bdb613d54565b614be4836141d2565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff80821115614c1557600080fd5b9085019036601f830112614c2857600080fd5b813581811115614c3a57614c3a613d25565b8060051b9150614c4b848301613da0565b8181529183018401918481019036841115614c6557600080fd5b938501935b83851015614c8357843582529385019390850190614c6a565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614ccc57835183529284019291840191600101614cb0565b50909695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261494157600080fd5b8035600281106141e657600080fd5b600060a08236031215614d2d57600080fd5b614d35613d7d565b823567ffffffffffffffff80821115614d4d57600080fd5b614d5936838701613e35565b83526020850135915080821115614d6f57600080fd5b50614d7c36828601613e35565b602083015250604083013560048110614d9457600080fd5b6040820152614da560608401614d0c565b6060820152614db6608084016147a5565b608082015292915050565b6000602080835260008454614dd581614897565b8060208701526040600180841660008114614df75760018114614e3157614e61565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851660408a0152604084151560051b8a01019550614e61565b89600052602060002060005b85811015614e585781548b8201860152908301908801614e3d565b8a016040019650505b509398975050505050505050565b600060208284031215614e8157600080fd5b8151612ad281614542565b60ff818116838216019081111561047457610474614813565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614eda57600080fd5b83018035915067ffffffffffffffff821115614ef557600080fd5b60200191503681900382131561104157600080fd5b67ffffffffffffffff831115614f2257614f22613d25565b614f3683614f308354614897565b836149bd565b6000601f841160018114614f885760008515614f525750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561501e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614fd75786850135825560209485019460019092019101614fb7565b5086821015615012577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561047457610474614813565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156150a057600080fd5b8560051b808860a0850137820182810360a090810160208501526150c690820187613f2c565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000818000a",
}
var CapabilitiesRegistryABI = CapabilitiesRegistryMetaData.ABI
diff --git a/core/gethwrappers/keystone/generated/feeds_consumer/feeds_consumer.go b/core/gethwrappers/keystone/generated/feeds_consumer/feeds_consumer.go
new file mode 100644
index 0000000000..2951835c8d
--- /dev/null
+++ b/core/gethwrappers/keystone/generated/feeds_consumer/feeds_consumer.go
@@ -0,0 +1,756 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package feeds_consumer
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
+)
+
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+var KeystoneFeedsConsumerMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"}],\"name\":\"UnauthorizedWorkflowName\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"}],\"name\":\"UnauthorizedWorkflowOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint224\",\"name\":\"price\",\"type\":\"uint224\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"name\":\"FeedReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_allowedSendersList\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_allowedWorkflowOwnersList\",\"type\":\"address[]\"},{\"internalType\":\"bytes10[]\",\"name\":\"_allowedWorkflowNamesList\",\"type\":\"bytes10[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611281806101576000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063805f21321161005b578063805f2132146101ab5780638da5cb5b146101be578063e3401711146101e6578063f2fde38b146101f957600080fd5b806301ffc9a71461008257806331d98b3f146100ec57806379ba5097146101a1575b600080fd5b6100d7610090366004610dd4565b7fffffffff00000000000000000000000000000000000000000000000000000000167f805f2132000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b6101686100fa366004610e1d565b6000908152600260209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168084527c010000000000000000000000000000000000000000000000000000000090910463ffffffff169290910182905291565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316835263ffffffff9091166020830152016100e3565b6101a961020c565b005b6101a96101b9366004610e7f565b61030e565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e3565b6101a96101f4366004610f30565b61068d565b6101a9610207366004610fca565b610acd565b60015473ffffffffffffffffffffffffffffffffffffffff163314610292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3360009081526004602052604090205460ff16610359576040517f3fcc3f17000000000000000000000000000000000000000000000000000000008152336004820152602401610289565b60008061039b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ae192505050565b7fffffffffffffffffffff000000000000000000000000000000000000000000008216600090815260086020526040902054919350915060ff1661042f576040517f4b942f800000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffff0000000000000000000000000000000000000000000083166004820152602401610289565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604090205460ff166104a6576040517fbf24162300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610289565b60006104b4848601866110a7565b905060005b81518110156106835760405180604001604052808383815181106104df576104df6111b9565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152602001838381518110610520576105206111b9565b60200260200101516040015163ffffffff168152506002600084848151811061054b5761054b6111b9565b602090810291909101810151518252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905581518290829081106105cd576105cd6111b9565b6020026020010151600001517f2c30f5cb3caf4239d0f994ce539d7ef24817fa550169c388e3a110f02e40197d83838151811061060c5761060c6111b9565b60200260200101516020015184848151811061062a5761062a6111b9565b6020026020010151604001516040516106739291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a26001016104b9565b5050505050505050565b610695610af7565b60005b60035463ffffffff821610156107365760006004600060038463ffffffff16815481106106c7576106c76111b9565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905561072f816111e8565b9050610698565b5060005b63ffffffff81168611156107de5760016004600089898563ffffffff16818110610766576107666111b9565b905060200201602081019061077b9190610fca565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556107d7816111e8565b905061073a565b506107eb60038787610c6f565b5060005b60055463ffffffff8216101561088d5760006006600060058463ffffffff168154811061081e5761081e6111b9565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055610886816111e8565b90506107ef565b5060005b63ffffffff81168411156109355760016006600087878563ffffffff168181106108bd576108bd6111b9565b90506020020160208101906108d29190610fca565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905561092e816111e8565b9050610891565b5061094260058585610c6f565b5060005b60075463ffffffff82161015610a035760006008600060078463ffffffff1681548110610975576109756111b9565b600091825260208083206003808404909101549206600a026101000a90910460b01b7fffffffffffffffffffff00000000000000000000000000000000000000000000168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556109fc816111e8565b9050610946565b5060005b63ffffffff8116821115610ab75760016008600085858563ffffffff16818110610a3357610a336111b9565b9050602002016020810190610a489190611232565b7fffffffffffffffffffff00000000000000000000000000000000000000000000168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055610ab0816111e8565b9050610a07565b50610ac460078383610cf7565b50505050505050565b610ad5610af7565b610ade81610b7a565b50565b6040810151604a90910151909160609190911c90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610289565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610289565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215610ce7579160200282015b82811115610ce75781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190610c8f565b50610cf3929150610dbf565b5090565b82805482825590600052602060002090600201600390048101928215610ce75791602002820160005b83821115610d8057833575ffffffffffffffffffffffffffffffffffffffffffff191683826101000a81548169ffffffffffffffffffff021916908360b01c02179055509260200192600a01602081600901049283019260010302610d20565b8015610db65782816101000a81549069ffffffffffffffffffff0219169055600a01602081600901049283019260010302610d80565b5050610cf39291505b5b80821115610cf35760008155600101610dc0565b600060208284031215610de657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e1657600080fd5b9392505050565b600060208284031215610e2f57600080fd5b5035919050565b60008083601f840112610e4857600080fd5b50813567ffffffffffffffff811115610e6057600080fd5b602083019150836020828501011115610e7857600080fd5b9250929050565b60008060008060408587031215610e9557600080fd5b843567ffffffffffffffff80821115610ead57600080fd5b610eb988838901610e36565b90965094506020870135915080821115610ed257600080fd5b50610edf87828801610e36565b95989497509550505050565b60008083601f840112610efd57600080fd5b50813567ffffffffffffffff811115610f1557600080fd5b6020830191508360208260051b8501011115610e7857600080fd5b60008060008060008060608789031215610f4957600080fd5b863567ffffffffffffffff80821115610f6157600080fd5b610f6d8a838b01610eeb565b90985096506020890135915080821115610f8657600080fd5b610f928a838b01610eeb565b90965094506040890135915080821115610fab57600080fd5b50610fb889828a01610eeb565b979a9699509497509295939492505050565b600060208284031215610fdc57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610e1657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561105257611052611000565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561109f5761109f611000565b604052919050565b600060208083850312156110ba57600080fd5b823567ffffffffffffffff808211156110d257600080fd5b818501915085601f8301126110e657600080fd5b8135818111156110f8576110f8611000565b611106848260051b01611058565b8181528481019250606091820284018501918883111561112557600080fd5b938501935b828510156111ad5780858a0312156111425760008081fd5b61114a61102f565b85358152868601357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461117d5760008081fd5b8188015260408681013563ffffffff8116811461119a5760008081fd5b908201528452938401939285019261112a565b50979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103611228577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6001019392505050565b60006020828403121561124457600080fd5b81357fffffffffffffffffffff0000000000000000000000000000000000000000000081168114610e1657600080fdfea164736f6c6343000818000a",
+}
+
+var KeystoneFeedsConsumerABI = KeystoneFeedsConsumerMetaData.ABI
+
+var KeystoneFeedsConsumerBin = KeystoneFeedsConsumerMetaData.Bin
+
+func DeployKeystoneFeedsConsumer(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *KeystoneFeedsConsumer, error) {
+ parsed, err := KeystoneFeedsConsumerMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(KeystoneFeedsConsumerBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &KeystoneFeedsConsumer{address: address, abi: *parsed, KeystoneFeedsConsumerCaller: KeystoneFeedsConsumerCaller{contract: contract}, KeystoneFeedsConsumerTransactor: KeystoneFeedsConsumerTransactor{contract: contract}, KeystoneFeedsConsumerFilterer: KeystoneFeedsConsumerFilterer{contract: contract}}, nil
+}
+
+type KeystoneFeedsConsumer struct {
+ address common.Address
+ abi abi.ABI
+ KeystoneFeedsConsumerCaller
+ KeystoneFeedsConsumerTransactor
+ KeystoneFeedsConsumerFilterer
+}
+
+type KeystoneFeedsConsumerCaller struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneFeedsConsumerTransactor struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneFeedsConsumerFilterer struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneFeedsConsumerSession struct {
+ Contract *KeystoneFeedsConsumer
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type KeystoneFeedsConsumerCallerSession struct {
+ Contract *KeystoneFeedsConsumerCaller
+ CallOpts bind.CallOpts
+}
+
+type KeystoneFeedsConsumerTransactorSession struct {
+ Contract *KeystoneFeedsConsumerTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type KeystoneFeedsConsumerRaw struct {
+ Contract *KeystoneFeedsConsumer
+}
+
+type KeystoneFeedsConsumerCallerRaw struct {
+ Contract *KeystoneFeedsConsumerCaller
+}
+
+type KeystoneFeedsConsumerTransactorRaw struct {
+ Contract *KeystoneFeedsConsumerTransactor
+}
+
+func NewKeystoneFeedsConsumer(address common.Address, backend bind.ContractBackend) (*KeystoneFeedsConsumer, error) {
+ abi, err := abi.JSON(strings.NewReader(KeystoneFeedsConsumerABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindKeystoneFeedsConsumer(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumer{address: address, abi: abi, KeystoneFeedsConsumerCaller: KeystoneFeedsConsumerCaller{contract: contract}, KeystoneFeedsConsumerTransactor: KeystoneFeedsConsumerTransactor{contract: contract}, KeystoneFeedsConsumerFilterer: KeystoneFeedsConsumerFilterer{contract: contract}}, nil
+}
+
+func NewKeystoneFeedsConsumerCaller(address common.Address, caller bind.ContractCaller) (*KeystoneFeedsConsumerCaller, error) {
+ contract, err := bindKeystoneFeedsConsumer(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerCaller{contract: contract}, nil
+}
+
+func NewKeystoneFeedsConsumerTransactor(address common.Address, transactor bind.ContractTransactor) (*KeystoneFeedsConsumerTransactor, error) {
+ contract, err := bindKeystoneFeedsConsumer(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerTransactor{contract: contract}, nil
+}
+
+func NewKeystoneFeedsConsumerFilterer(address common.Address, filterer bind.ContractFilterer) (*KeystoneFeedsConsumerFilterer, error) {
+ contract, err := bindKeystoneFeedsConsumer(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerFilterer{contract: contract}, nil
+}
+
+func bindKeystoneFeedsConsumer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := KeystoneFeedsConsumerMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _KeystoneFeedsConsumer.Contract.KeystoneFeedsConsumerCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.KeystoneFeedsConsumerTransactor.contract.Transfer(opts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.KeystoneFeedsConsumerTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _KeystoneFeedsConsumer.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.contract.Transfer(opts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCaller) GetPrice(opts *bind.CallOpts, feedId [32]byte) (*big.Int, uint32, error) {
+ var out []interface{}
+ err := _KeystoneFeedsConsumer.contract.Call(opts, &out, "getPrice", feedId)
+
+ if err != nil {
+ return *new(*big.Int), *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+ out1 := *abi.ConvertType(out[1], new(uint32)).(*uint32)
+
+ return out0, out1, err
+
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) GetPrice(feedId [32]byte) (*big.Int, uint32, error) {
+ return _KeystoneFeedsConsumer.Contract.GetPrice(&_KeystoneFeedsConsumer.CallOpts, feedId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerSession) GetPrice(feedId [32]byte) (*big.Int, uint32, error) {
+ return _KeystoneFeedsConsumer.Contract.GetPrice(&_KeystoneFeedsConsumer.CallOpts, feedId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _KeystoneFeedsConsumer.contract.Call(opts, &out, "owner")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) Owner() (common.Address, error) {
+ return _KeystoneFeedsConsumer.Contract.Owner(&_KeystoneFeedsConsumer.CallOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerSession) Owner() (common.Address, error) {
+ return _KeystoneFeedsConsumer.Contract.Owner(&_KeystoneFeedsConsumer.CallOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
+ var out []interface{}
+ err := _KeystoneFeedsConsumer.contract.Call(opts, &out, "supportsInterface", interfaceId)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _KeystoneFeedsConsumer.Contract.SupportsInterface(&_KeystoneFeedsConsumer.CallOpts, interfaceId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _KeystoneFeedsConsumer.Contract.SupportsInterface(&_KeystoneFeedsConsumer.CallOpts, interfaceId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) AcceptOwnership() (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.AcceptOwnership(&_KeystoneFeedsConsumer.TransactOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.AcceptOwnership(&_KeystoneFeedsConsumer.TransactOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) OnReport(opts *bind.TransactOpts, metadata []byte, rawReport []byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "onReport", metadata, rawReport)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) OnReport(metadata []byte, rawReport []byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.OnReport(&_KeystoneFeedsConsumer.TransactOpts, metadata, rawReport)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) OnReport(metadata []byte, rawReport []byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.OnReport(&_KeystoneFeedsConsumer.TransactOpts, metadata, rawReport)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) SetConfig(opts *bind.TransactOpts, _allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "setConfig", _allowedSendersList, _allowedWorkflowOwnersList, _allowedWorkflowNamesList)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) SetConfig(_allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.SetConfig(&_KeystoneFeedsConsumer.TransactOpts, _allowedSendersList, _allowedWorkflowOwnersList, _allowedWorkflowNamesList)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) SetConfig(_allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.SetConfig(&_KeystoneFeedsConsumer.TransactOpts, _allowedSendersList, _allowedWorkflowOwnersList, _allowedWorkflowNamesList)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.TransferOwnership(&_KeystoneFeedsConsumer.TransactOpts, to)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.TransferOwnership(&_KeystoneFeedsConsumer.TransactOpts, to)
+}
+
+type KeystoneFeedsConsumerFeedReceivedIterator struct {
+ Event *KeystoneFeedsConsumerFeedReceived
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneFeedsConsumerFeedReceivedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerFeedReceived)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerFeedReceived)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *KeystoneFeedsConsumerFeedReceivedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneFeedsConsumerFeedReceivedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneFeedsConsumerFeedReceived struct {
+ FeedId [32]byte
+ Price *big.Int
+ Timestamp uint32
+ Raw types.Log
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) FilterFeedReceived(opts *bind.FilterOpts, feedId [][32]byte) (*KeystoneFeedsConsumerFeedReceivedIterator, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.FilterLogs(opts, "FeedReceived", feedIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerFeedReceivedIterator{contract: _KeystoneFeedsConsumer.contract, event: "FeedReceived", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) WatchFeedReceived(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerFeedReceived, feedId [][32]byte) (event.Subscription, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.WatchLogs(opts, "FeedReceived", feedIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneFeedsConsumerFeedReceived)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "FeedReceived", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) ParseFeedReceived(log types.Log) (*KeystoneFeedsConsumerFeedReceived, error) {
+ event := new(KeystoneFeedsConsumerFeedReceived)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "FeedReceived", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferRequestedIterator struct {
+ Event *KeystoneFeedsConsumerOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferRequestedIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerOwnershipTransferRequestedIterator{contract: _KeystoneFeedsConsumer.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) ParseOwnershipTransferRequested(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferRequested, error) {
+ event := new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferredIterator struct {
+ Event *KeystoneFeedsConsumerOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferredIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerOwnershipTransferredIterator{contract: _KeystoneFeedsConsumer.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) ParseOwnershipTransferred(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferred, error) {
+ event := new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumer) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _KeystoneFeedsConsumer.abi.Events["FeedReceived"].ID:
+ return _KeystoneFeedsConsumer.ParseFeedReceived(log)
+ case _KeystoneFeedsConsumer.abi.Events["OwnershipTransferRequested"].ID:
+ return _KeystoneFeedsConsumer.ParseOwnershipTransferRequested(log)
+ case _KeystoneFeedsConsumer.abi.Events["OwnershipTransferred"].ID:
+ return _KeystoneFeedsConsumer.ParseOwnershipTransferred(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (KeystoneFeedsConsumerFeedReceived) Topic() common.Hash {
+ return common.HexToHash("0x2c30f5cb3caf4239d0f994ce539d7ef24817fa550169c388e3a110f02e40197d")
+}
+
+func (KeystoneFeedsConsumerOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (KeystoneFeedsConsumerOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumer) Address() common.Address {
+ return _KeystoneFeedsConsumer.address
+}
+
+type KeystoneFeedsConsumerInterface interface {
+ GetPrice(opts *bind.CallOpts, feedId [32]byte) (*big.Int, uint32, error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ OnReport(opts *bind.TransactOpts, metadata []byte, rawReport []byte) (*types.Transaction, error)
+
+ SetConfig(opts *bind.TransactOpts, _allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ FilterFeedReceived(opts *bind.FilterOpts, feedId [][32]byte) (*KeystoneFeedsConsumerFeedReceivedIterator, error)
+
+ WatchFeedReceived(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerFeedReceived, feedId [][32]byte) (event.Subscription, error)
+
+ ParseFeedReceived(log types.Log) (*KeystoneFeedsConsumerFeedReceived, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferred, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 4051f95020..40cf539277 100644
--- a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -1,4 +1,5 @@
GETH_VERSION: 1.13.8
-capabilities_registry: ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.abi ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.bin 3a082f0307411f41c30db26e61d59adcd5b003141a5aa8fe79d7779619028e26
+capabilities_registry: ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.abi ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.bin 6d2e3aa3a6f3aed2cf24b613743bb9ae4b9558f48a6864dc03b8b0ebb37235e3
+feeds_consumer: ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.abi ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.bin 8c3a2b18a80be41e7c40d2bc3a4c8d1b5e18d55c1fd20ad5af68cebb66109fc5
forwarder: ../../../contracts/solc/v0.8.24/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.24/KeystoneForwarder/KeystoneForwarder.bin dc98a86a3775ead987b79d5b6079ee0e26f31c0626032bdd6508f986e2423227
ocr3_capability: ../../../contracts/solc/v0.8.24/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.24/OCR3Capability/OCR3Capability.bin 8bf0f53f222efce7143dea6134552eb26ea1eef845407b4475a0d79b7d7ba9f8
diff --git a/core/gethwrappers/keystone/go_generate.go b/core/gethwrappers/keystone/go_generate.go
index 36b27852ad..79f49264b3 100644
--- a/core/gethwrappers/keystone/go_generate.go
+++ b/core/gethwrappers/keystone/go_generate.go
@@ -7,3 +7,4 @@ package gethwrappers
//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.24/KeystoneForwarder/KeystoneForwarder.bin KeystoneForwarder forwarder
//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.24/OCR3Capability/OCR3Capability.bin OCR3Capability ocr3_capability
//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.abi ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.bin CapabilitiesRegistry capabilities_registry
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.abi ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.bin KeystoneFeedsConsumer feeds_consumer
diff --git a/core/internal/cltest/cltest.go b/core/internal/cltest/cltest.go
index 508dde86a0..12491300bf 100644
--- a/core/internal/cltest/cltest.go
+++ b/core/internal/cltest/cltest.go
@@ -37,6 +37,10 @@ import (
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting/types"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities"
+ remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
+ p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
+
"github.com/smartcontractkit/chainlink-common/pkg/loop"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
@@ -316,6 +320,31 @@ func NewApplicationWithConfig(t testing.TB, cfg chainlink.GeneralConfig, flagsAn
auditLogger = audit.NoopLogger
}
+ var capabilitiesRegistry *capabilities.Registry
+ capabilitiesRegistry = capabilities.NewRegistry(lggr)
+ for _, dep := range flagsAndDeps {
+ registry, _ := dep.(*capabilities.Registry)
+ if registry != nil {
+ capabilitiesRegistry = registry
+ }
+ }
+
+ var dispatcher remotetypes.Dispatcher
+ for _, dep := range flagsAndDeps {
+ dispatcher, _ = dep.(remotetypes.Dispatcher)
+ if dispatcher != nil {
+ break
+ }
+ }
+
+ var peerWrapper p2ptypes.PeerWrapper
+ for _, dep := range flagsAndDeps {
+ peerWrapper, _ = dep.(p2ptypes.PeerWrapper)
+ if peerWrapper != nil {
+ break
+ }
+ }
+
url := cfg.Database().URL()
db, err := pg.NewConnection(url.String(), cfg.Database().Dialect(), cfg.Database())
require.NoError(t, err)
@@ -354,10 +383,11 @@ func NewApplicationWithConfig(t testing.TB, cfg chainlink.GeneralConfig, flagsAn
})
relayerFactory := chainlink.RelayerFactory{
- Logger: lggr,
- LoopRegistry: loopRegistry,
- GRPCOpts: loop.GRPCOpts{},
- MercuryPool: mercuryPool,
+ Logger: lggr,
+ LoopRegistry: loopRegistry,
+ GRPCOpts: loop.GRPCOpts{},
+ MercuryPool: mercuryPool,
+ CapabilitiesRegistry: capabilitiesRegistry,
}
evmOpts := chainlink.EVMFactoryConfig{
@@ -409,6 +439,7 @@ func NewApplicationWithConfig(t testing.TB, cfg chainlink.GeneralConfig, flagsAn
}
initOps = append(initOps, chainlink.InitStarknet(testCtx, relayerFactory, starkCfg))
}
+
relayChainInterops, err := chainlink.NewCoreRelayerChainInteroperators(initOps...)
if err != nil {
t.Fatal(err)
@@ -429,7 +460,11 @@ func NewApplicationWithConfig(t testing.TB, cfg chainlink.GeneralConfig, flagsAn
SecretGenerator: MockSecretGenerator{},
LoopRegistry: plugins.NewLoopRegistry(lggr, nil),
MercuryPool: mercuryPool,
+ CapabilitiesRegistry: capabilitiesRegistry,
+ CapabilitiesDispatcher: dispatcher,
+ CapabilitiesPeerWrapper: peerWrapper,
})
+
require.NoError(t, err)
app := appInstance.(*chainlink.ChainlinkApplication)
ta := &TestApplication{
diff --git a/core/internal/mocks/prometheus_backend.go b/core/internal/mocks/prometheus_backend.go
new file mode 100644
index 0000000000..d02f7062cb
--- /dev/null
+++ b/core/internal/mocks/prometheus_backend.go
@@ -0,0 +1,204 @@
+// Code generated by mockery v2.43.2. DO NOT EDIT.
+
+package mocks
+
+import (
+ big "math/big"
+
+ mock "github.com/stretchr/testify/mock"
+)
+
+// PrometheusBackend is an autogenerated mock type for the PrometheusBackend type
+type PrometheusBackend struct {
+ mock.Mock
+}
+
+type PrometheusBackend_Expecter struct {
+ mock *mock.Mock
+}
+
+func (_m *PrometheusBackend) EXPECT() *PrometheusBackend_Expecter {
+ return &PrometheusBackend_Expecter{mock: &_m.Mock}
+}
+
+// SetMaxUnconfirmedAge provides a mock function with given fields: _a0, _a1
+func (_m *PrometheusBackend) SetMaxUnconfirmedAge(_a0 *big.Int, _a1 float64) {
+ _m.Called(_a0, _a1)
+}
+
+// PrometheusBackend_SetMaxUnconfirmedAge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetMaxUnconfirmedAge'
+type PrometheusBackend_SetMaxUnconfirmedAge_Call struct {
+ *mock.Call
+}
+
+// SetMaxUnconfirmedAge is a helper method to define mock.On call
+// - _a0 *big.Int
+// - _a1 float64
+func (_e *PrometheusBackend_Expecter) SetMaxUnconfirmedAge(_a0 interface{}, _a1 interface{}) *PrometheusBackend_SetMaxUnconfirmedAge_Call {
+ return &PrometheusBackend_SetMaxUnconfirmedAge_Call{Call: _e.mock.On("SetMaxUnconfirmedAge", _a0, _a1)}
+}
+
+func (_c *PrometheusBackend_SetMaxUnconfirmedAge_Call) Run(run func(_a0 *big.Int, _a1 float64)) *PrometheusBackend_SetMaxUnconfirmedAge_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(*big.Int), args[1].(float64))
+ })
+ return _c
+}
+
+func (_c *PrometheusBackend_SetMaxUnconfirmedAge_Call) Return() *PrometheusBackend_SetMaxUnconfirmedAge_Call {
+ _c.Call.Return()
+ return _c
+}
+
+func (_c *PrometheusBackend_SetMaxUnconfirmedAge_Call) RunAndReturn(run func(*big.Int, float64)) *PrometheusBackend_SetMaxUnconfirmedAge_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// SetMaxUnconfirmedBlocks provides a mock function with given fields: _a0, _a1
+func (_m *PrometheusBackend) SetMaxUnconfirmedBlocks(_a0 *big.Int, _a1 int64) {
+ _m.Called(_a0, _a1)
+}
+
+// PrometheusBackend_SetMaxUnconfirmedBlocks_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetMaxUnconfirmedBlocks'
+type PrometheusBackend_SetMaxUnconfirmedBlocks_Call struct {
+ *mock.Call
+}
+
+// SetMaxUnconfirmedBlocks is a helper method to define mock.On call
+// - _a0 *big.Int
+// - _a1 int64
+func (_e *PrometheusBackend_Expecter) SetMaxUnconfirmedBlocks(_a0 interface{}, _a1 interface{}) *PrometheusBackend_SetMaxUnconfirmedBlocks_Call {
+ return &PrometheusBackend_SetMaxUnconfirmedBlocks_Call{Call: _e.mock.On("SetMaxUnconfirmedBlocks", _a0, _a1)}
+}
+
+func (_c *PrometheusBackend_SetMaxUnconfirmedBlocks_Call) Run(run func(_a0 *big.Int, _a1 int64)) *PrometheusBackend_SetMaxUnconfirmedBlocks_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(*big.Int), args[1].(int64))
+ })
+ return _c
+}
+
+func (_c *PrometheusBackend_SetMaxUnconfirmedBlocks_Call) Return() *PrometheusBackend_SetMaxUnconfirmedBlocks_Call {
+ _c.Call.Return()
+ return _c
+}
+
+func (_c *PrometheusBackend_SetMaxUnconfirmedBlocks_Call) RunAndReturn(run func(*big.Int, int64)) *PrometheusBackend_SetMaxUnconfirmedBlocks_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// SetPipelineRunsQueued provides a mock function with given fields: n
+func (_m *PrometheusBackend) SetPipelineRunsQueued(n int) {
+ _m.Called(n)
+}
+
+// PrometheusBackend_SetPipelineRunsQueued_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetPipelineRunsQueued'
+type PrometheusBackend_SetPipelineRunsQueued_Call struct {
+ *mock.Call
+}
+
+// SetPipelineRunsQueued is a helper method to define mock.On call
+// - n int
+func (_e *PrometheusBackend_Expecter) SetPipelineRunsQueued(n interface{}) *PrometheusBackend_SetPipelineRunsQueued_Call {
+ return &PrometheusBackend_SetPipelineRunsQueued_Call{Call: _e.mock.On("SetPipelineRunsQueued", n)}
+}
+
+func (_c *PrometheusBackend_SetPipelineRunsQueued_Call) Run(run func(n int)) *PrometheusBackend_SetPipelineRunsQueued_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(int))
+ })
+ return _c
+}
+
+func (_c *PrometheusBackend_SetPipelineRunsQueued_Call) Return() *PrometheusBackend_SetPipelineRunsQueued_Call {
+ _c.Call.Return()
+ return _c
+}
+
+func (_c *PrometheusBackend_SetPipelineRunsQueued_Call) RunAndReturn(run func(int)) *PrometheusBackend_SetPipelineRunsQueued_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// SetPipelineTaskRunsQueued provides a mock function with given fields: n
+func (_m *PrometheusBackend) SetPipelineTaskRunsQueued(n int) {
+ _m.Called(n)
+}
+
+// PrometheusBackend_SetPipelineTaskRunsQueued_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetPipelineTaskRunsQueued'
+type PrometheusBackend_SetPipelineTaskRunsQueued_Call struct {
+ *mock.Call
+}
+
+// SetPipelineTaskRunsQueued is a helper method to define mock.On call
+// - n int
+func (_e *PrometheusBackend_Expecter) SetPipelineTaskRunsQueued(n interface{}) *PrometheusBackend_SetPipelineTaskRunsQueued_Call {
+ return &PrometheusBackend_SetPipelineTaskRunsQueued_Call{Call: _e.mock.On("SetPipelineTaskRunsQueued", n)}
+}
+
+func (_c *PrometheusBackend_SetPipelineTaskRunsQueued_Call) Run(run func(n int)) *PrometheusBackend_SetPipelineTaskRunsQueued_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(int))
+ })
+ return _c
+}
+
+func (_c *PrometheusBackend_SetPipelineTaskRunsQueued_Call) Return() *PrometheusBackend_SetPipelineTaskRunsQueued_Call {
+ _c.Call.Return()
+ return _c
+}
+
+func (_c *PrometheusBackend_SetPipelineTaskRunsQueued_Call) RunAndReturn(run func(int)) *PrometheusBackend_SetPipelineTaskRunsQueued_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// SetUnconfirmedTransactions provides a mock function with given fields: _a0, _a1
+func (_m *PrometheusBackend) SetUnconfirmedTransactions(_a0 *big.Int, _a1 int64) {
+ _m.Called(_a0, _a1)
+}
+
+// PrometheusBackend_SetUnconfirmedTransactions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetUnconfirmedTransactions'
+type PrometheusBackend_SetUnconfirmedTransactions_Call struct {
+ *mock.Call
+}
+
+// SetUnconfirmedTransactions is a helper method to define mock.On call
+// - _a0 *big.Int
+// - _a1 int64
+func (_e *PrometheusBackend_Expecter) SetUnconfirmedTransactions(_a0 interface{}, _a1 interface{}) *PrometheusBackend_SetUnconfirmedTransactions_Call {
+ return &PrometheusBackend_SetUnconfirmedTransactions_Call{Call: _e.mock.On("SetUnconfirmedTransactions", _a0, _a1)}
+}
+
+func (_c *PrometheusBackend_SetUnconfirmedTransactions_Call) Run(run func(_a0 *big.Int, _a1 int64)) *PrometheusBackend_SetUnconfirmedTransactions_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(*big.Int), args[1].(int64))
+ })
+ return _c
+}
+
+func (_c *PrometheusBackend_SetUnconfirmedTransactions_Call) Return() *PrometheusBackend_SetUnconfirmedTransactions_Call {
+ _c.Call.Return()
+ return _c
+}
+
+func (_c *PrometheusBackend_SetUnconfirmedTransactions_Call) RunAndReturn(run func(*big.Int, int64)) *PrometheusBackend_SetUnconfirmedTransactions_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// NewPrometheusBackend creates a new instance of PrometheusBackend. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewPrometheusBackend(t interface {
+ mock.TestingT
+ Cleanup(func())
+}) *PrometheusBackend {
+ mock := &PrometheusBackend{}
+ mock.Mock.Test(t)
+
+ t.Cleanup(func() { mock.AssertExpectations(t) })
+
+ return mock
+}
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 7ee9ff2513..ac50bc8655 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -24,7 +24,7 @@ require (
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chain-selectors v1.0.23
github.com/smartcontractkit/chainlink-automation v1.0.4
- github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
+ github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
github.com/spf13/cobra v1.8.0
@@ -320,7 +320,7 @@ require (
go.mongodb.org/mongo-driver v1.15.0 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
go.opentelemetry.io/otel v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect
@@ -330,12 +330,12 @@ require (
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/ratelimit v0.3.0 // indirect
go.uber.org/zap v1.27.0 // indirect
- golang.org/x/arch v0.7.0 // indirect
+ golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/mod v0.19.0 // indirect
golang.org/x/net v0.27.0 // indirect
- golang.org/x/oauth2 v0.20.0 // indirect
+ golang.org/x/oauth2 v0.21.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/term v0.22.0 // indirect
@@ -343,7 +343,7 @@ require (
golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.23.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
- google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect
+ google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/grpc v1.65.0 // indirect
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index 192357740f..db4c3cd316 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -10,27 +10,31 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
-cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
+cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
+cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
+cloud.google.com/go/auth v0.7.1 h1:Iv1bbpzJ2OIg16m94XI9/tlzZZl3cdeR3nGVGj78N7s=
+cloud.google.com/go/auth v0.7.1/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs=
+cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI=
+cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
-cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
-cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/compute v1.27.2 h1:5cE5hdrwJV/92ravlwIFRGnyH9CpLGhh4N0ZDVTU+BA=
+cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
+cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
-cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
+cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw=
+cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg=
-cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY=
+cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
+cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk=
contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo=
@@ -1070,8 +1074,8 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj
github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1/go.mod h1:Jg1sCTsbxg76YByI8ifpFby3FvVqISStHT8ypy9ocmY=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45/go.mod h1:LV0h7QBQUpoC2UUi6TcUvcIFm1xjP/DtEcqV8+qeLUs=
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa h1:g75H8oh2ws52s8BekwvGQ9XvBVu3E7WM1rfiA0PN0zk=
@@ -1261,10 +1265,10 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg=
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.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
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.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
@@ -1277,8 +1281,8 @@ go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6b
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
-go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0=
-go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q=
+go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08=
+go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg=
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
@@ -1313,8 +1317,8 @@ go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
-golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
+golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1426,8 +1430,8 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
-golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
+golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1610,8 +1614,8 @@ google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY=
-google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg=
+google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw=
+google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -1643,8 +1647,8 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY=
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY=
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A=
diff --git a/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go b/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go
index 338a582a76..8762241543 100644
--- a/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go
+++ b/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go
@@ -8,15 +8,19 @@ import (
"log"
"os"
"strings"
+ "time"
"github.com/ethereum/go-ethereum/common"
ragetypes "github.com/smartcontractkit/libocr/ragep2p/types"
"google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/types/known/durationpb"
+
+ capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
helpers "github.com/smartcontractkit/chainlink/core/scripts/common"
- remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
)
@@ -162,6 +166,12 @@ func peerToNode(nopID uint32, p peer) (kcr.CapabilitiesRegistryNodeParams, error
}, nil
}
+func newCapabilityConfig() *capabilitiespb.CapabilityConfig {
+ return &capabilitiespb.CapabilityConfig{
+ DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(),
+ }
+}
+
// Run expects the following environment variables to be set:
//
// 1. Deploys the CapabilitiesRegistry contract
@@ -308,9 +318,16 @@ func (c *deployAndInitializeCapabilitiesRegistryCommand) Run(args []string) {
panic(err)
}
+ cc := newCapabilityConfig()
+ ccb, err := proto.Marshal(cc)
+ if err != nil {
+ panic(err)
+ }
+
cfgs := []kcr.CapabilitiesRegistryCapabilityConfiguration{
{
CapabilityId: ocrid,
+ Config: ccb,
},
}
_, err = reg.AddDON(env.Owner, ps, cfgs, true, true, 2)
@@ -324,11 +341,16 @@ func (c *deployAndInitializeCapabilitiesRegistryCommand) Run(args []string) {
panic(err)
}
- config := &remotetypes.RemoteTriggerConfig{
- RegistrationRefreshMs: 20000,
- RegistrationExpiryMs: 60000,
- // F + 1
- MinResponsesToAggregate: uint32(1) + 1,
+ config := &capabilitiespb.CapabilityConfig{
+ DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(),
+ RemoteConfig: &capabilitiespb.CapabilityConfig_RemoteTriggerConfig{
+ RemoteTriggerConfig: &capabilitiespb.RemoteTriggerConfig{
+ RegistrationRefresh: durationpb.New(20 * time.Second),
+ RegistrationExpiry: durationpb.New(60 * time.Second),
+ // F + 1
+ MinResponsesToAggregate: uint32(1) + 1,
+ },
+ },
}
configb, err := proto.Marshal(config)
if err != nil {
@@ -351,9 +373,16 @@ func (c *deployAndInitializeCapabilitiesRegistryCommand) Run(args []string) {
panic(err)
}
+ cc = newCapabilityConfig()
+ ccb, err = proto.Marshal(cc)
+ if err != nil {
+ panic(err)
+ }
+
cfgs = []kcr.CapabilitiesRegistryCapabilityConfiguration{
{
CapabilityId: wid,
+ Config: ccb,
},
}
_, err = reg.AddDON(env.Owner, ps, cfgs, true, false, 1)
diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go
index 94619b7ce6..e880ecfad2 100644
--- a/core/services/chainlink/application.go
+++ b/core/services/chainlink/application.go
@@ -17,19 +17,21 @@ import (
"go.uber.org/multierr"
"go.uber.org/zap/zapcore"
- pkgcapabilities "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/loop"
commonservices "github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
- coretypes "github.com/smartcontractkit/chainlink-common/pkg/types/core"
"github.com/smartcontractkit/chainlink-common/pkg/utils"
"github.com/smartcontractkit/chainlink-common/pkg/utils/jsonserializable"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
+
"github.com/smartcontractkit/chainlink/v2/core/capabilities"
+ remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
"github.com/smartcontractkit/chainlink/v2/core/services/standardcapabilities"
"github.com/smartcontractkit/chainlink/v2/core/static"
+ "github.com/smartcontractkit/chainlink/v2/core/services/promreporter"
+
"github.com/smartcontractkit/chainlink/v2/core/bridges"
"github.com/smartcontractkit/chainlink/v2/core/build"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote"
@@ -47,7 +49,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/feeds"
"github.com/smartcontractkit/chainlink/v2/core/services/fluxmonitorv2"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway"
- "github.com/smartcontractkit/chainlink/v2/core/services/headreporter"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keeper"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
@@ -180,7 +181,9 @@ type ApplicationOpts struct {
LoopRegistry *plugins.LoopRegistry
GRPCOpts loop.GRPCOpts
MercuryPool wsrpc.Pool
- CapabilitiesRegistry coretypes.CapabilitiesRegistry
+ CapabilitiesRegistry *capabilities.Registry
+ CapabilitiesDispatcher remotetypes.Dispatcher
+ CapabilitiesPeerWrapper p2ptypes.PeerWrapper
}
// NewApplication initializes a new store if one is not already
@@ -200,23 +203,39 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
restrictedHTTPClient := opts.RestrictedHTTPClient
unrestrictedHTTPClient := opts.UnrestrictedHTTPClient
- if opts.CapabilitiesRegistry == nil { // for tests only, in prod Registry is always set at this point
+ if opts.CapabilitiesRegistry == nil {
+ // for tests only, in prod Registry should always be set at this point
opts.CapabilitiesRegistry = capabilities.NewRegistry(globalLogger)
}
var externalPeerWrapper p2ptypes.PeerWrapper
- var getLocalNode func(ctx context.Context) (pkgcapabilities.Node, error)
- var capabilityRegistrySyncer registrysyncer.Syncer
+ if cfg.Capabilities().Peering().Enabled() {
+ var dispatcher remotetypes.Dispatcher
+ if opts.CapabilitiesDispatcher == nil {
+ externalPeer := externalp2p.NewExternalPeerWrapper(keyStore.P2P(), cfg.Capabilities().Peering(), opts.DS, globalLogger)
+ signer := externalPeer
+ externalPeerWrapper = externalPeer
+ remoteDispatcher := remote.NewDispatcher(externalPeerWrapper, signer, opts.CapabilitiesRegistry, globalLogger)
+ srvcs = append(srvcs, remoteDispatcher)
+
+ dispatcher = remoteDispatcher
+ } else {
+ dispatcher = opts.CapabilitiesDispatcher
+ externalPeerWrapper = opts.CapabilitiesPeerWrapper
+ }
+
+ srvcs = append(srvcs, externalPeerWrapper)
- if cfg.Capabilities().ExternalRegistry().Address() != "" {
rid := cfg.Capabilities().ExternalRegistry().RelayID()
registryAddress := cfg.Capabilities().ExternalRegistry().Address()
relayer, err := relayerChainInterops.Get(rid)
if err != nil {
return nil, fmt.Errorf("could not fetch relayer %s configured for capabilities registry: %w", rid, err)
}
+
registrySyncer, err := registrysyncer.New(
globalLogger,
+ externalPeerWrapper,
relayer,
registryAddress,
)
@@ -224,32 +243,15 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
return nil, fmt.Errorf("could not configure syncer: %w", err)
}
- capabilityRegistrySyncer = registrySyncer
- srvcs = append(srvcs, capabilityRegistrySyncer)
- }
-
- if cfg.Capabilities().Peering().Enabled() {
- if capabilityRegistrySyncer == nil {
- return nil, errors.Errorf("peering enabled but no capability registry found")
- }
- externalPeer := externalp2p.NewExternalPeerWrapper(keyStore.P2P(), cfg.Capabilities().Peering(), opts.DS, globalLogger)
- signer := externalPeer
- externalPeerWrapper = externalPeer
-
- srvcs = append(srvcs, externalPeerWrapper)
-
- dispatcher := remote.NewDispatcher(externalPeerWrapper, signer, opts.CapabilitiesRegistry, globalLogger)
-
wfLauncher := capabilities.NewLauncher(
globalLogger,
externalPeerWrapper,
dispatcher,
opts.CapabilitiesRegistry,
)
+ registrySyncer.AddLauncher(wfLauncher)
- capabilityRegistrySyncer.AddLauncher(wfLauncher)
- getLocalNode = wfLauncher.LocalNode
- srvcs = append(srvcs, dispatcher, wfLauncher)
+ srvcs = append(srvcs, dispatcher, wfLauncher, registrySyncer)
}
// LOOPs can be created as options, in the case of LOOP relayers, or
@@ -322,6 +324,8 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
srvcs = append(srvcs, mailMon)
srvcs = append(srvcs, relayerChainInterops.Services()...)
+ promReporter := promreporter.NewPromReporter(opts.DS, legacyEVMChains, globalLogger)
+ srvcs = append(srvcs, promReporter)
// Initialize Local Users ORM and Authentication Provider specified in config
// BasicAdminUsersORM is initialized and required regardless of separate Authentication Provider
@@ -361,16 +365,8 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
workflowORM = workflowstore.NewDBStore(opts.DS, globalLogger, clockwork.NewRealClock())
)
- promReporter := headreporter.NewPrometheusReporter(opts.DS, legacyEVMChains)
- chainIDs := make([]*big.Int, legacyEVMChains.Len())
- for i, chain := range legacyEVMChains.Slice() {
- chainIDs[i] = chain.ID()
- }
- telemReporter := headreporter.NewTelemetryReporter(telemetryManager, globalLogger, chainIDs...)
- headReporter := headreporter.NewHeadReporterService(opts.DS, globalLogger, promReporter, telemReporter)
- srvcs = append(srvcs, headReporter)
for _, chain := range legacyEVMChains.Slice() {
- chain.HeadBroadcaster().Subscribe(headReporter)
+ chain.HeadBroadcaster().Subscribe(promReporter)
chain.TxManager().RegisterResumeCallback(pipelineRunner.ResumeRun)
}
@@ -446,7 +442,6 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
globalLogger,
opts.CapabilitiesRegistry,
workflowORM,
- getLocalNode,
)
// Flux monitor requires ethereum just to boot, silence errors with a null delegate
diff --git a/core/services/chainlink/relayer_chain_interoperators_test.go b/core/services/chainlink/relayer_chain_interoperators_test.go
index aaf458c76c..5aaf6e16dd 100644
--- a/core/services/chainlink/relayer_chain_interoperators_test.go
+++ b/core/services/chainlink/relayer_chain_interoperators_test.go
@@ -13,6 +13,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/loop"
"github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities"
coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
solcfg "github.com/smartcontractkit/chainlink-solana/pkg/solana/config"
@@ -174,9 +175,10 @@ func TestCoreRelayerChainInteroperators(t *testing.T) {
lggr := logger.TestLogger(t)
factory := chainlink.RelayerFactory{
- Logger: lggr,
- LoopRegistry: plugins.NewLoopRegistry(lggr, nil),
- GRPCOpts: loop.GRPCOpts{},
+ Logger: lggr,
+ LoopRegistry: plugins.NewLoopRegistry(lggr, nil),
+ GRPCOpts: loop.GRPCOpts{},
+ CapabilitiesRegistry: capabilities.NewRegistry(lggr),
}
testctx := testutils.Context(t)
diff --git a/core/services/chainlink/relayer_factory.go b/core/services/chainlink/relayer_factory.go
index ae222f56c6..849964f9be 100644
--- a/core/services/chainlink/relayer_factory.go
+++ b/core/services/chainlink/relayer_factory.go
@@ -11,6 +11,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/loop/adapters/relay"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
"github.com/smartcontractkit/chainlink-common/pkg/types"
+ coretypes "github.com/smartcontractkit/chainlink-common/pkg/types/core"
"github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos"
coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
"github.com/smartcontractkit/chainlink-solana/pkg/solana"
@@ -18,8 +19,6 @@ import (
pkgstarknet "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink"
starkchain "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/chain"
"github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/config"
-
- "github.com/smartcontractkit/chainlink/v2/core/capabilities"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
coreconfig "github.com/smartcontractkit/chainlink/v2/core/config"
"github.com/smartcontractkit/chainlink/v2/core/config/env"
@@ -37,7 +36,7 @@ type RelayerFactory struct {
*plugins.LoopRegistry
loop.GRPCOpts
MercuryPool wsrpc.Pool
- CapabilitiesRegistry *capabilities.Registry
+ CapabilitiesRegistry coretypes.CapabilitiesRegistry
}
type DummyFactoryConfig struct {
diff --git a/core/services/functions/connector_handler_test.go b/core/services/functions/connector_handler_test.go
index 7e1f3ced34..a24139da58 100644
--- a/core/services/functions/connector_handler_test.go
+++ b/core/services/functions/connector_handler_test.go
@@ -269,7 +269,10 @@ func TestFunctionsConnectorHandler(t *testing.T) {
// first call to trigger the request
var response functions.HeartbeatResponse
allowlist.On("Allow", addr).Return(true).Once()
- listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(nil).Once()
+ handlerCalled := make(chan struct{})
+ listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
+ handlerCalled <- struct{}{}
+ }).Return(nil).Once()
connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Run(func(args mock.Arguments) {
respMsg, ok := args[2].(*api.Message)
require.True(t, ok)
@@ -277,6 +280,7 @@ func TestFunctionsConnectorHandler(t *testing.T) {
require.Equal(t, functions.RequestStatePending, response.Status)
}).Return(nil).Once()
handler.HandleGatewayMessage(ctx, "gw1", msg)
+ <-handlerCalled
// async response computation
reportCh <- &functions.OffchainResponse{
@@ -304,9 +308,13 @@ func TestFunctionsConnectorHandler(t *testing.T) {
// first call to trigger the request
var response functions.HeartbeatResponse
allowlist.On("Allow", addr).Return(true).Once()
- listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Return(errors.New("boom")).Once()
+ handlerCalled := make(chan struct{})
+ listener.On("HandleOffchainRequest", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
+ handlerCalled <- struct{}{}
+ }).Return(errors.New("boom")).Once()
connector.On("SendToGateway", mock.Anything, "gw1", mock.Anything).Return(nil).Once()
handler.HandleGatewayMessage(ctx, "gw1", msg)
+ <-handlerCalled
// collect the response - should eventually result in an internal error
gomega.NewGomegaWithT(t).Eventually(func() bool {
diff --git a/core/services/headreporter/head_reporter.go b/core/services/headreporter/head_reporter.go
deleted file mode 100644
index 94de8ae2be..0000000000
--- a/core/services/headreporter/head_reporter.go
+++ /dev/null
@@ -1,111 +0,0 @@
-package headreporter
-
-import (
- "context"
- "sync"
- "time"
-
- "github.com/smartcontractkit/chainlink-common/pkg/services"
- "github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
- "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
-
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types"
- evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
-)
-
-type (
- HeadReporter interface {
- ReportNewHead(ctx context.Context, head *evmtypes.Head) error
- ReportPeriodic(ctx context.Context) error
- }
-
- HeadReporterService struct {
- services.StateMachine
- ds sqlutil.DataSource
- lggr logger.Logger
- newHeads *mailbox.Mailbox[*evmtypes.Head]
- chStop services.StopChan
- wgDone sync.WaitGroup
- reportPeriod time.Duration
- reporters []HeadReporter
- unsubscribeFns []func()
- }
-)
-
-func NewHeadReporterService(ds sqlutil.DataSource, lggr logger.Logger, reporters ...HeadReporter) *HeadReporterService {
- return &HeadReporterService{
- ds: ds,
- lggr: lggr.Named("HeadReporter"),
- newHeads: mailbox.NewSingle[*evmtypes.Head](),
- chStop: make(chan struct{}),
- reporters: reporters,
- reportPeriod: 15 * time.Second,
- }
-}
-
-func (hrd *HeadReporterService) Subscribe(subFn func(types.HeadTrackable) (evmtypes.Head, func())) {
- _, unsubscribe := subFn(hrd)
- hrd.unsubscribeFns = append(hrd.unsubscribeFns, unsubscribe)
-}
-
-func (hrd *HeadReporterService) Start(context.Context) error {
- return hrd.StartOnce(hrd.Name(), func() error {
- hrd.wgDone.Add(1)
- go hrd.eventLoop()
- return nil
- })
-}
-
-func (hrd *HeadReporterService) Close() error {
- return hrd.StopOnce(hrd.Name(), func() error {
- close(hrd.chStop)
- hrd.wgDone.Wait()
- return nil
- })
-}
-
-func (hrd *HeadReporterService) Name() string {
- return hrd.lggr.Name()
-}
-
-func (hrd *HeadReporterService) HealthReport() map[string]error {
- return map[string]error{hrd.Name(): hrd.Healthy()}
-}
-
-func (hrd *HeadReporterService) OnNewLongestChain(ctx context.Context, head *evmtypes.Head) {
- hrd.newHeads.Deliver(head)
-}
-
-func (hrd *HeadReporterService) eventLoop() {
- hrd.lggr.Debug("Starting event loop")
- defer hrd.wgDone.Done()
- ctx, cancel := hrd.chStop.NewCtx()
- defer cancel()
- after := time.After(hrd.reportPeriod)
- for {
- select {
- case <-hrd.newHeads.Notify():
- head, exists := hrd.newHeads.Retrieve()
- if !exists {
- continue
- }
- for _, reporter := range hrd.reporters {
- err := reporter.ReportNewHead(ctx, head)
- if err != nil && ctx.Err() == nil {
- hrd.lggr.Errorw("Error reporting new head", "err", err)
- }
- }
- case <-after:
- for _, reporter := range hrd.reporters {
- err := reporter.ReportPeriodic(ctx)
- if err != nil && ctx.Err() == nil {
- hrd.lggr.Errorw("Error in periodic report", "err", err)
- }
- }
- after = time.After(hrd.reportPeriod)
- case <-hrd.chStop:
- return
- }
- }
-}
diff --git a/core/services/headreporter/head_reporter_mock.go b/core/services/headreporter/head_reporter_mock.go
deleted file mode 100644
index 21978abb86..0000000000
--- a/core/services/headreporter/head_reporter_mock.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
-
-package headreporter
-
-import (
- context "context"
-
- types "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- mock "github.com/stretchr/testify/mock"
-)
-
-// MockHeadReporter is an autogenerated mock type for the HeadReporter type
-type MockHeadReporter struct {
- mock.Mock
-}
-
-type MockHeadReporter_Expecter struct {
- mock *mock.Mock
-}
-
-func (_m *MockHeadReporter) EXPECT() *MockHeadReporter_Expecter {
- return &MockHeadReporter_Expecter{mock: &_m.Mock}
-}
-
-// ReportNewHead provides a mock function with given fields: ctx, head
-func (_m *MockHeadReporter) ReportNewHead(ctx context.Context, head *types.Head) error {
- ret := _m.Called(ctx, head)
-
- if len(ret) == 0 {
- panic("no return value specified for ReportNewHead")
- }
-
- var r0 error
- if rf, ok := ret.Get(0).(func(context.Context, *types.Head) error); ok {
- r0 = rf(ctx, head)
- } else {
- r0 = ret.Error(0)
- }
-
- return r0
-}
-
-// MockHeadReporter_ReportNewHead_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ReportNewHead'
-type MockHeadReporter_ReportNewHead_Call struct {
- *mock.Call
-}
-
-// ReportNewHead is a helper method to define mock.On call
-// - ctx context.Context
-// - head *types.Head
-func (_e *MockHeadReporter_Expecter) ReportNewHead(ctx interface{}, head interface{}) *MockHeadReporter_ReportNewHead_Call {
- return &MockHeadReporter_ReportNewHead_Call{Call: _e.mock.On("ReportNewHead", ctx, head)}
-}
-
-func (_c *MockHeadReporter_ReportNewHead_Call) Run(run func(ctx context.Context, head *types.Head)) *MockHeadReporter_ReportNewHead_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(context.Context), args[1].(*types.Head))
- })
- return _c
-}
-
-func (_c *MockHeadReporter_ReportNewHead_Call) Return(_a0 error) *MockHeadReporter_ReportNewHead_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockHeadReporter_ReportNewHead_Call) RunAndReturn(run func(context.Context, *types.Head) error) *MockHeadReporter_ReportNewHead_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// ReportPeriodic provides a mock function with given fields: ctx
-func (_m *MockHeadReporter) ReportPeriodic(ctx context.Context) error {
- ret := _m.Called(ctx)
-
- if len(ret) == 0 {
- panic("no return value specified for ReportPeriodic")
- }
-
- var r0 error
- if rf, ok := ret.Get(0).(func(context.Context) error); ok {
- r0 = rf(ctx)
- } else {
- r0 = ret.Error(0)
- }
-
- return r0
-}
-
-// MockHeadReporter_ReportPeriodic_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ReportPeriodic'
-type MockHeadReporter_ReportPeriodic_Call struct {
- *mock.Call
-}
-
-// ReportPeriodic is a helper method to define mock.On call
-// - ctx context.Context
-func (_e *MockHeadReporter_Expecter) ReportPeriodic(ctx interface{}) *MockHeadReporter_ReportPeriodic_Call {
- return &MockHeadReporter_ReportPeriodic_Call{Call: _e.mock.On("ReportPeriodic", ctx)}
-}
-
-func (_c *MockHeadReporter_ReportPeriodic_Call) Run(run func(ctx context.Context)) *MockHeadReporter_ReportPeriodic_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(context.Context))
- })
- return _c
-}
-
-func (_c *MockHeadReporter_ReportPeriodic_Call) Return(_a0 error) *MockHeadReporter_ReportPeriodic_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockHeadReporter_ReportPeriodic_Call) RunAndReturn(run func(context.Context) error) *MockHeadReporter_ReportPeriodic_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// NewMockHeadReporter creates a new instance of MockHeadReporter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-// The first argument is typically a *testing.T value.
-func NewMockHeadReporter(t interface {
- mock.TestingT
- Cleanup(func())
-}) *MockHeadReporter {
- mock := &MockHeadReporter{}
- mock.Mock.Test(t)
-
- t.Cleanup(func() { mock.AssertExpectations(t) })
-
- return mock
-}
diff --git a/core/services/headreporter/head_reporter_test.go b/core/services/headreporter/head_reporter_test.go
deleted file mode 100644
index 304dd59a47..0000000000
--- a/core/services/headreporter/head_reporter_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package headreporter
-
-import (
- "sync/atomic"
- "testing"
- "time"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/mock"
- "github.com/stretchr/testify/require"
-
- evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
-
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
-)
-
-func NewHead() evmtypes.Head {
- return evmtypes.Head{Number: 42, EVMChainID: ubig.NewI(0)}
-}
-
-func Test_HeadReporterService(t *testing.T) {
- t.Run("report everything", func(t *testing.T) {
- db := pgtest.NewSqlxDB(t)
-
- headReporter := NewMockHeadReporter(t)
- service := NewHeadReporterService(db, logger.TestLogger(t), headReporter)
- service.reportPeriod = time.Second
- err := service.Start(testutils.Context(t))
- require.NoError(t, err)
-
- var reportCalls atomic.Int32
- head := NewHead()
- headReporter.On("ReportNewHead", mock.Anything, &head).Run(func(args mock.Arguments) {
- reportCalls.Add(1)
- }).Return(nil)
- headReporter.On("ReportPeriodic", mock.Anything).Run(func(args mock.Arguments) {
- reportCalls.Add(1)
- }).Return(nil)
- service.OnNewLongestChain(testutils.Context(t), &head)
-
- require.Eventually(t, func() bool { return reportCalls.Load() == 2 }, 5*time.Second, 100*time.Millisecond)
- })
-
- t.Run("has default report period", func(t *testing.T) {
- service := NewHeadReporterService(pgtest.NewSqlxDB(t), logger.TestLogger(t), NewMockHeadReporter(t))
- assert.Equal(t, service.reportPeriod, 15*time.Second)
- })
-}
diff --git a/core/services/headreporter/helper_test.go b/core/services/headreporter/helper_test.go
deleted file mode 100644
index fa05182a85..0000000000
--- a/core/services/headreporter/helper_test.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package headreporter
-
-func (p *prometheusReporter) SetBackend(b PrometheusBackend) {
- p.backend = b
-}
diff --git a/core/services/headreporter/prometheus_backend_mock.go b/core/services/headreporter/prometheus_backend_mock.go
deleted file mode 100644
index ca83f6c4fb..0000000000
--- a/core/services/headreporter/prometheus_backend_mock.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
-
-package headreporter
-
-import (
- big "math/big"
-
- mock "github.com/stretchr/testify/mock"
-)
-
-// MockPrometheusBackend is an autogenerated mock type for the PrometheusBackend type
-type MockPrometheusBackend struct {
- mock.Mock
-}
-
-type MockPrometheusBackend_Expecter struct {
- mock *mock.Mock
-}
-
-func (_m *MockPrometheusBackend) EXPECT() *MockPrometheusBackend_Expecter {
- return &MockPrometheusBackend_Expecter{mock: &_m.Mock}
-}
-
-// SetMaxUnconfirmedAge provides a mock function with given fields: _a0, _a1
-func (_m *MockPrometheusBackend) SetMaxUnconfirmedAge(_a0 *big.Int, _a1 float64) {
- _m.Called(_a0, _a1)
-}
-
-// MockPrometheusBackend_SetMaxUnconfirmedAge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetMaxUnconfirmedAge'
-type MockPrometheusBackend_SetMaxUnconfirmedAge_Call struct {
- *mock.Call
-}
-
-// SetMaxUnconfirmedAge is a helper method to define mock.On call
-// - _a0 *big.Int
-// - _a1 float64
-func (_e *MockPrometheusBackend_Expecter) SetMaxUnconfirmedAge(_a0 interface{}, _a1 interface{}) *MockPrometheusBackend_SetMaxUnconfirmedAge_Call {
- return &MockPrometheusBackend_SetMaxUnconfirmedAge_Call{Call: _e.mock.On("SetMaxUnconfirmedAge", _a0, _a1)}
-}
-
-func (_c *MockPrometheusBackend_SetMaxUnconfirmedAge_Call) Run(run func(_a0 *big.Int, _a1 float64)) *MockPrometheusBackend_SetMaxUnconfirmedAge_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(*big.Int), args[1].(float64))
- })
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetMaxUnconfirmedAge_Call) Return() *MockPrometheusBackend_SetMaxUnconfirmedAge_Call {
- _c.Call.Return()
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetMaxUnconfirmedAge_Call) RunAndReturn(run func(*big.Int, float64)) *MockPrometheusBackend_SetMaxUnconfirmedAge_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// SetMaxUnconfirmedBlocks provides a mock function with given fields: _a0, _a1
-func (_m *MockPrometheusBackend) SetMaxUnconfirmedBlocks(_a0 *big.Int, _a1 int64) {
- _m.Called(_a0, _a1)
-}
-
-// MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetMaxUnconfirmedBlocks'
-type MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call struct {
- *mock.Call
-}
-
-// SetMaxUnconfirmedBlocks is a helper method to define mock.On call
-// - _a0 *big.Int
-// - _a1 int64
-func (_e *MockPrometheusBackend_Expecter) SetMaxUnconfirmedBlocks(_a0 interface{}, _a1 interface{}) *MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call {
- return &MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call{Call: _e.mock.On("SetMaxUnconfirmedBlocks", _a0, _a1)}
-}
-
-func (_c *MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call) Run(run func(_a0 *big.Int, _a1 int64)) *MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(*big.Int), args[1].(int64))
- })
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call) Return() *MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call {
- _c.Call.Return()
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call) RunAndReturn(run func(*big.Int, int64)) *MockPrometheusBackend_SetMaxUnconfirmedBlocks_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// SetPipelineRunsQueued provides a mock function with given fields: n
-func (_m *MockPrometheusBackend) SetPipelineRunsQueued(n int) {
- _m.Called(n)
-}
-
-// MockPrometheusBackend_SetPipelineRunsQueued_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetPipelineRunsQueued'
-type MockPrometheusBackend_SetPipelineRunsQueued_Call struct {
- *mock.Call
-}
-
-// SetPipelineRunsQueued is a helper method to define mock.On call
-// - n int
-func (_e *MockPrometheusBackend_Expecter) SetPipelineRunsQueued(n interface{}) *MockPrometheusBackend_SetPipelineRunsQueued_Call {
- return &MockPrometheusBackend_SetPipelineRunsQueued_Call{Call: _e.mock.On("SetPipelineRunsQueued", n)}
-}
-
-func (_c *MockPrometheusBackend_SetPipelineRunsQueued_Call) Run(run func(n int)) *MockPrometheusBackend_SetPipelineRunsQueued_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(int))
- })
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetPipelineRunsQueued_Call) Return() *MockPrometheusBackend_SetPipelineRunsQueued_Call {
- _c.Call.Return()
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetPipelineRunsQueued_Call) RunAndReturn(run func(int)) *MockPrometheusBackend_SetPipelineRunsQueued_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// SetPipelineTaskRunsQueued provides a mock function with given fields: n
-func (_m *MockPrometheusBackend) SetPipelineTaskRunsQueued(n int) {
- _m.Called(n)
-}
-
-// MockPrometheusBackend_SetPipelineTaskRunsQueued_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetPipelineTaskRunsQueued'
-type MockPrometheusBackend_SetPipelineTaskRunsQueued_Call struct {
- *mock.Call
-}
-
-// SetPipelineTaskRunsQueued is a helper method to define mock.On call
-// - n int
-func (_e *MockPrometheusBackend_Expecter) SetPipelineTaskRunsQueued(n interface{}) *MockPrometheusBackend_SetPipelineTaskRunsQueued_Call {
- return &MockPrometheusBackend_SetPipelineTaskRunsQueued_Call{Call: _e.mock.On("SetPipelineTaskRunsQueued", n)}
-}
-
-func (_c *MockPrometheusBackend_SetPipelineTaskRunsQueued_Call) Run(run func(n int)) *MockPrometheusBackend_SetPipelineTaskRunsQueued_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(int))
- })
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetPipelineTaskRunsQueued_Call) Return() *MockPrometheusBackend_SetPipelineTaskRunsQueued_Call {
- _c.Call.Return()
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetPipelineTaskRunsQueued_Call) RunAndReturn(run func(int)) *MockPrometheusBackend_SetPipelineTaskRunsQueued_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// SetUnconfirmedTransactions provides a mock function with given fields: _a0, _a1
-func (_m *MockPrometheusBackend) SetUnconfirmedTransactions(_a0 *big.Int, _a1 int64) {
- _m.Called(_a0, _a1)
-}
-
-// MockPrometheusBackend_SetUnconfirmedTransactions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetUnconfirmedTransactions'
-type MockPrometheusBackend_SetUnconfirmedTransactions_Call struct {
- *mock.Call
-}
-
-// SetUnconfirmedTransactions is a helper method to define mock.On call
-// - _a0 *big.Int
-// - _a1 int64
-func (_e *MockPrometheusBackend_Expecter) SetUnconfirmedTransactions(_a0 interface{}, _a1 interface{}) *MockPrometheusBackend_SetUnconfirmedTransactions_Call {
- return &MockPrometheusBackend_SetUnconfirmedTransactions_Call{Call: _e.mock.On("SetUnconfirmedTransactions", _a0, _a1)}
-}
-
-func (_c *MockPrometheusBackend_SetUnconfirmedTransactions_Call) Run(run func(_a0 *big.Int, _a1 int64)) *MockPrometheusBackend_SetUnconfirmedTransactions_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(*big.Int), args[1].(int64))
- })
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetUnconfirmedTransactions_Call) Return() *MockPrometheusBackend_SetUnconfirmedTransactions_Call {
- _c.Call.Return()
- return _c
-}
-
-func (_c *MockPrometheusBackend_SetUnconfirmedTransactions_Call) RunAndReturn(run func(*big.Int, int64)) *MockPrometheusBackend_SetUnconfirmedTransactions_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// NewMockPrometheusBackend creates a new instance of MockPrometheusBackend. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-// The first argument is typically a *testing.T value.
-func NewMockPrometheusBackend(t interface {
- mock.TestingT
- Cleanup(func())
-}) *MockPrometheusBackend {
- mock := &MockPrometheusBackend{}
- mock.Mock.Test(t)
-
- t.Cleanup(func() { mock.AssertExpectations(t) })
-
- return mock
-}
diff --git a/core/services/headreporter/telemetry_reporter.go b/core/services/headreporter/telemetry_reporter.go
deleted file mode 100644
index 0d93ca59a4..0000000000
--- a/core/services/headreporter/telemetry_reporter.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package headreporter
-
-import (
- "context"
- "math/big"
-
- "github.com/pkg/errors"
-
- "github.com/smartcontractkit/libocr/commontypes"
- "google.golang.org/protobuf/proto"
-
- evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/synchronization"
- "github.com/smartcontractkit/chainlink/v2/core/services/synchronization/telem"
- "github.com/smartcontractkit/chainlink/v2/core/services/telemetry"
-)
-
-type telemetryReporter struct {
- lggr logger.Logger
- endpoints map[uint64]commontypes.MonitoringEndpoint
-}
-
-func NewTelemetryReporter(monitoringEndpointGen telemetry.MonitoringEndpointGenerator, lggr logger.Logger, chainIDs ...*big.Int) HeadReporter {
- endpoints := make(map[uint64]commontypes.MonitoringEndpoint)
- for _, chainID := range chainIDs {
- endpoints[chainID.Uint64()] = monitoringEndpointGen.GenMonitoringEndpoint("EVM", chainID.String(), "", synchronization.HeadReport)
- }
- return &telemetryReporter{lggr: lggr.Named("TelemetryReporter"), endpoints: endpoints}
-}
-
-func (t *telemetryReporter) ReportNewHead(ctx context.Context, head *evmtypes.Head) error {
- monitoringEndpoint := t.endpoints[head.EVMChainID.ToInt().Uint64()]
- if monitoringEndpoint == nil {
- return errors.Errorf("No monitoring endpoint provided chain_id=%d", head.EVMChainID.Int64())
- }
- var finalized *telem.Block
- latestFinalizedHead := head.LatestFinalizedHead()
- if latestFinalizedHead != nil {
- finalized = &telem.Block{
- Timestamp: uint64(latestFinalizedHead.GetTimestamp().UTC().Unix()),
- Number: uint64(latestFinalizedHead.BlockNumber()),
- Hash: latestFinalizedHead.BlockHash().Hex(),
- }
- }
- request := &telem.HeadReportRequest{
- ChainID: head.EVMChainID.String(),
- Latest: &telem.Block{
- Timestamp: uint64(head.Timestamp.UTC().Unix()),
- Number: uint64(head.Number),
- Hash: head.Hash.Hex(),
- },
- Finalized: finalized,
- }
- bytes, err := proto.Marshal(request)
- if err != nil {
- return errors.WithMessage(err, "telem.HeadReportRequest marshal error")
- }
- monitoringEndpoint.SendLog(bytes)
- if finalized == nil {
- t.lggr.Infow("No finalized block was found", "chainID", head.EVMChainID.Int64(),
- "head.number", head.Number, "chainLength", head.ChainLength())
- }
- return nil
-}
-
-func (t *telemetryReporter) ReportPeriodic(ctx context.Context) error {
- return nil
-}
diff --git a/core/services/headreporter/telemetry_reporter_test.go b/core/services/headreporter/telemetry_reporter_test.go
deleted file mode 100644
index 85bfea5866..0000000000
--- a/core/services/headreporter/telemetry_reporter_test.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package headreporter_test
-
-import (
- "math/big"
- "testing"
- "time"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/stretchr/testify/assert"
- "google.golang.org/protobuf/proto"
-
- mocks2 "github.com/smartcontractkit/chainlink/v2/common/types/mocks"
- evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/headreporter"
- "github.com/smartcontractkit/chainlink/v2/core/services/synchronization"
- "github.com/smartcontractkit/chainlink/v2/core/services/synchronization/telem"
- "github.com/smartcontractkit/chainlink/v2/core/services/telemetry"
-)
-
-func Test_TelemetryReporter_NewHead(t *testing.T) {
- head := evmtypes.Head{
- Number: 42,
- EVMChainID: ubig.NewI(100),
- Hash: common.HexToHash("0x1010"),
- Timestamp: time.UnixMilli(1000),
- IsFinalized: false,
- Parent: &evmtypes.Head{
- Number: 41,
- Hash: common.HexToHash("0x1009"),
- Timestamp: time.UnixMilli(999),
- IsFinalized: true,
- },
- }
- requestBytes, err := proto.Marshal(&telem.HeadReportRequest{
- ChainID: "100",
- Latest: &telem.Block{
- Timestamp: uint64(head.Timestamp.UTC().Unix()),
- Number: 42,
- Hash: head.Hash.Hex(),
- },
- Finalized: &telem.Block{
- Timestamp: uint64(head.Parent.Timestamp.UTC().Unix()),
- Number: 41,
- Hash: head.Parent.Hash.Hex(),
- },
- })
- assert.NoError(t, err)
-
- monitoringEndpoint := mocks2.NewMonitoringEndpoint(t)
- monitoringEndpoint.On("SendLog", requestBytes).Return()
-
- monitoringEndpointGen := telemetry.NewMockMonitoringEndpointGenerator(t)
- monitoringEndpointGen.
- On("GenMonitoringEndpoint", "EVM", "100", "", synchronization.HeadReport).
- Return(monitoringEndpoint)
- reporter := headreporter.NewTelemetryReporter(monitoringEndpointGen, logger.TestLogger(t), big.NewInt(100))
-
- err = reporter.ReportNewHead(testutils.Context(t), &head)
- assert.NoError(t, err)
-}
-
-func Test_TelemetryReporter_NewHeadMissingFinalized(t *testing.T) {
- head := evmtypes.Head{
- Number: 42,
- EVMChainID: ubig.NewI(100),
- Hash: common.HexToHash("0x1010"),
- Timestamp: time.UnixMilli(1000),
- IsFinalized: false,
- }
- requestBytes, err := proto.Marshal(&telem.HeadReportRequest{
- ChainID: "100",
- Latest: &telem.Block{
- Timestamp: uint64(head.Timestamp.UTC().Unix()),
- Number: 42,
- Hash: head.Hash.Hex(),
- },
- })
- assert.NoError(t, err)
-
- monitoringEndpoint := mocks2.NewMonitoringEndpoint(t)
- monitoringEndpoint.On("SendLog", requestBytes).Return()
-
- monitoringEndpointGen := telemetry.NewMockMonitoringEndpointGenerator(t)
- monitoringEndpointGen.
- On("GenMonitoringEndpoint", "EVM", "100", "", synchronization.HeadReport).
- Return(monitoringEndpoint)
- reporter := headreporter.NewTelemetryReporter(monitoringEndpointGen, logger.TestLogger(t), big.NewInt(100))
-
- err = reporter.ReportNewHead(testutils.Context(t), &head)
- assert.NoError(t, err)
-}
-
-func Test_TelemetryReporter_NewHead_MissingEndpoint(t *testing.T) {
- monitoringEndpointGen := telemetry.NewMockMonitoringEndpointGenerator(t)
- monitoringEndpointGen.
- On("GenMonitoringEndpoint", "EVM", "100", "", synchronization.HeadReport).
- Return(nil)
-
- reporter := headreporter.NewTelemetryReporter(monitoringEndpointGen, logger.TestLogger(t), big.NewInt(100))
-
- head := evmtypes.Head{Number: 42, EVMChainID: ubig.NewI(100)}
-
- err := reporter.ReportNewHead(testutils.Context(t), &head)
- assert.Errorf(t, err, "No monitoring endpoint provided chain_id=100")
-}
diff --git a/core/services/job/helpers_test.go b/core/services/job/helpers_test.go
index d69056ae81..6f9bee66a0 100644
--- a/core/services/job/helpers_test.go
+++ b/core/services/job/helpers_test.go
@@ -71,7 +71,6 @@ maxServiceWorkers = 100
cacheEvictionInterval = "1s"
mercuryCredentialName = "%s"
contractVersion = "v2.1"
-useBufferV1 = %v
`
voterTurnoutDataSourceTemplate = `
// data source 1
@@ -277,7 +276,7 @@ func makeOCR2Keeper21JobSpec(t testing.TB, ks keystore.Master, transmitter commo
_, registry := cltest.MustInsertRandomKey(t, ks.Eth())
ocr2Keeper21Job := fmt.Sprintf(ocr2Keeper21JobSpecTemplate, registry.String(), kb.ID(), transmitter,
- fmt.Sprintf("%s127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), chainID, "mercury cred", false)
+ fmt.Sprintf("%s127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), chainID, "mercury cred")
jobSpec := makeOCR2JobSpecFromToml(t, ocr2Keeper21Job)
diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go
index 92d6cc65bc..7c99083a97 100644
--- a/core/services/ocr2/delegate.go
+++ b/core/services/ocr2/delegate.go
@@ -66,7 +66,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21"
ocr2keeper21core "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/validate"
"github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon"
"github.com/smartcontractkit/chainlink/v2/core/services/pipeline"
@@ -1188,14 +1187,6 @@ func (d *Delegate) newServicesOCR2Keepers21(
return nil, errors.New("could not coerce PluginProvider to AutomationProvider")
}
- // TODO: (AUTO-9355) remove once we remove v0
- if useBufferV1 := cfg.UseBufferV1 != nil && *cfg.UseBufferV1; useBufferV1 {
- logProviderFeatures, ok := keeperProvider.LogEventProvider().(logprovider.LogEventProviderFeatures)
- if ok {
- logProviderFeatures.WithBufferVersion("v1")
- }
- }
-
services, err := ocr2keeper.EVMDependencies21(kb)
if err != nil {
return nil, errors.Wrap(err, "could not build dependencies for ocr2 keepers")
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/batching.go b/core/services/ocr2/plugins/ccip/ccipexec/batching.go
index b457dd986d..f096953f5d 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/batching.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/batching.go
@@ -24,6 +24,12 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker"
)
+// Batching strategies
+const (
+ BestEffortBatchingStrategyID = uint32(0)
+ ZKOverflowBatchingStrategyID = uint32(1)
+)
+
type BatchContext struct {
report commitReportWithSendRequests
inflight []InflightInternalExecutionReport
@@ -47,6 +53,7 @@ type BatchContext struct {
type BatchingStrategy interface {
BuildBatch(ctx context.Context, batchCtx *BatchContext) ([]ccip.ObservedMessage, []messageExecStatus)
+ GetBatchingStrategyID() uint32
}
type BestEffortBatchingStrategy struct{}
@@ -58,9 +65,9 @@ type ZKOverflowBatchingStrategy struct {
func NewBatchingStrategy(batchingStrategyID uint32, statusChecker statuschecker.CCIPTransactionStatusChecker) (BatchingStrategy, error) {
var batchingStrategy BatchingStrategy
switch batchingStrategyID {
- case 0:
+ case BestEffortBatchingStrategyID:
batchingStrategy = &BestEffortBatchingStrategy{}
- case 1:
+ case ZKOverflowBatchingStrategyID:
batchingStrategy = &ZKOverflowBatchingStrategy{
statuschecker: statusChecker,
}
@@ -70,6 +77,10 @@ func NewBatchingStrategy(batchingStrategyID uint32, statusChecker statuschecker.
return batchingStrategy, nil
}
+func (s *BestEffortBatchingStrategy) GetBatchingStrategyID() uint32 {
+ return BestEffortBatchingStrategyID
+}
+
// BestEffortBatchingStrategy is a batching strategy that tries to batch as many messages as possible (up to certain limits).
func (s *BestEffortBatchingStrategy) BuildBatch(
ctx context.Context,
@@ -95,6 +106,10 @@ func (s *BestEffortBatchingStrategy) BuildBatch(
return batchBuilder.batch, batchBuilder.statuses
}
+func (bs *ZKOverflowBatchingStrategy) GetBatchingStrategyID() uint32 {
+ return ZKOverflowBatchingStrategyID
+}
+
// ZKOverflowBatchingStrategy is a batching strategy for ZK chains overflowing under certain conditions.
// It is a simple batching strategy that only allows one message to be added to the batch.
// TXM is used to perform the ZK check: if the message failed the check, it will be skipped.
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go b/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go
index 3647556a6d..4393fc5f58 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go
@@ -850,13 +850,13 @@ func runBatchingStrategyTests(t *testing.T, strategy BatchingStrategy, available
seqNrs, execStates := strategy.BuildBatch(context.Background(), batchContext)
- runAssertions(t, tc, seqNrs, execStates)
+ runAssertions(t, tc, seqNrs, execStates, strategy)
})
}
}
// Utility function to run common assertions
-func runAssertions(t *testing.T, tc testCase, seqNrs []ccip.ObservedMessage, execStates []messageExecStatus) {
+func runAssertions(t *testing.T, tc testCase, seqNrs []ccip.ObservedMessage, execStates []messageExecStatus, strategy BatchingStrategy) {
if tc.expectedSeqNrs == nil {
assert.Len(t, seqNrs, 0)
} else {
@@ -868,6 +868,13 @@ func runAssertions(t *testing.T, tc testCase, seqNrs []ccip.ObservedMessage, exe
} else {
assert.Equal(t, tc.expectedStates, execStates)
}
+
+ batchingStratID := strategy.GetBatchingStrategyID()
+ if strategyType := reflect.TypeOf(strategy); strategyType == reflect.TypeOf(&BestEffortBatchingStrategy{}) {
+ assert.Equal(t, batchingStratID, uint32(0))
+ } else {
+ assert.Equal(t, batchingStratID, uint32(1))
+ }
}
func createTestMessage(seqNr uint64, sender cciptypes.Address, nonce uint64, feeToken cciptypes.Address, feeAmount *big.Int, executed bool, data []byte) cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta {
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go b/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
index 4a09cf37b4..2c70cac497 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
@@ -468,6 +468,19 @@ func (r *ExecutionReportingPlugin) buildReport(ctx context.Context, lggr logger.
return encodedReport, nil
}
+// Returns required number of observations to reach consensus
+func (r *ExecutionReportingPlugin) getConsensusThreshold() int {
+ // Default consensus threshold is F+1
+ consensusThreshold := r.F + 1
+ if r.batchingStrategy.GetBatchingStrategyID() == ZKOverflowBatchingStrategyID {
+ // For batching strategy 1, consensus threshold is 2F+1
+ // This is because chains that can overflow need to reach consensus during the inflight cache period
+ // to avoid 2 transmissions round of an overflown message.
+ consensusThreshold = 2*r.F + 1
+ }
+ return consensusThreshold
+}
+
func (r *ExecutionReportingPlugin) Report(ctx context.Context, timestamp types.ReportTimestamp, query types.Query, observations []types.AttributedObservation) (bool, types.Report, error) {
lggr := r.lggr.Named("ExecutionReport")
if healthy, err := r.chainHealthcheck.IsHealthy(ctx); err != nil {
@@ -475,14 +488,16 @@ func (r *ExecutionReportingPlugin) Report(ctx context.Context, timestamp types.R
} else if !healthy {
return false, nil, ccip.ErrChainIsNotHealthy
}
+ consensusThreshold := r.getConsensusThreshold()
+ lggr.Infof("Consensus threshold set to: %d", consensusThreshold)
+
parsableObservations := ccip.GetParsableObservations[ccip.ExecutionObservation](lggr, observations)
- // Need at least F+1 observations
- if len(parsableObservations) <= r.F {
- lggr.Warn("Non-empty observations <= F, need at least F+1 to continue")
+ if len(parsableObservations) < consensusThreshold {
+ lggr.Warnf("Insufficient observations: only %d received, but need more than %d to proceed", len(parsableObservations), consensusThreshold)
return false, nil, nil
}
- observedMessages, err := calculateObservedMessagesConsensus(parsableObservations, r.F)
+ observedMessages, err := calculateObservedMessagesConsensus(parsableObservations, consensusThreshold)
if err != nil {
return false, nil, err
}
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go b/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
index 627afda975..fea05ab61c 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
@@ -42,6 +42,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/prices"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker"
)
func TestExecutionReportingPlugin_Observation(t *testing.T) {
@@ -232,19 +233,21 @@ func TestExecutionReportingPlugin_Observation(t *testing.T) {
func TestExecutionReportingPlugin_Report(t *testing.T) {
testCases := []struct {
- name string
- f int
- committedSeqNum uint64
- observations []ccip.ExecutionObservation
+ name string
+ f int
+ batchingStrategyId uint32
+ committedSeqNum uint64
+ observations []ccip.ExecutionObservation
expectingSomeReport bool
expectedReport cciptypes.ExecReport
expectingSomeErr bool
}{
{
- name: "not enough observations to form consensus",
- f: 5,
- committedSeqNum: 5,
+ name: "not enough observations to form consensus - best effort batching",
+ f: 5,
+ batchingStrategyId: 0,
+ committedSeqNum: 5,
observations: []ccip.ExecutionObservation{
{Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
{Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
@@ -252,6 +255,21 @@ func TestExecutionReportingPlugin_Report(t *testing.T) {
expectingSomeErr: false,
expectingSomeReport: false,
},
+ {
+ name: "not enough observaitons to form consensus - zk batching",
+ f: 5,
+ batchingStrategyId: 1,
+ committedSeqNum: 5,
+ observations: []ccip.ExecutionObservation{
+ {Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
+ {Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
+ {Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
+ {Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
+ {Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
+ {Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
+ {Messages: map[uint64]ccip.MsgData{3: {}, 4: {}}},
+ },
+ },
{
name: "zero observations",
f: 0,
@@ -268,6 +286,9 @@ func TestExecutionReportingPlugin_Report(t *testing.T) {
p := ExecutionReportingPlugin{}
p.lggr = logger.TestLogger(t)
p.F = tc.f
+ bs, err := NewBatchingStrategy(tc.batchingStrategyId, &statuschecker.TxmStatusChecker{})
+ assert.NoError(t, err)
+ p.batchingStrategy = bs
p.commitStoreReader = ccipdatamocks.NewCommitStoreReader(t)
chainHealthcheck := ccipcachemocks.NewChainHealthcheck(t)
@@ -281,12 +302,12 @@ func TestExecutionReportingPlugin_Report(t *testing.T) {
observations[i] = types.AttributedObservation{Observation: b, Observer: commontypes.OracleID(i + 1)}
}
- _, _, err := p.Report(ctx, types.ReportTimestamp{}, types.Query{}, observations)
+ _, _, err2 := p.Report(ctx, types.ReportTimestamp{}, types.Query{}, observations)
if tc.expectingSomeErr {
- assert.Error(t, err)
+ assert.Error(t, err2)
return
}
- assert.NoError(t, err)
+ assert.NoError(t, err2)
})
}
}
@@ -1422,3 +1443,37 @@ func TestExecutionReportingPlugin_ensurePriceRegistrySynchronization(t *testing.
require.NoError(t, err)
require.Equal(t, mockPriceRegistryReader2, p.sourcePriceRegistry)
}
+
+func TestExecutionReportingPlugin_getConsensusThreshold(t *testing.T) {
+ tests := []struct {
+ name string
+ batchingStrategyID uint32
+ F int
+ expectedConsensusThreshold int
+ }{
+ {
+ name: "zk batching strategy",
+ batchingStrategyID: uint32(1),
+ F: 5,
+ expectedConsensusThreshold: 11,
+ },
+ {
+ name: "default batching strategy",
+ batchingStrategyID: uint32(0),
+ F: 5,
+ expectedConsensusThreshold: 6,
+ },
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ p := &ExecutionReportingPlugin{}
+ p.F = tc.F
+ bs, err := NewBatchingStrategy(tc.batchingStrategyID, &statuschecker.TxmStatusChecker{})
+ assert.NoError(t, err)
+ p.batchingStrategy = bs
+
+ require.Equal(t, tc.expectedConsensusThreshold, p.getConsensusThreshold())
+ })
+ }
+}
diff --git a/core/services/ocr2/plugins/ccip/observations.go b/core/services/ocr2/plugins/ccip/observations.go
index f79d667a55..29fa85021f 100644
--- a/core/services/ocr2/plugins/ccip/observations.go
+++ b/core/services/ocr2/plugins/ccip/observations.go
@@ -19,6 +19,10 @@ import (
// Note if a breaking change is introduced to this struct nodes running different versions
// will not be able to unmarshal each other's observations. Do not modify unless you
// know what you are doing.
+//
+// IMPORTANT: Both CommitObservation and ExecutionObservation are streamed and processed by Atlas.
+// Any change to that struct must be reflected in the Atlas codebase.
+// Additionally, you must test if OTI telemetry ingestion works with the new struct on staging environment.
type CommitObservation struct {
Interval cciptypes.CommitStoreInterval `json:"interval"`
TokenPricesUSD map[cciptypes.Address]*big.Int `json:"tokensPerFeeCoin"`
@@ -47,6 +51,10 @@ func (o CommitObservation) Marshal() ([]byte, error) {
// Note if a breaking change is introduced to this struct nodes running different versions
// will not be able to unmarshal each other's observations. Do not modify unless you
// know what you are doing.
+//
+// IMPORTANT: Both CommitObservation and ExecutionObservation are streamed and processed by Atlas.
+// Any change to that struct must be reflected in the Atlas codebase.
+// Additionally, you must test if OTI telemetry ingestion works with the new struct on staging environment.
type ExecutionObservation struct {
Messages map[uint64]MsgData `json:"messages"`
}
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go
index 73c5992470..bb2f6b0f7c 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go
@@ -38,6 +38,7 @@ import (
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ evmcapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
v2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
@@ -460,9 +461,10 @@ func setupNodeCCIP(
}
loopRegistry := plugins.NewLoopRegistry(lggr.Named("LoopRegistry"), config.Tracing())
relayerFactory := chainlink.RelayerFactory{
- Logger: lggr,
- LoopRegistry: loopRegistry,
- GRPCOpts: loop.GRPCOpts{},
+ Logger: lggr,
+ LoopRegistry: loopRegistry,
+ GRPCOpts: loop.GRPCOpts{},
+ CapabilitiesRegistry: evmcapabilities.NewRegistry(logger.TestLogger(t)),
}
testCtx := testutils.Context(t)
// evm alway enabled for backward compatibility
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go
index 5099a4b57e..8d7a4551f1 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go
@@ -37,6 +37,7 @@ import (
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ evmcapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
v2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
@@ -457,9 +458,10 @@ func setupNodeCCIP(
}
loopRegistry := plugins.NewLoopRegistry(lggr.Named("LoopRegistry"), config.Tracing())
relayerFactory := chainlink.RelayerFactory{
- Logger: lggr,
- LoopRegistry: loopRegistry,
- GRPCOpts: loop.GRPCOpts{},
+ Logger: lggr,
+ LoopRegistry: loopRegistry,
+ GRPCOpts: loop.GRPCOpts{},
+ CapabilitiesRegistry: evmcapabilities.NewRegistry(lggr),
}
testCtx := testutils.Context(t)
// evm alway enabled for backward compatibility
diff --git a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go
index 49a79463a5..639d8ec04d 100644
--- a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go
+++ b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go
@@ -217,7 +217,9 @@ func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts,
}
var initialAllowedSenders []common.Address
var initialBlockedSenders []common.Address
- allowListAddress, _, allowListContract, err := functions_allow_list.DeployTermsOfServiceAllowList(owner, b, allowListConfig, initialAllowedSenders, initialBlockedSenders)
+ // The allowlist requires a pointer to the previous allowlist. If none exists, use the null address.
+ var nullPreviousAllowlist common.Address
+ allowListAddress, _, allowListContract, err := functions_allow_list.DeployTermsOfServiceAllowList(owner, b, allowListConfig, initialAllowedSenders, initialBlockedSenders, nullPreviousAllowlist)
require.NoError(t, err)
// Deploy Coordinator contract (matches updateConfig() in FunctionsBilling.sol)
diff --git a/core/services/ocr2/plugins/ocr2keeper/config.go b/core/services/ocr2/plugins/ocr2keeper/config.go
index 4b41e5a028..ec56f9c699 100644
--- a/core/services/ocr2/plugins/ocr2keeper/config.go
+++ b/core/services/ocr2/plugins/ocr2keeper/config.go
@@ -60,9 +60,6 @@ type PluginConfig struct {
ContractVersion string `json:"contractVersion"`
// CaptureAutomationCustomTelemetry is a bool flag to toggle Custom Telemetry Service
CaptureAutomationCustomTelemetry *bool `json:"captureAutomationCustomTelemetry,omitempty"`
- // UseBufferV1 is a bool flag to toggle the new log buffer implementation
- // TODO: (AUTO-9355) remove once we have a single version
- UseBufferV1 *bool `json:"useBufferV1,omitempty"`
}
func ValidatePluginConfig(cfg PluginConfig) error {
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer.go
deleted file mode 100644
index af934a0801..0000000000
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer.go
+++ /dev/null
@@ -1,388 +0,0 @@
-package logprovider
-
-import (
- "encoding/hex"
- "math/big"
- "sort"
- "sync"
- "sync/atomic"
-
- "github.com/smartcontractkit/chainlink-automation/pkg/v3/random"
- ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation"
-
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/prommetrics"
-)
-
-var (
- // defaultFastExecLogsHigh is the default upper bound / maximum number of logs that Automation is committed to process for each upkeep,
- // based on available capacity, i.e. if there are no logs from other upkeeps.
- // Used by Log buffer to limit the number of logs we are saving in memory for each upkeep in a block
- defaultFastExecLogsHigh = 32
- // defaultNumOfLogUpkeeps is the default number of log upkeeps supported by the registry.
- defaultNumOfLogUpkeeps = 50
-)
-
-// fetchedLog holds the log and the ID of the upkeep
-type fetchedLog struct {
- upkeepID *big.Int
- log logpoller.Log
- // cachedLogID is the cached log identifier, used for sorting.
- // It is calculated lazily, and cached for performance.
- cachedLogID string
-}
-
-func (l *fetchedLog) getLogID() string {
- if len(l.cachedLogID) == 0 {
- ext := ocr2keepers.LogTriggerExtension{
- Index: uint32(l.log.LogIndex),
- }
- copy(ext.TxHash[:], l.log.TxHash[:])
- copy(ext.BlockHash[:], l.log.BlockHash[:])
- l.cachedLogID = hex.EncodeToString(ext.LogIdentifier())
- }
- return l.cachedLogID
-}
-
-// fetchedBlock holds the logs fetched for a block
-type fetchedBlock struct {
- blockNumber int64
- // logs is the logs fetched for the block and haven't been visited yet
- logs []fetchedLog
- // visited is the logs fetched for the block and have been visited.
- // We keep them in order to avoid fetching them again.
- visited []fetchedLog
-}
-
-func (b *fetchedBlock) Append(lggr logger.Logger, fl fetchedLog, maxBlockLogs, maxUpkeepLogs int) (fetchedLog, bool) {
- has, upkeepLogs := b.has(fl.upkeepID, fl.log)
- if has {
- // Skipping known logs
- return fetchedLog{}, false
- }
- // lggr.Debugw("Adding log", "i", i, "blockBlock", currentBlock.blockNumber, "logBlock", log.BlockNumber, "id", id)
- b.logs = append(b.logs, fl)
-
- // drop logs if we reached limits.
- if upkeepLogs+1 > maxUpkeepLogs {
- // in case we have logs overflow for a particular upkeep, we drop a log of that upkeep,
- // based on shared, random (per block) order of the logs in the block.
- b.Sort()
- var dropped fetchedLog
- currentLogs := make([]fetchedLog, 0, len(b.logs)-1)
- for _, l := range b.logs {
- if dropped.upkeepID == nil && l.upkeepID.Cmp(fl.upkeepID) == 0 {
- dropped = l
- continue
- }
- currentLogs = append(currentLogs, l)
- }
- b.logs = currentLogs
- return dropped, true
- } else if len(b.logs)+len(b.visited) > maxBlockLogs {
- // in case we have logs overflow in the buffer level, we drop a log based on
- // shared, random (per block) order of the logs in the block.
- b.Sort()
- dropped := b.logs[0]
- b.logs = b.logs[1:]
- return dropped, true
- }
-
- return fetchedLog{}, true
-}
-
-// Has returns true if the block has the log,
-// and the number of logs for that upkeep in the block.
-func (b fetchedBlock) has(id *big.Int, log logpoller.Log) (bool, int) {
- allLogs := append(b.logs, b.visited...)
- upkeepLogs := 0
- for _, l := range allLogs {
- if l.upkeepID.Cmp(id) != 0 {
- continue
- }
- upkeepLogs++
- if l.log.BlockHash == log.BlockHash && l.log.TxHash == log.TxHash && l.log.LogIndex == log.LogIndex {
- return true, upkeepLogs
- }
- }
- return false, upkeepLogs
-}
-
-func (b fetchedBlock) Clone() fetchedBlock {
- logs := make([]fetchedLog, len(b.logs))
- copy(logs, b.logs)
- visited := make([]fetchedLog, len(b.visited))
- copy(visited, b.visited)
- return fetchedBlock{
- blockNumber: b.blockNumber,
- logs: logs,
- visited: visited,
- }
-}
-
-// Sort by log identifiers, shuffled using a pseduorandom souce that is shared across all nodes
-// for a given block.
-func (b *fetchedBlock) Sort() {
- randSeed := random.GetRandomKeySource(nil, uint64(b.blockNumber))
-
- shuffledLogIDs := make(map[string]string, len(b.logs))
- for _, log := range b.logs {
- logID := log.getLogID()
- shuffledLogIDs[logID] = random.ShuffleString(logID, randSeed)
- }
-
- sort.SliceStable(b.logs, func(i, j int) bool {
- return shuffledLogIDs[b.logs[i].getLogID()] < shuffledLogIDs[b.logs[j].getLogID()]
- })
-}
-
-// logEventBuffer is a circular/ring buffer of fetched logs.
-// Each entry in the buffer represents a block,
-// and holds the logs fetched for that block.
-type logEventBuffer struct {
- lggr logger.Logger
- lock sync.RWMutex
- // size is the number of blocks supported by the buffer
- size int32
-
- numOfLogUpkeeps, fastExecLogsHigh uint32
- // blocks is the circular buffer of fetched blocks
- blocks []fetchedBlock
- // latestBlock is the latest block number seen
- latestBlock int64
-}
-
-func newLogEventBuffer(lggr logger.Logger, size, numOfLogUpkeeps, fastExecLogsHigh int) *logEventBuffer {
- return &logEventBuffer{
- lggr: lggr.Named("KeepersRegistry.LogEventBuffer"),
- size: int32(size),
- blocks: make([]fetchedBlock, size),
- numOfLogUpkeeps: uint32(numOfLogUpkeeps),
- fastExecLogsHigh: uint32(fastExecLogsHigh),
- }
-}
-
-func (b *logEventBuffer) latestBlockSeen() int64 {
- return atomic.LoadInt64(&b.latestBlock)
-}
-
-func (b *logEventBuffer) bufferSize() int {
- return int(atomic.LoadInt32(&b.size))
-}
-
-func (b *logEventBuffer) SetLimits(numOfLogUpkeeps, fastExecLogsHigh int) {
- atomic.StoreUint32(&b.numOfLogUpkeeps, uint32(numOfLogUpkeeps))
- atomic.StoreUint32(&b.fastExecLogsHigh, uint32(fastExecLogsHigh))
-}
-
-// enqueue adds logs (if not exist) to the buffer, returning the number of logs added
-// minus the number of logs dropped.
-func (b *logEventBuffer) enqueue(id *big.Int, logs ...logpoller.Log) int {
- b.lock.Lock()
- defer b.lock.Unlock()
-
- lggr := b.lggr.With("id", id.String())
-
- maxBlockLogs := int(atomic.LoadUint32(&b.fastExecLogsHigh) * atomic.LoadUint32(&b.numOfLogUpkeeps))
- maxUpkeepLogs := int(atomic.LoadUint32(&b.fastExecLogsHigh))
-
- latestBlock := b.latestBlockSeen()
- added, dropped := 0, 0
-
- for _, log := range logs {
- if log.BlockNumber == 0 {
- // invalid log
- continue
- }
- i := b.blockNumberIndex(log.BlockNumber)
- currentBlock := b.blocks[i]
- if currentBlock.blockNumber < log.BlockNumber {
- lggr.Debugw("Got log on a new block", "prevBlock", currentBlock.blockNumber, "newBlock", log.BlockNumber)
- currentBlock.blockNumber = log.BlockNumber
- currentBlock.logs = nil
- currentBlock.visited = nil
- } else if currentBlock.blockNumber > log.BlockNumber {
- // not expected to happen
- lggr.Debugw("Skipping log from old block", "currentBlock", currentBlock.blockNumber, "newBlock", log.BlockNumber)
- continue
- }
- droppedLog, ok := currentBlock.Append(lggr, fetchedLog{upkeepID: id, log: log}, maxBlockLogs, maxUpkeepLogs)
- if !ok {
- // Skipping known logs
- continue
- }
- if droppedLog.upkeepID != nil {
- dropped++
- lggr.Debugw("Reached log buffer limits, dropping log", "blockNumber", droppedLog.log.BlockNumber,
- "blockHash", droppedLog.log.BlockHash, "txHash", droppedLog.log.TxHash, "logIndex", droppedLog.log.LogIndex,
- "upkeepID", droppedLog.upkeepID.String())
- }
- added++
- b.blocks[i] = currentBlock
-
- if log.BlockNumber > latestBlock {
- latestBlock = log.BlockNumber
- }
- }
-
- if latestBlock > b.latestBlockSeen() {
- atomic.StoreInt64(&b.latestBlock, latestBlock)
- }
- if added > 0 {
- lggr.Debugw("Added logs to buffer", "addedLogs", added, "dropped", dropped, "latestBlock", latestBlock)
- prommetrics.AutomationLogBufferFlow.WithLabelValues(prommetrics.LogBufferFlowDirectionIngress).Add(float64(added))
- prommetrics.AutomationLogBufferFlow.WithLabelValues(prommetrics.LogBufferFlowDirectionDropped).Add(float64(dropped))
- }
-
- return added - dropped
-}
-
-// peek returns the logs in range [latestBlock-blocks, latestBlock]
-func (b *logEventBuffer) peek(blocks int) []fetchedLog {
- latestBlock := b.latestBlockSeen()
- if latestBlock == 0 {
- return nil
- }
- if blocks > int(latestBlock) {
- blocks = int(latestBlock) - 1
- }
-
- return b.peekRange(latestBlock-int64(blocks), latestBlock)
-}
-
-// peekRange returns the logs between start and end inclusive.
-func (b *logEventBuffer) peekRange(start, end int64) []fetchedLog {
- b.lock.RLock()
- defer b.lock.RUnlock()
-
- blocksInRange := b.getBlocksInRange(int(start), int(end))
-
- var results []fetchedLog
- for _, block := range blocksInRange {
- // double checking that we don't have any gaps in the range
- if block.blockNumber < start || block.blockNumber > end {
- continue
- }
- results = append(results, block.logs...)
- }
-
- sort.SliceStable(results, func(i, j int) bool {
- return results[i].log.BlockNumber < results[j].log.BlockNumber
- })
-
- b.lggr.Debugw("Peeked logs", "results", len(results), "start", start, "end", end)
-
- return results
-}
-
-// dequeueRange returns the logs between start and end inclusive.
-func (b *logEventBuffer) dequeueRange(start, end int64, upkeepLimit, totalLimit int) []fetchedLog {
- b.lock.Lock()
- defer b.lock.Unlock()
-
- blocksInRange := b.getBlocksInRange(int(start), int(end))
- fetchedBlocks := make([]fetchedBlock, 0, len(blocksInRange))
- for _, block := range blocksInRange {
- // Create clone of the blocks as they get processed and update underlying b.blocks
- fetchedBlocks = append(fetchedBlocks, block.Clone())
- }
-
- // Sort the blocks in reverse order of block number so that latest logs
- // are preferred while dequeueing.
- sort.SliceStable(fetchedBlocks, func(i, j int) bool {
- return fetchedBlocks[i].blockNumber > fetchedBlocks[j].blockNumber
- })
-
- logsCount := map[string]int{}
- totalCount := 0
- var results []fetchedLog
- for _, block := range fetchedBlocks {
- if block.blockNumber < start || block.blockNumber > end {
- // double checking that we don't have any gaps in the range
- continue
- }
- if totalCount >= totalLimit {
- // reached total limit, no need to process more blocks
- break
- }
- // Sort the logs in random order that is shared across all nodes.
- // This ensures that nodes across the network will process the same logs.
- block.Sort()
- var remainingLogs, blockResults []fetchedLog
- for _, log := range block.logs {
- if totalCount >= totalLimit {
- remainingLogs = append(remainingLogs, log)
- continue
- }
- if logsCount[log.upkeepID.String()] >= upkeepLimit {
- remainingLogs = append(remainingLogs, log)
- continue
- }
- blockResults = append(blockResults, log)
- logsCount[log.upkeepID.String()]++
- totalCount++
- }
- if len(blockResults) == 0 {
- continue
- }
- results = append(results, blockResults...)
- block.visited = append(block.visited, blockResults...)
- block.logs = remainingLogs
- b.blocks[b.blockNumberIndex(block.blockNumber)] = block
- }
-
- if len(results) > 0 {
- b.lggr.Debugw("Dequeued logs", "results", len(results), "start", start, "end", end)
- prommetrics.AutomationLogBufferFlow.WithLabelValues(prommetrics.LogBufferFlowDirectionEgress).Add(float64(len(results)))
- }
-
- return results
-}
-
-// getBlocksInRange returns the blocks between start and end.
-// NOTE: this function should be called with the lock held
-func (b *logEventBuffer) getBlocksInRange(start, end int) []fetchedBlock {
- var blocksInRange []fetchedBlock
- start, end = b.blockRangeToIndices(start, end)
- if start == -1 || end == -1 {
- // invalid range
- return blocksInRange
- }
- if start <= end {
- // Normal range, need to return indices from start to end(inclusive)
- return b.blocks[start : end+1]
- }
- // in case we get circular range such as [0, 1, end, ... , start, ..., size-1]
- // we need to return the blocks in two ranges: [0, end](inclusive) and [start, size-1]
- blocksInRange = append(blocksInRange, b.blocks[start:]...)
- blocksInRange = append(blocksInRange, b.blocks[:end+1]...)
-
- return blocksInRange
-}
-
-// blockRangeToIndices returns the normalized range of start to end block range,
-// to indices aligned with buffer size. Note ranges inclusive of start, end indices.
-func (b *logEventBuffer) blockRangeToIndices(start, end int) (int, int) {
- latest := b.latestBlockSeen()
- if end > int(latest) {
- // Limit end of range to latest block seen
- end = int(latest)
- }
- if end < start || start == 0 || end == 0 {
- // invalid range
- return -1, -1
- }
- size := b.bufferSize()
- if end-start >= size {
- // If range requires more than buffer size blocks, only to return
- // last size blocks as that's the max the buffer stores.
- start = (end - size) + 1
- }
- return b.blockNumberIndex(int64(start)), b.blockNumberIndex(int64(end))
-}
-
-// blockNumberIndex returns the index of the block in the buffer
-func (b *logEventBuffer) blockNumberIndex(bn int64) int {
- return int(bn-1) % b.bufferSize()
-}
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go
deleted file mode 100644
index dca43ca14a..0000000000
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_test.go
+++ /dev/null
@@ -1,892 +0,0 @@
-package logprovider
-
-import (
- "encoding/hex"
- "fmt"
- "math/big"
- "testing"
-
- "github.com/smartcontractkit/chainlink-automation/pkg/v3/types"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/stretchr/testify/require"
-
- ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation"
-
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core"
-)
-
-func TestLogEventBuffer_GetBlocksInRange(t *testing.T) {
- size := 3
- maxSeenBlock := int64(4)
- buf := newLogEventBuffer(logger.TestLogger(t), size, 10, 10)
-
- buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0},
- )
-
- buf.enqueue(big.NewInt(2),
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 2},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 2},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- )
-
- tests := []struct {
- name string
- from int64
- to int64
- want int
- }{
- {
- name: "all",
- from: 2,
- to: 4,
- want: 3,
- },
- {
- name: "partial",
- from: 2,
- to: 3,
- want: 2,
- },
- {
- name: "circular",
- from: 3,
- to: 4,
- want: 2,
- },
- {
- name: "zero start",
- from: 0,
- to: 2,
- },
- {
- name: "invalid zero end",
- from: 0,
- to: 0,
- },
- {
- name: "invalid from larger than to",
- from: 4,
- to: 2,
- },
- {
- name: "outside max last seen",
- from: 5,
- to: 10,
- },
- {
- name: "limited by max last seen",
- from: 2,
- to: 5,
- want: 3,
- },
- }
-
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- blocks := buf.getBlocksInRange(int(tc.from), int(tc.to))
- require.Equal(t, tc.want, len(blocks))
- if tc.want > 0 {
- from := tc.from
- require.Equal(t, from, blocks[0].blockNumber)
- to := tc.to
- if to >= maxSeenBlock {
- to = maxSeenBlock
- }
- require.Equal(t, to, blocks[len(blocks)-1].blockNumber)
- }
- })
- }
-}
-
-func TestLogEventBuffer_GetBlocksInRange_Circular(t *testing.T) {
- size := 4
- buf := newLogEventBuffer(logger.TestLogger(t), size, 10, 10)
-
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0},
- ), 3)
-
- require.Equal(t, buf.enqueue(big.NewInt(2),
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 2},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 2},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- ), 3)
-
- require.Equal(t, buf.enqueue(big.NewInt(3),
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 4},
- logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x3"), LogIndex: 2},
- logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x3"), LogIndex: 5},
- ), 3)
-
- tests := []struct {
- name string
- from int64
- to int64
- expectedBlocks []int64
- }{
- {
- name: "happy flow",
- from: 2,
- to: 5,
- expectedBlocks: []int64{2, 3, 4, 5},
- },
- {
- name: "range overflow circular",
- from: 1,
- to: 6,
- expectedBlocks: []int64{2, 3, 4, 5},
- },
- }
-
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- blocks := buf.getBlocksInRange(int(tc.from), int(tc.to))
- require.Equal(t, len(tc.expectedBlocks), len(blocks))
- expectedBlockNumbers := map[int64]bool{}
- for _, b := range tc.expectedBlocks {
- expectedBlockNumbers[b] = false
- }
- for _, b := range blocks {
- expectedBlockNumbers[b.blockNumber] = true
- }
- for k, v := range expectedBlockNumbers {
- require.True(t, v, "missing block %d", k)
- }
- })
- }
-}
-
-func TestLogEventBuffer_EnqueueDequeue(t *testing.T) {
- t.Run("dequeue empty", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10)
-
- results := buf.peekRange(int64(1), int64(2))
- require.Equal(t, 0, len(results))
- results = buf.peek(2)
- require.Equal(t, 0, len(results))
- })
-
- t.Run("enqueue", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10)
-
- buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- )
- buf.lock.Lock()
- require.Equal(t, 2, len(buf.blocks[0].logs))
- buf.lock.Unlock()
- })
-
- t.Run("enqueue logs overflow", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 2, 2, 2)
-
- require.Equal(t, 2, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2},
- ))
- buf.lock.Lock()
- require.Equal(t, 2, len(buf.blocks[0].logs))
- buf.lock.Unlock()
- })
-
- t.Run("enqueue logs overflow with dynamic limits", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 2, 10, 2)
-
- require.Equal(t, 2, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2},
- ))
- buf.SetLimits(10, 3)
- require.Equal(t, 3, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 1},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 2},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 3},
- ))
-
- buf.lock.Lock()
- defer buf.lock.Unlock()
- require.Equal(t, 2, len(buf.blocks[0].logs))
- require.Equal(t, 3, len(buf.blocks[1].logs))
- })
-
- t.Run("enqueue logs overflow with dynamic limits", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 2, 10, 2)
-
- require.Equal(t, 2, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 3},
- ))
- buf.SetLimits(10, 3)
- require.Equal(t, 3, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 1},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 2},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x21"), LogIndex: 3},
- ))
-
- buf.lock.Lock()
- defer buf.lock.Unlock()
- require.Equal(t, 2, len(buf.blocks[0].logs))
- })
-
- t.Run("enqueue block overflow", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 2, 10)
-
- require.Equal(t, 5, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 0},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 1},
- ))
- buf.lock.Lock()
- require.Equal(t, 2, len(buf.blocks[0].logs))
- buf.lock.Unlock()
- })
-
- t.Run("enqueue upkeep block overflow", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 10, 10, 2)
-
- require.Equal(t, 2, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 2},
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 3},
- ))
- buf.lock.Lock()
- require.Equal(t, 2, len(buf.blocks[0].logs))
- buf.lock.Unlock()
- })
-
- t.Run("peek range after dequeue", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10)
-
- require.Equal(t, buf.enqueue(big.NewInt(10),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 10},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 11},
- ), 2)
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- ), 2)
- results := buf.peekRange(int64(1), int64(2))
- require.Equal(t, 2, len(results))
- verifyBlockNumbers(t, results, 1, 2)
- removed := buf.dequeueRange(int64(1), int64(2), 2, 10)
- require.Equal(t, 2, len(removed))
- results = buf.peekRange(int64(1), int64(2))
- require.Equal(t, 0, len(results))
- })
-
- t.Run("enqueue peek and dequeue", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 4, 10, 10)
-
- require.Equal(t, buf.enqueue(big.NewInt(10),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 10},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 11},
- ), 2)
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x1"), LogIndex: 1},
- ), 2)
- results := buf.peek(8)
- require.Equal(t, 4, len(results))
- verifyBlockNumbers(t, results, 1, 2, 3, 3)
- removed := buf.dequeueRange(1, 3, 5, 5)
- require.Equal(t, 4, len(removed))
- buf.lock.Lock()
- require.Equal(t, 0, len(buf.blocks[0].logs))
- require.Equal(t, int64(2), buf.blocks[1].blockNumber)
- require.Equal(t, 1, len(buf.blocks[1].visited))
- buf.lock.Unlock()
- })
-
- t.Run("enqueue and peek range circular", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 10, 10)
-
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0},
- ), 3)
- require.Equal(t, buf.enqueue(big.NewInt(10),
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 10},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 11},
- ), 2)
-
- results := buf.peekRange(int64(1), int64(1))
- require.Equal(t, 0, len(results))
-
- results = buf.peekRange(int64(3), int64(5))
- require.Equal(t, 3, len(results))
- verifyBlockNumbers(t, results, 3, 4, 4)
- })
-
- t.Run("doesnt enqueue old blocks", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 5, 10)
-
- require.Equal(t, buf.enqueue(big.NewInt(10),
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 10},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x1"), LogIndex: 11},
- ), 2)
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0},
- ), 2)
- results := buf.peekRange(int64(1), int64(5))
- fmt.Println(results)
- verifyBlockNumbers(t, results, 2, 3, 4, 4)
- })
-
- t.Run("dequeue with limits returns latest block logs", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 5, 10)
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0},
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 0},
- logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x5"), LogIndex: 0},
- ), 5)
-
- logs := buf.dequeueRange(1, 5, 2, 10)
- require.Equal(t, 2, len(logs))
- require.Equal(t, int64(5), logs[0].log.BlockNumber)
- require.Equal(t, int64(4), logs[1].log.BlockNumber)
-
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 4, TxHash: common.HexToHash("0x4"), LogIndex: 1},
- logpoller.Log{BlockNumber: 5, TxHash: common.HexToHash("0x5"), LogIndex: 1},
- ), 2)
-
- logs = buf.dequeueRange(1, 5, 3, 2)
- require.Equal(t, 2, len(logs))
- })
-
- t.Run("dequeue doesn't return same logs again", func(t *testing.T) {
- buf := newLogEventBuffer(logger.TestLogger(t), 3, 5, 10)
- require.Equal(t, buf.enqueue(big.NewInt(1),
- logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0},
- logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0},
- logpoller.Log{BlockNumber: 3, TxHash: common.HexToHash("0x3"), LogIndex: 0},
- ), 3)
-
- logs := buf.dequeueRange(3, 3, 2, 10)
- fmt.Println(logs)
- require.Equal(t, 1, len(logs))
-
- logs = buf.dequeueRange(3, 3, 2, 10)
- fmt.Println(logs)
- require.Equal(t, 0, len(logs))
- })
-}
-
-func TestLogEventBuffer_FetchedBlock_Append(t *testing.T) {
- type appendArgs struct {
- fl fetchedLog
- maxBlockLogs, maxUpkeepLogs int
- added, dropped bool
- }
-
- tests := []struct {
- name string
- blockNumber int64
- logs []fetchedLog
- visited []fetchedLog
- toAdd []appendArgs
- expected []fetchedLog
- added bool
- }{
- {
- name: "empty block",
- blockNumber: 1,
- logs: []fetchedLog{},
- visited: []fetchedLog{},
- toAdd: []appendArgs{
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 10,
- maxUpkeepLogs: 2,
- added: true,
- },
- },
- expected: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- },
- {
- name: "existing log",
- blockNumber: 1,
- logs: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- visited: []fetchedLog{},
- toAdd: []appendArgs{
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 10,
- maxUpkeepLogs: 2,
- added: false,
- },
- },
- expected: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- },
- {
- name: "visited log",
- blockNumber: 1,
- logs: []fetchedLog{},
- visited: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- toAdd: []appendArgs{
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 10,
- maxUpkeepLogs: 2,
- added: false,
- },
- },
- expected: []fetchedLog{},
- },
- {
- name: "upkeep log limits",
- blockNumber: 1,
- logs: []fetchedLog{},
- visited: []fetchedLog{},
- toAdd: []appendArgs{
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 10,
- maxUpkeepLogs: 2,
- added: true,
- },
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 1,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 10,
- maxUpkeepLogs: 2,
- added: true,
- },
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 2,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 10,
- maxUpkeepLogs: 2,
- added: true,
- dropped: true,
- },
- },
- expected: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 1,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 2,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- },
- {
- name: "block log limits",
- blockNumber: 1,
- logs: []fetchedLog{},
- visited: []fetchedLog{},
- toAdd: []appendArgs{
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 2,
- maxUpkeepLogs: 4,
- added: true,
- },
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 1,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 2,
- maxUpkeepLogs: 4,
- added: true,
- },
- {
- fl: fetchedLog{
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 2,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- maxBlockLogs: 2,
- maxUpkeepLogs: 4,
- added: true,
- dropped: true,
- },
- },
- expected: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 1,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 2,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- },
- }
-
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- lggr := logger.TestLogger(t)
- b := fetchedBlock{
- blockNumber: tc.blockNumber,
- logs: make([]fetchedLog, len(tc.logs)),
- visited: make([]fetchedLog, len(tc.visited)),
- }
- copy(b.logs, tc.logs)
- copy(b.visited, tc.visited)
-
- for _, args := range tc.toAdd {
- dropped, added := b.Append(lggr, args.fl, args.maxBlockLogs, args.maxUpkeepLogs)
- require.Equal(t, args.added, added)
- if args.dropped {
- require.NotNil(t, dropped.upkeepID)
- } else {
- require.Nil(t, dropped.upkeepID)
- }
- }
- // clear cached logIDs
- for i := range b.logs {
- b.logs[i].cachedLogID = ""
- }
- require.Equal(t, tc.expected, b.logs)
- })
- }
-}
-func TestLogEventBuffer_FetchedBlock_Sort(t *testing.T) {
- tests := []struct {
- name string
- blockNumber int64
- logs []fetchedLog
- beforeSort []string
- afterSort []string
- iterations int
- }{
- {
- name: "no logs",
- blockNumber: 10,
- logs: []fetchedLog{},
- beforeSort: []string{},
- afterSort: []string{},
- },
- {
- name: "single log",
- blockNumber: 1,
- logs: []fetchedLog{
- {
- log: logpoller.Log{
- BlockHash: common.HexToHash("0x111"),
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- },
- },
- beforeSort: []string{
- "0000000000000000000000000000000000000000000000000000000000000111000000000000000000000000000000000000000000000000000000000000000100000000",
- },
- afterSort: []string{
- "0000000000000000000000000000000000000000000000000000000000000111000000000000000000000000000000000000000000000000000000000000000100000000",
- },
- },
- {
- name: "multiple logs with 10 iterations",
- blockNumber: 1,
- logs: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xb711bd1103927611ee41152aa8ae27f3330"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "222").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6"),
- LogIndex: 4,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6"),
- LogIndex: 3,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "222").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6"),
- LogIndex: 2,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6"),
- LogIndex: 5,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6"),
- LogIndex: 3,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- BlockHash: common.HexToHash("0xa25ebae1099f3fbae2525ebae279f3ae25e"),
- TxHash: common.HexToHash("0xa651bd1109922111ee411525ebae27f3fb6"),
- LogIndex: 1,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- beforeSort: []string{
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000b711bd1103927611ee41152aa8ae27f333000000000",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000000",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000004",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000003",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000002",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000005",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000003",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000001",
- },
- afterSort: []string{
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000b711bd1103927611ee41152aa8ae27f333000000000",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000000",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000001",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000002",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000003",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000003",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000004",
- "00000000000000000000000000000a25ebae1099f3fbae2525ebae279f3ae25e00000000000000000000000000000a651bd1109922111ee411525ebae27f3fb600000005",
- },
- iterations: 10,
- },
- }
-
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- b := fetchedBlock{
- blockNumber: tc.blockNumber,
- logs: make([]fetchedLog, len(tc.logs)),
- }
- if tc.iterations == 0 {
- tc.iterations = 1
- }
- // performing the same multiple times should yield the same result
- // default is one iteration
- for i := 0; i < tc.iterations; i++ {
- copy(b.logs, tc.logs)
- logIDs := getLogIds(b)
- require.Equal(t, len(tc.beforeSort), len(logIDs))
- require.Equal(t, tc.beforeSort, logIDs)
- b.Sort()
- logIDsAfterSort := getLogIds(b)
- require.Equal(t, len(tc.afterSort), len(logIDsAfterSort))
- require.Equal(t, tc.afterSort, logIDsAfterSort)
- }
- })
- }
-}
-
-func TestLogEventBuffer_FetchedBlock_Clone(t *testing.T) {
- b1 := fetchedBlock{
- blockNumber: 1,
- logs: []fetchedLog{
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 0,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- {
- log: logpoller.Log{
- BlockNumber: 1,
- TxHash: common.HexToHash("0x1"),
- LogIndex: 2,
- },
- upkeepID: core.GenUpkeepID(types.LogTrigger, "111").BigInt(),
- },
- },
- }
-
- b2 := b1.Clone()
- require.Equal(t, b1.blockNumber, b2.blockNumber)
- require.Equal(t, len(b1.logs), len(b2.logs))
- require.Equal(t, b1.logs[0].log.BlockNumber, b2.logs[0].log.BlockNumber)
-
- b1.blockNumber = 2
- b1.logs[0].log.BlockNumber = 2
- require.NotEqual(t, b1.blockNumber, b2.blockNumber)
- require.NotEqual(t, b1.logs[0].log.BlockNumber, b2.logs[0].log.BlockNumber)
-}
-
-func verifyBlockNumbers(t *testing.T, logs []fetchedLog, bns ...int64) {
- require.Equal(t, len(bns), len(logs), "expected length mismatch")
- for i, log := range logs {
- require.Equal(t, bns[i], log.log.BlockNumber, "wrong block number")
- }
-}
-
-func getLogIds(b fetchedBlock) []string {
- logIDs := make([]string, len(b.logs))
- for i, l := range b.logs {
- ext := ocr2keepers.LogTriggerExtension{
- TxHash: l.log.TxHash,
- Index: uint32(l.log.LogIndex),
- BlockHash: l.log.BlockHash,
- }
- logIDs[i] = hex.EncodeToString(ext.LogIdentifier())
- }
- return logIDs
-}
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go
index 19302624b4..7ec65ff474 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go
@@ -35,23 +35,12 @@ type LogTriggersOptions struct {
// Finality depth is the number of blocks to wait before considering a block final.
FinalityDepth int64
- // TODO: (AUTO-9355) remove once we have a single version
- BufferVersion BufferVersion
// LogLimit is the minimum number of logs to process in a single block window.
LogLimit uint32
// BlockRate determines the block window for log processing.
BlockRate uint32
}
-// BufferVersion is the version of the log buffer.
-// TODO: (AUTO-9355) remove once we have a single version
-type BufferVersion string
-
-const (
- BufferVersionDefault BufferVersion = ""
- BufferVersionV1 BufferVersion = "v1"
-)
-
func NewOptions(finalityDepth int64, chainID *big.Int) LogTriggersOptions {
opts := new(LogTriggersOptions)
opts.chainID = chainID
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go
index 475963c575..49741b7911 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go
@@ -34,115 +34,92 @@ import (
)
func TestIntegration_LogEventProvider(t *testing.T) {
- tests := []struct {
- name string
- bufferVersion logprovider.BufferVersion
- logLimit uint32
- }{
- {
- name: "default buffer",
- bufferVersion: logprovider.BufferVersionDefault,
- logLimit: 10,
- },
- {
- name: "buffer v1",
- bufferVersion: logprovider.BufferVersionV1,
- logLimit: 10,
- },
- }
+ ctx, cancel := context.WithCancel(testutils.Context(t))
+ defer cancel()
+
+ backend, stopMining, accounts := setupBackend(t)
+ defer stopMining()
+ carrol := accounts[2]
+
+ db := setupDB(t)
+ defer db.Close()
+
+ opts := logprovider.NewOptions(200, big.NewInt(1))
+ opts.ReadInterval = time.Second / 2
+ opts.LogLimit = 10
+
+ lp, ethClient := setupDependencies(t, db, backend)
+ filterStore := logprovider.NewUpkeepFilterStore()
+ provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts)
+ logProvider := provider.(logprovider.LogEventProviderTest)
+
+ n := 10
+
+ backend.Commit()
+ lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block
- for _, tc := range tests {
- bufferVersion, logLimit := tc.bufferVersion, tc.logLimit
- t.Run(tc.name, func(t *testing.T) {
- ctx, cancel := context.WithCancel(testutils.Context(t))
- defer cancel()
-
- backend, stopMining, accounts := setupBackend(t)
- defer stopMining()
- carrol := accounts[2]
-
- db := setupDB(t)
- defer db.Close()
-
- opts := logprovider.NewOptions(200, big.NewInt(1))
- opts.ReadInterval = time.Second / 2
- opts.BufferVersion = bufferVersion
- opts.LogLimit = logLimit
-
- lp, ethClient := setupDependencies(t, db, backend)
- filterStore := logprovider.NewUpkeepFilterStore()
- provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts)
- logProvider := provider.(logprovider.LogEventProviderTest)
-
- n := 10
-
- backend.Commit()
- lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block
-
- ids, addrs, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider)
- lp.PollAndSaveLogs(ctx, int64(n))
-
- go func() {
- if err := logProvider.Start(ctx); err != nil {
- t.Logf("error starting log provider: %s", err)
- t.Fail()
- }
- }()
- defer logProvider.Close()
-
- logsRounds := 10
-
- poll := pollFn(ctx, t, lp, ethClient)
-
- triggerEvents(ctx, t, backend, carrol, logsRounds, poll, contracts...)
-
- poll(backend.Commit())
-
- waitLogPoller(ctx, t, backend, lp, ethClient)
-
- waitLogProvider(ctx, t, logProvider, 3)
-
- allPayloads := collectPayloads(ctx, t, logProvider, n, logsRounds/2)
- require.GreaterOrEqual(t, len(allPayloads), n,
- "failed to get logs after restart")
-
- t.Run("Restart", func(t *testing.T) {
- t.Log("restarting log provider")
- // assuming that our service was closed and restarted,
- // we should be able to backfill old logs and fetch new ones
- filterStore := logprovider.NewUpkeepFilterStore()
- logProvider2 := logprovider.NewLogProvider(logger.TestLogger(t), lp, big.NewInt(1), logprovider.NewLogEventsPacker(), filterStore, opts)
-
- poll(backend.Commit())
- go func() {
- if err2 := logProvider2.Start(ctx); err2 != nil {
- t.Logf("error starting log provider: %s", err2)
- t.Fail()
- }
- }()
- defer logProvider2.Close()
-
- // re-register filters
- for i, id := range ids {
- err := logProvider2.RegisterFilter(ctx, logprovider.FilterOptions{
- UpkeepID: id,
- TriggerConfig: newPlainLogTriggerConfig(addrs[i]),
- // using block number at which the upkeep was registered,
- // before we emitted any logs
- UpdateBlock: uint64(n),
- })
- require.NoError(t, err)
- }
-
- waitLogProvider(ctx, t, logProvider2, 2)
-
- t.Log("getting logs after restart")
- logsAfterRestart := collectPayloads(ctx, t, logProvider2, n, 5)
- require.GreaterOrEqual(t, len(logsAfterRestart), n,
- "failed to get logs after restart")
+ ids, addrs, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider)
+ lp.PollAndSaveLogs(ctx, int64(n))
+
+ go func() {
+ if err := logProvider.Start(ctx); err != nil {
+ t.Logf("error starting log provider: %s", err)
+ t.Fail()
+ }
+ }()
+ defer logProvider.Close()
+
+ logsRounds := 10
+
+ poll := pollFn(ctx, t, lp, ethClient)
+
+ triggerEvents(ctx, t, backend, carrol, logsRounds, poll, contracts...)
+
+ poll(backend.Commit())
+
+ waitLogPoller(ctx, t, backend, lp, ethClient)
+
+ waitLogProvider(ctx, t, logProvider, 3)
+
+ allPayloads := collectPayloads(ctx, t, logProvider, n, logsRounds/2)
+ require.GreaterOrEqual(t, len(allPayloads), n,
+ "failed to get logs after restart")
+
+ t.Run("Restart", func(t *testing.T) {
+ t.Log("restarting log provider")
+ // assuming that our service was closed and restarted,
+ // we should be able to backfill old logs and fetch new ones
+ filterStore := logprovider.NewUpkeepFilterStore()
+ logProvider2 := logprovider.NewLogProvider(logger.TestLogger(t), lp, big.NewInt(1), logprovider.NewLogEventsPacker(), filterStore, opts)
+
+ poll(backend.Commit())
+ go func() {
+ if err2 := logProvider2.Start(ctx); err2 != nil {
+ t.Logf("error starting log provider: %s", err2)
+ t.Fail()
+ }
+ }()
+ defer logProvider2.Close()
+
+ // re-register filters
+ for i, id := range ids {
+ err := logProvider2.RegisterFilter(ctx, logprovider.FilterOptions{
+ UpkeepID: id,
+ TriggerConfig: newPlainLogTriggerConfig(addrs[i]),
+ // using block number at which the upkeep was registered,
+ // before we emitted any logs
+ UpdateBlock: uint64(n),
})
- })
- }
+ require.NoError(t, err)
+ }
+
+ waitLogProvider(ctx, t, logProvider2, 2)
+
+ t.Log("getting logs after restart")
+ logsAfterRestart := collectPayloads(ctx, t, logProvider2, n, 5)
+ require.GreaterOrEqual(t, len(logsAfterRestart), n,
+ "failed to get logs after restart")
+ })
}
func TestIntegration_LogEventProvider_UpdateConfig(t *testing.T) {
@@ -219,78 +196,55 @@ func TestIntegration_LogEventProvider_UpdateConfig(t *testing.T) {
}
func TestIntegration_LogEventProvider_Backfill(t *testing.T) {
- tests := []struct {
- name string
- bufferVersion logprovider.BufferVersion
- logLimit uint32
- }{
- {
- name: "default buffer",
- bufferVersion: logprovider.BufferVersionDefault,
- logLimit: 10,
- },
- {
- name: "buffer v1",
- bufferVersion: logprovider.BufferVersionV1,
- logLimit: 10,
- },
- }
-
- for _, tc := range tests {
- bufferVersion, limitLow := tc.bufferVersion, tc.logLimit
- t.Run(tc.name, func(t *testing.T) {
- ctx, cancel := context.WithTimeout(testutils.Context(t), time.Second*60)
- defer cancel()
+ ctx, cancel := context.WithTimeout(testutils.Context(t), time.Second*60)
+ defer cancel()
- backend, stopMining, accounts := setupBackend(t)
- defer stopMining()
- carrol := accounts[2]
+ backend, stopMining, accounts := setupBackend(t)
+ defer stopMining()
+ carrol := accounts[2]
- db := setupDB(t)
- defer db.Close()
+ db := setupDB(t)
+ defer db.Close()
- opts := logprovider.NewOptions(200, big.NewInt(1))
- opts.ReadInterval = time.Second / 4
- opts.BufferVersion = bufferVersion
- opts.LogLimit = limitLow
+ opts := logprovider.NewOptions(200, big.NewInt(1))
+ opts.ReadInterval = time.Second / 4
+ opts.LogLimit = 10
- lp, ethClient := setupDependencies(t, db, backend)
- filterStore := logprovider.NewUpkeepFilterStore()
- provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts)
- logProvider := provider.(logprovider.LogEventProviderTest)
+ lp, ethClient := setupDependencies(t, db, backend)
+ filterStore := logprovider.NewUpkeepFilterStore()
+ provider, _ := setup(logger.TestLogger(t), lp, nil, nil, filterStore, &opts)
+ logProvider := provider.(logprovider.LogEventProviderTest)
- n := 10
+ n := 10
- backend.Commit()
- lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block
- _, _, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider)
+ backend.Commit()
+ lp.PollAndSaveLogs(ctx, 1) // Ensure log poller has a latest block
+ _, _, contracts := deployUpkeepCounter(ctx, t, n, ethClient, backend, carrol, logProvider)
- poll := pollFn(ctx, t, lp, ethClient)
+ poll := pollFn(ctx, t, lp, ethClient)
- rounds := 8
- for i := 0; i < rounds; i++ {
- poll(backend.Commit())
- triggerEvents(ctx, t, backend, carrol, n, poll, contracts...)
- poll(backend.Commit())
- }
+ rounds := 8
+ for i := 0; i < rounds; i++ {
+ poll(backend.Commit())
+ triggerEvents(ctx, t, backend, carrol, n, poll, contracts...)
+ poll(backend.Commit())
+ }
- waitLogPoller(ctx, t, backend, lp, ethClient)
+ waitLogPoller(ctx, t, backend, lp, ethClient)
- // starting the log provider should backfill logs
- go func() {
- if startErr := logProvider.Start(ctx); startErr != nil {
- t.Logf("error starting log provider: %s", startErr)
- t.Fail()
- }
- }()
- defer logProvider.Close()
+ // starting the log provider should backfill logs
+ go func() {
+ if startErr := logProvider.Start(ctx); startErr != nil {
+ t.Logf("error starting log provider: %s", startErr)
+ t.Fail()
+ }
+ }()
+ defer logProvider.Close()
- waitLogProvider(ctx, t, logProvider, 3)
+ waitLogProvider(ctx, t, logProvider, 3)
- allPayloads := collectPayloads(ctx, t, logProvider, n*rounds, 5)
- require.GreaterOrEqual(t, len(allPayloads), len(contracts), "failed to backfill logs")
- })
- }
+ allPayloads := collectPayloads(ctx, t, logProvider, n*rounds, 5)
+ require.GreaterOrEqual(t, len(allPayloads), len(contracts), "failed to backfill logs")
}
func TestIntegration_LogRecoverer_Backfill(t *testing.T) {
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go
index 3609d0a465..f1de1ef512 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go
@@ -81,13 +81,8 @@ type LogEventProviderTest interface {
CurrentPartitionIdx() uint64
}
-type LogEventProviderFeatures interface {
- WithBufferVersion(v BufferVersion)
-}
-
var _ LogEventProvider = &logEventProvider{}
var _ LogEventProviderTest = &logEventProvider{}
-var _ LogEventProviderFeatures = &logEventProvider{}
// logEventProvider manages log filters for upkeeps and enables to read the log events.
type logEventProvider struct {
@@ -104,8 +99,7 @@ type logEventProvider struct {
registerLock sync.Mutex
filterStore UpkeepFilterStore
- buffer *logEventBuffer
- bufferV1 LogBuffer
+ buffer LogBuffer
opts LogTriggersOptions
@@ -119,8 +113,7 @@ func NewLogProvider(lggr logger.Logger, poller logpoller.LogPoller, chainID *big
threadCtrl: utils.NewThreadControl(),
lggr: lggr.Named("KeepersRegistry.LogEventProvider"),
packer: packer,
- buffer: newLogEventBuffer(lggr, int(opts.LookbackBlocks), defaultNumOfLogUpkeeps, defaultFastExecLogsHigh),
- bufferV1: NewLogBuffer(lggr, uint32(opts.LookbackBlocks), opts.BlockRate, opts.LogLimit),
+ buffer: NewLogBuffer(lggr, uint32(opts.LookbackBlocks), opts.BlockRate, opts.LogLimit),
poller: poller,
opts: opts,
filterStore: filterStore,
@@ -147,20 +140,7 @@ func (p *logEventProvider) SetConfig(cfg ocr2keepers.LogEventProviderConfig) {
atomic.StoreUint32(&p.opts.BlockRate, blockRate)
atomic.StoreUint32(&p.opts.LogLimit, logLimit)
- switch p.opts.BufferVersion {
- case BufferVersionV1:
- p.bufferV1.SetConfig(uint32(p.opts.LookbackBlocks), blockRate, logLimit)
- default:
- }
-}
-
-func (p *logEventProvider) WithBufferVersion(v BufferVersion) {
- p.lock.Lock()
- defer p.lock.Unlock()
-
- p.lggr.Debugw("with buffer version", "version", v)
-
- p.opts.BufferVersion = v
+ p.buffer.SetConfig(uint32(p.opts.LookbackBlocks), blockRate, logLimit)
}
func (p *logEventProvider) Start(context.Context) error {
@@ -197,7 +177,7 @@ func (p *logEventProvider) Start(context.Context) error {
for {
select {
case <-ticker.C:
- if err := p.syncBufferFilters(); err != nil {
+ if err := p.buffer.SyncFilters(p.filterStore); err != nil {
p.lggr.Warnw("failed to sync buffer filters", "err", err)
}
case <-ctx.Done():
@@ -259,22 +239,11 @@ func (p *logEventProvider) getLogsFromBuffer(latestBlock int64) []ocr2keepers.Up
start = 1
}
- switch p.opts.BufferVersion {
- case BufferVersionV1:
- payloads = p.minimumCommitmentDequeue(latestBlock, start)
+ payloads = p.minimumCommitmentDequeue(latestBlock, start)
- // if we have remaining capacity following minimum commitment dequeue, perform a best effort dequeue
- if len(payloads) < MaxPayloads {
- payloads = p.bestEffortDequeue(latestBlock, start, payloads)
- }
- default:
- logs := p.buffer.dequeueRange(start, latestBlock, AllowedLogsPerUpkeep, MaxPayloads)
- for _, l := range logs {
- payload, err := p.createPayload(l.upkeepID, l.log)
- if err == nil {
- payloads = append(payloads, payload)
- }
- }
+ // if we have remaining capacity following minimum commitment dequeue, perform a best effort dequeue
+ if len(payloads) < MaxPayloads {
+ payloads = p.bestEffortDequeue(latestBlock, start, payloads)
}
return payloads
@@ -290,7 +259,7 @@ func (p *logEventProvider) minimumCommitmentDequeue(latestBlock, start int64) []
startWindow, _ := getBlockWindow(start, blockRate)
// dequeue the minimum number logs (log limit, varies by chain) per upkeep for this block window
- logs, remaining := p.bufferV1.Dequeue(startWindow, MaxPayloads-len(payloads), true)
+ logs, remaining := p.buffer.Dequeue(startWindow, MaxPayloads-len(payloads), true)
if len(logs) > 0 {
p.lggr.Debugw("minimum commitment dequeue", "start", start, "latestBlock", latestBlock, "logs", len(logs), "remaining", remaining)
}
@@ -316,7 +285,7 @@ func (p *logEventProvider) bestEffortDequeue(latestBlock, start int64, payloads
startWindow, _ := getBlockWindow(start, blockRate)
// dequeue as many logs as we can, based on remaining capacity, for this block window
- logs, remaining := p.bufferV1.Dequeue(startWindow, MaxPayloads-len(payloads), false)
+ logs, remaining := p.buffer.Dequeue(startWindow, MaxPayloads-len(payloads), false)
if len(logs) > 0 {
p.lggr.Debugw("best effort dequeue", "start", start, "latestBlock", latestBlock, "logs", len(logs), "remaining", remaining)
}
@@ -522,12 +491,8 @@ func (p *logEventProvider) readLogs(ctx context.Context, latest int64, filters [
}
filteredLogs := filter.Select(logs...)
- switch p.opts.BufferVersion {
- case BufferVersionV1:
- p.bufferV1.Enqueue(filter.upkeepID, filteredLogs...)
- default:
- p.buffer.enqueue(filter.upkeepID, filteredLogs...)
- }
+ p.buffer.Enqueue(filter.upkeepID, filteredLogs...)
+
// Update the lastPollBlock for filter in slice this is then
// updated into filter store in updateFiltersLastPoll
filters[i].lastPollBlock = latest
@@ -535,16 +500,3 @@ func (p *logEventProvider) readLogs(ctx context.Context, latest int64, filters [
return merr
}
-
-func (p *logEventProvider) syncBufferFilters() error {
- p.lock.RLock()
- buffVersion := p.opts.BufferVersion
- p.lock.RUnlock()
-
- switch buffVersion {
- case BufferVersionV1:
- return p.bufferV1.SyncFilters(p.filterStore)
- default:
- return nil
- }
-}
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go
index 282f89d370..9536a24ce0 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go
@@ -258,37 +258,14 @@ func TestLogEventProvider_ReadLogs(t *testing.T) {
filterStore := NewUpkeepFilterStore()
p := NewLogProvider(logger.TestLogger(t), mp, big.NewInt(1), &mockedPacker{}, filterStore, NewOptions(200, big.NewInt(1)))
- var ids []*big.Int
for i := 0; i < 10; i++ {
cfg, f := newEntry(p, i+1)
- ids = append(ids, f.upkeepID)
require.NoError(t, p.RegisterFilter(ctx, FilterOptions{
UpkeepID: f.upkeepID,
TriggerConfig: cfg,
}))
}
- t.Run("no entries", func(t *testing.T) {
- require.NoError(t, p.ReadLogs(ctx, big.NewInt(999999)))
- logs := p.buffer.peek(10)
- require.Len(t, logs, 0)
- })
-
- t.Run("has entries", func(t *testing.T) {
- require.NoError(t, p.ReadLogs(ctx, ids[:2]...))
- logs := p.buffer.peek(10)
- require.Len(t, logs, 2)
-
- var updatedFilters []upkeepFilter
- filterStore.RangeFiltersByIDs(func(i int, f upkeepFilter) {
- updatedFilters = append(updatedFilters, f.Clone())
- }, ids[:2]...)
- for _, f := range updatedFilters {
- // Last poll block should be updated
- require.Equal(t, int64(1), f.lastPollBlock)
- }
- })
-
// TODO: test rate limiting
}
@@ -342,7 +319,6 @@ func remainingBlockWindowCounts(queues map[string]*upkeepLogQueue, blockRate int
func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("dequeuing from an empty buffer returns 0 logs", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -361,7 +337,6 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("a single log for a single upkeep gets dequeued", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -373,7 +348,7 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
ctx := context.Background()
- buffer := provider.bufferV1
+ buffer := provider.buffer
buffer.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0})
@@ -384,7 +359,6 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("a log per upkeep for 4 upkeeps across 4 blocks (2 separate block windows) is dequeued, for a total of 4 payloads", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -396,7 +370,7 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
ctx := context.Background()
- buffer := provider.bufferV1
+ buffer := provider.buffer
buffer.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: 1, TxHash: common.HexToHash("0x1"), LogIndex: 0})
buffer.Enqueue(big.NewInt(2), logpoller.Log{BlockNumber: 2, TxHash: common.HexToHash("0x2"), LogIndex: 0})
@@ -410,7 +384,6 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("100 logs are dequeued for a single upkeep, 1 log for every block window across 100 blocks followed by best effort", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -422,7 +395,7 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
ctx := context.Background()
- buffer := provider.bufferV1.(*logBuffer)
+ buffer := provider.buffer.(*logBuffer)
for i := 0; i < 100; i++ {
buffer.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: int64(i + 1), TxHash: common.HexToHash(fmt.Sprintf("0x%d", i+1)), LogIndex: 0})
@@ -439,7 +412,6 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("100 logs are dequeued for two upkeeps, 25 logs each as min commitment (50 logs total best effort), followed by best effort", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -451,7 +423,7 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
ctx := context.Background()
- buffer := provider.bufferV1.(*logBuffer)
+ buffer := provider.buffer.(*logBuffer)
for i := 0; i < 100; i++ {
buffer.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: int64(i + 1), TxHash: common.HexToHash(fmt.Sprintf("0x1%d", i+1)), LogIndex: 0})
@@ -491,7 +463,6 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("minimum guaranteed for all windows including an incomplete window followed by best effort", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -503,7 +474,7 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
ctx := context.Background()
- buffer := provider.bufferV1.(*logBuffer)
+ buffer := provider.buffer.(*logBuffer)
for i := 0; i < 102; i++ {
buffer.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: int64(i + 1), TxHash: common.HexToHash(fmt.Sprintf("0x1%d", i+1)), LogIndex: 0})
@@ -551,7 +522,6 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("min dequeue followed by best effort followed by reorg followed by best effort", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -563,7 +533,7 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
ctx := context.Background()
- buffer := provider.bufferV1.(*logBuffer)
+ buffer := provider.buffer.(*logBuffer)
for i := 0; i < 100; i++ {
buffer.Enqueue(big.NewInt(1), logpoller.Log{BlockNumber: int64(i + 1), TxHash: common.HexToHash(fmt.Sprintf("0x1%d", i+1)), LogIndex: 0})
@@ -606,7 +576,6 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
t.Run("sparsely populated blocks", func(t *testing.T) {
opts := NewOptions(200, big.NewInt(42161))
- opts.BufferVersion = "v1"
logPoller := &mockLogPoller{
LatestBlockFn: func(ctx context.Context) (int64, error) {
@@ -618,7 +587,7 @@ func TestLogEventProvider_GetLatestPayloads(t *testing.T) {
ctx := context.Background()
- buffer := provider.bufferV1.(*logBuffer)
+ buffer := provider.buffer.(*logBuffer)
upkeepOmittedOnBlocks := map[int64][]int{
1: {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100}, // upkeep 1 won't have logs on 20 blocks
diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go
index a79237cf04..7f74f9a38a 100644
--- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go
+++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go
@@ -54,7 +54,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
@@ -119,7 +118,7 @@ func TestIntegration_KeeperPluginConditionalUpkeep(t *testing.T) {
require.NoError(t, err)
registry := deployKeeper21Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr)
- setupNodes(t, nodeKeys, registry, backend, steve, false)
+ setupNodes(t, nodeKeys, registry, backend, steve)
<-time.After(time.Second * 5)
@@ -173,368 +172,314 @@ func TestIntegration_KeeperPluginConditionalUpkeep(t *testing.T) {
}
func TestIntegration_KeeperPluginLogUpkeep(t *testing.T) {
- tests := []struct {
- name string
- logBufferVersion logprovider.BufferVersion
- }{
- {
- name: "default buffer",
- logBufferVersion: logprovider.BufferVersionDefault,
- },
- {
- name: "buffer v1",
- logBufferVersion: logprovider.BufferVersionV1,
- },
- }
+ g := gomega.NewWithT(t)
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- g := gomega.NewWithT(t)
-
- // setup blockchain
- sergey := testutils.MustNewSimTransactor(t) // owns all the link
- steve := testutils.MustNewSimTransactor(t) // registry owner
- carrol := testutils.MustNewSimTransactor(t) // upkeep owner
- genesisData := core.GenesisAlloc{
- sergey.From: {Balance: assets.Ether(10000).ToInt()},
- steve.From: {Balance: assets.Ether(10000).ToInt()},
- carrol.From: {Balance: assets.Ether(10000).ToInt()},
- }
- // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether
- var nodeKeys [5]ethkey.KeyV2
- for i := int64(0); i < 5; i++ {
- nodeKeys[i] = cltest.MustGenerateRandomKey(t)
- genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}
- }
+ // setup blockchain
+ sergey := testutils.MustNewSimTransactor(t) // owns all the link
+ steve := testutils.MustNewSimTransactor(t) // registry owner
+ carrol := testutils.MustNewSimTransactor(t) // upkeep owner
+ genesisData := core.GenesisAlloc{
+ sergey.From: {Balance: assets.Ether(10000).ToInt()},
+ steve.From: {Balance: assets.Ether(10000).ToInt()},
+ carrol.From: {Balance: assets.Ether(10000).ToInt()},
+ }
+ // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether
+ var nodeKeys [5]ethkey.KeyV2
+ for i := int64(0); i < 5; i++ {
+ nodeKeys[i] = cltest.MustGenerateRandomKey(t)
+ genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}
+ }
- backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))
- stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain
- defer stopMining()
+ backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))
+ stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain
+ defer stopMining()
- // Deploy registry
- linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend)
- require.NoError(t, err)
- gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))
- require.NoError(t, err)
- linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000))
- require.NoError(t, err)
+ // Deploy registry
+ linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(sergey, backend)
+ require.NoError(t, err)
+ gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(60000000000))
+ require.NoError(t, err)
+ linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(steve, backend, 18, big.NewInt(2000000000000000000))
+ require.NoError(t, err)
- registry := deployKeeper21Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr)
- setupNodes(t, nodeKeys, registry, backend, steve, tc.logBufferVersion == logprovider.BufferVersionV1)
- upkeeps := 1
+ registry := deployKeeper21Registry(t, steve, backend, linkAddr, linkFeedAddr, gasFeedAddr)
+ setupNodes(t, nodeKeys, registry, backend, steve)
+ upkeeps := 1
- _, err = linkToken.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1))))
- require.NoError(t, err)
+ _, err = linkToken.Transfer(sergey, carrol.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeeps+1))))
+ require.NoError(t, err)
- backend.Commit()
+ backend.Commit()
- ids, addrs, contracts := deployUpkeeps(t, backend, carrol, steve, linkToken, registry, upkeeps)
- require.Equal(t, upkeeps, len(ids))
- require.Equal(t, len(ids), len(contracts))
- require.Equal(t, len(ids), len(addrs))
+ ids, addrs, contracts := deployUpkeeps(t, backend, carrol, steve, linkToken, registry, upkeeps)
+ require.Equal(t, upkeeps, len(ids))
+ require.Equal(t, len(ids), len(contracts))
+ require.Equal(t, len(ids), len(addrs))
- backend.Commit()
+ backend.Commit()
- emits := 1
- go emitEvents(testutils.Context(t), t, emits, contracts, carrol, func() {
- backend.Commit()
- })
+ emits := 1
+ go emitEvents(testutils.Context(t), t, emits, contracts, carrol, func() {
+ backend.Commit()
+ })
- listener, done := listenPerformed(t, backend, registry, ids, int64(1))
- g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue())
- done()
+ listener, done := listenPerformed(t, backend, registry, ids, int64(1))
+ g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue())
+ done()
- t.Run("recover logs", func(t *testing.T) {
- addr, contract := addrs[0], contracts[0]
- upkeepID := registerUpkeep(t, registry, addr, carrol, steve, backend)
+ t.Run("recover logs", func(t *testing.T) {
+ addr, contract := addrs[0], contracts[0]
+ upkeepID := registerUpkeep(t, registry, addr, carrol, steve, backend)
+ backend.Commit()
+ t.Logf("Registered new upkeep %s for address %s", upkeepID.String(), addr.String())
+ // Emit 100 logs in a burst
+ recoverEmits := 100
+ i := 0
+ emitEvents(testutils.Context(t), t, 100, []*log_upkeep_counter_wrapper.LogUpkeepCounter{contract}, carrol, func() {
+ i++
+ if i%(recoverEmits/4) == 0 {
backend.Commit()
- t.Logf("Registered new upkeep %s for address %s", upkeepID.String(), addr.String())
- // Emit 100 logs in a burst
- recoverEmits := 100
- i := 0
- emitEvents(testutils.Context(t), t, 100, []*log_upkeep_counter_wrapper.LogUpkeepCounter{contract}, carrol, func() {
- i++
- if i%(recoverEmits/4) == 0 {
- backend.Commit()
- time.Sleep(time.Millisecond * 250) // otherwise we get "invalid transaction nonce" errors
- }
- })
+ time.Sleep(time.Millisecond * 250) // otherwise we get "invalid transaction nonce" errors
+ }
+ })
- beforeDummyBlocks := backend.Blockchain().CurrentBlock().Number.Uint64()
+ beforeDummyBlocks := backend.Blockchain().CurrentBlock().Number.Uint64()
- // Mine enough blocks to ensure these logs don't fall into log provider range
- dummyBlocks := 500
- for i := 0; i < dummyBlocks; i++ {
- backend.Commit()
- time.Sleep(time.Millisecond * 10)
- }
+ // Mine enough blocks to ensure these logs don't fall into log provider range
+ dummyBlocks := 500
+ for i := 0; i < dummyBlocks; i++ {
+ backend.Commit()
+ time.Sleep(time.Millisecond * 10)
+ }
- t.Logf("Mined %d blocks, waiting for logs to be recovered", dummyBlocks)
+ t.Logf("Mined %d blocks, waiting for logs to be recovered", dummyBlocks)
- listener, done := listenPerformedN(t, backend, registry, ids, int64(beforeDummyBlocks), recoverEmits)
- defer done()
- g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue())
- })
- })
- }
+ listener, done := listenPerformedN(t, backend, registry, ids, int64(beforeDummyBlocks), recoverEmits)
+ defer done()
+ g.Eventually(listener, testutils.WaitTimeout(t), cltest.DBPollingInterval).Should(gomega.BeTrue())
+ })
}
func TestIntegration_KeeperPluginLogUpkeep_Retry(t *testing.T) {
- tests := []struct {
- name string
- logBufferVersion logprovider.BufferVersion
- }{
- {
- name: "default buffer",
- logBufferVersion: logprovider.BufferVersionDefault,
- },
- {
- name: "buffer v1",
- logBufferVersion: logprovider.BufferVersionV1,
- },
+ g := gomega.NewWithT(t)
+
+ // setup blockchain
+ linkOwner := testutils.MustNewSimTransactor(t) // owns all the link
+ registryOwner := testutils.MustNewSimTransactor(t) // registry owner
+ upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner
+ genesisData := core.GenesisAlloc{
+ linkOwner.From: {Balance: assets.Ether(10000).ToInt()},
+ registryOwner.From: {Balance: assets.Ether(10000).ToInt()},
+ upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()},
}
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- g := gomega.NewWithT(t)
-
- // setup blockchain
- linkOwner := testutils.MustNewSimTransactor(t) // owns all the link
- registryOwner := testutils.MustNewSimTransactor(t) // registry owner
- upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner
- genesisData := core.GenesisAlloc{
- linkOwner.From: {Balance: assets.Ether(10000).ToInt()},
- registryOwner.From: {Balance: assets.Ether(10000).ToInt()},
- upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()},
- }
+ // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether
+ var nodeKeys [5]ethkey.KeyV2
+ for i := int64(0); i < 5; i++ {
+ nodeKeys[i] = cltest.MustGenerateRandomKey(t)
+ genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}
+ }
- // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether
- var nodeKeys [5]ethkey.KeyV2
- for i := int64(0); i < 5; i++ {
- nodeKeys[i] = cltest.MustGenerateRandomKey(t)
- genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}
- }
+ backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))
+ stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain
+ defer stopMining()
- backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))
- stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain
- defer stopMining()
+ // Deploy registry
+ linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend)
+ require.NoError(t, err)
- // Deploy registry
- linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend)
- require.NoError(t, err)
+ gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000))
+ require.NoError(t, err)
- gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000))
- require.NoError(t, err)
+ linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000))
+ require.NoError(t, err)
- linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000))
- require.NoError(t, err)
+ registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr)
- registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr)
+ _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner)
- _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner, tc.logBufferVersion == logprovider.BufferVersionV1)
+ const upkeepCount = 10
+ const mercuryFailCount = upkeepCount * 3 * 2
- const upkeepCount = 10
- const mercuryFailCount = upkeepCount * 3 * 2
+ // testing with the mercury server involves mocking responses. currently,
+ // there is not a way to connect a mercury call to an upkeep id (though we
+ // could add custom headers) so the test must be fairly basic and just
+ // count calls before switching to successes
+ var (
+ mu sync.Mutex
+ count int
+ )
- // testing with the mercury server involves mocking responses. currently,
- // there is not a way to connect a mercury call to an upkeep id (though we
- // could add custom headers) so the test must be fairly basic and just
- // count calls before switching to successes
- var (
- mu sync.Mutex
- count int
- )
+ mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) {
+ mu.Lock()
+ defer mu.Unlock()
- mercuryServer.RegisterHandler(func(w http.ResponseWriter, r *http.Request) {
- mu.Lock()
- defer mu.Unlock()
+ count++
- count++
+ _ = r.ParseForm()
- _ = r.ParseForm()
+ t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI)
- t.Logf("MercuryHTTPServe:RequestURI: %s", r.RequestURI)
+ for key, value := range r.Form {
+ t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value)
+ }
- for key, value := range r.Form {
- t.Logf("MercuryHTTPServe:FormValue: key: %s; value: %s;", key, value)
- }
+ // the streams lookup retries against the remote server 3 times before
+ // returning a result as retryable.
+ // the simulation here should force the streams lookup process to return
+ // retryable 2 times.
+ // the total count of failures should be (upkeepCount * 3 * tryCount)
+ if count <= mercuryFailCount {
+ w.WriteHeader(http.StatusNotFound)
- // the streams lookup retries against the remote server 3 times before
- // returning a result as retryable.
- // the simulation here should force the streams lookup process to return
- // retryable 2 times.
- // the total count of failures should be (upkeepCount * 3 * tryCount)
- if count <= mercuryFailCount {
- w.WriteHeader(http.StatusNotFound)
+ return
+ }
- return
- }
+ // start sending success messages
+ output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}`
- // start sending success messages
- output := `{"chainlinkBlob":"0x0001c38d71fed6c320b90e84b6f559459814d068e2a1700adc931ca9717d4fe70000000000000000000000000000000000000000000000000000000001a80b52b4bf1233f9cb71144a253a1791b202113c4ab4a92fa1b176d684b4959666ff8200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004254432d5553442d415242495452554d2d544553544e4554000000000000000000000000000000000000000000000000000000000000000000000000645570be000000000000000000000000000000000000000000000000000002af2b818dc5000000000000000000000000000000000000000000000000000002af2426faf3000000000000000000000000000000000000000000000000000002af32dc209700000000000000000000000000000000000000000000000000000000012130f8df0a9745bb6ad5e2df605e158ba8ad8a33ef8a0acf9851f0f01668a3a3f2b68600000000000000000000000000000000000000000000000000000000012130f60000000000000000000000000000000000000000000000000000000000000002c4a7958dce105089cf5edb68dad7dcfe8618d7784eb397f97d5a5fade78c11a58275aebda478968e545f7e3657aba9dcbe8d44605e4c6fde3e24edd5e22c94270000000000000000000000000000000000000000000000000000000000000002459c12d33986018a8959566d145225f0c4a4e61a9a3f50361ccff397899314f0018162cf10cd89897635a0bb62a822355bd199d09f4abe76e4d05261bb44733d"}`
+ w.WriteHeader(http.StatusOK)
+ _, _ = w.Write([]byte(output))
+ })
- w.WriteHeader(http.StatusOK)
- _, _ = w.Write([]byte(output))
- })
+ defer mercuryServer.Stop()
- defer mercuryServer.Stop()
+ _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))
+ require.NoError(t, err)
- _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))
- require.NoError(t, err)
+ backend.Commit()
- backend.Commit()
+ feeds, err := newFeedLookupUpkeepController(backend, registryOwner)
+ require.NoError(t, err, "no error expected from creating a feed lookup controller")
+
+ // deploy multiple upkeeps that listen to a log emitter and need to be
+ // performed for each log event
+ _ = feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(int) bool {
+ return false
+ })
+ _ = feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken)
+ _ = feeds.EnableMercury(t, backend, registry, registryOwner)
+ _ = feeds.VerifyEnv(t, backend, registry, registryOwner)
- feeds, err := newFeedLookupUpkeepController(backend, registryOwner)
- require.NoError(t, err, "no error expected from creating a feed lookup controller")
-
- // deploy multiple upkeeps that listen to a log emitter and need to be
- // performed for each log event
- _ = feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, func(int) bool {
- return false
- })
- _ = feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken)
- _ = feeds.EnableMercury(t, backend, registry, registryOwner)
- _ = feeds.VerifyEnv(t, backend, registry, registryOwner)
-
- // start emitting events in a separate go-routine
- // feed lookup relies on a single contract event log to perform multiple
- // listener contracts
- go func() {
- // only 1 event is necessary to make all 10 upkeeps eligible
- _ = feeds.EmitEvents(t, backend, 1, func() {
- // pause per emit for expected block production time
- time.Sleep(3 * time.Second)
- })
- }()
-
- listener, done := listenPerformed(t, backend, registry, feeds.UpkeepsIds(), int64(1))
- defer done()
- g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue())
+ // start emitting events in a separate go-routine
+ // feed lookup relies on a single contract event log to perform multiple
+ // listener contracts
+ go func() {
+ // only 1 event is necessary to make all 10 upkeeps eligible
+ _ = feeds.EmitEvents(t, backend, 1, func() {
+ // pause per emit for expected block production time
+ time.Sleep(3 * time.Second)
})
- }
+ }()
+
+ listener, done := listenPerformed(t, backend, registry, feeds.UpkeepsIds(), int64(1))
+ defer done()
+ g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue())
}
func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) {
- tests := []struct {
- name string
- logBufferVersion logprovider.BufferVersion
- }{
- {
- name: "default buffer",
- logBufferVersion: logprovider.BufferVersionDefault,
- },
- {
- name: "buffer v1",
- logBufferVersion: logprovider.BufferVersionV1,
- },
+ g := gomega.NewWithT(t)
+
+ // setup blockchain
+ linkOwner := testutils.MustNewSimTransactor(t) // owns all the link
+ registryOwner := testutils.MustNewSimTransactor(t) // registry owner
+ upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner
+ genesisData := core.GenesisAlloc{
+ linkOwner.From: {Balance: assets.Ether(10000).ToInt()},
+ registryOwner.From: {Balance: assets.Ether(10000).ToInt()},
+ upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()},
}
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- g := gomega.NewWithT(t)
-
- // setup blockchain
- linkOwner := testutils.MustNewSimTransactor(t) // owns all the link
- registryOwner := testutils.MustNewSimTransactor(t) // registry owner
- upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner
- genesisData := core.GenesisAlloc{
- linkOwner.From: {Balance: assets.Ether(10000).ToInt()},
- registryOwner.From: {Balance: assets.Ether(10000).ToInt()},
- upkeepOwner.From: {Balance: assets.Ether(10000).ToInt()},
- }
+ // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether
+ var nodeKeys [5]ethkey.KeyV2
+ for i := int64(0); i < 5; i++ {
+ nodeKeys[i] = cltest.MustGenerateRandomKey(t)
+ genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}
+ }
- // Generate 5 keys for nodes (1 bootstrap + 4 ocr nodes) and fund them with ether
- var nodeKeys [5]ethkey.KeyV2
- for i := int64(0); i < 5; i++ {
- nodeKeys[i] = cltest.MustGenerateRandomKey(t)
- genesisData[nodeKeys[i].Address] = core.GenesisAccount{Balance: assets.Ether(1000).ToInt()}
- }
+ backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))
+ stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain
+ defer stopMining()
- backend := cltest.NewSimulatedBackend(t, genesisData, uint32(ethconfig.Defaults.Miner.GasCeil))
- stopMining := cltest.Mine(backend, 3*time.Second) // Should be greater than deltaRound since we cannot access old blocks on simulated blockchain
- defer stopMining()
+ // Deploy registry
+ linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend)
+ require.NoError(t, err)
- // Deploy registry
- linkAddr, _, linkToken, err := link_token_interface.DeployLinkToken(linkOwner, backend)
- require.NoError(t, err)
+ gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000))
+ require.NoError(t, err)
- gasFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(60000000000))
- require.NoError(t, err)
+ linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000))
+ require.NoError(t, err)
- linkFeedAddr, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(registryOwner, backend, 18, big.NewInt(2000000000000000000))
- require.NoError(t, err)
+ registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr)
- registry := deployKeeper21Registry(t, registryOwner, backend, linkAddr, linkFeedAddr, gasFeedAddr)
+ _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner)
- _, mercuryServer := setupNodes(t, nodeKeys, registry, backend, registryOwner, tc.logBufferVersion == logprovider.BufferVersionV1)
+ upkeepCount := 10
- upkeepCount := 10
+ errResponses := []int{
+ http.StatusUnauthorized,
+ http.StatusBadRequest,
+ http.StatusInternalServerError,
+ http.StatusNotFound,
+ http.StatusNotFound,
+ http.StatusNotFound,
+ http.StatusUnauthorized,
+ }
+ startMercuryServer(t, mercuryServer, func(i int) (int, []byte) {
+ var resp int
+ if i < len(errResponses) {
+ resp = errResponses[i]
+ }
+ if resp == 0 {
+ resp = http.StatusNotFound
+ }
+ return resp, nil
+ })
+ defer mercuryServer.Stop()
- errResponses := []int{
- http.StatusUnauthorized,
- http.StatusBadRequest,
- http.StatusInternalServerError,
- http.StatusNotFound,
- http.StatusNotFound,
- http.StatusNotFound,
- http.StatusUnauthorized,
- }
- startMercuryServer(t, mercuryServer, func(i int) (int, []byte) {
- var resp int
- if i < len(errResponses) {
- resp = errResponses[i]
- }
- if resp == 0 {
- resp = http.StatusNotFound
- }
- return resp, nil
- })
- defer mercuryServer.Stop()
+ _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))
+ require.NoError(t, err)
- _, err = linkToken.Transfer(linkOwner, upkeepOwner.From, big.NewInt(0).Mul(oneHunEth, big.NewInt(int64(upkeepCount+1))))
- require.NoError(t, err)
+ backend.Commit()
- backend.Commit()
+ feeds, err := newFeedLookupUpkeepController(backend, registryOwner)
+ require.NoError(t, err, "no error expected from creating a feed lookup controller")
- feeds, err := newFeedLookupUpkeepController(backend, registryOwner)
- require.NoError(t, err, "no error expected from creating a feed lookup controller")
+ // deploy multiple upkeeps that listen to a log emitter and need to be
+ // performed for each log event
+ checkResultsProvider := func(i int) bool {
+ return i%2 == 1
+ }
+ require.NoError(t, feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, checkResultsProvider))
+ require.NoError(t, feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken))
+ require.NoError(t, feeds.EnableMercury(t, backend, registry, registryOwner))
+ require.NoError(t, feeds.VerifyEnv(t, backend, registry, registryOwner))
+
+ startBlock := backend.Blockchain().CurrentBlock().Number.Int64()
+ // start emitting events in a separate go-routine
+ // feed lookup relies on a single contract event log to perform multiple
+ // listener contracts
+ go func() {
+ // only 1 event is necessary to make all 10 upkeeps eligible
+ _ = feeds.EmitEvents(t, backend, 1, func() {
+ // pause per emit for expected block production time
+ time.Sleep(3 * time.Second)
+ })
+ }()
- // deploy multiple upkeeps that listen to a log emitter and need to be
- // performed for each log event
- checkResultsProvider := func(i int) bool {
- return i%2 == 1
- }
- require.NoError(t, feeds.DeployUpkeeps(t, backend, upkeepOwner, upkeepCount, checkResultsProvider))
- require.NoError(t, feeds.RegisterAndFund(t, registry, registryOwner, backend, linkToken))
- require.NoError(t, feeds.EnableMercury(t, backend, registry, registryOwner))
- require.NoError(t, feeds.VerifyEnv(t, backend, registry, registryOwner))
-
- startBlock := backend.Blockchain().CurrentBlock().Number.Int64()
- // start emitting events in a separate go-routine
- // feed lookup relies on a single contract event log to perform multiple
- // listener contracts
- go func() {
- // only 1 event is necessary to make all 10 upkeeps eligible
- _ = feeds.EmitEvents(t, backend, 1, func() {
- // pause per emit for expected block production time
- time.Sleep(3 * time.Second)
- })
- }()
-
- go makeDummyBlocks(t, backend, 3*time.Second, 1000)
-
- idsToCheck := make([]*big.Int, 0)
- for i, uid := range feeds.UpkeepsIds() {
- if checkResultsProvider(i) {
- idsToCheck = append(idsToCheck, uid)
- }
- }
+ go makeDummyBlocks(t, backend, 3*time.Second, 1000)
- listener, done := listenPerformed(t, backend, registry, idsToCheck, startBlock)
- defer done()
- g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue())
- })
+ idsToCheck := make([]*big.Int, 0)
+ for i, uid := range feeds.UpkeepsIds() {
+ if checkResultsProvider(i) {
+ idsToCheck = append(idsToCheck, uid)
+ }
}
+
+ listener, done := listenPerformed(t, backend, registry, idsToCheck, startBlock)
+ defer done()
+ g.Eventually(listener, testutils.WaitTimeout(t)-(5*time.Second), cltest.DBPollingInterval).Should(gomega.BeTrue())
}
func startMercuryServer(t *testing.T, mercuryServer *mercury.SimulatedMercuryServer, responder func(i int) (int, []byte)) {
@@ -644,7 +589,7 @@ func listenPerformed(t *testing.T, backend *backends.SimulatedBackend, registry
return listenPerformedN(t, backend, registry, ids, startBlock, 0)
}
-func setupNodes(t *testing.T, nodeKeys [5]ethkey.KeyV2, registry *iregistry21.IKeeperRegistryMaster, backend *backends.SimulatedBackend, usr *bind.TransactOpts, useBufferV1 bool) ([]Node, *mercury.SimulatedMercuryServer) {
+func setupNodes(t *testing.T, nodeKeys [5]ethkey.KeyV2, registry *iregistry21.IKeeperRegistryMaster, backend *backends.SimulatedBackend, usr *bind.TransactOpts) ([]Node, *mercury.SimulatedMercuryServer) {
lggr := logger.TestLogger(t)
mServer := mercury.NewSimulatedMercuryServer()
mServer.Start()
@@ -727,8 +672,7 @@ func setupNodes(t *testing.T, nodeKeys [5]ethkey.KeyV2, registry *iregistry21.IK
cacheEvictionInterval = "1s"
mercuryCredentialName = "%s"
contractVersion = "v2.1"
- useBufferV1 = %v
- `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName, useBufferV1))
+ `, i, registry.Address(), node.KeyBundle.ID(), node.Transmitter, fmt.Sprintf("%s@127.0.0.1:%d", bootstrapPeerID, bootstrapNodePort), MercuryCredName))
}
// Setup config on contract
diff --git a/core/services/headreporter/prometheus_reporter.go b/core/services/promreporter/prom_reporter.go
similarity index 63%
rename from core/services/headreporter/prometheus_reporter.go
rename to core/services/promreporter/prom_reporter.go
index 3e39c7aca4..31d5f1129e 100644
--- a/core/services/headreporter/prometheus_reporter.go
+++ b/core/services/promreporter/prom_reporter.go
@@ -1,28 +1,40 @@
-package headreporter
+package promreporter
import (
"context"
"fmt"
"math/big"
+ "sync"
"time"
+ "github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
+ txmgrcommon "github.com/smartcontractkit/chainlink/v2/common/txmgr"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"go.uber.org/multierr"
- "github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
- txmgrcommon "github.com/smartcontractkit/chainlink/v2/common/txmgr"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
+
evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
)
type (
- prometheusReporter struct {
- ds sqlutil.DataSource
- chains legacyevm.LegacyChainContainer
- backend PrometheusBackend
+ promReporter struct {
+ services.StateMachine
+ ds sqlutil.DataSource
+ chains legacyevm.LegacyChainContainer
+ lggr logger.Logger
+ backend PrometheusBackend
+ newHeads *mailbox.Mailbox[*evmtypes.Head]
+ chStop services.StopChan
+ wgDone sync.WaitGroup
+ reportPeriod time.Duration
}
PrometheusBackend interface {
@@ -59,15 +71,103 @@ var (
})
)
-func NewPrometheusReporter(ds sqlutil.DataSource, chainContainer legacyevm.LegacyChainContainer) *prometheusReporter {
- return &prometheusReporter{
- ds: ds,
- chains: chainContainer,
- backend: defaultBackend{},
+func (defaultBackend) SetUnconfirmedTransactions(evmChainID *big.Int, n int64) {
+ promUnconfirmedTransactions.WithLabelValues(evmChainID.String()).Set(float64(n))
+}
+
+func (defaultBackend) SetMaxUnconfirmedAge(evmChainID *big.Int, s float64) {
+ promMaxUnconfirmedAge.WithLabelValues(evmChainID.String()).Set(s)
+}
+
+func (defaultBackend) SetMaxUnconfirmedBlocks(evmChainID *big.Int, n int64) {
+ promMaxUnconfirmedBlocks.WithLabelValues(evmChainID.String()).Set(float64(n))
+}
+
+func (defaultBackend) SetPipelineRunsQueued(n int) {
+ promPipelineTaskRunsQueued.Set(float64(n))
+}
+
+func (defaultBackend) SetPipelineTaskRunsQueued(n int) {
+ promPipelineRunsQueued.Set(float64(n))
+}
+
+func NewPromReporter(ds sqlutil.DataSource, chainContainer legacyevm.LegacyChainContainer, lggr logger.Logger, opts ...interface{}) *promReporter {
+ var backend PrometheusBackend = defaultBackend{}
+ period := 15 * time.Second
+ for _, opt := range opts {
+ switch v := opt.(type) {
+ case time.Duration:
+ period = v
+ case PrometheusBackend:
+ backend = v
+ }
+ }
+
+ chStop := make(chan struct{})
+ return &promReporter{
+ ds: ds,
+ chains: chainContainer,
+ lggr: lggr.Named("PromReporter"),
+ backend: backend,
+ newHeads: mailbox.NewSingle[*evmtypes.Head](),
+ chStop: chStop,
+ reportPeriod: period,
}
}
-func (pr *prometheusReporter) getTxm(evmChainID *big.Int) (txmgr.TxManager, error) {
+// Start starts PromReporter.
+func (pr *promReporter) Start(context.Context) error {
+ return pr.StartOnce("PromReporter", func() error {
+ pr.wgDone.Add(1)
+ go pr.eventLoop()
+ return nil
+ })
+}
+
+func (pr *promReporter) Close() error {
+ return pr.StopOnce("PromReporter", func() error {
+ close(pr.chStop)
+ pr.wgDone.Wait()
+ return nil
+ })
+}
+func (pr *promReporter) Name() string {
+ return pr.lggr.Name()
+}
+
+func (pr *promReporter) HealthReport() map[string]error {
+ return map[string]error{pr.Name(): pr.Healthy()}
+}
+
+func (pr *promReporter) OnNewLongestChain(ctx context.Context, head *evmtypes.Head) {
+ pr.newHeads.Deliver(head)
+}
+
+func (pr *promReporter) eventLoop() {
+ pr.lggr.Debug("Starting event loop")
+ defer pr.wgDone.Done()
+ ctx, cancel := pr.chStop.NewCtx()
+ defer cancel()
+ for {
+ select {
+ case <-pr.newHeads.Notify():
+ head, exists := pr.newHeads.Retrieve()
+ if !exists {
+ continue
+ }
+ pr.reportHeadMetrics(ctx, head)
+ case <-time.After(pr.reportPeriod):
+ if err := errors.Wrap(pr.reportPipelineRunStats(ctx), "reportPipelineRunStats failed"); err != nil {
+ pr.lggr.Errorw("Error reporting prometheus metrics", "err", err)
+ }
+
+ case <-pr.chStop:
+ return
+ }
+ }
+}
+
+func (pr *promReporter) getTxm(evmChainID *big.Int) (txmgr.TxManager, error) {
chain, err := pr.chains.Get(evmChainID.String())
if err != nil {
return nil, fmt.Errorf("failed to get chain: %w", err)
@@ -75,16 +175,20 @@ func (pr *prometheusReporter) getTxm(evmChainID *big.Int) (txmgr.TxManager, erro
return chain.TxManager(), nil
}
-func (pr *prometheusReporter) ReportNewHead(ctx context.Context, head *evmtypes.Head) error {
+func (pr *promReporter) reportHeadMetrics(ctx context.Context, head *evmtypes.Head) {
evmChainID := head.EVMChainID.ToInt()
- return multierr.Combine(
+ err := multierr.Combine(
errors.Wrap(pr.reportPendingEthTxes(ctx, evmChainID), "reportPendingEthTxes failed"),
errors.Wrap(pr.reportMaxUnconfirmedAge(ctx, evmChainID), "reportMaxUnconfirmedAge failed"),
errors.Wrap(pr.reportMaxUnconfirmedBlocks(ctx, head), "reportMaxUnconfirmedBlocks failed"),
)
+
+ if err != nil && ctx.Err() == nil {
+ pr.lggr.Errorw("Error reporting prometheus metrics", "err", err)
+ }
}
-func (pr *prometheusReporter) reportPendingEthTxes(ctx context.Context, evmChainID *big.Int) (err error) {
+func (pr *promReporter) reportPendingEthTxes(ctx context.Context, evmChainID *big.Int) (err error) {
txm, err := pr.getTxm(evmChainID)
if err != nil {
return fmt.Errorf("failed to get txm: %w", err)
@@ -98,7 +202,7 @@ func (pr *prometheusReporter) reportPendingEthTxes(ctx context.Context, evmChain
return nil
}
-func (pr *prometheusReporter) reportMaxUnconfirmedAge(ctx context.Context, evmChainID *big.Int) (err error) {
+func (pr *promReporter) reportMaxUnconfirmedAge(ctx context.Context, evmChainID *big.Int) (err error) {
txm, err := pr.getTxm(evmChainID)
if err != nil {
return fmt.Errorf("failed to get txm: %w", err)
@@ -117,7 +221,7 @@ func (pr *prometheusReporter) reportMaxUnconfirmedAge(ctx context.Context, evmCh
return nil
}
-func (pr *prometheusReporter) reportMaxUnconfirmedBlocks(ctx context.Context, head *evmtypes.Head) (err error) {
+func (pr *promReporter) reportMaxUnconfirmedBlocks(ctx context.Context, head *evmtypes.Head) (err error) {
txm, err := pr.getTxm(head.EVMChainID.ToInt())
if err != nil {
return fmt.Errorf("failed to get txm: %w", err)
@@ -136,11 +240,7 @@ func (pr *prometheusReporter) reportMaxUnconfirmedBlocks(ctx context.Context, he
return nil
}
-func (pr *prometheusReporter) ReportPeriodic(ctx context.Context) error {
- return errors.Wrap(pr.reportPipelineRunStats(ctx), "reportPipelineRunStats failed")
-}
-
-func (pr *prometheusReporter) reportPipelineRunStats(ctx context.Context) (err error) {
+func (pr *promReporter) reportPipelineRunStats(ctx context.Context) (err error) {
rows, err := pr.ds.QueryContext(ctx, `
SELECT pipeline_run_id FROM pipeline_task_runs WHERE finished_at IS NULL
`)
@@ -171,23 +271,3 @@ SELECT pipeline_run_id FROM pipeline_task_runs WHERE finished_at IS NULL
return nil
}
-
-func (defaultBackend) SetUnconfirmedTransactions(evmChainID *big.Int, n int64) {
- promUnconfirmedTransactions.WithLabelValues(evmChainID.String()).Set(float64(n))
-}
-
-func (defaultBackend) SetMaxUnconfirmedAge(evmChainID *big.Int, s float64) {
- promMaxUnconfirmedAge.WithLabelValues(evmChainID.String()).Set(s)
-}
-
-func (defaultBackend) SetMaxUnconfirmedBlocks(evmChainID *big.Int, n int64) {
- promMaxUnconfirmedBlocks.WithLabelValues(evmChainID.String()).Set(float64(n))
-}
-
-func (defaultBackend) SetPipelineRunsQueued(n int) {
- promPipelineTaskRunsQueued.Set(float64(n))
-}
-
-func (defaultBackend) SetPipelineTaskRunsQueued(n int) {
- promPipelineRunsQueued.Set(float64(n))
-}
diff --git a/core/services/headreporter/prometheus_reporter_test.go b/core/services/promreporter/prom_reporter_test.go
similarity index 64%
rename from core/services/headreporter/prometheus_reporter_test.go
rename to core/services/promreporter/prom_reporter_test.go
index 32d2c09d0e..b61fa25bdc 100644
--- a/core/services/headreporter/prometheus_reporter_test.go
+++ b/core/services/promreporter/prom_reporter_test.go
@@ -1,7 +1,8 @@
-package headreporter_test
+package promreporter_test
import (
"math/big"
+ "sync/atomic"
"testing"
"time"
@@ -9,40 +10,90 @@ import (
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
+
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/gas"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+ evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
+ ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
"github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/mocks"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/evmtest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/headreporter"
+ "github.com/smartcontractkit/chainlink/v2/core/services/promreporter"
)
-func Test_PrometheusReporter(t *testing.T) {
+func newHead() evmtypes.Head {
+ return evmtypes.Head{Number: 42, EVMChainID: ubig.NewI(0)}
+}
+
+func newLegacyChainContainer(t *testing.T, db *sqlx.DB) legacyevm.LegacyChainContainer {
+ config, dbConfig, evmConfig := txmgr.MakeTestConfigs(t)
+ keyStore := cltest.NewKeyStore(t, db).Eth()
+ ethClient := evmtest.NewEthClientMockWithDefaultChain(t)
+ estimator, err := gas.NewEstimator(logger.TestLogger(t), ethClient, config, evmConfig.GasEstimator())
+ require.NoError(t, err)
+ lggr := logger.TestLogger(t)
+ lpOpts := logpoller.Opts{
+ PollPeriod: 100 * time.Millisecond,
+ FinalityDepth: 2,
+ BackfillBatchSize: 3,
+ RpcBatchSize: 2,
+ KeepFinalizedBlocksDepth: 1000,
+ }
+ ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth)
+ lp := logpoller.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), ethClient, lggr, ht, lpOpts)
+
+ txm, err := txmgr.NewTxm(
+ db,
+ evmConfig,
+ evmConfig.GasEstimator(),
+ evmConfig.Transactions(),
+ nil,
+ dbConfig,
+ dbConfig.Listener(),
+ ethClient,
+ lggr,
+ lp,
+ keyStore,
+ estimator)
+ require.NoError(t, err)
+
+ cfg := configtest.NewGeneralConfig(t, nil)
+ return cltest.NewLegacyChainsWithMockChainAndTxManager(t, ethClient, cfg, txm)
+}
+
+func Test_PromReporter_OnNewLongestChain(t *testing.T) {
t.Run("with nothing in the database", func(t *testing.T) {
db := pgtest.NewSqlxDB(t)
- backend := headreporter.NewMockPrometheusBackend(t)
+ backend := mocks.NewPrometheusBackend(t)
+ reporter := promreporter.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond)
+
+ var subscribeCalls atomic.Int32
+
backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0)).Return()
backend.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0)).Return()
backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0)).Return()
+ backend.On("SetPipelineTaskRunsQueued", 0).Return()
+ backend.On("SetPipelineRunsQueued", 0).
+ Run(func(args mock.Arguments) {
+ subscribeCalls.Add(1)
+ }).
+ Return()
- reporter := headreporter.NewPrometheusReporter(db, newLegacyChainContainer(t, db))
- reporter.SetBackend(backend)
+ servicetest.Run(t, reporter)
- head := headreporter.NewHead()
- err := reporter.ReportNewHead(testutils.Context(t), &head)
- require.NoError(t, err)
+ head := newHead()
+ reporter.OnNewLongestChain(testutils.Context(t), &head)
- backend.On("SetPipelineTaskRunsQueued", 0).Return()
- backend.On("SetPipelineRunsQueued", 0).Return()
- err = reporter.ReportPeriodic(testutils.Context(t))
- require.NoError(t, err)
+ require.Eventually(t, func() bool { return subscribeCalls.Load() >= 1 }, 12*time.Second, 100*time.Millisecond)
})
t.Run("with unconfirmed evm.txes", func(t *testing.T) {
@@ -51,92 +102,61 @@ func Test_PrometheusReporter(t *testing.T) {
ethKeyStore := cltest.NewKeyStore(t, db).Eth()
_, fromAddress := cltest.MustInsertRandomKey(t, ethKeyStore)
- etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress)
- cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress)
- cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)
- require.NoError(t, txStore.UpdateTxAttemptBroadcastBeforeBlockNum(testutils.Context(t), etx.ID, 7))
+ var subscribeCalls atomic.Int32
- backend := headreporter.NewMockPrometheusBackend(t)
+ backend := mocks.NewPrometheusBackend(t)
backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(3)).Return()
backend.On("SetMaxUnconfirmedAge", big.NewInt(0), mock.MatchedBy(func(s float64) bool {
return s > 0
})).Return()
backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(35)).Return()
+ backend.On("SetPipelineTaskRunsQueued", 0).Return()
+ backend.On("SetPipelineRunsQueued", 0).
+ Run(func(args mock.Arguments) {
+ subscribeCalls.Add(1)
+ }).
+ Return()
+ reporter := promreporter.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond)
+ servicetest.Run(t, reporter)
- reporter := headreporter.NewPrometheusReporter(db, newLegacyChainContainer(t, db))
- reporter.SetBackend(backend)
-
- head := headreporter.NewHead()
- err := reporter.ReportNewHead(testutils.Context(t), &head)
- require.NoError(t, err)
+ etx := cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 0, fromAddress)
+ cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 1, fromAddress)
+ cltest.MustInsertUnconfirmedEthTxWithBroadcastLegacyAttempt(t, txStore, 2, fromAddress)
+ require.NoError(t, txStore.UpdateTxAttemptBroadcastBeforeBlockNum(testutils.Context(t), etx.ID, 7))
- backend.On("SetPipelineTaskRunsQueued", 0).Return()
- backend.On("SetPipelineRunsQueued", 0).Return()
+ head := newHead()
+ reporter.OnNewLongestChain(testutils.Context(t), &head)
- err = reporter.ReportPeriodic(testutils.Context(t))
- require.NoError(t, err)
+ require.Eventually(t, func() bool { return subscribeCalls.Load() >= 1 }, 12*time.Second, 100*time.Millisecond)
})
t.Run("with unfinished pipeline task runs", func(t *testing.T) {
db := pgtest.NewSqlxDB(t)
pgtest.MustExec(t, db, `SET CONSTRAINTS pipeline_task_runs_pipeline_run_id_fkey DEFERRED`)
+ backend := mocks.NewPrometheusBackend(t)
+ reporter := promreporter.NewPromReporter(db, newLegacyChainContainer(t, db), logger.TestLogger(t), backend, 10*time.Millisecond)
+
cltest.MustInsertUnfinishedPipelineTaskRun(t, db, 1)
cltest.MustInsertUnfinishedPipelineTaskRun(t, db, 1)
cltest.MustInsertUnfinishedPipelineTaskRun(t, db, 2)
- backend := headreporter.NewMockPrometheusBackend(t)
+ var subscribeCalls atomic.Int32
+
backend.On("SetUnconfirmedTransactions", big.NewInt(0), int64(0)).Return()
backend.On("SetMaxUnconfirmedAge", big.NewInt(0), float64(0)).Return()
backend.On("SetMaxUnconfirmedBlocks", big.NewInt(0), int64(0)).Return()
-
- reporter := headreporter.NewPrometheusReporter(db, newLegacyChainContainer(t, db))
- reporter.SetBackend(backend)
-
- head := headreporter.NewHead()
- err := reporter.ReportNewHead(testutils.Context(t), &head)
- require.NoError(t, err)
-
backend.On("SetPipelineTaskRunsQueued", 3).Return()
- backend.On("SetPipelineRunsQueued", 2).Return()
-
- err = reporter.ReportPeriodic(testutils.Context(t))
- require.NoError(t, err)
- })
-}
-
-func newLegacyChainContainer(t *testing.T, db *sqlx.DB) legacyevm.LegacyChainContainer {
- config, dbConfig, evmConfig := txmgr.MakeTestConfigs(t)
- keyStore := cltest.NewKeyStore(t, db).Eth()
- ethClient := evmtest.NewEthClientMockWithDefaultChain(t)
- estimator, err := gas.NewEstimator(logger.TestLogger(t), ethClient, config, evmConfig.GasEstimator())
- require.NoError(t, err)
- lggr := logger.TestLogger(t)
- lpOpts := logpoller.Opts{
- PollPeriod: 100 * time.Millisecond,
- FinalityDepth: 2,
- BackfillBatchSize: 3,
- RpcBatchSize: 2,
- KeepFinalizedBlocksDepth: 1000,
- }
- ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth)
- lp := logpoller.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), ethClient, lggr, ht, lpOpts)
+ backend.On("SetPipelineRunsQueued", 2).
+ Run(func(args mock.Arguments) {
+ subscribeCalls.Add(1)
+ }).
+ Return()
+ servicetest.Run(t, reporter)
- txm, err := txmgr.NewTxm(
- db,
- evmConfig,
- evmConfig.GasEstimator(),
- evmConfig.Transactions(),
- nil,
- dbConfig,
- dbConfig.Listener(),
- ethClient,
- lggr,
- lp,
- keyStore,
- estimator)
- require.NoError(t, err)
+ head := newHead()
+ reporter.OnNewLongestChain(testutils.Context(t), &head)
- cfg := configtest.NewGeneralConfig(t, nil)
- return cltest.NewLegacyChainsWithMockChainAndTxManager(t, ethClient, cfg, txm)
+ require.Eventually(t, func() bool { return subscribeCalls.Load() >= 1 }, 12*time.Second, 100*time.Millisecond)
+ })
}
diff --git a/core/services/registrysyncer/local_registry.go b/core/services/registrysyncer/local_registry.go
new file mode 100644
index 0000000000..4e4a632bf8
--- /dev/null
+++ b/core/services/registrysyncer/local_registry.go
@@ -0,0 +1,85 @@
+package registrysyncer
+
+import (
+ "context"
+ "errors"
+ "fmt"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
+)
+
+type DonID uint32
+
+type DON struct {
+ capabilities.DON
+ CapabilityConfigurations map[string]capabilities.CapabilityConfiguration
+}
+
+type Capability struct {
+ ID string
+ CapabilityType capabilities.CapabilityType
+}
+
+type LocalRegistry struct {
+ lggr logger.Logger
+ peerWrapper p2ptypes.PeerWrapper
+ IDsToDONs map[DonID]DON
+ IDsToNodes map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo
+ IDsToCapabilities map[string]Capability
+}
+
+func (l *LocalRegistry) LocalNode(ctx context.Context) (capabilities.Node, error) {
+ // Load the current nodes PeerWrapper, this gets us the current node's
+ // PeerID, allowing us to contextualize registry information in terms of DON ownership
+ // (eg. get my current DON configuration, etc).
+ if l.peerWrapper.GetPeer() == nil {
+ return capabilities.Node{}, errors.New("unable to get local node: peerWrapper hasn't started yet")
+ }
+
+ pid := l.peerWrapper.GetPeer().ID()
+
+ var workflowDON capabilities.DON
+ capabilityDONs := []capabilities.DON{}
+ for _, d := range l.IDsToDONs {
+ for _, p := range d.Members {
+ if p == pid {
+ if d.AcceptsWorkflows {
+ // The CapabilitiesRegistry enforces that the DON ID is strictly
+ // greater than 0, so if the ID is 0, it means we've not set `workflowDON` initialized above yet.
+ if workflowDON.ID == 0 {
+ workflowDON = d.DON
+ l.lggr.Debug("Workflow DON identified: %+v", workflowDON)
+ } else {
+ l.lggr.Errorf("Configuration error: node %s belongs to more than one workflowDON", pid)
+ }
+ }
+
+ capabilityDONs = append(capabilityDONs, d.DON)
+ }
+ }
+ }
+
+ return capabilities.Node{
+ PeerID: &pid,
+ WorkflowDON: workflowDON,
+ CapabilityDONs: capabilityDONs,
+ }, nil
+}
+
+func (l *LocalRegistry) ConfigForCapability(ctx context.Context, capabilityID string, donID uint32) (capabilities.CapabilityConfiguration, error) {
+ d, ok := l.IDsToDONs[DonID(donID)]
+ if !ok {
+ return capabilities.CapabilityConfiguration{}, fmt.Errorf("could not find don %d", donID)
+ }
+
+ cc, ok := d.CapabilityConfigurations[capabilityID]
+ if !ok {
+ return capabilities.CapabilityConfiguration{}, fmt.Errorf("could not find capability configuration for capability %s and donID %d", capabilityID, donID)
+ }
+
+ return cc, nil
+}
diff --git a/core/services/registrysyncer/syncer.go b/core/services/registrysyncer/syncer.go
index f3c254af6d..6a44ff561d 100644
--- a/core/services/registrysyncer/syncer.go
+++ b/core/services/registrysyncer/syncer.go
@@ -7,9 +7,14 @@ import (
"sync"
"time"
+ "google.golang.org/protobuf/proto"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -17,17 +22,8 @@ import (
evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
)
-type HashedCapabilityID [32]byte
-type DonID uint32
-
-type State struct {
- IDsToDONs map[DonID]kcr.CapabilitiesRegistryDONInfo
- IDsToNodes map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo
- IDsToCapabilities map[HashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo
-}
-
type Launcher interface {
- Launch(ctx context.Context, state State) error
+ Launch(ctx context.Context, registry *LocalRegistry) error
}
type Syncer interface {
@@ -36,12 +32,14 @@ type Syncer interface {
}
type registrySyncer struct {
+ services.StateMachine
stopCh services.StopChan
launchers []Launcher
reader types.ContractReader
initReader func(ctx context.Context, lggr logger.Logger, relayer contractReaderFactory, registryAddress string) (types.ContractReader, error)
relayer contractReaderFactory
registryAddress string
+ peerWrapper p2ptypes.PeerWrapper
wg sync.WaitGroup
lggr logger.Logger
@@ -57,6 +55,7 @@ var (
// New instantiates a new RegistrySyncer
func New(
lggr logger.Logger,
+ peerWrapper p2ptypes.PeerWrapper,
relayer contractReaderFactory,
registryAddress string,
) (*registrySyncer, error) {
@@ -67,6 +66,7 @@ func New(
relayer: relayer,
registryAddress: registryAddress,
initReader: newReader,
+ peerWrapper: peerWrapper,
}, nil
}
@@ -118,12 +118,14 @@ func newReader(ctx context.Context, lggr logger.Logger, relayer contractReaderFa
}
func (s *registrySyncer) Start(ctx context.Context) error {
- s.wg.Add(1)
- go func() {
- defer s.wg.Done()
- s.syncLoop()
- }()
- return nil
+ return s.StartOnce("RegistrySyncer", func() error {
+ s.wg.Add(1)
+ go func() {
+ defer s.wg.Done()
+ s.syncLoop()
+ }()
+ return nil
+ })
}
func (s *registrySyncer) syncLoop() {
@@ -156,33 +158,81 @@ func (s *registrySyncer) syncLoop() {
}
}
-func (s *registrySyncer) state(ctx context.Context) (State, error) {
- dons := []kcr.CapabilitiesRegistryDONInfo{}
- err := s.reader.GetLatestValue(ctx, "CapabilitiesRegistry", "getDONs", primitives.Unconfirmed, nil, &dons)
+func unmarshalCapabilityConfig(data []byte) (capabilities.CapabilityConfiguration, error) {
+ cconf := &capabilitiespb.CapabilityConfig{}
+ err := proto.Unmarshal(data, cconf)
if err != nil {
- return State{}, err
+ return capabilities.CapabilityConfiguration{}, err
}
- idsToDONs := map[DonID]kcr.CapabilitiesRegistryDONInfo{}
- for _, d := range dons {
- idsToDONs[DonID(d.Id)] = d
+ var rtc capabilities.RemoteTriggerConfig
+ if prtc := cconf.GetRemoteTriggerConfig(); prtc != nil {
+ rtc.RegistrationRefresh = prtc.RegistrationRefresh.AsDuration()
+ rtc.RegistrationExpiry = prtc.RegistrationExpiry.AsDuration()
+ rtc.MinResponsesToAggregate = prtc.MinResponsesToAggregate
+ rtc.MessageExpiry = prtc.MessageExpiry.AsDuration()
}
+ return capabilities.CapabilityConfiguration{
+ DefaultConfig: values.FromMapValueProto(cconf.DefaultConfig),
+ RemoteTriggerConfig: rtc,
+ }, nil
+}
+
+func (s *registrySyncer) localRegistry(ctx context.Context) (*LocalRegistry, error) {
caps := []kcr.CapabilitiesRegistryCapabilityInfo{}
- err = s.reader.GetLatestValue(ctx, "CapabilitiesRegistry", "getCapabilities", primitives.Unconfirmed, nil, &caps)
+ err := s.reader.GetLatestValue(ctx, "CapabilitiesRegistry", "getCapabilities", primitives.Unconfirmed, nil, &caps)
if err != nil {
- return State{}, err
+ return nil, err
}
- idsToCapabilities := map[HashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{}
+ idsToCapabilities := map[string]Capability{}
+ hashedIDsToCapabilityIDs := map[[32]byte]string{}
for _, c := range caps {
- idsToCapabilities[c.HashedId] = c
+ cid := fmt.Sprintf("%s@%s", c.LabelledName, c.Version)
+ idsToCapabilities[cid] = Capability{
+ ID: cid,
+ CapabilityType: toCapabilityType(c.CapabilityType),
+ }
+
+ hashedIDsToCapabilityIDs[c.HashedId] = cid
+ }
+
+ dons := []kcr.CapabilitiesRegistryDONInfo{}
+ err = s.reader.GetLatestValue(ctx, "CapabilitiesRegistry", "getDONs", primitives.Unconfirmed, nil, &dons)
+ if err != nil {
+ return nil, err
+ }
+
+ idsToDONs := map[DonID]DON{}
+ for _, d := range dons {
+ cc := map[string]capabilities.CapabilityConfiguration{}
+ for _, dc := range d.CapabilityConfigurations {
+ cid, ok := hashedIDsToCapabilityIDs[dc.CapabilityId]
+ if !ok {
+ return nil, fmt.Errorf("invariant violation: could not find full ID for hashed ID %s", dc.CapabilityId)
+ }
+
+ cconf, innerErr := unmarshalCapabilityConfig(dc.Config)
+ if innerErr != nil {
+ return nil, innerErr
+ }
+
+ cconf.RemoteTriggerConfig.ApplyDefaults()
+
+ cc[cid] = cconf
+ }
+
+ idsToDONs[DonID(d.Id)] = DON{
+ DON: *toDONInfo(d),
+ CapabilityConfigurations: cc,
+ }
}
nodes := []kcr.CapabilitiesRegistryNodeInfo{}
err = s.reader.GetLatestValue(ctx, "CapabilitiesRegistry", "getNodes", primitives.Unconfirmed, nil, &nodes)
if err != nil {
- return State{}, err
+ return nil, err
}
idsToNodes := map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{}
@@ -190,7 +240,13 @@ func (s *registrySyncer) state(ctx context.Context) (State, error) {
idsToNodes[node.P2pId] = node
}
- return State{IDsToDONs: idsToDONs, IDsToCapabilities: idsToCapabilities, IDsToNodes: idsToNodes}, nil
+ return &LocalRegistry{
+ lggr: s.lggr,
+ peerWrapper: s.peerWrapper,
+ IDsToDONs: idsToDONs,
+ IDsToCapabilities: idsToCapabilities,
+ IDsToNodes: idsToNodes,
+ }, nil
}
func (s *registrySyncer) sync(ctx context.Context) error {
@@ -211,13 +267,13 @@ func (s *registrySyncer) sync(ctx context.Context) error {
s.reader = reader
}
- state, err := s.state(ctx)
+ lr, err := s.localRegistry(ctx)
if err != nil {
return fmt.Errorf("failed to sync with remote registry: %w", err)
}
for _, h := range s.launchers {
- if err := h.Launch(ctx, state); err != nil {
+ if err := h.Launch(ctx, lr); err != nil {
s.lggr.Errorf("error calling launcher: %s", err)
}
}
@@ -225,6 +281,38 @@ func (s *registrySyncer) sync(ctx context.Context) error {
return nil
}
+func toCapabilityType(capabilityType uint8) capabilities.CapabilityType {
+ switch capabilityType {
+ case 0:
+ return capabilities.CapabilityTypeTrigger
+ case 1:
+ return capabilities.CapabilityTypeAction
+ case 2:
+ return capabilities.CapabilityTypeConsensus
+ case 3:
+ return capabilities.CapabilityTypeTarget
+ default:
+ // Not found
+ return capabilities.CapabilityType(-1)
+ }
+}
+
+func toDONInfo(don kcr.CapabilitiesRegistryDONInfo) *capabilities.DON {
+ peerIDs := []p2ptypes.PeerID{}
+ for _, p := range don.NodeP2PIds {
+ peerIDs = append(peerIDs, p)
+ }
+
+ return &capabilities.DON{
+ ID: don.Id,
+ ConfigVersion: don.ConfigCount,
+ Members: peerIDs,
+ F: don.F,
+ IsPublic: don.IsPublic,
+ AcceptsWorkflows: don.AcceptsWorkflows,
+ }
+}
+
func (s *registrySyncer) AddLauncher(launchers ...Launcher) {
s.mu.Lock()
defer s.mu.Unlock()
@@ -232,9 +320,11 @@ func (s *registrySyncer) AddLauncher(launchers ...Launcher) {
}
func (s *registrySyncer) Close() error {
- close(s.stopCh)
- s.wg.Wait()
- return nil
+ return s.StopOnce("RegistrySyncer", func() error {
+ close(s.stopCh)
+ s.wg.Wait()
+ return nil
+ })
}
func (s *registrySyncer) Ready() error {
diff --git a/core/services/registrysyncer/syncer_test.go b/core/services/registrysyncer/syncer_test.go
index c239cead43..b926183394 100644
--- a/core/services/registrysyncer/syncer_test.go
+++ b/core/services/registrysyncer/syncer_test.go
@@ -16,9 +16,15 @@ import (
"github.com/ethereum/go-ethereum/eth/ethconfig"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/types/known/durationpb"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
+ capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
@@ -27,14 +33,15 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
"github.com/smartcontractkit/chainlink/v2/core/logger"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
+ "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types/mocks"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
)
var writeChainCapability = kcr.CapabilitiesRegistryCapability{
- LabelledName: "write-chain",
- Version: "1.0.1",
- ResponseType: uint8(1),
+ LabelledName: "write-chain",
+ Version: "1.0.1",
+ CapabilityType: uint8(3),
}
func startNewChainWithRegistry(t *testing.T) (*kcr.CapabilitiesRegistry, common.Address, *bind.TransactOpts, *backends.SimulatedBackend) {
@@ -120,14 +127,22 @@ func randomWord() [32]byte {
}
type launcher struct {
- localRegistry State
+ localRegistry *LocalRegistry
}
-func (l *launcher) Launch(ctx context.Context, localRegistry State) error {
+func (l *launcher) Launch(ctx context.Context, localRegistry *LocalRegistry) error {
l.localRegistry = localRegistry
return nil
}
+func toPeerIDs(ids [][32]byte) []p2ptypes.PeerID {
+ pids := []p2ptypes.PeerID{}
+ for _, id := range ids {
+ pids = append(pids, id)
+ }
+ return pids
+}
+
func TestReader_Integration(t *testing.T) {
ctx := testutils.Context(t)
reg, regAddress, owner, sim := startNewChainWithRegistry(t)
@@ -136,7 +151,9 @@ func TestReader_Integration(t *testing.T) {
require.NoError(t, err, "AddCapability failed for %s", writeChainCapability.LabelledName)
sim.Commit()
- cid, err := reg.GetHashedCapabilityId(&bind.CallOpts{}, writeChainCapability.LabelledName, writeChainCapability.Version)
+ cid := fmt.Sprintf("%s@%s", writeChainCapability.LabelledName, writeChainCapability.Version)
+
+ hid, err := reg.GetHashedCapabilityId(&bind.CallOpts{}, writeChainCapability.LabelledName, writeChainCapability.Version)
require.NoError(t, err)
_, err = reg.AddNodeOperators(owner, []kcr.CapabilitiesRegistryNodeOperator{
@@ -165,30 +182,46 @@ func TestReader_Integration(t *testing.T) {
NodeOperatorId: uint32(1),
Signer: signersSet[0],
P2pId: nodeSet[0],
- HashedCapabilityIds: [][32]byte{cid},
+ HashedCapabilityIds: [][32]byte{hid},
},
{
// The first NodeOperatorId has id 1 since the id is auto-incrementing.
NodeOperatorId: uint32(1),
Signer: signersSet[1],
P2pId: nodeSet[1],
- HashedCapabilityIds: [][32]byte{cid},
+ HashedCapabilityIds: [][32]byte{hid},
},
{
// The first NodeOperatorId has id 1 since the id is auto-incrementing.
NodeOperatorId: uint32(1),
Signer: signersSet[2],
P2pId: nodeSet[2],
- HashedCapabilityIds: [][32]byte{cid},
+ HashedCapabilityIds: [][32]byte{hid},
},
}
_, err = reg.AddNodes(owner, nodes)
require.NoError(t, err)
+ config := &capabilitiespb.CapabilityConfig{
+ DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(),
+ RemoteConfig: &capabilitiespb.CapabilityConfig_RemoteTriggerConfig{
+ RemoteTriggerConfig: &capabilitiespb.RemoteTriggerConfig{
+ RegistrationRefresh: durationpb.New(20 * time.Second),
+ RegistrationExpiry: durationpb.New(60 * time.Second),
+ // F + 1
+ MinResponsesToAggregate: uint32(1) + 1,
+ },
+ },
+ }
+ configb, err := proto.Marshal(config)
+ if err != nil {
+ panic(err)
+ }
+
cfgs := []kcr.CapabilitiesRegistryCapabilityConfiguration{
{
- CapabilityId: cid,
- Config: []byte(`{"hello": "world"}`),
+ CapabilityId: hid,
+ Config: configb,
},
}
_, err = reg.AddDON(
@@ -203,8 +236,9 @@ func TestReader_Integration(t *testing.T) {
require.NoError(t, err)
+ wrapper := mocks.NewPeerWrapper(t)
factory := newContractReaderFactory(t, sim)
- syncer, err := New(logger.TestLogger(t), factory, regAddress.Hex())
+ syncer, err := New(logger.TestLogger(t), wrapper, factory, regAddress.Hex())
require.NoError(t, err)
l := &launcher{}
@@ -216,25 +250,35 @@ func TestReader_Integration(t *testing.T) {
assert.Len(t, s.IDsToCapabilities, 1)
gotCap := s.IDsToCapabilities[cid]
- assert.Equal(t, kcr.CapabilitiesRegistryCapabilityInfo{
- HashedId: cid,
- LabelledName: "write-chain",
- Version: "1.0.1",
- ResponseType: uint8(1),
- CapabilityType: uint8(0),
- IsDeprecated: false,
+ assert.Equal(t, Capability{
+ CapabilityType: capabilities.CapabilityTypeTarget,
+ ID: "write-chain@1.0.1",
}, gotCap)
assert.Len(t, s.IDsToDONs, 1)
- assert.Equal(t, kcr.CapabilitiesRegistryDONInfo{
- Id: 1, // initial Id
- ConfigCount: 1, // initial Count
- IsPublic: true,
- AcceptsWorkflows: true,
- F: 1,
- NodeP2PIds: nodeSet,
- CapabilityConfigurations: cfgs,
- }, s.IDsToDONs[1])
+ rtc := capabilities.RemoteTriggerConfig{
+ RegistrationRefresh: 20 * time.Second,
+ MinResponsesToAggregate: 2,
+ RegistrationExpiry: 60 * time.Second,
+ MessageExpiry: 120 * time.Second,
+ }
+ expectedDON := DON{
+ DON: capabilities.DON{
+ ID: 1,
+ ConfigVersion: 1,
+ IsPublic: true,
+ AcceptsWorkflows: true,
+ F: 1,
+ Members: toPeerIDs(nodeSet),
+ },
+ CapabilityConfigurations: map[string]capabilities.CapabilityConfiguration{
+ cid: {
+ DefaultConfig: values.EmptyMap(),
+ RemoteTriggerConfig: rtc,
+ },
+ },
+ }
+ assert.Equal(t, expectedDON, s.IDsToDONs[1])
nodesInfo := []kcr.CapabilitiesRegistryNodeInfo{
{
@@ -244,7 +288,7 @@ func TestReader_Integration(t *testing.T) {
WorkflowDONId: 1,
Signer: signersSet[0],
P2pId: nodeSet[0],
- HashedCapabilityIds: [][32]byte{cid},
+ HashedCapabilityIds: [][32]byte{hid},
CapabilitiesDONIds: []*big.Int{},
},
{
@@ -254,7 +298,7 @@ func TestReader_Integration(t *testing.T) {
WorkflowDONId: 1,
Signer: signersSet[1],
P2pId: nodeSet[1],
- HashedCapabilityIds: [][32]byte{cid},
+ HashedCapabilityIds: [][32]byte{hid},
CapabilitiesDONIds: []*big.Int{},
},
{
@@ -264,7 +308,7 @@ func TestReader_Integration(t *testing.T) {
WorkflowDONId: 1,
Signer: signersSet[2],
P2pId: nodeSet[2],
- HashedCapabilityIds: [][32]byte{cid},
+ HashedCapabilityIds: [][32]byte{hid},
CapabilitiesDONIds: []*big.Int{},
},
}
@@ -276,3 +320,84 @@ func TestReader_Integration(t *testing.T) {
nodeSet[2]: nodesInfo[2],
}, s.IDsToNodes)
}
+
+func TestSyncer_LocalNode(t *testing.T) {
+ ctx := tests.Context(t)
+ lggr := logger.TestLogger(t)
+
+ var pid p2ptypes.PeerID
+ err := pid.UnmarshalText([]byte("12D3KooWBCF1XT5Wi8FzfgNCqRL76Swv8TRU3TiD4QiJm8NMNX7N"))
+ require.NoError(t, err)
+ peer := mocks.NewPeer(t)
+ peer.On("ID").Return(pid)
+ wrapper := mocks.NewPeerWrapper(t)
+ wrapper.On("GetPeer").Return(peer)
+
+ workflowDonNodes := []p2ptypes.PeerID{
+ pid,
+ randomWord(),
+ randomWord(),
+ randomWord(),
+ }
+
+ dID := uint32(1)
+ // The below state describes a Workflow DON (AcceptsWorkflows = true),
+ // which exposes the streams-trigger and write_chain capabilities.
+ // We expect receivers to be wired up and both capabilities to be added to the registry.
+ localRegistry := LocalRegistry{
+ lggr: lggr,
+ peerWrapper: wrapper,
+ IDsToDONs: map[DonID]DON{
+ DonID(dID): {
+ DON: capabilities.DON{
+ ID: dID,
+ ConfigVersion: uint32(2),
+ F: uint8(1),
+ IsPublic: true,
+ AcceptsWorkflows: true,
+ Members: workflowDonNodes,
+ },
+ },
+ },
+ IDsToNodes: map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo{
+ workflowDonNodes[0]: {
+ NodeOperatorId: 1,
+ Signer: randomWord(),
+ P2pId: workflowDonNodes[0],
+ },
+ workflowDonNodes[1]: {
+ NodeOperatorId: 1,
+ Signer: randomWord(),
+ P2pId: workflowDonNodes[1],
+ },
+ workflowDonNodes[2]: {
+ NodeOperatorId: 1,
+ Signer: randomWord(),
+ P2pId: workflowDonNodes[2],
+ },
+ workflowDonNodes[3]: {
+ NodeOperatorId: 1,
+ Signer: randomWord(),
+ P2pId: workflowDonNodes[3],
+ },
+ },
+ }
+
+ node, err := localRegistry.LocalNode(ctx)
+ require.NoError(t, err)
+
+ don := capabilities.DON{
+ ID: dID,
+ ConfigVersion: 2,
+ Members: workflowDonNodes,
+ F: 1,
+ IsPublic: true,
+ AcceptsWorkflows: true,
+ }
+ expectedNode := capabilities.Node{
+ PeerID: &pid,
+ WorkflowDON: don,
+ CapabilityDONs: []capabilities.DON{don},
+ }
+ assert.Equal(t, expectedNode, node)
+}
diff --git a/core/services/workflows/delegate.go b/core/services/workflows/delegate.go
index b937e0b580..acd006940f 100644
--- a/core/services/workflows/delegate.go
+++ b/core/services/workflows/delegate.go
@@ -7,7 +7,6 @@ import (
"github.com/google/uuid"
"github.com/pelletier/go-toml"
- "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/types/core"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
@@ -15,10 +14,9 @@ import (
)
type Delegate struct {
- registry core.CapabilitiesRegistry
- logger logger.Logger
- getLocalNode func(ctx context.Context) (capabilities.Node, error)
- store store.Store
+ registry core.CapabilitiesRegistry
+ logger logger.Logger
+ store store.Store
}
var _ job.Delegate = (*Delegate)(nil)
@@ -44,7 +42,6 @@ func (d *Delegate) ServicesForSpec(_ context.Context, spec job.Job) ([]job.Servi
WorkflowOwner: spec.WorkflowSpec.WorkflowOwner,
WorkflowName: spec.WorkflowSpec.WorkflowName,
Registry: d.registry,
- GetLocalNode: d.getLocalNode,
Store: d.store,
}
engine, err := NewEngine(cfg)
@@ -58,9 +55,8 @@ func NewDelegate(
logger logger.Logger,
registry core.CapabilitiesRegistry,
store store.Store,
- getLocalNode func(ctx context.Context) (capabilities.Node, error),
) *Delegate {
- return &Delegate{logger: logger, registry: registry, store: store, getLocalNode: getLocalNode}
+ return &Delegate{logger: logger, registry: registry, store: store}
}
func ValidatedWorkflowJobSpec(tomlString string) (job.Job, error) {
diff --git a/core/services/workflows/engine.go b/core/services/workflows/engine.go
index f83d40b176..ed5daaf210 100644
--- a/core/services/workflows/engine.go
+++ b/core/services/workflows/engine.go
@@ -33,7 +33,6 @@ type Engine struct {
logger logger.Logger
registry core.CapabilitiesRegistry
workflow *workflow
- getLocalNode func(ctx context.Context) (capabilities.Node, error)
localNode capabilities.Node
executionStates store.Store
pendingStepRequests chan stepRequest
@@ -164,9 +163,11 @@ func (e *Engine) initializeCapability(ctx context.Context, step *step) error {
return newCPErr("failed to get capability info", err)
}
+ step.info = info
+
// Special treatment for local targets - wrap into a transmission capability
// If the DON is nil, this is a local target.
- if info.CapabilityType == capabilities.CapabilityTypeTarget && info.DON == nil {
+ if info.CapabilityType == capabilities.CapabilityTypeTarget && info.IsLocal {
l := e.logger.With("capabilityID", step.ID)
l.Debug("wrapping capability in local transmission protocol")
cp = transmission.NewLocalTargetCapability(
@@ -222,7 +223,7 @@ func (e *Engine) init(ctx context.Context) {
retryErr := retryable(ctx, e.logger, e.retryMs, e.maxRetries, func() error {
// first wait for localDON to return a non-error response; this depends
// on the underlying peerWrapper returning the PeerID.
- node, err := e.getLocalNode(ctx)
+ node, err := e.registry.LocalNode(ctx)
if err != nil {
return fmt.Errorf("failed to get donInfo: %w", err)
}
@@ -680,6 +681,45 @@ func (e *Engine) workerForStepRequest(ctx context.Context, msg stepRequest) {
}
}
+func merge(baseConfig *values.Map, overrideConfig *values.Map) *values.Map {
+ m := values.EmptyMap()
+
+ for k, v := range baseConfig.Underlying {
+ m.Underlying[k] = v
+ }
+
+ for k, v := range overrideConfig.Underlying {
+ m.Underlying[k] = v
+ }
+
+ return m
+}
+
+func (e *Engine) configForStep(ctx context.Context, executionID string, step *step) (*values.Map, error) {
+ ID := step.info.ID
+
+ // If the capability info is missing a DON, then
+ // the capability is local, and we should use the localNode's DON ID.
+ var donID uint32
+ if !step.info.IsLocal {
+ donID = step.info.DON.ID
+ } else {
+ donID = e.localNode.WorkflowDON.ID
+ }
+
+ capConfig, err := e.registry.ConfigForCapability(ctx, ID, donID)
+ if err != nil {
+ e.logger.Warnw(fmt.Sprintf("could not retrieve config from remote registry: %s", err), "executionID", executionID, "capabilityID", ID)
+ return step.config, nil
+ }
+
+ // Merge the configs for now; note that this means that a workflow can override
+ // all of the config set by the capability. This is probably not desirable in
+ // the long-term, but we don't know much about those use cases so stick to a simpler
+ // implementation for now.
+ return merge(capConfig.DefaultConfig, step.config), nil
+}
+
// executeStep executes the referenced capability within a step and returns the result.
func (e *Engine) executeStep(ctx context.Context, msg stepRequest) (*values.Map, values.Value, error) {
step, err := e.workflow.Vertex(msg.stepRef)
@@ -704,9 +744,14 @@ func (e *Engine) executeStep(ctx context.Context, msg stepRequest) (*values.Map,
return nil, nil, err
}
+ config, err := e.configForStep(ctx, msg.state.ExecutionID, step)
+ if err != nil {
+ return nil, nil, err
+ }
+
tr := capabilities.CapabilityRequest{
Inputs: inputsMap,
- Config: step.config,
+ Config: config,
Metadata: capabilities.RequestMetadata{
WorkflowID: msg.state.WorkflowID,
WorkflowExecutionID: msg.state.ExecutionID,
@@ -825,7 +870,6 @@ type Config struct {
QueueSize int
NewWorkerTimeout time.Duration
MaxExecutionDuration time.Duration
- GetLocalNode func(ctx context.Context) (capabilities.Node, error)
Store store.Store
// For testing purposes only
@@ -868,12 +912,6 @@ func NewEngine(cfg Config) (engine *Engine, err error) {
cfg.MaxExecutionDuration = defaultMaxExecutionDuration
}
- if cfg.GetLocalNode == nil {
- cfg.GetLocalNode = func(ctx context.Context) (capabilities.Node, error) {
- return capabilities.Node{}, nil
- }
- }
-
if cfg.retryMs == 0 {
cfg.retryMs = 5000
}
@@ -911,7 +949,6 @@ func NewEngine(cfg Config) (engine *Engine, err error) {
logger: cfg.Lggr.Named("WorkflowEngine").With("workflowID", cfg.WorkflowID),
registry: cfg.Registry,
workflow: workflow,
- getLocalNode: cfg.GetLocalNode,
executionStates: cfg.Store,
pendingStepRequests: make(chan stepRequest, cfg.QueueSize),
stepUpdateCh: make(chan store.WorkflowExecutionStep),
diff --git a/core/services/workflows/engine_test.go b/core/services/workflows/engine_test.go
index 2c4129dbaf..b8d5a9591e 100644
--- a/core/services/workflows/engine_test.go
+++ b/core/services/workflows/engine_test.go
@@ -99,26 +99,46 @@ func newTestDBStore(t *testing.T, clock clockwork.Clock) store.Store {
return store.NewDBStore(db, logger.TestLogger(t), clock)
}
+type testConfigProvider struct {
+ localNode func(ctx context.Context) (capabilities.Node, error)
+ configForCapability func(ctx context.Context, capabilityID string, donID uint32) (capabilities.CapabilityConfiguration, error)
+}
+
+func (t testConfigProvider) LocalNode(ctx context.Context) (capabilities.Node, error) {
+ if t.localNode != nil {
+ return t.localNode(ctx)
+ }
+
+ peerID := p2ptypes.PeerID{}
+ return capabilities.Node{
+ WorkflowDON: capabilities.DON{
+ ID: 1,
+ },
+ PeerID: &peerID,
+ }, nil
+}
+
+func (t testConfigProvider) ConfigForCapability(ctx context.Context, capabilityID string, donID uint32) (capabilities.CapabilityConfiguration, error) {
+ if t.configForCapability != nil {
+ return t.configForCapability(ctx, capabilityID, donID)
+ }
+
+ return capabilities.CapabilityConfiguration{DefaultConfig: values.EmptyMap()}, nil
+}
+
// newTestEngine creates a new engine with some test defaults.
func newTestEngine(t *testing.T, reg *coreCap.Registry, spec string, opts ...func(c *Config)) (*Engine, *testHooks) {
- peerID := p2ptypes.PeerID{}
initFailed := make(chan struct{})
initSuccessful := make(chan struct{})
executionFinished := make(chan string, 100)
clock := clockwork.NewFakeClock()
+
+ reg.SetLocalRegistry(&testConfigProvider{})
cfg := Config{
WorkflowID: testWorkflowId,
Lggr: logger.TestLogger(t),
Registry: reg,
Spec: spec,
- GetLocalNode: func(ctx context.Context) (capabilities.Node, error) {
- return capabilities.Node{
- WorkflowDON: capabilities.DON{
- ID: 1,
- },
- PeerID: &peerID,
- }, nil
- },
maxRetries: 1,
retryMs: 100,
afterInit: func(success bool) {
@@ -787,6 +807,19 @@ func TestEngine_GetsNodeInfoDuringInitialization(t *testing.T) {
},
}
retryCount := 0
+
+ reg.SetLocalRegistry(testConfigProvider{
+ localNode: func(ctx context.Context) (capabilities.Node, error) {
+ n := capabilities.Node{}
+ err := errors.New("peer not initialized")
+ if retryCount > 0 {
+ n = node
+ err = nil
+ }
+ retryCount++
+ return n, err
+ },
+ })
eng, hooks := newTestEngine(
t,
reg,
@@ -796,16 +829,6 @@ func TestEngine_GetsNodeInfoDuringInitialization(t *testing.T) {
c.clock = clock
c.maxRetries = 2
c.retryMs = 0
- c.GetLocalNode = func(ctx context.Context) (capabilities.Node, error) {
- n := capabilities.Node{}
- err := errors.New("peer not initialized")
- if retryCount > 0 {
- n = node
- err = nil
- }
- retryCount++
- return n, err
- }
},
)
servicetest.Run(t, eng)
@@ -969,3 +992,74 @@ func TestEngine_Error(t *testing.T) {
})
}
}
+
+func TestEngine_MergesWorkflowConfigAndCRConfig(t *testing.T) {
+ ctx := testutils.Context(t)
+ reg := coreCap.NewRegistry(logger.TestLogger(t))
+
+ trigger, _ := mockTrigger(t)
+
+ require.NoError(t, reg.Add(ctx, trigger))
+ require.NoError(t, reg.Add(ctx, mockConsensus()))
+ writeID := "write_polygon-testnet-mumbai@1.0.0"
+
+ gotConfig := values.EmptyMap()
+ target := newMockCapability(
+ // Create a remote capability so we don't use the local transmission protocol.
+ capabilities.MustNewRemoteCapabilityInfo(
+ writeID,
+ capabilities.CapabilityTypeTarget,
+ "a write capability targeting polygon testnet",
+ &capabilities.DON{ID: 1},
+ ),
+ func(req capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) {
+ gotConfig = req.Config
+
+ return capabilities.CapabilityResponse{
+ Value: req.Inputs,
+ }, nil
+ },
+ )
+ require.NoError(t, reg.Add(ctx, target))
+
+ eng, testHooks := newTestEngine(
+ t,
+ reg,
+ simpleWorkflow,
+ )
+ reg.SetLocalRegistry(testConfigProvider{
+ configForCapability: func(ctx context.Context, capabilityID string, donID uint32) (capabilities.CapabilityConfiguration, error) {
+ if capabilityID != writeID {
+ return capabilities.CapabilityConfiguration{
+ DefaultConfig: values.EmptyMap(),
+ }, nil
+ }
+
+ cm, err := values.WrapMap(map[string]any{
+ "deltaStage": "1s",
+ "schedule": "allAtOnce",
+ })
+ if err != nil {
+ return capabilities.CapabilityConfiguration{}, err
+ }
+
+ return capabilities.CapabilityConfiguration{
+ DefaultConfig: cm,
+ }, nil
+ },
+ })
+
+ servicetest.Run(t, eng)
+
+ eid := getExecutionId(t, eng, testHooks)
+
+ state, err := eng.executionStates.Get(ctx, eid)
+ require.NoError(t, err)
+
+ assert.Equal(t, state.Status, store.StatusCompleted)
+
+ m, err := values.Unwrap(gotConfig)
+ require.NoError(t, err)
+ assert.Equal(t, m.(map[string]any)["deltaStage"], "1s")
+ assert.Equal(t, m.(map[string]any)["schedule"], "allAtOnce")
+}
diff --git a/core/services/workflows/models.go b/core/services/workflows/models.go
index d55212a30c..8d970dfa94 100644
--- a/core/services/workflows/models.go
+++ b/core/services/workflows/models.go
@@ -79,6 +79,7 @@ func (w *workflow) dependents(start string) ([]*step, error) {
type step struct {
workflows.Vertex
capability capabilities.CallbackCapability
+ info capabilities.CapabilityInfo
config *values.Map
}
diff --git a/core/web/testdata/body/health.html b/core/web/testdata/body/health.html
index 4e244a9fe7..2a1b222753 100644
--- a/core/web/testdata/body/health.html
+++ b/core/web/testdata/body/health.html
@@ -69,9 +69,6 @@
-
- HeadReporter
-
JobSpawner
@@ -99,6 +96,9 @@
BridgeCache
+
+ PromReporter
+
TelemetryManager
diff --git a/core/web/testdata/body/health.json b/core/web/testdata/body/health.json
index 224a3534c9..10415c0abd 100644
--- a/core/web/testdata/body/health.json
+++ b/core/web/testdata/body/health.json
@@ -99,15 +99,6 @@
"output": ""
}
},
- {
- "type": "checks",
- "id": "HeadReporter",
- "attributes": {
- "name": "HeadReporter",
- "status": "passing",
- "output": ""
- }
- },
{
"type": "checks",
"id": "JobSpawner",
@@ -171,6 +162,15 @@
"output": ""
}
},
+ {
+ "type": "checks",
+ "id": "PromReporter",
+ "attributes": {
+ "name": "PromReporter",
+ "status": "passing",
+ "output": ""
+ }
+ },
{
"type": "checks",
"id": "TelemetryManager",
diff --git a/core/web/testdata/body/health.txt b/core/web/testdata/body/health.txt
index 0fbac846a6..09c8cff6c2 100644
--- a/core/web/testdata/body/health.txt
+++ b/core/web/testdata/body/health.txt
@@ -10,7 +10,6 @@ ok EVM.0.Txm.BlockHistoryEstimator
ok EVM.0.Txm.Broadcaster
ok EVM.0.Txm.Confirmer
ok EVM.0.Txm.WrappedEvmEstimator
-ok HeadReporter
ok JobSpawner
ok Mailbox.Monitor
ok Mercury.WSRPCPool
@@ -18,4 +17,5 @@ ok Mercury.WSRPCPool.CacheSet
ok PipelineORM
ok PipelineRunner
ok PipelineRunner.BridgeCache
+ok PromReporter
ok TelemetryManager
diff --git a/go.mod b/go.mod
index ee87e23f30..fdebb10181 100644
--- a/go.mod
+++ b/go.mod
@@ -74,7 +74,7 @@ require (
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chain-selectors v1.0.23
github.com/smartcontractkit/chainlink-automation v1.0.4
- github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
+ github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827
@@ -129,6 +129,11 @@ require (
)
require (
+ cloud.google.com/go/auth v0.7.1 // indirect
+ cloud.google.com/go/auth/oauth2adapt v0.2.3 // indirect
+ cloud.google.com/go/compute/metadata v0.5.0 // indirect
+ cloud.google.com/go/iam v1.1.11 // indirect
+ cloud.google.com/go/storage v1.43.0 // indirect
contrib.go.opencensus.io/exporter/stackdriver v0.13.5 // indirect
cosmossdk.io/api v0.3.1 // indirect
cosmossdk.io/core v0.5.1 // indirect
@@ -323,17 +328,21 @@ require (
go.etcd.io/bbolt v1.3.7 // indirect
go.mongodb.org/mongo-driver v1.15.0 // indirect
go.opencensus.io v0.24.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect
go.opentelemetry.io/otel/metric v1.28.0 // indirect
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect
go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.uber.org/ratelimit v0.3.0 // indirect
- golang.org/x/arch v0.7.0 // indirect
+ golang.org/x/arch v0.8.0 // indirect
+ golang.org/x/oauth2 v0.21.0 // indirect
golang.org/x/sys v0.22.0 // indirect
- google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect
+ google.golang.org/api v0.188.0 // indirect
+ google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect
gopkg.in/guregu/null.v2 v2.1.2 // indirect
diff --git a/go.sum b/go.sum
index ac442571a9..d65d3fa705 100644
--- a/go.sum
+++ b/go.sum
@@ -10,27 +10,30 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
-cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
+cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
+cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
+cloud.google.com/go/auth v0.7.1 h1:Iv1bbpzJ2OIg16m94XI9/tlzZZl3cdeR3nGVGj78N7s=
+cloud.google.com/go/auth v0.7.1/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs=
+cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI=
+cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
-cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
-cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
+cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
-cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
+cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw=
+cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg=
-cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY=
+cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
+cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk=
contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo=
@@ -533,8 +536,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=
-github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
+github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA=
+github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
@@ -1027,8 +1030,8 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj
github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1/go.mod h1:Jg1sCTsbxg76YByI8ifpFby3FvVqISStHT8ypy9ocmY=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45/go.mod h1:LV0h7QBQUpoC2UUi6TcUvcIFm1xjP/DtEcqV8+qeLUs=
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa h1:g75H8oh2ws52s8BekwvGQ9XvBVu3E7WM1rfiA0PN0zk=
@@ -1215,10 +1218,10 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg=
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.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
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.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
@@ -1231,8 +1234,8 @@ go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6b
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
-go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0=
-go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q=
+go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08=
+go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg=
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
@@ -1267,8 +1270,8 @@ go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
-golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
+golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1379,8 +1382,8 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
-golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
+golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1564,8 +1567,8 @@ google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY=
-google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg=
+google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw=
+google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -1597,8 +1600,8 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY=
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY=
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A=
diff --git a/integration-tests/actions/actions.go b/integration-tests/actions/actions.go
index 9cad5f79de..73365da443 100644
--- a/integration-tests/actions/actions.go
+++ b/integration-tests/actions/actions.go
@@ -40,7 +40,8 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/google/uuid"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
gethtypes "github.com/ethereum/go-ethereum/core/types"
"github.com/pkg/errors"
diff --git a/integration-tests/actions/automation_ocr_helpers.go b/integration-tests/actions/automation_ocr_helpers.go
index 05c4501fbe..866d1078a6 100644
--- a/integration-tests/actions/automation_ocr_helpers.go
+++ b/integration-tests/actions/automation_ocr_helpers.go
@@ -10,7 +10,8 @@ import (
"time"
"github.com/pkg/errors"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_registry_master_wrapper_2_3"
diff --git a/integration-tests/actions/automationv2/actions.go b/integration-tests/actions/automationv2/actions.go
index f7d495bda5..c0d751b96c 100644
--- a/integration-tests/actions/automationv2/actions.go
+++ b/integration-tests/actions/automationv2/actions.go
@@ -20,11 +20,12 @@ import (
ocr2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
ocr3 "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper"
"github.com/smartcontractkit/libocr/offchainreporting2plus/types"
- "github.com/smartcontractkit/seth"
"github.com/stretchr/testify/require"
"golang.org/x/sync/errgroup"
"gopkg.in/guregu/null.v4"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_registry_master_wrapper_2_3"
ocr2keepers20config "github.com/smartcontractkit/chainlink-automation/pkg/v2/config"
@@ -88,8 +89,7 @@ type AutomationTest struct {
mercuryCredentialName string
TransmitterKeyIndex int
- Logger zerolog.Logger
- useLogBufferV1 bool
+ Logger zerolog.Logger
}
type UpkeepConfig struct {
@@ -117,7 +117,6 @@ func NewAutomationTestK8s(
TransmitterKeyIndex: 0,
UpkeepPrivilegeManager: chainClient.MustGetRootKeyAddress(),
mercuryCredentialName: "",
- useLogBufferV1: false,
Logger: l,
}
}
@@ -134,7 +133,6 @@ func NewAutomationTestDocker(
TransmitterKeyIndex: 0,
UpkeepPrivilegeManager: chainClient.MustGetRootKeyAddress(),
mercuryCredentialName: "",
- useLogBufferV1: false,
Logger: l,
}
}
@@ -147,10 +145,6 @@ func (a *AutomationTest) SetMercuryCredentialName(name string) {
a.mercuryCredentialName = name
}
-func (a *AutomationTest) SetUseLogBufferV1(flag bool) {
- a.useLogBufferV1 = flag
-}
-
func (a *AutomationTest) SetTransmitterKeyIndex(index int) {
a.TransmitterKeyIndex = index
}
@@ -422,9 +416,6 @@ func (a *AutomationTest) AddAutomationJobs() error {
if a.mercuryCredentialName != "" {
pluginCfg["mercuryCredentialName"] = "\"" + a.mercuryCredentialName + "\""
}
- if a.useLogBufferV1 {
- pluginCfg["useBufferV1"] = "true"
- }
}
for i := 1; i < len(a.ChainlinkNodes); i++ {
autoOCR2JobSpec := client.OCR2TaskJobSpec{
diff --git a/integration-tests/actions/keeper_helpers.go b/integration-tests/actions/keeper_helpers.go
index ee1662cc18..84353ff9b2 100644
--- a/integration-tests/actions/keeper_helpers.go
+++ b/integration-tests/actions/keeper_helpers.go
@@ -11,7 +11,8 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/google/uuid"
"github.com/pkg/errors"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
ctf_concurrency "github.com/smartcontractkit/chainlink-testing-framework/concurrency"
"github.com/smartcontractkit/chainlink-testing-framework/logging"
diff --git a/integration-tests/actions/ocr_helpers.go b/integration-tests/actions/ocr_helpers.go
index 0622167c99..b0292dc518 100644
--- a/integration-tests/actions/ocr_helpers.go
+++ b/integration-tests/actions/ocr_helpers.go
@@ -10,7 +10,8 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
diff --git a/integration-tests/actions/refund.go b/integration-tests/actions/refund.go
index 38c4dfad3b..d49b74c699 100644
--- a/integration-tests/actions/refund.go
+++ b/integration-tests/actions/refund.go
@@ -16,7 +16,8 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/pkg/errors"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink-testing-framework/blockchain"
diff --git a/integration-tests/actions/vrf/common/actions.go b/integration-tests/actions/vrf/common/actions.go
index e599c705ef..1fcba02fa7 100644
--- a/integration-tests/actions/vrf/common/actions.go
+++ b/integration-tests/actions/vrf/common/actions.go
@@ -15,7 +15,8 @@ import (
"github.com/go-resty/resty/v2"
"github.com/google/uuid"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
ctf_test_env "github.com/smartcontractkit/chainlink-testing-framework/docker/test_env"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
diff --git a/integration-tests/actions/vrf/vrfv1/actions.go b/integration-tests/actions/vrf/vrfv1/actions.go
index 67110c543e..f5fae76a39 100644
--- a/integration-tests/actions/vrf/vrfv1/actions.go
+++ b/integration-tests/actions/vrf/vrfv1/actions.go
@@ -3,7 +3,7 @@ package vrfv1
import (
"fmt"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
)
diff --git a/integration-tests/actions/vrf/vrfv2/contract_steps.go b/integration-tests/actions/vrf/vrfv2/contract_steps.go
index 324b65b5d6..053b06758d 100644
--- a/integration-tests/actions/vrf/vrfv2/contract_steps.go
+++ b/integration-tests/actions/vrf/vrfv2/contract_steps.go
@@ -11,7 +11,7 @@ import (
"github.com/rs/zerolog"
"github.com/shopspring/decimal"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
"github.com/smartcontractkit/chainlink/integration-tests/actions"
diff --git a/integration-tests/actions/vrf/vrfv2/setup_steps.go b/integration-tests/actions/vrf/vrfv2/setup_steps.go
index c13aed807a..25b1f4c077 100644
--- a/integration-tests/actions/vrf/vrfv2/setup_steps.go
+++ b/integration-tests/actions/vrf/vrfv2/setup_steps.go
@@ -6,7 +6,7 @@ import (
"math/big"
"testing"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
diff --git a/integration-tests/actions/vrf/vrfv2plus/contract_steps.go b/integration-tests/actions/vrf/vrfv2plus/contract_steps.go
index 479b00d952..882bd97792 100644
--- a/integration-tests/actions/vrf/vrfv2plus/contract_steps.go
+++ b/integration-tests/actions/vrf/vrfv2plus/contract_steps.go
@@ -10,7 +10,8 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/rs/zerolog"
"github.com/shopspring/decimal"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
"github.com/smartcontractkit/chainlink/integration-tests/actions"
diff --git a/integration-tests/actions/vrf/vrfv2plus/setup_steps.go b/integration-tests/actions/vrf/vrfv2plus/setup_steps.go
index f3c7d53d6e..b7698e6429 100644
--- a/integration-tests/actions/vrf/vrfv2plus/setup_steps.go
+++ b/integration-tests/actions/vrf/vrfv2plus/setup_steps.go
@@ -6,7 +6,7 @@ import (
"math/big"
"testing"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
diff --git a/integration-tests/ccip-tests/Makefile b/integration-tests/ccip-tests/Makefile
index d33d956915..8fdd635fd6 100644
--- a/integration-tests/ccip-tests/Makefile
+++ b/integration-tests/ccip-tests/Makefile
@@ -1,5 +1,5 @@
## To Override the default config:
-# example usage: make set_config override_toml=../config/config.toml network_config_toml=../config/network.toml
+# example usage: make set_config override_toml=../config/config.toml
.PHONY: set_config
set_config:
if [ -s "$(override_toml)" ]; then \
@@ -12,10 +12,6 @@ set_config:
echo "No override config found, using default config"; \
echo > ./testconfig/override/.env; \
fi
- if [ -s "$(network_config_toml)" ]; then \
- echo "Overriding network config with $(network_config_toml)"; \
- echo "export BASE64_NETWORK_CONFIG=$$(base64 -i $(network_config_toml))" >> ./testconfig/override/.env; \
- fi
@echo "Checking for test secrets file in ~/.testsecrets...";
@if [ ! -f ~/.testsecrets ]; then \
diff --git a/integration-tests/ccip-tests/testconfig/README.md b/integration-tests/ccip-tests/testconfig/README.md
index e22a5e4d59..bcf468a36c 100644
--- a/integration-tests/ccip-tests/testconfig/README.md
+++ b/integration-tests/ccip-tests/testconfig/README.md
@@ -10,7 +10,7 @@ The test config is read in following order:
- The config mentioned in this file will override the default config.
- Example override file - [override.toml.example](./examples/override.toml.example)
- If there are sensitive details like private keys, credentials in test config, they can be specified in a separate dotenv file as env vars
- - The `~/.testsecrets` file in home directory is automatically loaded and should have all test secrets as env vars
+ - The `~/.testsecrets` file in home directory is automatically loaded and should have all test secrets as env vars. Learn more about it [here](https://github.com/smartcontractkit/chainlink-testing-framework/blob/main/config/README.md#test-secrets)
- Example secret file - [.testsecrets.example](./examples/.testsecrets.example)
## CCIP.ContractVersions
@@ -119,14 +119,7 @@ Mandatory fields are:
- **NewCLCluster**: [CCIP.Env.NewCLCluster](#ccipenvnewclcluster) - This is mandatory if the test needs to deploy Chainlink nodes.
- **ExistingCLCluster**: [CCIP.Env.ExistingCLCluster](#ccipenvexistingclcluster) - This is mandatory if the test needs to run on existing Chainlink nodes to deploy ccip jobs.
-Test needs network/chain details to be set through configuration. This configuration is mandatory for running the tests.
-you have option to set the network details in two ways:
-
-1. Using [CCIP.Env.Networks](#ccipenvnetworks)
-2. Using a separate network config file -
- - refer to the example - [network_config.toml.example](./examples/network_config.toml.example)
- - once all necessary values are set, encode the toml file content in base64 format,
- - set the base64'ed string content in `BASE64_NETWORK_CONFIG` environment variable.
+Test needs network/chain details to be set through configuration. Set network urls in ~/.testsecrets [see docs](https://github.com/smartcontractkit/chainlink-testing-framework/blob/main/config/README.md#test-secrets).
### CCIP.Env.Networks
diff --git a/integration-tests/ccip-tests/testconfig/examples/network_config.toml.example b/integration-tests/ccip-tests/testconfig/examples/network_config.toml.example
deleted file mode 100644
index ffed99a771..0000000000
--- a/integration-tests/ccip-tests/testconfig/examples/network_config.toml.example
+++ /dev/null
@@ -1,168 +0,0 @@
-[RpcHttpUrls]
-ETHEREUM_MAINNET = [
- 'https:....',
- 'https:......',
-]
-AVALANCHE_MAINNET = [
- 'https:....',
- 'https:......',
-]
-BASE_MAINNET = [
- 'https:....',
- 'https:......',
-]
-ARBITRUM_MAINNET = [
- 'https:....',
- 'https:......',
-]
-BSC_MAINNET = [
- 'https:....',
- 'https:......',
-]
-OPTIMISM_MAINNET = [
- 'https:....',
- 'https:......',
-]
-POLYGON_MAINNET = [
- 'https:....',
- 'https:......',
-]
-WEMIX_MAINNET = [
- 'https:....',
- 'https:......',
-]
-KROMA_MAINNET = [
- 'https:....',
- 'https:......',
-]
-
-OPTIMISM_SEPOLIA = [
- 'https:....',
- 'https:......',
-]
-SEPOLIA = [
- 'https:....',
- 'https:......',
-]
-AVALANCHE_FUJI = [
- 'https:....',
- 'https:......',
-]
-ARBITRUM_SEPOLIA = [
- 'https:....',
- 'https:......',
-]
-POLYGON_MUMBAI = [
- 'https:....',
- 'https:......',
-]
-BASE_SEPOLIA = [
- 'https:....',
- 'https:......',
-]
-BSC_TESTNET = [
- 'https:....',
- 'https:......',
-]
-KROMA_SEPOLIA = [
- 'https:....',
- 'https:......',
-]
-WEMIX_TESTNET = [
- 'https:....',
- 'https:......',
-]
-
-[RpcWsUrls]
-ETHEREUM_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-AVALANCHE_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-BASE_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-ARBITRUM_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-BSC_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-POLYGON_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-OPTIMISM_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-WEMIX_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-KROMA_MAINNET = [
- 'wss://......',
- 'wss://.........'
-]
-OPTIMISM_SEPOLIA = [
- 'wss://......',
- 'wss://.........'
-]
-SEPOLIA = [
- 'wss://......',
- 'wss://.........'
-]
-AVALANCHE_FUJI = [
- 'wss://......',
- 'wss://.........'
-]
-ARBITRUM_SEPOLIA = [
- 'wss://......',
- 'wss://.........'
-]
-POLYGON_MUMBAI = [
- 'wss://......',
- 'wss://.........'
-]
-BASE_SEPOLIA = [
- 'wss://......',
- 'wss://.........'
-]
-BSC_TESTNET = [
- 'wss://......',
- 'wss://.........'
-]
-KROMA_SEPOLIA = [
- 'wss://......',
- 'wss://.........'
-]
-WEMIX_TESTNET = [
- 'wss://......',
- 'wss://.........'
-]
-
-[WalletKeys]
-ETHEREUM_MAINNET = ['']
-AVALANCHE_MAINNET = ['']
-BASE_MAINNET = ['']
-ARBITRUM_MAINNET = ['']
-BSC_MAINNET = ['']
-POLYGON_MAINNET = ['']
-OPTIMISM_MAINNET = ['']
-WEMIX_MAINNET = ['']
-KROMA_MAINNET = ['']
-OPTIMISM_SEPOLIA = ['']
-SEPOLIA = ['']
-AVALANCHE_FUJI = ['']
-ARBITRUM_SEPOLIA = ['']
-POLYGON_MUMBAI = ['']
-BASE_SEPOLIA = ['']
-BSC_TESTNET = ['']
-KROMA_SEPOLIA = ['']
-WEMIX_TESTNET = ['']
\ No newline at end of file
diff --git a/integration-tests/ccip-tests/testconfig/global.go b/integration-tests/ccip-tests/testconfig/global.go
index a1658a4841..e8d955fae9 100644
--- a/integration-tests/ccip-tests/testconfig/global.go
+++ b/integration-tests/ccip-tests/testconfig/global.go
@@ -12,7 +12,8 @@ import (
"github.com/pelletier/go-toml/v2"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink-testing-framework/docker/test_env"
"github.com/smartcontractkit/chainlink-testing-framework/logging"
diff --git a/integration-tests/chaos/automation_chaos_test.go b/integration-tests/chaos/automation_chaos_test.go
index 79513b2e8f..467f371ad1 100644
--- a/integration-tests/chaos/automation_chaos_test.go
+++ b/integration-tests/chaos/automation_chaos_test.go
@@ -6,6 +6,11 @@ import (
"testing"
"time"
+ ocr3 "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper"
+
+ ocr2keepers30config "github.com/smartcontractkit/chainlink-automation/pkg/v3/config"
+ "github.com/smartcontractkit/chainlink/integration-tests/actions/automationv2"
+
seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
"github.com/onsi/gomega"
@@ -77,22 +82,6 @@ ListenAddresses = ["0.0.0.0:6690"]`
},
},
}
-
- defaultOCRRegistryConfig = contracts.KeeperRegistrySettings{
- PaymentPremiumPPB: uint32(200000000),
- FlatFeeMicroLINK: uint32(0),
- BlockCountPerTurn: big.NewInt(10),
- CheckGasLimit: uint32(2500000),
- StalenessSeconds: big.NewInt(90000),
- GasCeilingMultiplier: uint16(1),
- MinUpkeepSpend: big.NewInt(0),
- MaxPerformGas: uint32(5000000),
- FallbackGasPrice: big.NewInt(2e11),
- FallbackLinkPrice: big.NewInt(2e18),
- MaxCheckDataSize: uint32(5000),
- MaxPerformDataSize: uint32(5000),
- MaxRevertDataSize: uint32(5000),
- }
)
func getDefaultAutomationSettings(config *tc.TestConfig) map[string]interface{} {
@@ -127,6 +116,7 @@ func TestAutomationChaos(t *testing.T) {
"registry_2_0": eth_contracts.RegistryVersion_2_0,
"registry_2_1": eth_contracts.RegistryVersion_2_1,
"registry_2_2": eth_contracts.RegistryVersion_2_2,
+ "registry_2_3": eth_contracts.RegistryVersion_2_3,
}
for name, registryVersion := range registryVersions {
@@ -253,57 +243,76 @@ func TestAutomationChaos(t *testing.T) {
require.NoError(t, err, "Error tearing down environment")
})
- txCost, err := actions.EstimateCostForChainlinkOperations(l, chainClient, network, 1000)
- require.NoError(t, err, "Error estimating cost for Chainlink Operations")
- err = actions.FundChainlinkNodesFromRootAddress(l, chainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes), txCost)
- require.NoError(t, err, "Error funding Chainlink nodes")
-
- linkToken, err := contracts.DeployLinkTokenContract(l, chainClient)
- require.NoError(t, err, "Error deploying LINK token")
-
- wethToken, err := contracts.DeployWETHTokenContract(l, chainClient)
- require.NoError(t, err, "Error deploying weth token contract")
-
- // This feed is used for both eth/usd and link/usd
- ethUSDFeed, err := contracts.DeployMockETHUSDFeed(chainClient, defaultOCRRegistryConfig.FallbackLinkPrice)
- require.NoError(t, err, "Error deploying eth usd feed contract")
-
- registry, registrar := actions.DeployAutoOCRRegistryAndRegistrar(
- t,
- chainClient,
- rv,
- defaultOCRRegistryConfig,
- linkToken,
- wethToken,
- ethUSDFeed,
- )
-
- // Fund the registry with LINK
- err = linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(numberOfUpkeeps))))
- require.NoError(t, err, "Funding keeper registry contract shouldn't fail")
-
- actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv)
- nodesWithoutBootstrap := chainlinkNodes[1:]
- defaultOCRRegistryConfig.RegistryVersion = rv
- ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled(), linkToken, wethToken, ethUSDFeed)
- require.NoError(t, err, "Error building OCR config vars")
-
- if rv == eth_contracts.RegistryVersion_2_0 {
- err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig)
- } else {
- err = registry.SetConfigTypeSafe(ocrConfig)
+ a := automationv2.NewAutomationTestK8s(l, chainClient, chainlinkNodes)
+ a.SetMercuryCredentialName("cred1")
+ conf := config.Automation.AutomationConfig
+ a.RegistrySettings = contracts.KeeperRegistrySettings{
+ PaymentPremiumPPB: *conf.RegistrySettings.PaymentPremiumPPB,
+ FlatFeeMicroLINK: *conf.RegistrySettings.FlatFeeMicroLINK,
+ CheckGasLimit: *conf.RegistrySettings.CheckGasLimit,
+ StalenessSeconds: conf.RegistrySettings.StalenessSeconds,
+ GasCeilingMultiplier: *conf.RegistrySettings.GasCeilingMultiplier,
+ MaxPerformGas: *conf.RegistrySettings.MaxPerformGas,
+ MinUpkeepSpend: conf.RegistrySettings.MinUpkeepSpend,
+ FallbackGasPrice: conf.RegistrySettings.FallbackGasPrice,
+ FallbackLinkPrice: conf.RegistrySettings.FallbackLinkPrice,
+ MaxCheckDataSize: *conf.RegistrySettings.MaxCheckDataSize,
+ MaxPerformDataSize: *conf.RegistrySettings.MaxPerformDataSize,
+ MaxRevertDataSize: *conf.RegistrySettings.MaxRevertDataSize,
+ RegistryVersion: rv,
+ }
+ a.RegistrarSettings = contracts.KeeperRegistrarSettings{
+ AutoApproveConfigType: uint8(2),
+ AutoApproveMaxAllowed: 1000,
+ MinLinkJuels: big.NewInt(0),
+ }
+ plCfg := config.GetAutomationConfig().AutomationConfig.PluginConfig
+ a.PluginConfig = ocr2keepers30config.OffchainConfig{
+ TargetProbability: *plCfg.TargetProbability,
+ TargetInRounds: *plCfg.TargetInRounds,
+ PerformLockoutWindow: *plCfg.PerformLockoutWindow,
+ GasLimitPerReport: *plCfg.GasLimitPerReport,
+ GasOverheadPerUpkeep: *plCfg.GasOverheadPerUpkeep,
+ MinConfirmations: *plCfg.MinConfirmations,
+ MaxUpkeepBatchSize: *plCfg.MaxUpkeepBatchSize,
+ }
+ pubCfg := config.GetAutomationConfig().AutomationConfig.PublicConfig
+ a.PublicConfig = ocr3.PublicConfig{
+ DeltaProgress: *pubCfg.DeltaProgress,
+ DeltaResend: *pubCfg.DeltaResend,
+ DeltaInitial: *pubCfg.DeltaInitial,
+ DeltaRound: *pubCfg.DeltaRound,
+ DeltaGrace: *pubCfg.DeltaGrace,
+ DeltaCertifiedCommitRequest: *pubCfg.DeltaCertifiedCommitRequest,
+ DeltaStage: *pubCfg.DeltaStage,
+ RMax: *pubCfg.RMax,
+ MaxDurationQuery: *pubCfg.MaxDurationQuery,
+ MaxDurationObservation: *pubCfg.MaxDurationObservation,
+ MaxDurationShouldAcceptAttestedReport: *pubCfg.MaxDurationShouldAcceptAttestedReport,
+ MaxDurationShouldTransmitAcceptedReport: *pubCfg.MaxDurationShouldTransmitAcceptedReport,
+ F: *pubCfg.F,
}
- require.NoError(t, err, "Error setting OCR config")
- consumersConditional, upkeepidsConditional := actions.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, false, false, false, nil)
- consumersLogtrigger, upkeepidsLogtrigger := actions.DeployConsumers(t, chainClient, registry, registrar, linkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, true, false, false, nil)
+ a.SetupAutomationDeployment(t)
- consumers := append(consumersConditional, consumersLogtrigger...)
- upkeepIDs := append(upkeepidsConditional, upkeepidsLogtrigger...)
+ err = actions.FundChainlinkNodesFromRootAddress(l, a.ChainClient, contracts.ChainlinkK8sClientToChainlinkNodeWithKeysAndAddress(chainlinkNodes[1:]), big.NewFloat(*config.Common.ChainlinkNodeFunding))
+ require.NoError(t, err, "Error funding Chainlink nodes")
+
+ var consumersLogTrigger, consumersConditional []contracts.KeeperConsumer
+ var upkeepidsConditional, upkeepidsLogTrigger []*big.Int
+ consumersConditional, upkeepidsConditional = actions.DeployConsumers(t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, false, false, false, nil)
+ consumers := consumersConditional
+ upkeepIDs := upkeepidsConditional
+ if rv >= eth_contracts.RegistryVersion_2_1 {
+ consumersLogTrigger, upkeepidsLogTrigger = actions.DeployConsumers(t, a.ChainClient, a.Registry, a.Registrar, a.LinkToken, numberOfUpkeeps, big.NewInt(defaultLinkFunds), defaultUpkeepGasLimit, true, false, false, nil)
- for _, c := range consumersLogtrigger {
- err = c.Start()
- require.NoError(t, err, "Error starting consumer")
+ consumers = append(consumersConditional, consumersLogTrigger...)
+ upkeepIDs = append(upkeepidsConditional, upkeepidsLogTrigger...)
+
+ for _, c := range consumersLogTrigger {
+ err = c.Start()
+ require.NoError(t, err, "Error starting consumer")
+ }
}
l.Info().Msg("Waiting for all upkeeps to be performed")
@@ -324,6 +333,13 @@ func TestAutomationChaos(t *testing.T) {
_, err = testEnvironment.Chaos.Run(testCase.chaosFunc(testEnvironment.Cfg.Namespace, testCase.chaosProps))
require.NoError(t, err)
+ if rv >= eth_contracts.RegistryVersion_2_1 {
+ for _, c := range consumersLogTrigger {
+ err = c.Start()
+ require.NoError(t, err, "Error starting consumer")
+ }
+ }
+
gom.Eventually(func(g gomega.Gomega) {
// Check if the upkeeps are performing multiple times by analyzing their counters and checking they are greater than 10
for i := 0; i < len(upkeepIDs); i++ {
@@ -334,7 +350,7 @@ func TestAutomationChaos(t *testing.T) {
g.Expect(counter.Int64()).Should(gomega.BeNumerically(">=", int64(expect)),
"Expected consumer counter to be greater than %d, but got %d", expect, counter.Int64())
}
- }, "3m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer
+ }, "5m", "1s").Should(gomega.Succeed()) // ~1m for cluster setup, ~2m for performing each upkeep 5 times, ~2m buffer
})
}
diff --git a/integration-tests/contracts/contract_vrf_models.go b/integration-tests/contracts/contract_vrf_models.go
index 45825a18ff..3aca32a66f 100644
--- a/integration-tests/contracts/contract_vrf_models.go
+++ b/integration-tests/contracts/contract_vrf_models.go
@@ -9,7 +9,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2"
diff --git a/integration-tests/contracts/ethereum_contracts.go b/integration-tests/contracts/ethereum_contracts.go
index 2db6aeb463..9ce118b556 100644
--- a/integration-tests/contracts/ethereum_contracts.go
+++ b/integration-tests/contracts/ethereum_contracts.go
@@ -18,7 +18,8 @@ import (
"github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
ocrConfigHelper "github.com/smartcontractkit/libocr/offchainreporting/confighelper"
ocrTypes "github.com/smartcontractkit/libocr/offchainreporting/types"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/counter"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_registry_master_wrapper_2_3"
diff --git a/integration-tests/contracts/ethereum_contracts_atlas.go b/integration-tests/contracts/ethereum_contracts_atlas.go
index c28e519868..4636a92a19 100644
--- a/integration-tests/contracts/ethereum_contracts_atlas.go
+++ b/integration-tests/contracts/ethereum_contracts_atlas.go
@@ -5,7 +5,8 @@ import (
"math/big"
"github.com/ethereum/go-ethereum/common"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
eth_contracts "github.com/smartcontractkit/chainlink/integration-tests/contracts/ethereum"
"github.com/smartcontractkit/chainlink/integration-tests/wrappers"
diff --git a/integration-tests/contracts/ethereum_contracts_automation.go b/integration-tests/contracts/ethereum_contracts_automation.go
index bd0e1aafc8..b15cb6c172 100644
--- a/integration-tests/contracts/ethereum_contracts_automation.go
+++ b/integration-tests/contracts/ethereum_contracts_automation.go
@@ -14,7 +14,8 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
cltypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
registrylogicc23 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/automation_registry_logic_c_wrapper_2_3"
diff --git a/integration-tests/contracts/ethereum_vrf_contracts.go b/integration-tests/contracts/ethereum_vrf_contracts.go
index e4dbb87d0b..8fcd6c7bfa 100644
--- a/integration-tests/contracts/ethereum_vrf_contracts.go
+++ b/integration-tests/contracts/ethereum_vrf_contracts.go
@@ -15,7 +15,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrfv2plus_wrapper"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrfv2plus_wrapper_optimism"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink-testing-framework/blockchain"
"github.com/smartcontractkit/chainlink/integration-tests/wrappers"
diff --git a/integration-tests/contracts/ethereum_vrfv2_contracts.go b/integration-tests/contracts/ethereum_vrfv2_contracts.go
index a9d1a93769..aa9237ea7c 100644
--- a/integration-tests/contracts/ethereum_vrfv2_contracts.go
+++ b/integration-tests/contracts/ethereum_vrfv2_contracts.go
@@ -13,7 +13,7 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog/log"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/integration-tests/wrappers"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
diff --git a/integration-tests/contracts/ethereum_vrfv2plus_contracts.go b/integration-tests/contracts/ethereum_vrfv2plus_contracts.go
index 8e099b4f6b..58044b36c6 100644
--- a/integration-tests/contracts/ethereum_vrfv2plus_contracts.go
+++ b/integration-tests/contracts/ethereum_vrfv2plus_contracts.go
@@ -11,7 +11,7 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/montanaflynn/stats"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/integration-tests/wrappers"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_blockhash_store"
diff --git a/integration-tests/contracts/multicall.go b/integration-tests/contracts/multicall.go
index 6b73aed084..cd7134a8d8 100644
--- a/integration-tests/contracts/multicall.go
+++ b/integration-tests/contracts/multicall.go
@@ -8,7 +8,8 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/integration-tests/wrappers"
)
diff --git a/integration-tests/contracts/test_contracts.go b/integration-tests/contracts/test_contracts.go
index 85e76054c7..f8674e2136 100644
--- a/integration-tests/contracts/test_contracts.go
+++ b/integration-tests/contracts/test_contracts.go
@@ -7,7 +7,8 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink/integration-tests/wrappers"
le "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/log_emitter"
diff --git a/integration-tests/crib/connect.go b/integration-tests/crib/connect.go
index 91d7d8ee1a..f8ab8db282 100644
--- a/integration-tests/crib/connect.go
+++ b/integration-tests/crib/connect.go
@@ -7,7 +7,8 @@ import (
"time"
"github.com/pkg/errors"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink-testing-framework/utils/ptr"
seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
diff --git a/integration-tests/docker/test_env/test_env_builder.go b/integration-tests/docker/test_env/test_env_builder.go
index 36704baeda..334334036f 100644
--- a/integration-tests/docker/test_env/test_env_builder.go
+++ b/integration-tests/docker/test_env/test_env_builder.go
@@ -281,6 +281,9 @@ func (b *CLTestEnvBuilder) Build() (*CLClusterTestEnv, error) {
// new logs can be added to the log stream, so parallel processing would get stuck on waiting for it to be unlocked
LogScanningLoop:
for i := 0; i < b.clNodesCount; i++ {
+ if b == nil || b.te == nil || b.te.ClCluster == nil || b.te.ClCluster.Nodes == nil || b.te.ClCluster.Nodes[i] == nil || len(b.te.ClCluster.Nodes)-1 < i {
+ continue
+ }
// ignore count return, because we are only interested in the error
_, err := logProcessor.ProcessContainerLogs(b.te.ClCluster.Nodes[i].ContainerName, processFn)
if err != nil && !strings.Contains(err.Error(), testreporters.MultipleLogsAtLogLevelErr) && !strings.Contains(err.Error(), testreporters.OneLogAtLogLevelErr) {
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index 8eed200342..20f43c4b7b 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -34,14 +34,14 @@ require (
github.com/slack-go/slack v0.12.2
github.com/smartcontractkit/chain-selectors v1.0.23
github.com/smartcontractkit/chainlink-automation v1.0.4
- github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
- github.com/smartcontractkit/chainlink-testing-framework v1.34.5
+ github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
+ github.com/smartcontractkit/chainlink-testing-framework v1.34.10
github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239
+ github.com/smartcontractkit/chainlink-testing-framework/seth v1.2.1-0.20240827112945-bd8c580392d6
github.com/smartcontractkit/chainlink/integration-tests v0.0.0-00010101000000-000000000000
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
- github.com/smartcontractkit/seth v1.1.1
github.com/smartcontractkit/wasp v0.4.5
github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.9.0
@@ -104,8 +104,22 @@ require (
github.com/avast/retry-go v3.0.0+incompatible // indirect
github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect
github.com/aws/aws-sdk-go v1.45.25 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.30.4 // indirect
+ github.com/aws/aws-sdk-go-v2/config v1.27.28 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.28 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 // indirect
+ github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.5 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.30.4 // indirect
github.com/aws/constructs-go/constructs/v10 v10.1.255 // indirect
github.com/aws/jsii-runtime-go v1.75.0 // indirect
+ github.com/aws/smithy-go v1.20.4 // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
@@ -395,6 +409,7 @@ require (
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e // indirect
github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240709043547-03612098f799 // indirect
+ github.com/smartcontractkit/chainlink-testing-framework/wasp v0.4.9 // indirect
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 // indirect
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1 // indirect
github.com/smartcontractkit/wsrpc v0.8.1 // indirect
@@ -445,7 +460,7 @@ require (
go.opentelemetry.io/collector/pdata v1.0.0-rcv0016 // indirect
go.opentelemetry.io/collector/semconv v0.87.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
go.opentelemetry.io/otel v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect
@@ -457,17 +472,17 @@ require (
go.uber.org/goleak v1.3.0 // indirect
go.uber.org/ratelimit v0.3.0 // indirect
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect
- golang.org/x/arch v0.7.0 // indirect
+ golang.org/x/arch v0.8.0 // indirect
golang.org/x/mod v0.19.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/oauth2 v0.21.0 // indirect
golang.org/x/sys v0.23.0 // indirect
golang.org/x/term v0.23.0 // indirect
- golang.org/x/time v0.5.0 // indirect
+ golang.org/x/time v0.6.0 // indirect
golang.org/x/tools v0.23.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
- google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect
+ google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect
google.golang.org/grpc v1.65.0 // indirect
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index d7ec061aeb..5e6f9b279d 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -14,23 +14,27 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
-cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
+cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
+cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
+cloud.google.com/go/auth v0.7.1 h1:Iv1bbpzJ2OIg16m94XI9/tlzZZl3cdeR3nGVGj78N7s=
+cloud.google.com/go/auth v0.7.1/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs=
+cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI=
+cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
+cloud.google.com/go/compute v1.27.2 h1:5cE5hdrwJV/92ravlwIFRGnyH9CpLGhh4N0ZDVTU+BA=
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
-cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
-cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
+cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
-cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
+cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw=
+cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -40,8 +44,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg=
-cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY=
+cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
+cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk=
contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo=
@@ -211,10 +215,38 @@ github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi
github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4=
github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
+github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8=
+github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
+github.com/aws/aws-sdk-go-v2/config v1.27.28 h1:OTxWGW/91C61QlneCtnD62NLb4W616/NM1jA8LhJqbg=
+github.com/aws/aws-sdk-go-v2/config v1.27.28/go.mod h1:uzVRVtJSU5EFv6Fu82AoVFKozJi2ZCY6WRCXj06rbvs=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.28 h1:m8+AHY/ND8CMHJnPoH7PJIRakWGa4gbfbxuY9TGTUXM=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.28/go.mod h1:6TF7dSc78ehD1SL6KpRIPKMA1GyyWflIkjqg+qmf4+c=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 h1:yjwoSyDZF8Jth+mUk5lSPJCkMC0lMy6FaCD51jm6ayE=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12/go.mod h1:fuR57fAgMk7ot3WcNQfb6rSEn+SUffl7ri+aa8uKysI=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 h1:TNyt/+X43KJ9IJJMjKfa3bNTiZbUP7DeCxfbTROESwY=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16/go.mod h1:2DwJF39FlNAUiX5pAc0UNeiz16lK2t7IaFcm0LFHEgc=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 h1:jYfy8UPmd+6kJW5YhY0L1/KftReOGxI/4NtVSTh9O/I=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16/go.mod h1:7ZfEPZxkW42Afq4uQB8H2E2e6ebh6mXTueEpYzjCzcs=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 h1:tJ5RnkHCiSH0jyd6gROjlJtNwov0eGYNz8s8nFcR0jQ=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18/go.mod h1:++NHzT+nAF7ZPrHPsA+ENvsXkOO8wEu+C6RXltAG4/c=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.5 h1:UDXu9dqpCZYonj7poM4kFISjzTdWI0v3WUusM+w+Gfc=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.5/go.mod h1:5NPkI3RsTOhwz1CuG7VVSgJCm3CINKkoIaUbUZWQ67w=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 h1:zCsFCKvbj25i7p1u94imVoO447I/sFv8qq+lGJhRN0c=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.5/go.mod h1:ZeDX1SnKsVlejeuz41GiajjZpRSWR7/42q/EyA/QEiM=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 h1:SKvPgvdvmiTWoi0GAJ7AsJfOz3ngVkD/ERbs5pUnHNI=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5/go.mod h1:20sz31hv/WsPa3HhU3hfrIet2kxM4Pe0r20eBZ20Tac=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.4 h1:iAckBT2OeEK/kBDyN/jDtpEExhjeeA/Im2q4X0rJZT8=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.4/go.mod h1:vmSqFK+BVIwVpDAGZB3CoCXHzurt4qBE8lf+I/kRTh0=
github.com/aws/constructs-go/constructs/v10 v10.1.255 h1:5hARfEmhBqHSTQf/C3QLA3sWOxO2Dfja0iA1W7ZcI7g=
github.com/aws/constructs-go/constructs/v10 v10.1.255/go.mod h1:DCdBSjN04Ck2pajCacTD4RKFqSA7Utya8d62XreYctI=
github.com/aws/jsii-runtime-go v1.75.0 h1:NhpUfyiL7/wsRuUekFsz8FFBCYLfPD/l61kKg9kL/a4=
github.com/aws/jsii-runtime-go v1.75.0/go.mod h1:TKCyrtM0pygEPo4rDZzbMSDNCDNTSYSN6/mGyHI6O3I=
+github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4=
+github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0=
@@ -1393,8 +1425,8 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj
github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1/go.mod h1:Jg1sCTsbxg76YByI8ifpFby3FvVqISStHT8ypy9ocmY=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45/go.mod h1:LV0h7QBQUpoC2UUi6TcUvcIFm1xjP/DtEcqV8+qeLUs=
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa h1:g75H8oh2ws52s8BekwvGQ9XvBVu3E7WM1rfiA0PN0zk=
@@ -1405,10 +1437,14 @@ github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e/go.mod h1:hsFhop+SlQHKD+DEFjZrMJmbauT1A/wvtZIeeo4PxFU=
github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240709043547-03612098f799 h1:HyLTySm7BR+oNfZqDTkVJ25wnmcTtxBBD31UkFL+kEM=
github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240709043547-03612098f799/go.mod h1:UVFRacRkP7O7TQAzFmR52v5mUlxf+G1ovMlCQAB/cHU=
-github.com/smartcontractkit/chainlink-testing-framework v1.34.5 h1:6itLSDW4NHDDNR+Y+Z8YDzxxCN9SjdKb6SmLCl0vTFM=
-github.com/smartcontractkit/chainlink-testing-framework v1.34.5/go.mod h1:hRZEDh2+afO8MSZb9qYNscmWb+3mHZf01J5ACZuIdTQ=
+github.com/smartcontractkit/chainlink-testing-framework v1.34.10 h1:7boGJr/wkX5TF6TBb4wRnP6t1IFL6RD98+fZBJBZyCY=
+github.com/smartcontractkit/chainlink-testing-framework v1.34.10/go.mod h1:ekYJbRAxXcs/YgOjHsY9/tlvDvXzv3lxcZK2eFUZduc=
github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239 h1:Kk5OVlx/5g9q3Z3lhxytZS4/f8ds1MiNM8yaHgK3Oe8=
github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239/go.mod h1:DC8sQMyTlI/44UCTL8QWFwb0bYNoXCfjwCv2hMivYZU=
+github.com/smartcontractkit/chainlink-testing-framework/seth v1.2.1-0.20240827112945-bd8c580392d6 h1:ItZ75xmt+VHR/lw+GJwSWj9XICpgZ94dJ+I/5jdet7c=
+github.com/smartcontractkit/chainlink-testing-framework/seth v1.2.1-0.20240827112945-bd8c580392d6/go.mod h1:afY3QmNgeR/VI1pRbGH8g3YXGy7C2RrFOwUzEFvL3L8=
+github.com/smartcontractkit/chainlink-testing-framework/wasp v0.4.9 h1:zyp3Ic0lvseZEKh4/Afcsjk9RAnnxHEI6ajqNXWbRL0=
+github.com/smartcontractkit/chainlink-testing-framework/wasp v0.4.9/go.mod h1:OMadmu2D8J0ju4XZ+tiTX3EOz0QBsfrw1zym+ZXuNVk=
github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16 h1:TFe+FvzxClblt6qRfqEhUfa4kFQx5UobuoFGO2W4mMo=
github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU=
@@ -1417,8 +1453,6 @@ github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37 h1
github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37/go.mod h1:/kFr0D7SI/vueXl1N03uzOun4nViGPFRyA5X6eL3jXw=
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 h1:e38V5FYE7DA1JfKXeD5Buo/7lczALuVXlJ8YNTAUxcw=
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
-github.com/smartcontractkit/seth v1.1.1 h1:6hvexjJD7ek8ht/CLlEwQcH21K2E/WEYwbSRdKInZmM=
-github.com/smartcontractkit/seth v1.1.1/go.mod h1:cDfKHi/hJLpO9sRpVbrflrHCOV+MJPAMJHloExJnIXk=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 h1:yiKnypAqP8l0OX0P3klzZ7SCcBUxy5KqTAKZmQOvSQE=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1/go.mod h1:q6f4fe39oZPdsh1i57WznEZgxd8siidMaSFq3wdPmVg=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1 h1:Dai1bn+Q5cpeGMQwRdjOdVjG8mmFFROVkSKuUgBErRQ=
@@ -1626,8 +1660,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.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
@@ -1640,8 +1674,8 @@ go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6b
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
-go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0=
-go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q=
+go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08=
+go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg=
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
@@ -1679,8 +1713,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s=
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
-golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
+golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1951,8 +1985,8 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -2044,8 +2078,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.171.0 h1:w174hnBPqut76FzW5Qaupt7zY8Kql6fiVjgys4f58sU=
-google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o=
+google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw=
+google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -2090,8 +2124,8 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY=
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY=
google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A=
diff --git a/integration-tests/load/automationv2_1/automationv2_1_test.go b/integration-tests/load/automationv2_1/automationv2_1_test.go
index b0555cdd3f..0fe13d4bc7 100644
--- a/integration-tests/load/automationv2_1/automationv2_1_test.go
+++ b/integration-tests/load/automationv2_1/automationv2_1_test.go
@@ -368,10 +368,6 @@ Load Config:
a.SetMercuryCredentialName("cred1")
}
- if *conf.UseLogBufferV1 {
- a.SetUseLogBufferV1(true)
- }
-
startTimeTestSetup := time.Now()
l.Info().Str("START_TIME", startTimeTestSetup.String()).Msg("Test setup started")
diff --git a/integration-tests/load/automationv2_1/gun.go b/integration-tests/load/automationv2_1/gun.go
index 162aca251f..a5fd52c40c 100644
--- a/integration-tests/load/automationv2_1/gun.go
+++ b/integration-tests/load/automationv2_1/gun.go
@@ -5,9 +5,10 @@ import (
"sync"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/smartcontractkit/wasp"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/log_emitter"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
diff --git a/integration-tests/load/automationv2_1/helpers.go b/integration-tests/load/automationv2_1/helpers.go
index 30559743e1..f770ba7573 100644
--- a/integration-tests/load/automationv2_1/helpers.go
+++ b/integration-tests/load/automationv2_1/helpers.go
@@ -8,7 +8,8 @@ import (
"github.com/pkg/errors"
"github.com/rs/zerolog"
"github.com/slack-go/slack"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
ctf_concurrency "github.com/smartcontractkit/chainlink-testing-framework/concurrency"
reportModel "github.com/smartcontractkit/chainlink-testing-framework/testreporters"
diff --git a/integration-tests/load/functions/setup.go b/integration-tests/load/functions/setup.go
index 5519c90846..8151342021 100644
--- a/integration-tests/load/functions/setup.go
+++ b/integration-tests/load/functions/setup.go
@@ -13,9 +13,10 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/go-resty/resty/v2"
"github.com/rs/zerolog/log"
- "github.com/smartcontractkit/seth"
"github.com/smartcontractkit/tdh2/go/tdh2/tdh2easy"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
chainlinkutils "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
ctf_config "github.com/smartcontractkit/chainlink-testing-framework/config"
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index c8ef675d05..6ce1049562 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -13,15 +13,15 @@ require (
github.com/go-resty/resty/v2 v2.11.0
github.com/pelletier/go-toml/v2 v2.2.2
github.com/pkg/errors v0.9.1
- github.com/rs/zerolog v1.32.0
+ github.com/rs/zerolog v1.33.0
github.com/slack-go/slack v0.12.2
github.com/smartcontractkit/chainlink-automation v1.0.4
- github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
- github.com/smartcontractkit/chainlink-testing-framework v1.34.5
+ github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1
+ github.com/smartcontractkit/chainlink-testing-framework v1.34.10
+ github.com/smartcontractkit/chainlink-testing-framework/seth v1.2.1-0.20240827112945-bd8c580392d6
github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20240214231432-4ad5eb95178c
github.com/smartcontractkit/chainlink/v2 v2.9.0-beta0.0.20240216210048-da02459ddad8
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
- github.com/smartcontractkit/seth v1.1.1
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1
github.com/smartcontractkit/wasp v0.4.7
github.com/stretchr/testify v1.9.0
@@ -36,6 +36,20 @@ require (
cosmossdk.io/errors v1.0.1 // indirect
cosmossdk.io/math v1.3.0 // indirect
github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect
+ github.com/aws/aws-sdk-go-v2 v1.30.4 // indirect
+ github.com/aws/aws-sdk-go-v2/config v1.27.28 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.28 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 // indirect
+ github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.5 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.30.4 // indirect
+ github.com/aws/smithy-go v1.20.4 // indirect
github.com/containerd/errdefs v0.1.0 // indirect
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
@@ -43,8 +57,9 @@ require (
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 // indirect
+ github.com/smartcontractkit/chainlink-testing-framework/wasp v0.4.9 // indirect
github.com/testcontainers/testcontainers-go v0.28.0 // indirect
- k8s.io/apimachinery v0.30.2 // indirect
+ k8s.io/apimachinery v0.31.0 // indirect
)
// avoids ambigious imports of indirect dependencies
@@ -103,7 +118,7 @@ require (
github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/chai2010/gettext-go v1.0.2 // indirect
- github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240709130330-9f4feec7553f // indirect
+ github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240821051457-da69c6d9617a // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.0 // indirect
github.com/cockroachdb/errors v1.10.0 // indirect
@@ -164,7 +179,7 @@ require (
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fvbommel/sortorder v1.1.0 // indirect
- github.com/fxamacker/cbor/v2 v2.6.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gagliardetto/binary v0.7.7 // indirect
github.com/gagliardetto/solana-go v1.8.4 // indirect
@@ -217,7 +232,7 @@ require (
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/go-tpm v0.9.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
- github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect
+ github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/context v1.1.1 // indirect
@@ -232,7 +247,7 @@ require (
github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b // indirect
github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 // indirect
github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 // indirect
- github.com/grafana/pyroscope-go v1.1.1 // indirect
+ github.com/grafana/pyroscope-go v1.1.2 // indirect
github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect
github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
@@ -240,7 +255,7 @@ require (
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect
github.com/gtank/merlin v0.1.1 // indirect
github.com/gtank/ristretto255 v0.1.2 // indirect
@@ -379,7 +394,7 @@ require (
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e // indirect
github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240709043547-03612098f799 // indirect
- github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239 // indirect
+ github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.1 // indirect
github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37 // indirect
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 // indirect
github.com/smartcontractkit/wsrpc v0.8.1 // indirect
@@ -423,16 +438,16 @@ require (
github.com/zondax/ledger-go v0.14.3 // indirect
go.dedis.ch/fixbuf v1.0.3 // indirect
go.dedis.ch/kyber/v3 v3.1.0 // indirect
- go.etcd.io/bbolt v1.3.8 // indirect
- go.etcd.io/etcd/api/v3 v3.5.12 // indirect
- go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect
- go.etcd.io/etcd/client/v3 v3.5.12 // indirect
+ go.etcd.io/bbolt v1.3.9 // indirect
+ go.etcd.io/etcd/api/v3 v3.5.14 // indirect
+ go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect
+ go.etcd.io/etcd/client/v3 v3.5.14 // indirect
go.mongodb.org/mongo-driver v1.15.0 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/collector/pdata v1.0.0-rcv0016 // indirect
go.opentelemetry.io/collector/semconv v0.87.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
go.opentelemetry.io/otel v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect
@@ -446,23 +461,23 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect
- golang.org/x/arch v0.7.0 // indirect
+ golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.26.0 // indirect
- golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
- golang.org/x/mod v0.19.0 // indirect
- golang.org/x/net v0.27.0 // indirect
- golang.org/x/oauth2 v0.21.0 // indirect
+ golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect
+ golang.org/x/mod v0.20.0 // indirect
+ golang.org/x/net v0.28.0 // indirect
+ golang.org/x/oauth2 v0.22.0 // indirect
golang.org/x/sync v0.8.0 // indirect
- golang.org/x/sys v0.23.0 // indirect
+ golang.org/x/sys v0.24.0 // indirect
golang.org/x/term v0.23.0 // indirect
golang.org/x/text v0.17.0 // indirect
- golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.23.0 // indirect
+ golang.org/x/time v0.6.0 // indirect
+ golang.org/x/tools v0.24.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
- google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect
+ google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect
google.golang.org/grpc v1.65.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/guregu/null.v4 v4.0.0 // indirect
@@ -471,15 +486,15 @@ require (
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/api v0.30.2 // indirect
- k8s.io/apiextensions-apiserver v0.30.2 // indirect
+ k8s.io/api v0.31.0 // indirect
+ k8s.io/apiextensions-apiserver v0.31.0 // indirect
k8s.io/cli-runtime v0.28.2 // indirect
k8s.io/client-go v1.5.2 // indirect
- k8s.io/component-base v0.30.2 // indirect
+ k8s.io/component-base v0.31.0 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect
k8s.io/kubectl v0.28.2 // indirect
- k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect
+ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
nhooyr.io/websocket v1.8.10 // indirect
pgregory.net/rapid v1.1.0 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index 714ba7700b..760e624daf 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -14,23 +14,27 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
-cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
+cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
+cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
+cloud.google.com/go/auth v0.7.1 h1:Iv1bbpzJ2OIg16m94XI9/tlzZZl3cdeR3nGVGj78N7s=
+cloud.google.com/go/auth v0.7.1/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs=
+cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI=
+cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
+cloud.google.com/go/compute v1.27.2 h1:5cE5hdrwJV/92ravlwIFRGnyH9CpLGhh4N0ZDVTU+BA=
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
-cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
-cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
+cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
-cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
+cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw=
+cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -40,8 +44,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg=
-cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY=
+cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
+cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk=
contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo=
@@ -199,10 +203,38 @@ github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi
github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4=
github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
+github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8=
+github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
+github.com/aws/aws-sdk-go-v2/config v1.27.28 h1:OTxWGW/91C61QlneCtnD62NLb4W616/NM1jA8LhJqbg=
+github.com/aws/aws-sdk-go-v2/config v1.27.28/go.mod h1:uzVRVtJSU5EFv6Fu82AoVFKozJi2ZCY6WRCXj06rbvs=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.28 h1:m8+AHY/ND8CMHJnPoH7PJIRakWGa4gbfbxuY9TGTUXM=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.28/go.mod h1:6TF7dSc78ehD1SL6KpRIPKMA1GyyWflIkjqg+qmf4+c=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 h1:yjwoSyDZF8Jth+mUk5lSPJCkMC0lMy6FaCD51jm6ayE=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12/go.mod h1:fuR57fAgMk7ot3WcNQfb6rSEn+SUffl7ri+aa8uKysI=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 h1:TNyt/+X43KJ9IJJMjKfa3bNTiZbUP7DeCxfbTROESwY=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16/go.mod h1:2DwJF39FlNAUiX5pAc0UNeiz16lK2t7IaFcm0LFHEgc=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 h1:jYfy8UPmd+6kJW5YhY0L1/KftReOGxI/4NtVSTh9O/I=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16/go.mod h1:7ZfEPZxkW42Afq4uQB8H2E2e6ebh6mXTueEpYzjCzcs=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 h1:tJ5RnkHCiSH0jyd6gROjlJtNwov0eGYNz8s8nFcR0jQ=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18/go.mod h1:++NHzT+nAF7ZPrHPsA+ENvsXkOO8wEu+C6RXltAG4/c=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.5 h1:UDXu9dqpCZYonj7poM4kFISjzTdWI0v3WUusM+w+Gfc=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.5/go.mod h1:5NPkI3RsTOhwz1CuG7VVSgJCm3CINKkoIaUbUZWQ67w=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 h1:zCsFCKvbj25i7p1u94imVoO447I/sFv8qq+lGJhRN0c=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.5/go.mod h1:ZeDX1SnKsVlejeuz41GiajjZpRSWR7/42q/EyA/QEiM=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 h1:SKvPgvdvmiTWoi0GAJ7AsJfOz3ngVkD/ERbs5pUnHNI=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5/go.mod h1:20sz31hv/WsPa3HhU3hfrIet2kxM4Pe0r20eBZ20Tac=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.4 h1:iAckBT2OeEK/kBDyN/jDtpEExhjeeA/Im2q4X0rJZT8=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.4/go.mod h1:vmSqFK+BVIwVpDAGZB3CoCXHzurt4qBE8lf+I/kRTh0=
github.com/aws/constructs-go/constructs/v10 v10.1.255 h1:5hARfEmhBqHSTQf/C3QLA3sWOxO2Dfja0iA1W7ZcI7g=
github.com/aws/constructs-go/constructs/v10 v10.1.255/go.mod h1:DCdBSjN04Ck2pajCacTD4RKFqSA7Utya8d62XreYctI=
github.com/aws/jsii-runtime-go v1.75.0 h1:NhpUfyiL7/wsRuUekFsz8FFBCYLfPD/l61kKg9kL/a4=
github.com/aws/jsii-runtime-go v1.75.0/go.mod h1:TKCyrtM0pygEPo4rDZzbMSDNCDNTSYSN6/mGyHI6O3I=
+github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4=
+github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0=
@@ -473,8 +505,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw=
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
-github.com/fxamacker/cbor/v2 v2.6.0 h1:sU6J2usfADwWlYDAFhZBQ6TnLFBHxgesMrQfQgk1tWA=
-github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
+github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
+github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gagliardetto/binary v0.7.7 h1:QZpT38+sgoPg+TIQjH94sLbl/vX+nlIRA37pEyOsjfY=
@@ -728,8 +760,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg=
-github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
+github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM=
+github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
@@ -778,8 +810,8 @@ github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 h1:gdrsYbmk8822v6qv
github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503/go.mod h1:d8seWXCEXkL42mhuIJYcGi6DxfehzoIpLrMQWJojvOo=
github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 h1:wQ0FnSeebhJIBkgYOD06Mxk9HV2KhtEG0hp/7R+5RUQ=
github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4/go.mod h1:f3JSoxBTPXX5ec4FxxeC19nTBSxoTz+cBgS3cYLMcr0=
-github.com/grafana/pyroscope-go v1.1.1 h1:PQoUU9oWtO3ve/fgIiklYuGilvsm8qaGhlY4Vw6MAcQ=
-github.com/grafana/pyroscope-go v1.1.1/go.mod h1:Mw26jU7jsL/KStNSGGuuVYdUq7Qghem5P8aXYXSXG88=
+github.com/grafana/pyroscope-go v1.1.2 h1:7vCfdORYQMCxIzI3NlYAs3FcBP760+gWuYWOyiVyYx8=
+github.com/grafana/pyroscope-go v1.1.2/go.mod h1:HSSmHo2KRn6FasBA4vK7BMiQqyQq8KSuBKvrhkXxYPU=
github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg=
github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU=
github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww=
@@ -801,8 +833,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU=
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0=
@@ -1303,8 +1335,8 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
-github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
-github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
+github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
+github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@@ -1359,8 +1391,8 @@ github.com/smartcontractkit/chain-selectors v1.0.23 h1:D2Eaex4Cw/O7Lg3tX6WklOqnj
github.com/smartcontractkit/chain-selectors v1.0.23/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
-github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1 h1:pdEpjgbZ5w/Sd5lzg/XiuC5gVyrmSovOo+3nUD46SP8=
+github.com/smartcontractkit/chainlink-common v0.2.2-0.20240723123524-e407ecd120b1/go.mod h1:Jg1sCTsbxg76YByI8ifpFby3FvVqISStHT8ypy9ocmY=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45/go.mod h1:LV0h7QBQUpoC2UUi6TcUvcIFm1xjP/DtEcqV8+qeLUs=
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa h1:g75H8oh2ws52s8BekwvGQ9XvBVu3E7WM1rfiA0PN0zk=
@@ -1371,10 +1403,14 @@ github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e/go.mod h1:hsFhop+SlQHKD+DEFjZrMJmbauT1A/wvtZIeeo4PxFU=
github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240709043547-03612098f799 h1:HyLTySm7BR+oNfZqDTkVJ25wnmcTtxBBD31UkFL+kEM=
github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240709043547-03612098f799/go.mod h1:UVFRacRkP7O7TQAzFmR52v5mUlxf+G1ovMlCQAB/cHU=
-github.com/smartcontractkit/chainlink-testing-framework v1.34.5 h1:6itLSDW4NHDDNR+Y+Z8YDzxxCN9SjdKb6SmLCl0vTFM=
-github.com/smartcontractkit/chainlink-testing-framework v1.34.5/go.mod h1:hRZEDh2+afO8MSZb9qYNscmWb+3mHZf01J5ACZuIdTQ=
-github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239 h1:Kk5OVlx/5g9q3Z3lhxytZS4/f8ds1MiNM8yaHgK3Oe8=
-github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239/go.mod h1:DC8sQMyTlI/44UCTL8QWFwb0bYNoXCfjwCv2hMivYZU=
+github.com/smartcontractkit/chainlink-testing-framework v1.34.10 h1:7boGJr/wkX5TF6TBb4wRnP6t1IFL6RD98+fZBJBZyCY=
+github.com/smartcontractkit/chainlink-testing-framework v1.34.10/go.mod h1:ekYJbRAxXcs/YgOjHsY9/tlvDvXzv3lxcZK2eFUZduc=
+github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.1 h1:1/r1wQZ4TOFpZ13w94r7amdF096Z96RuEnkOmrz1BGE=
+github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.1/go.mod h1:DC8sQMyTlI/44UCTL8QWFwb0bYNoXCfjwCv2hMivYZU=
+github.com/smartcontractkit/chainlink-testing-framework/seth v1.2.1-0.20240827112945-bd8c580392d6 h1:ItZ75xmt+VHR/lw+GJwSWj9XICpgZ94dJ+I/5jdet7c=
+github.com/smartcontractkit/chainlink-testing-framework/seth v1.2.1-0.20240827112945-bd8c580392d6/go.mod h1:afY3QmNgeR/VI1pRbGH8g3YXGy7C2RrFOwUzEFvL3L8=
+github.com/smartcontractkit/chainlink-testing-framework/wasp v0.4.9 h1:zyp3Ic0lvseZEKh4/Afcsjk9RAnnxHEI6ajqNXWbRL0=
+github.com/smartcontractkit/chainlink-testing-framework/wasp v0.4.9/go.mod h1:OMadmu2D8J0ju4XZ+tiTX3EOz0QBsfrw1zym+ZXuNVk=
github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16 h1:TFe+FvzxClblt6qRfqEhUfa4kFQx5UobuoFGO2W4mMo=
github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU=
@@ -1383,8 +1419,6 @@ github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37 h1
github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37/go.mod h1:/kFr0D7SI/vueXl1N03uzOun4nViGPFRyA5X6eL3jXw=
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 h1:e38V5FYE7DA1JfKXeD5Buo/7lczALuVXlJ8YNTAUxcw=
github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
-github.com/smartcontractkit/seth v1.1.1 h1:6hvexjJD7ek8ht/CLlEwQcH21K2E/WEYwbSRdKInZmM=
-github.com/smartcontractkit/seth v1.1.1/go.mod h1:cDfKHi/hJLpO9sRpVbrflrHCOV+MJPAMJHloExJnIXk=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 h1:yiKnypAqP8l0OX0P3klzZ7SCcBUxy5KqTAKZmQOvSQE=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1/go.mod h1:q6f4fe39oZPdsh1i57WznEZgxd8siidMaSFq3wdPmVg=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1 h1:Dai1bn+Q5cpeGMQwRdjOdVjG8mmFFROVkSKuUgBErRQ=
@@ -1559,14 +1593,14 @@ go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRL
go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4=
go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=
-go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
-go.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c=
-go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4=
-go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A=
-go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=
-go.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg=
-go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw=
+go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
+go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
+go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0=
+go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU=
+go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ=
+go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI=
+go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg=
+go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk=
go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng=
go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
@@ -1590,8 +1624,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.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
@@ -1604,8 +1638,8 @@ go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6b
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
-go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0=
-go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q=
+go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08=
+go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg=
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
@@ -1643,8 +1677,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s=
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
-golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
+golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1684,8 +1718,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
-golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
+golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI=
+golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1710,8 +1744,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
-golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
+golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1767,8 +1801,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
-golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
+golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
+golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1776,8 +1810,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
+golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1879,8 +1913,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
-golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
+golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1913,8 +1947,8 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -1976,8 +2010,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
-golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
+golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
+golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -2006,8 +2040,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.171.0 h1:w174hnBPqut76FzW5Qaupt7zY8Kql6fiVjgys4f58sU=
-google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o=
+google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw=
+google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -2052,12 +2086,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
-google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY=
-google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc=
+google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY=
+google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo=
+google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -2159,8 +2193,8 @@ k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6z
k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc=
k8s.io/kubectl v0.28.2 h1:fOWOtU6S0smdNjG1PB9WFbqEIMlkzU5ahyHkc7ESHgM=
k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64=
-k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak=
-k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
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/integration-tests/load/ocr/gun.go b/integration-tests/load/ocr/gun.go
index c4b79ceaf4..5ed71f1672 100644
--- a/integration-tests/load/ocr/gun.go
+++ b/integration-tests/load/ocr/gun.go
@@ -6,9 +6,10 @@ import (
"time"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/smartcontractkit/wasp"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
)
diff --git a/integration-tests/load/ocr/vu.go b/integration-tests/load/ocr/vu.go
index 88f186c5ee..a50b52c690 100644
--- a/integration-tests/load/ocr/vu.go
+++ b/integration-tests/load/ocr/vu.go
@@ -9,7 +9,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/wasp"
"go.uber.org/ratelimit"
diff --git a/integration-tests/load/vrfv2/gun.go b/integration-tests/load/vrfv2/gun.go
index bf7449a247..0eef5b1481 100644
--- a/integration-tests/load/vrfv2/gun.go
+++ b/integration-tests/load/vrfv2/gun.go
@@ -4,9 +4,10 @@ import (
"math/rand"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/smartcontractkit/wasp"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
diff --git a/integration-tests/load/vrfv2/vrfv2_test.go b/integration-tests/load/vrfv2/vrfv2_test.go
index 31d6c27e51..6d3c199d7e 100644
--- a/integration-tests/load/vrfv2/vrfv2_test.go
+++ b/integration-tests/load/vrfv2/vrfv2_test.go
@@ -7,7 +7,7 @@ import (
"testing"
"time"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/rs/zerolog/log"
"github.com/smartcontractkit/wasp"
diff --git a/integration-tests/load/vrfv2plus/gun.go b/integration-tests/load/vrfv2plus/gun.go
index 430e9f5ff1..8d4162ab88 100644
--- a/integration-tests/load/vrfv2plus/gun.go
+++ b/integration-tests/load/vrfv2plus/gun.go
@@ -5,9 +5,10 @@ import (
"math/rand"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/smartcontractkit/wasp"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
"github.com/smartcontractkit/chainlink/integration-tests/actions"
diff --git a/integration-tests/load/vrfv2plus/vrfv2plus_test.go b/integration-tests/load/vrfv2plus/vrfv2plus_test.go
index 7eb55d0f43..98a9375389 100644
--- a/integration-tests/load/vrfv2plus/vrfv2plus_test.go
+++ b/integration-tests/load/vrfv2plus/vrfv2plus_test.go
@@ -6,7 +6,7 @@ import (
"testing"
"time"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/rs/zerolog/log"
"github.com/smartcontractkit/wasp"
diff --git a/integration-tests/reorg/automation_reorg_test.go b/integration-tests/reorg/automation_reorg_test.go
index 1b9cf5819b..fbfac20d40 100644
--- a/integration-tests/reorg/automation_reorg_test.go
+++ b/integration-tests/reorg/automation_reorg_test.go
@@ -132,7 +132,7 @@ func TestAutomationReorg(t *testing.T) {
err = actions.FundChainlinkNodesFromRootAddress(l, sethClient, contracts.ChainlinkClientToChainlinkNodeWithKeysAndAddress(env.ClCluster.NodeAPIs()), big.NewFloat(*config.GetCommonConfig().ChainlinkNodeFunding))
require.NoError(t, err, "Failed to fund the nodes")
- gethRPCClient := ctfClient.NewRPCClient(evmNetwork.HTTPURLs[0])
+ gethRPCClient := ctfClient.NewRPCClient(evmNetwork.HTTPURLs[0], nil)
registryConfig := actions.AutomationDefaultRegistryConfig(config)
registryConfig.RegistryVersion = registryVersion
diff --git a/integration-tests/smoke/keeper_test.go b/integration-tests/smoke/keeper_test.go
index 4ff1c90bd1..9e979dd0ff 100644
--- a/integration-tests/smoke/keeper_test.go
+++ b/integration-tests/smoke/keeper_test.go
@@ -13,9 +13,10 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/onsi/gomega"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink-testing-framework/logging"
"github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext"
diff --git a/integration-tests/smoke/log_poller_test.go b/integration-tests/smoke/log_poller_test.go
index f1a257552a..18862e13b7 100644
--- a/integration-tests/smoke/log_poller_test.go
+++ b/integration-tests/smoke/log_poller_test.go
@@ -7,7 +7,7 @@ import (
"testing"
"time"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/onsi/gomega"
diff --git a/integration-tests/smoke/ocr2_test.go b/integration-tests/smoke/ocr2_test.go
index 56a95c50bd..05f3dfa05c 100644
--- a/integration-tests/smoke/ocr2_test.go
+++ b/integration-tests/smoke/ocr2_test.go
@@ -12,9 +12,10 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink-testing-framework/logging"
"github.com/smartcontractkit/chainlink-testing-framework/logstream"
"github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext"
diff --git a/integration-tests/smoke/ocr_test.go b/integration-tests/smoke/ocr_test.go
index 0b4ac3de30..3d0ec83174 100644
--- a/integration-tests/smoke/ocr_test.go
+++ b/integration-tests/smoke/ocr_test.go
@@ -9,9 +9,10 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink-testing-framework/logging"
"github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext"
diff --git a/integration-tests/smoke/reorg_above_finality_test.go b/integration-tests/smoke/reorg_above_finality_test.go
index e7b9e4a218..78132848e5 100644
--- a/integration-tests/smoke/reorg_above_finality_test.go
+++ b/integration-tests/smoke/reorg_above_finality_test.go
@@ -53,7 +53,7 @@ func TestReorgAboveFinality_FinalityTagDisabled(t *testing.T) {
evmNetwork, err := testEnv.GetFirstEvmNetwork()
require.NoError(t, err, "Error getting first evm network")
- client := ctf_client.NewRPCClient(evmNetwork.HTTPURLs[0])
+ client := ctf_client.NewRPCClient(evmNetwork.HTTPURLs[0], nil)
// Wait for chain to progress
require.Eventually(t, func() bool {
diff --git a/integration-tests/smoke/vrf_test.go b/integration-tests/smoke/vrf_test.go
index 04e760796d..ac22270216 100644
--- a/integration-tests/smoke/vrf_test.go
+++ b/integration-tests/smoke/vrf_test.go
@@ -9,9 +9,10 @@ import (
"github.com/google/uuid"
"github.com/onsi/gomega"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink-testing-framework/logging"
seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
"github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext"
diff --git a/integration-tests/smoke/vrfv2_test.go b/integration-tests/smoke/vrfv2_test.go
index aad2a6d577..73e3d9054b 100644
--- a/integration-tests/smoke/vrfv2_test.go
+++ b/integration-tests/smoke/vrfv2_test.go
@@ -10,7 +10,7 @@ import (
"testing"
"time"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/ethereum/go-ethereum/common"
"github.com/google/go-cmp/cmp"
diff --git a/integration-tests/smoke/vrfv2plus_test.go b/integration-tests/smoke/vrfv2plus_test.go
index 00bd2a101a..2d95074ef0 100644
--- a/integration-tests/smoke/vrfv2plus_test.go
+++ b/integration-tests/smoke/vrfv2plus_test.go
@@ -9,7 +9,7 @@ import (
"testing"
"time"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/ethereum/go-ethereum/common"
"github.com/google/go-cmp/cmp"
diff --git a/integration-tests/testconfig/automation/automation.toml b/integration-tests/testconfig/automation/automation.toml
index 7e10af62cf..26b9f05597 100644
--- a/integration-tests/testconfig/automation/automation.toml
+++ b/integration-tests/testconfig/automation/automation.toml
@@ -152,6 +152,57 @@ max_check_data_size=5_000
max_perform_data_size=5_000
max_revert_data_size=5_000
+# chaos test specific overrides
+[Chaos.Common]
+chainlink_node_funding = 2.0
+
+[Chaos.Automation]
+
+[Chaos.Automation.AutomationConfig]
+use_log_buffer_v1=false
+
+[Chaos.Automation.AutomationConfig.PublicConfig]
+delta_progress=10_000_000_000
+delta_resend=15_000_000_000
+delta_initial=500_000_000
+delta_round=1_000_000_000
+delta_grace=200_000_000
+delta_certified_commit_request=300_000_000
+delta_stage=30_000_000_000
+r_max=24
+f=1
+max_duration_query=20_000_000
+max_duration_observation=20_000_000
+max_duration_should_accept_attested_report=1_200_000_000
+max_duration_should_transmit_accepted_report=20_000_000
+
+[Chaos.Automation.AutomationConfig.PluginConfig]
+perform_lockout_window=3_600_000
+target_probability="0.999"
+target_in_rounds=1
+min_confirmations=0
+gas_limit_per_report=10_300_000
+gas_overhead_per_upkeep=300_000
+max_upkeep_batch_size=10
+
+[Chaos.Automation.AutomationConfig.PluginConfig.LogProviderConfig]
+block_rate=1
+log_limit=2
+
+[Chaos.Automation.AutomationConfig.RegistrySettings]
+payment_premium_ppb=200_000_000
+flat_fee_micro_link=0
+check_gas_limit=2_500_000
+staleness_seconds=90000
+gas_ceiling_multiplier=1
+max_perform_gas=5_000_000
+min_upkeep_spend=0
+fallback_gas_price=200_000_000_000
+fallback_link_price=2_000_000_000_000_000_000
+max_check_data_size=5_000
+max_perform_data_size=5_000
+max_revert_data_size=5_000
+
# load test specific overrides
[Load.Seth]
ephemeral_addresses_number = 100
diff --git a/integration-tests/testconfig/automation/config.go b/integration-tests/testconfig/automation/config.go
index bde989f544..e6df7714af 100644
--- a/integration-tests/testconfig/automation/config.go
+++ b/integration-tests/testconfig/automation/config.go
@@ -160,7 +160,6 @@ type AutomationConfig struct {
PluginConfig *PluginConfig `toml:"PluginConfig"`
PublicConfig *PublicConfig `toml:"PublicConfig"`
RegistrySettings *RegistrySettings `toml:"RegistrySettings"`
- UseLogBufferV1 *bool `toml:"use_log_buffer_v1"`
}
func (c *AutomationConfig) Validate() error {
@@ -170,13 +169,7 @@ func (c *AutomationConfig) Validate() error {
if err := c.PublicConfig.Validate(); err != nil {
return err
}
- if err := c.RegistrySettings.Validate(); err != nil {
- return err
- }
- if c.UseLogBufferV1 == nil {
- return errors.New("use_log_buffer_v1 must be set")
- }
- return nil
+ return c.RegistrySettings.Validate()
}
type PluginConfig struct {
diff --git a/integration-tests/testconfig/testconfig.go b/integration-tests/testconfig/testconfig.go
index 718a72c4e7..11f73a6ab0 100644
--- a/integration-tests/testconfig/testconfig.go
+++ b/integration-tests/testconfig/testconfig.go
@@ -17,7 +17,7 @@ import (
"golang.org/x/text/cases"
"golang.org/x/text/language"
- "github.com/smartcontractkit/seth"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
ctf_config "github.com/smartcontractkit/chainlink-testing-framework/config"
k8s_config "github.com/smartcontractkit/chainlink-testing-framework/k8s/config"
diff --git a/integration-tests/testsetups/keeper_benchmark.go b/integration-tests/testsetups/keeper_benchmark.go
index 4803a5249f..f6bb041de8 100644
--- a/integration-tests/testsetups/keeper_benchmark.go
+++ b/integration-tests/testsetups/keeper_benchmark.go
@@ -21,10 +21,11 @@ import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/slack-go/slack"
- "github.com/smartcontractkit/seth"
"github.com/stretchr/testify/require"
"golang.org/x/sync/errgroup"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/chainlink-testing-framework/blockchain"
"github.com/smartcontractkit/chainlink-testing-framework/k8s/environment"
"github.com/smartcontractkit/chainlink-testing-framework/logging"
diff --git a/integration-tests/testsetups/ocr.go b/integration-tests/testsetups/ocr.go
index 30b0a6fcb1..858f6d08a5 100644
--- a/integration-tests/testsetups/ocr.go
+++ b/integration-tests/testsetups/ocr.go
@@ -23,9 +23,10 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/pelletier/go-toml/v2"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
"github.com/smartcontractkit/libocr/gethwrappers/offchainaggregator"
"github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
@@ -740,7 +741,7 @@ func (o *OCRSoakTest) complete() {
}
func (o *OCRSoakTest) startGethBlockchainReorg(network blockchain.EVMNetwork, conf ctf_config.ReorgConfig) {
- client := ctf_client.NewRPCClient(network.HTTPURLs[0])
+ client := ctf_client.NewRPCClient(network.HTTPURLs[0], nil)
o.log.Info().
Str("URL", client.URL).
Int("Depth", conf.Depth).
@@ -752,7 +753,7 @@ func (o *OCRSoakTest) startGethBlockchainReorg(network blockchain.EVMNetwork, co
}
func (o *OCRSoakTest) startAnvilGasSpikeSimulation(network blockchain.EVMNetwork, conf ctf_config.GasSpikeSimulationConfig) {
- client := ctf_client.NewRPCClient(network.HTTPURLs[0])
+ client := ctf_client.NewRPCClient(network.HTTPURLs[0], nil)
o.log.Info().
Str("URL", client.URL).
Any("GasSpikeSimulationConfig", conf).
@@ -765,7 +766,7 @@ func (o *OCRSoakTest) startAnvilGasSpikeSimulation(network blockchain.EVMNetwork
}
func (o *OCRSoakTest) startAnvilGasLimitSimulation(network blockchain.EVMNetwork, conf ctf_config.GasLimitSimulationConfig) {
- client := ctf_client.NewRPCClient(network.HTTPURLs[0])
+ client := ctf_client.NewRPCClient(network.HTTPURLs[0], nil)
latestBlock, err := o.seth.Client.BlockByNumber(context.Background(), nil)
require.NoError(o.t, err)
newGasLimit := int64(math.Ceil(float64(latestBlock.GasUsed()) * conf.NextGasLimitPercentage))
diff --git a/integration-tests/universal/log_poller/helpers.go b/integration-tests/universal/log_poller/helpers.go
index daa4784ec1..ce352440ac 100644
--- a/integration-tests/universal/log_poller/helpers.go
+++ b/integration-tests/universal/log_poller/helpers.go
@@ -14,9 +14,10 @@ import (
"time"
"github.com/jmoiron/sqlx"
- "github.com/smartcontractkit/seth"
"github.com/smartcontractkit/wasp"
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
+
geth "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
diff --git a/integration-tests/wrappers/contract_caller.go b/integration-tests/wrappers/contract_caller.go
index 0eea760e02..31672cb915 100644
--- a/integration-tests/wrappers/contract_caller.go
+++ b/integration-tests/wrappers/contract_caller.go
@@ -16,7 +16,8 @@ import (
"github.com/ethereum/go-ethereum/rpc"
"github.com/pkg/errors"
"github.com/rs/zerolog"
- "github.com/smartcontractkit/seth"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/seth"
"github.com/smartcontractkit/chainlink-testing-framework/blockchain"
diff --git a/package.json b/package.json
index 541cfb1aaf..f32ffe9e5a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ccip",
- "version": "2.14.0-ccip1.5.0",
+ "version": "2.15.0-ccip1.5.0",
"description": "node of the decentralized oracle network, bridging on and off-chain computation",
"main": "index.js",
"scripts": {
diff --git a/testdata/scripts/health/default.txtar b/testdata/scripts/health/default.txtar
index 777d3e5e12..1dbf6b8eb9 100644
--- a/testdata/scripts/health/default.txtar
+++ b/testdata/scripts/health/default.txtar
@@ -31,7 +31,6 @@ fj293fbBnlQ!f9vNs
HTTPPort = $PORT
-- out.txt --
-ok HeadReporter
ok JobSpawner
ok Mailbox.Monitor
ok Mercury.WSRPCPool
@@ -39,20 +38,12 @@ ok Mercury.WSRPCPool.CacheSet
ok PipelineORM
ok PipelineRunner
ok PipelineRunner.BridgeCache
+ok PromReporter
ok TelemetryManager
-- out.json --
{
"data": [
- {
- "type": "checks",
- "id": "HeadReporter",
- "attributes": {
- "name": "HeadReporter",
- "status": "passing",
- "output": ""
- }
- },
{
"type": "checks",
"id": "JobSpawner",
@@ -116,6 +107,15 @@ ok TelemetryManager
"output": ""
}
},
+ {
+ "type": "checks",
+ "id": "PromReporter",
+ "attributes": {
+ "name": "PromReporter",
+ "status": "passing",
+ "output": ""
+ }
+ },
{
"type": "checks",
"id": "TelemetryManager",
diff --git a/testdata/scripts/health/multi-chain.txtar b/testdata/scripts/health/multi-chain.txtar
index 3bd15850af..8178f8e821 100644
--- a/testdata/scripts/health/multi-chain.txtar
+++ b/testdata/scripts/health/multi-chain.txtar
@@ -75,7 +75,6 @@ ok EVM.1.Txm.BlockHistoryEstimator
ok EVM.1.Txm.Broadcaster
ok EVM.1.Txm.Confirmer
ok EVM.1.Txm.WrappedEvmEstimator
-ok HeadReporter
ok JobSpawner
ok Mailbox.Monitor
ok Mercury.WSRPCPool
@@ -83,6 +82,7 @@ ok Mercury.WSRPCPool.CacheSet
ok PipelineORM
ok PipelineRunner
ok PipelineRunner.BridgeCache
+ok PromReporter
ok Solana.Bar
ok StarkNet.Baz
ok TelemetryManager
@@ -216,15 +216,6 @@ ok TelemetryManager
"output": ""
}
},
- {
- "type": "checks",
- "id": "HeadReporter",
- "attributes": {
- "name": "HeadReporter",
- "status": "passing",
- "output": ""
- }
- },
{
"type": "checks",
"id": "JobSpawner",
@@ -288,6 +279,15 @@ ok TelemetryManager
"output": ""
}
},
+ {
+ "type": "checks",
+ "id": "PromReporter",
+ "attributes": {
+ "name": "PromReporter",
+ "status": "passing",
+ "output": ""
+ }
+ },
{
"type": "checks",
"id": "Solana.Bar",